加入极市专业CV交流群,与6000+来自腾讯,华为,百度,北大,清华,中科院等名企名校视觉开发者互动交流!更有机会与李开复老师等大牛群内互动!

同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流。关注 极市平台 公众号 ,回复 加群,立刻申请入群~

转自机器之心,已获得授权,不得二次转载

机器之心编译参与:杜伟、一鸣、泽南

机器学习中,有一个限制速度的环节,那就是从 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 适合稀疏嵌入训练。

那么,能够实现如此惊人的加速的库是怎么实现的呢?

SpeedToorch

背后的技术

SpeedTorch 如此之快的技术是因为它是基于 Cupy 开发的。CuPy 是一个借助 CUDA GPU 库在英伟达 GPU 上实现 Numpy 数组的库。基于 Numpy 数组的实现,GPU 自身具有的多个 CUDA 核心可以促成更好的并行加速。

CuPy 接口是 Numpy 的一个镜像,并且在大多情况下,它可以直接替换 Numpy 使用。只要用兼容的 CuPy 代码替换 Numpy 代码,用户就可以实现 GPU 加速。

CuPy 支持 Numpy 的大多数数组运算,包括索引、广播、数组数学以及各种矩阵变换。

有了这样强大的底层支持,再加上一些优化方法,SpeedTorch 就能达到 110 倍的速度了。

使用方法

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

安装步骤如下:

!pip install SpeedTorchimport cupyimport SpeedTorch

利用 SpeedTorch 加快 CPU→GPU 数据迁移速度

如下 colab notebook 所示,如何利用 Data Gadget 将数据载入 SpeedTorch,以及如何将数据移入/移出 Pytorch cuda 变量。

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

借助于 SpeedTorch 将非稀疏优化器(本例中为 Adamax)用于稀疏训练

SkipGram_ModelRegular = SkipGramModelRegular(numEmbeds=number_items, emb_dimension=128, sparseB=True)use_cuda = torch.cuda.is_available()if use_cuda:    SkipGram_ModelRegular.cuda()optimizer = optim.SparseAdam(    SkipGram_ModelRegular.parameters()) runningLoss = 0runnngTime = 0 batch_size = 512negSamp = 64numPos = 4skip_window = int(numPos/2)targets = torch.ones( batch_size, numPos + negSamp , dtype = torch.float32 ).cuda()for i in range(500):    batch, labels, negz = generate_batch(batch_size=batch_size, skip_window=skip_window, negRate= negSamp)    batchTensor = torch.from_numpy(batch)    LabelTensor = torch.from_numpy(labels)    negTensor = torch.from_numpy(negz)    pos_u = Variable(torch.LongTensor(LabelTensor.long()))    pos_v = Variable(torch.LongTensor(batchTensor.long()))    neg_v = Variable(torch.LongTensor(negTensor.long()))    if use_cuda:        pos_u = pos_u.cuda()        pos_v = pos_v.cuda()        neg_v = neg_v.cuda()    optimizer.zero_grad()    loss = SkipGram_ModelRegular.forward(pos_u, pos_v, neg_v, targets)    runningLoss = runningLoss + loss.data.item()    loss.backward()    optimizer.step()

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

以上展示了如何以常规的方式训练 word2vec,随后展示了如何使用 SpeedTorch 在同样的数据上进行训练——在通常不支持稀疏训练的优化器上。因为嵌入变量包含的所有嵌入在每一部上都有更新,你可以在初始化期间将 sparse=False。

效果

这一部分记录了 Cupy/PyTorch 张量和 PyTorch 变量之间的数据迁移速度。其中,需要迁移 128 维的嵌入向量,共有 131,072 个 32 位浮点数。使用了如下的代码进行测试工作。所有测试都使用了特斯拉 K80 GPU。

测试代码链接:https://colab.research.google.com/drive/1b3QpfSETePo-J2TjyO6D2LgTCjVrT1lu

下表是结果摘要。在同样情况下,将数据从 PyTorch CUDA 张量传递到 CUDA PyTorch 嵌入变量上是要比 SpeedTorch 更快的,但对于所有其他的传输类型,SpeedTorch 更快。对于转移到 Cuda Pytorch 嵌入,或从 Cuda Pytorch 嵌入转移的两个步骤的总和上来说,SpeedTorch 比常规 GPU 和 CPU Pinned 张量的 Pytorch 速度同样快。

从表中可以看出,这是 SpeedTorch 确实比 PyTorch 自带的数据迁移方法要快很多。

-End-

*延伸阅读

  • 极市干货|NVIDIA何琨:深度学习GPU服务器搭建指南

  • 40万现金大奖+免费算力+英特尔神经棒,极市开发者榜单邀你来战!

  • 极市干货|邓文彬-如何在GPU/CPU/移动端高效训练和推断CNN网络

添加极市小助手微信(ID : cv-mart),备注:研究方向-姓名-学校/公司-城市(如:目标检测-小极-北大-深圳),即可申请加入目标检测、目标跟踪、人脸、工业检测、医学影像、三维&SLAM、图像分割等极市技术交流群,更有每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流,一起来让思想之光照的更远吧~

△长按添加极市小助手

△长按关注极市平台

觉得有用麻烦给个在看啦~  

一部分 数据 迁移_超原版速度110倍,针对PyTorch的CPU到GPU张量迁移工具开源相关推荐

  1. 一部分 数据 迁移_软件测试员12小时惊魂记:数据库迁移出大事故,如何测试?...

    信息时代,随着用户数量不断增加,业务量不断增长,企业原有数据库不足以有效支撑业务的发展,在此情况下,企业更多的是寻求一款更加稳定的数据库进行替代. 本文以Sybase数据库和Oracle数据库为例.O ...

  2. 一部分 数据 迁移_从虚机到容器,知名架构师告诉你如何平滑进行业务迁移

    [小宅按]近期,短视频产品"秒拍"完成了一个"大动作"--将原来部署在虚拟机上的主体业务迁移到华为云,同时将公司的技术体系承载在下一代虚拟技术容器(Docker ...

  3. 06_2_Pytorch的基础数据类型、CPU tensor类型和GPU tensor类型、判断数据类型、CPU或GPU张量之间的转换、数据类型转换、1-4维向量、Tensor张量、Variable等

    1.6.2.Pytorch的基础数据类型 1.6.2.1.Torch定义了的七种CPU tensor类型和八种GPU tensor类型 1.6.2.2.基础数据类型 1.6.2.3.Pytorch数据 ...

  4. hdfs 数据迁移_对象存储BOS发布全新工具,加速自建HDFS到云端的访问速度

    想让自建Hadoop拥有流畅的云端访问体验?想替老板省点钱?是时候升级你的装备了! 百度智能云对象存储服务BOS新推出BOS HDFS工具,支持HDFS数据在BOS中的海量存储,并能在上层数据运算中使 ...

  5. flyway数据迁移_使用Flyway在Java EE中进行数据库迁移

    flyway数据迁移 任何Java EE应用程序的数据库模式都会随着业务逻辑一起发展. 这使得数据库迁移对于任何Java EE应用程序都很重要. 您是否还在执行应用程序时手动执行它们? 它仍然是一个锁 ...

  6. ecs服务器数据迁移_免费服务器迁移上云实践分享!一键迁云,自动同步

    导读:云服务器ECS(Elastic Computing Service)是每个阿里云用户上云的"第一步". 本次分享将为大家介绍免费的服务器迁移上云最佳实践方案和新功能特性,包括 ...

  7. iphone换机数据迁移_怎么一键换机?换新机迁移数据必看教程!

    怎么一键换机?现在数码产品更新换代的速度越来越快了,很多消费者都会紧跟时代潮流,但更换手机后,通常我们第一个需要面临的问题就是数据迁移,同品牌之间的换机与不同品牌之间的换机,应该怎么实现数据转移呢?下 ...

  8. dynamodb 数据迁移_亚马逊发布DynamoDB-用于弹性计算的快速,可扩展NoSQL数据库

    dynamodb 数据迁移 Werner Vogels, Chief Technology Officer of Amazon, has posted an article on his blog d ...

  9. hdfs 数据迁移_基于JindoFS+OSS构建高效数据湖

    作者:孙大鹏,花名诚历,阿里巴巴计算平台事业部 EMR 技术专家,Apache Sentry PMC,Apache Commons Committer,目前从事开源大数据存储和优化方面的工作. 为什么 ...

最新文章

  1. TypeScript interface
  2. phaiapi数据库重写类
  3. 关于SmartForm和ScriptForm的输出格式设置说明(转载)
  4. 51nod-诺德街【数学期望】
  5. maven nexus myeclipse 学习
  6. Struts2框架基础篇
  7. 站立会议中发现的一些新问题
  8. promise的状态值_ES6中的Promise的用法总结
  9. webpack5的tree-shaking值得了解
  10. Glomosim安装和ParseC的使用等相关链接
  11. Django之Django debug toolbar调试工具
  12. 如何在校外下载期刊全文
  13. L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误
  14. Vue——May(1)
  15. 两片8-3优先编码器转化为16-4线优先编码器真值表--python实现
  16. 【PS插件】Retouch4me 10合1一键安装版
  17. 机器学习系列--数据预处理
  18. 英语CET6救命作文通用模板
  19. (转)2010年最不能错过的101个网站
  20. JAVA之图书借阅管理

热门文章

  1. 继承Thread类的方式创建多线程
  2. 数学之美 与 浪潮之巅
  3. BZOJ 1822 Frozen Nova 霜冻新星
  4. poj1200 Crazy Search(hash)
  5. python 魔法方法
  6. delphi IOS 通知 TNotification
  7. 计算沙盒下文件夹内容大小 清空沙盒 文件 目录
  8. .NET平台及C#面向对象编程
  9. Hyper-V应用指南之3-理解并配置Hyper-V虚拟网络[转]
  10. webpack Babel