自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

超原版速度110倍,針對PyTorch的CPU到GPU張量遷移工具開源

新聞 開發(fā)工具
機器學(xué)習(xí)中,有一個限制速度的環(huán)節(jié),那就是從 CPU 到 GPU 之間的張量遷移。

機器學(xué)習(xí)中,有一個限制速度的環(huán)節(jié),那就是從 CPU 到 GPU 之間的張量遷移。很多計算只能在 CPU 上進行,然后遷移到 GPU 進行后續(xù)的訓(xùn)練工作,因此遷移中如果速度太慢,則會拖累整個模型的訓(xùn)練效率。近日,有一位開發(fā)者開源了針對 PyTorch 的 CPU->GPU 遷移工具,相比原版加速了 110 倍之多。 

神經(jīng)網(wǎng)絡(luò)的訓(xùn)練中往往需要進行很多環(huán)節(jié)的加速,這就是為什么我們逐漸使用 GPU 替代 CPU、使用各種各樣的算法來加速機器學(xué)習(xí)過程。但是,在很多情況下,GPU 并不能完成 CPU 進行的很多操作。比如訓(xùn)練詞嵌入時,計算是在 CPU 上進行的,然后需要將訓(xùn)練好的詞嵌入轉(zhuǎn)移到 GPU 上進行訓(xùn)練。 

在這一過程中,張量遷移可能會變得非常緩慢,這成為了機器學(xué)習(xí)訓(xùn)練的一個瓶頸。 

面對這樣的問題,在很多優(yōu)化方法中,就是將操作盡可能放在 GPU 上(如直接在 GPU 上進行數(shù)據(jù)預(yù)處理、詞嵌入等的操作),并努力減少兩者之間的數(shù)據(jù)交互,因為這些環(huán)節(jié)都很費時。機器之心就曾報道過這樣的一個教程,將數(shù)據(jù)預(yù)處理放在了 GPU 上,減少了不少時間。 

以上事例說明,如果能夠做好 CPU 和 GPU 之間的遷移,則可以幫助開發(fā)者更好地優(yōu)化機器學(xué)習(xí)模型,使 CPU、GPU 等硬件更好地完成自己的工作。 

近日,有一位開發(fā)者就開源了一個名為 SpeedTorch 的工具。這一工具庫可以實現(xiàn)高達 110 倍的 CPU 到 GPU 遷移加速。 

項目地址:https://github.com/Santosh-Gupta/SpeedTorch 

項目背景

作者表示,最初想要創(chuàng)建 SpeedTorch 庫是為了幫助訓(xùn)練大量的嵌入向量,而 GPU 在 RAM 保存這些嵌入時可能有困難。為了解決這個問題,他發(fā)現(xiàn)在 CPU 上托管一些此類嵌入有助于在 GPU 上保存它們。嵌入系統(tǒng)采用稀疏訓(xùn)練,只有一部分參數(shù)參與前饋/更新操作,剩余參數(shù)處于閑置狀態(tài)。所以作者想到,為什么不在訓(xùn)練的過程中關(guān)閉這些閑置參數(shù)呢?這就需要快速的 CPU→GPU 數(shù)據(jù)遷移能力。 

隨著 CPU→GPU 遷移速度的加快,除了加速了 CPU 到 GPU 的張量轉(zhuǎn)移外,開發(fā)者還可以實現(xiàn)很多新的功能。 

  • 將 SpeedTorch 庫嵌入數(shù)據(jù)管道中,實現(xiàn) CPU 和 GPU 之間快速的雙向數(shù)據(jù)交互;
  • 通過 CPU 存儲將模型的訓(xùn)練參數(shù)增加近兩倍(閑置參數(shù)保存在 CPU 中,需要更新時再移動到 GPU 里,因此可以擴大模型整體的參數(shù)量);
  • 在訓(xùn)練稀疏嵌入向量中采用 Adadelta、Adamax、RMSprop、Rprop、ASGD、AdamW 和 Adam 優(yōu)化器。之前只有 SpraseAdam、Adagrad 和 SGD 適合稀疏嵌入訓(xùn)練。

那么,能夠?qū)崿F(xiàn)如此驚人的加速的庫是怎么實現(xiàn)的呢?

SpeedTorch

背后的技術(shù)

SpeedTorch 如此之快的技術(shù)是因為它是基于 Cupy 開發(fā)的。CuPy 是一個借助 CUDA GPU 庫在英偉達 GPU 上實現(xiàn) Numpy 數(shù)組的庫?;?Numpy 數(shù)組的實現(xiàn),GPU 自身具有的多個 CUDA 核心可以促成更好的并行加速。

超原版速度110倍,针对PyTorch的CPU到GPU张量迁移工具开源

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

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

有了這樣強大的底層支持,再加上一些優(yōu)化方法,SpeedTorch 就能達到 110 倍的速度了。 

使用方法 

SpeedTorch 可以通過 pip 安裝。你需要在導(dǎo)入 SpeedTorch 之前事先安裝和導(dǎo)入 Cupy。 

安裝步驟如下:

  1. !pip install SpeedTorch 
  2. import cupy 
  3. import SpeedTorch 

利用 SpeedTorch 加快 CPU→GPU 數(shù)據(jù)遷移速度 

如下 colab notebook 所示,如何利用 Data Gadget 將數(shù)據(jù)載入 SpeedTorch,以及如何將數(shù)據(jù)移入/移出 Pytorch cuda 變量。

超原版速度110倍,针对PyTorch的CPU到GPU张量迁移工具开源

代碼示例:https://colab.research.google.com/drive/185Z5Gi62AZxh-EeMfrTtjqxEifHOBXxF 

借助于 SpeedTorch 將非稀疏優(yōu)化器(本例中為 Adamax)用于稀疏訓(xùn)練

  1. SkipGram_ModelRegular = SkipGramModelRegular(numEmbeds=number_items, emb_dimension=128, sparseB=True)  
  2. use_cuda = torch.cuda.is_available()  
  3.   
  4. if use_cuda:  
  5.     SkipGram_ModelRegular.cuda()  
  6.   
  7. optimizer = optim.SparseAdam(  
  8.     SkipGram_ModelRegular.parameters())  
  9.    
  10. runningLoss = 0  
  11. runnngTime = 0   
  12. batch_size = 512  
  13. negSamp = 64  
  14. numPos = 4  
  15.   
  16. skip_window = int(numPos/2)  
  17.   
  18. targets = torch.ones( batch_size, numPos + negSamp , dtype = torch.float32 ).cuda()  
  19.   
  20. for i in range(500):  
  21.   
  22.     batch, labels, negz = generate_batch(batch_size=batch_size, skip_window=skip_window, negRate= negSamp)  
  23.     batchTensor = torch.from_numpy(batch)  
  24.     LabelTensor = torch.from_numpy(labels)  
  25.     negTensor = torch.from_numpy(negz)  
  26.   
  27.     pos_u = Variable(torch.LongTensor(LabelTensor.long()))  
  28.     pos_v = Variable(torch.LongTensor(batchTensor.long()))  
  29.     neg_v = Variable(torch.LongTensor(negTensor.long()))  
  30.   
  31.     if use_cuda:  
  32.         pos_u = pos_u.cuda()  
  33.         pos_v = pos_v.cuda()  
  34.         neg_v = neg_v.cuda()  
  35.   
  36.     optimizer.zero_grad()  
  37.     loss = SkipGram_ModelRegular.forward(pos_u, pos_v, neg_v, targets)  
  38.     runningLoss = runningLoss + loss.data.item()  
  39.     loss.backward()  
  40.     optimizer.step()  

代碼示例: https://colab.research.google.com/drive/1ApJR3onbgQWM3FBcBKMvwaGXIDXlDXOt 

以上展示了如何以常規(guī)的方式訓(xùn)練 word2vec,隨后展示了如何使用 SpeedTorch 在同樣的數(shù)據(jù)上進行訓(xùn)練——在通常不支持稀疏訓(xùn)練的優(yōu)化器上。因為嵌入變量包含的所有嵌入在每一部上都有更新,你可以在初始化期間將 sparse=False。 

效果 

這一部分記錄了 Cupy/PyTorch 張量和 PyTorch 變量之間的數(shù)據(jù)遷移速度。其中,需要遷移 128 維的嵌入向量,共有 131,072 個 32 位浮點數(shù)。使用了如下的代碼進行測試工作。所有測試都使用了特斯拉 K80 GPU。 

測試代碼鏈接:https://colab.research.google.com/drive/1b3QpfSETePo-J2TjyO6D2LgTCjVrT1lu 

下表是結(jié)果摘要。在同樣情況下,將數(shù)據(jù)從 PyTorch CUDA 張量傳遞到 CUDA PyTorch 嵌入變量上是要比 SpeedTorch 更快的,但對于所有其他的傳輸類型,SpeedTorch 更快。對于轉(zhuǎn)移到 Cuda Pytorch 嵌入,或從 Cuda Pytorch 嵌入轉(zhuǎn)移的兩個步驟的總和上來說,SpeedTorch 比常規(guī) GPU 和 CPU Pinned 張量的 Pytorch 速度同樣快。

超原版速度110倍,针对PyTorch的CPU到GPU张量迁移工具开源

從表中可以看出,這是 SpeedTorch 確實比 PyTorch 自帶的數(shù)據(jù)遷移方法要快很多。 

 

責(zé)任編輯:張燕妮 來源: 機器之心
相關(guān)推薦

2024-03-01 20:55:40

Pytorch張量Tensor

2018-10-17 14:15:37

賽靈思ACAP

2021-07-07 10:12:08

數(shù)據(jù)庫工具技術(shù)

2024-08-13 14:20:00

模型數(shù)據(jù)

2022-04-26 15:24:03

開源框架

2019-01-25 19:19:28

數(shù)據(jù)工具互聯(lián)網(wǎng)

2020-04-14 15:00:04

PyTorchGitHub檢測

2024-04-10 08:00:00

PostgresNoSQL

2019-05-17 11:15:50

芯片數(shù)據(jù)中心技術(shù)

2022-04-06 11:10:00

模型訓(xùn)練項目

2019-06-06 10:19:33

谷歌開源計算庫

2011-05-13 09:38:54

2023-03-22 13:53:26

芯片英偉達

2021-11-05 12:59:51

深度學(xué)習(xí)PytorchTenso

2021-12-05 06:53:29

CPUCPU工具RunCat

2023-09-01 18:18:32

2020-06-12 14:25:36

框架PyTorch開發(fā)

2019-08-06 17:19:22

開源技術(shù) 趨勢

2020-08-12 09:35:23

Docker工具開源

2021-12-29 10:26:58

芯片半導(dǎo)體技術(shù)
點贊
收藏

51CTO技術(shù)棧公眾號