<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          驚呆了!這樣可以將Numpy加速700倍!

          共 2505字,需瀏覽 6分鐘

           ·

          2020-09-16 19:48







          選自towardsdatascience,?作者:George Seif

          本文轉(zhuǎn)自機(jī)器之nearhuman2014


          本文介紹了如何利用 CuPy 庫來加速 Numpy 運(yùn)算速度。


          就其自身來說,Numpy 的速度已經(jīng)較 Python 有了很大的提升。當(dāng)你發(fā)現(xiàn) Python 代碼運(yùn)行較慢,尤其出現(xiàn)大量的 for-loops 循環(huán)時(shí),通常可以將數(shù)據(jù)處理移入 Numpy 并實(shí)現(xiàn)其向量化最高速度處理。


          但有一點(diǎn),上述 Numpy 加速只是在 CPU 上實(shí)現(xiàn)的。由于消費(fèi)級 CPU 通常只有 8 個核心或更少,所以并行處理數(shù)量以及可以實(shí)現(xiàn)的加速是有限的。


          這就催生了新的加速工具——CuPy 庫。


          何為 CuPy?


          CuPy 是一個借助 CUDA GPU 庫在英偉達(dá) GPU 上實(shí)現(xiàn) Numpy 數(shù)組的庫。基于 Numpy 數(shù)組的實(shí)現(xiàn),GPU 自身具有的多個 CUDA 核心可以促成更好的并行加速。


          CuPy 接口是 Numpy 的一個鏡像,并且在大多情況下,它可以直接替換 Numpy 使用。只要用兼容的 CuPy 代碼替換 Numpy 代碼,用戶就可以實(shí)現(xiàn) GPU 加速。


          CuPy 支持 Numpy 的大多數(shù)數(shù)組運(yùn)算,包括索引、廣播、數(shù)組數(shù)學(xué)以及各種矩陣變換。

          如果遇到一些不支持的特殊情況,用戶也可以編寫自定義 Python 代碼,這些代碼會利用到 CUDA 和 GPU 加速。整個過程只需要 C++格式的一小段代碼,然后 CuPy 就可以自動進(jìn)行 GPU 轉(zhuǎn)換,這與使用 Cython 非常相似。


          在開始使用 CuPy 之前,用戶可以通過 pip 安裝 CuPy 庫:

          pip?install?cupy

          使用 CuPy 在 GPU 上運(yùn)行


          為符合相應(yīng)基準(zhǔn)測試,PC 配置如下:

          • i7–8700k CPU

          • 1080 Ti GPU

          • 32 GB of DDR4 3000MHz RAM

          • CUDA 9.0


          CuPy 安裝之后,用戶可以像導(dǎo)入 Numpy 一樣導(dǎo)入 CuPy:

          import?numpy?as?np
          import?cupy?as?cp
          import?time

          在接下來的編碼中,Numpy 和 CuPy 之間的切換就像用 CuPy 的 cp 替換 Numpy 的 np 一樣簡單。如下代碼為 Numpy 和 CuPy 創(chuàng)建了一個具有 10 億 1』s 的 3D 數(shù)組。為了測量創(chuàng)建數(shù)組的速度,用戶可以使用 Python 的原生 time 庫:

          ###?Numpy?and?CPU
          s?=?time.time()
          *x_cpu?=?np.ones((1000,1000,1000))*
          e?=?time.time()
          print(e?-?s)###?CuPy?and?GPU
          s?=?time.time()
          *x_gpu?=?cp.ones((1000,1000,1000))*
          e?=?time.time()
          print(e?-?s)

          這很簡單!


          令人難以置信的是,即使以上只是創(chuàng)建了一個數(shù)組,CuPy 的速度依然快得多。Numpy 創(chuàng)建一個具有 10 億 1』s 的數(shù)組用了 1.68 秒,而 CuPy 僅用了 0.16 秒,實(shí)現(xiàn)了 10.5 倍的加速。

          但 CuPy 能做到的還不止于此。


          比如在數(shù)組中做一些數(shù)學(xué)運(yùn)算。這次將整個數(shù)組乘以 5,并再次檢查 Numpy 和 CuPy 的速度。

          ###?Numpy?and?CPU
          s?=?time.time()
          *x_cpu?*=?5*
          e?=?time.time()
          print(e?-?s)###?CuPy?and?GPU
          s?=?time.time()
          *x_gpu?*=?5*
          e?=?time.time()
          print(e?-?s)

          果不其然,CuPy 再次勝過 Numpy。Numpy 用了 0.507 秒,而 CuPy 僅用了 0.000710 秒,速度整整提升了 714.1 倍。


          現(xiàn)在嘗試使用更多數(shù)組并執(zhí)行以下三種運(yùn)算:


          1. 數(shù)組乘以 5

          2. 數(shù)組本身相乘

          3. 數(shù)組添加到其自身


          ###?Numpy?and?CPU
          s?=?time.time()
          *x_cpu?*=?5
          x_cpu?*=?x_cpu
          x_cpu?+=?x_cpu*
          e?=?time.time()
          print(e?-?s)###?CuPy?and?GPU
          s?=?time.time()
          *x_gpu?*=?5
          x_gpu?*=?x_gpu
          x_gpu?+=?x_gpu*
          e?=?time.time()
          print(e?-?s)


          結(jié)果顯示,Numpy 在 CPU 上執(zhí)行整個運(yùn)算過程用了 1.49 秒,而 CuPy 在 GPU 上僅用了 0.0922 秒,速度提升了 16.16 倍。


          數(shù)組大小(數(shù)據(jù)點(diǎn))達(dá)到 1000 萬,運(yùn)算速度大幅度提升


          使用 CuPy 能夠在 GPU 上實(shí)現(xiàn) Numpy 和矩陣運(yùn)算的多倍加速。值得注意的是,用戶所能實(shí)現(xiàn)的加速高度依賴于自身正在處理的數(shù)組大小。下表顯示了不同數(shù)組大小(數(shù)據(jù)點(diǎn))的加速差異:


          數(shù)據(jù)點(diǎn)一旦達(dá)到 1000 萬,速度將會猛然提升;超過 1 億,速度提升極為明顯。Numpy 在數(shù)據(jù)點(diǎn)低于 1000 萬時(shí)實(shí)際運(yùn)行更快。此外,GPU 內(nèi)存越大,處理的數(shù)據(jù)也就更多。所以用戶應(yīng)當(dāng)注意,GPU 內(nèi)存是否足以應(yīng)對 CuPy 所需要處理的數(shù)據(jù)。

          原文鏈接:https://towardsdatascience.com/heres-how-to-use-cupy-to-make-numpy-700x-faster-4b920dda1f56


          由于微信平臺算法改版,公號內(nèi)容將不再以時(shí)間排序展示,如果大家想第一時(shí)間看到我們的推送,強(qiáng)烈建議星標(biāo)我們和給我們多點(diǎn)點(diǎn)【在看】。星標(biāo)具體步驟為:


          (1)點(diǎn)擊頁面最上方“小詹學(xué)Python”,進(jìn)入公眾號主頁。


          (2)點(diǎn)擊右上角的小點(diǎn)點(diǎn),在彈出頁面點(diǎn)擊“設(shè)為星標(biāo)”,就可以啦。


          感謝支持,比心。

          瀏覽 75
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  悠悠资源音影先锋在线观看 | 五月丁香花综合网 | 香蕉视频偷拍 | 国产激情视频久久久久久 | 欧美一区二区三区四还视频 |