加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

超原版速率110倍,针对PyTorch的CPU到GPU张量迁徙器材开源

发布时间:2019-09-17 22:02:02 所属栏目:移动互联 来源:机器之心编译
导读:呆板进修中,有一个限定速率的环节,那就是从 CPU 到 GPU 之间的张量迁徙。许多计较只能在 CPU 长举办,然后迁徙到 GPU 举办后续的实习事变,因此迁徙中假如速率太慢,则会拖累整个模子的实习服从。克日,有一位开拓者开源了针对 PyTorch 的 CPU-GPU 迁徙
副问题[/!--empirenews.page--]

呆板进修中,有一个限定速率的环节,那就是从 CPU 到 GPU 之间的张量迁徙。许多计较只能在 CPU 长举办,然后迁徙到 GPU 举办后续的实习事变,因此迁徙中假如速率太慢,则会拖累整个模子的实习服从。克日,有一位开拓者开源了针对 PyTorch 的 CPU->GPU 迁徙器材,对比原版加快了 110 倍之多。

神经收集的实习中每每必要举办许多环节的加快,这就是为什么我们逐渐行使 GPU 更换 CPU、行使各类百般的算法来加快呆板进修进程。可是,在许多环境下,GPU 并不能完成 CPU 举办的许多操纵。好比实习词嵌入时,计较是在 CPU 长举办的,然后必要将实习好的词嵌入转移到 GPU 长举办实习。

在这一进程中,张量迁徙也许会变得很是迟钝,这成为了呆板进修实习的一个瓶颈。

面临这样的题目,在许多优化要领中,就是将操纵尽也许放在 GPU 上(如直接在 GPU 长举办数据预处理赏罚、词嵌入等的操纵),并全力镌汰两者之间的数据交互,由于这些环节都很费时。呆板之心就曾报道过这样的一个教程,将数据预处理赏罚放在了 GPU 上,镌汰了不少时刻。

以上事例声名,假如可以或许做好 CPU 和 GPU 之间的迁徙,则可以辅佐开拓者更好地优化呆板进修模子,使 CPU、GPU 等硬件更好地完本钱身的事变。

克日,有一位开拓者就开源了一个名为 SpeedTorch 的器材。这一器材库可以实现高达 110 倍的 CPU 到 GPU 迁徙加快。

项目地点:https://github.com/Santosh-Gupta/SpeedTorch

项目配景

作者暗示,最初想要建设 SpeedTorch 库是为了辅佐实习大量的嵌入向量,而 GPU 在 RAM 生涯这些嵌入时也许有坚苦。为了办理这个题目,他发此刻 CPU 上托管一些此类嵌入有助于在 GPU 上生涯它们。嵌入体系回收稀少实习,只有一部门参数参加前馈/更新操纵,剩余参数处于闲置状态。以是作者想到,为什么不在实习的进程中封锁这些闲置参数呢?这就必要快速的 CPU→GPU 数据迁徙手段。

跟着 CPU→GPU 迁徙速率的加速,除了加快了 CPU 到 GPU 的张量转移外,开拓者还可以实现许多新的成果。

  • 将 SpeedTorch 库嵌入数据管道中,实现 CPU 和 GPU 之间快速的双向数据交互;
  • 通过 CPU 存储将模子的实习参数增进近两倍(闲置参数生涯在 CPU 中,必要更新时再移动到 GPU 里,因此可以扩大模子整体的参数目);
  • 在实习稀少嵌入向量中回收 Adadelta、Adamax、RMSprop、Rprop、ASGD、AdamW 和 Adam 优化器。之前只有 SpraseAdam、Adagrad 和 SGD 得当稀少嵌入实习。

那么,可以或许实现云云惊人的加快的库是怎么实现的呢?

SpeedTorch

背后的技能

SpeedTorch 云云之快的技能是由于它是基于 Cupy 开拓的。CuPy 是一个借助 CUDA GPU 库在英伟达 GPU 上实现 Numpy 数组的库。基于 Numpy 数组的实现,GPU 自身具有的多个 CUDA 焦点可以促成更好的并行加快。

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

CuPy 接口是 Numpy 的一个镜像,而且在大多环境下,它可以直接替代 Numpy 行使。只要用兼容的 CuPy 代码替代 Numpy 代码,用户就可以实现 GPU 加快。

CuPy 支持 Numpy 的大大都数组运算,包罗索引、广播、数组数学以及各类矩阵调动。

有了这样强盛的底层支持,再加上一些优化要领,SpeedTorch 就能到达 110 倍的速率了。

行使要领

SpeedTorch 可以通过 pip 安装。你必要在导入 SpeedTorch 之前事先安装和导入 Cupy。

安装步调如下:

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

操作 SpeedTorch 加速 CPU→GPU 数据迁徙速率

如下 colab notebook 所示,怎样操作 Data Gadget 将数据载入 SpeedTorch,以及怎样将数据移入/移出 Pytorch cuda 变量。

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

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

借助于 SpeedTorch 将非稀少优化器(本例中为 Adamax)用于稀少实习

  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

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读