网站首页 > 技术文章 正文
夏乙 发自 麦蒿寺
量子位 出品 | 公众号 QbitAI
腾讯前不久创造了机器学习训练新记录:在ImageNet上训练好AlexNet,只要4分钟。
震惊声钦佩声一片。同时,也有更多人的目光,落在了这项研究背后的庞大计算力之上:
4分钟在ImageNet上把AlexNet训练到58.7%的准确率,用了1024块英伟达Tesla P40 GPU;6.6分钟把ResNet-50训练到准确率75.8%,用了2048块P40。
按5万元一块保守计算,这项研究仅GPU成本就超过了1亿元。就算不去考虑机房机箱CPU等等其他成本,也已经不是 贫民 普通实验室能玩得起的了。
偏有贫穷团队不信邪。
在线深度学习课程fast.ai的创始人Jeremy Howard和自己的学生Andrew Shaw、以及国防创新部门DIU的Yaroslav Bulatov一起,用租来的亚马逊AWS的云计算资源,18分钟在ImageNet上将图像分类模型训练到了93%的准确率。
于是,Howard在fast.ai官方博客上发布了一篇文章:现在,任何人都能18分钟训练完ImageNet啦!
他说,在人人能用的硬件(公共基础设施)上把ImageNet训练到这样的准确率,这个速度是个新记录,比Google用TPU Pod在斯坦福DAWNBench测试上达到的速度还要快40%。
这样的成绩需要用到多少计算资源呢?
答案是,他们用了16个AWS云实例,每个实例搭载8块英伟达V100 GPU。成本:40美元。
他们训练的是一个标准ResNet-50,用SGD和momentum来优化。
而所用的方法,简单来说融合了这些技术:
逐步调整图像大小:fast.ai提出了在分类任务里要渐进式地调整图像大小(progressive image resizing),先用小图片训练,然后逐渐增大。
在验证中使用长方形图像:以往,人们在图像识别中都需要把原图剪成固定尺寸的正方形,而他们这一次所用的库会自动将固定尺寸的模型转换成动态尺寸模型,绕开了这一步。
如下图所示,左上是原图,右上是fast.ai使用的长方形图像,左下是标准方法裁剪的正方形,而右下是多次裁剪方法裁出的正方形。
Google Brain动态批次大小的一种变体:他们为中间的一些训练周期使用了更大的批次,这样能更好地利用GPU RAM,防止网络延迟。
腾讯4分钟训练ImageNet方法对权重衰减调整的处理方式:这种方法去掉了批次标准化(batchnorm)层里的权重衰减,能在固定的训练时间里多训练几个周期。
为了经济地在多台机器上运行多个实验,更方便地运用AWS比较便宜的“Spot实例”,他们构建的系统里用一个Python API来启动和配置新实例、运行实验、收集结果、查看进程,还开发了一个连接调度程序(nexus-scheduler)来帮助分布式实验更好地迭代。
△ 在连接调度程序里还能通过Tensorboard查看网络利用情况
基本的分布式计算是用英伟达的NCCL库结合PyTorch的all reduce分布式模块实现的。
就是这样一套方法,实现了前边所说的40美元、16个AWS实例、18分钟训练整个ImageNet的成绩。
接下来,他们还打算继续优化方法,进一步加快训练速度。另外,这个团队还计划8月25日正式发布nexus-scheduler,其中融合了fast.ai工具的功能。
最后,附一道通往原文的传送门:
http://www.fast.ai/2018/08/10/fastai-diu-imagenet/
— 完 —
诚挚招聘
量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复“招聘”两个字。
量子位 QbitAI · 头条号签约作者
?'?' ? 追踪AI技术和产品新动态
- 上一篇: 「Postman教程」使用Postman循环调用接口
- 下一篇: 一篇搞定实用动效技能(动效设计教程)
猜你喜欢
- 2024-09-18 一篇搞定实用动效技能(动效设计教程)
- 1513℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 561℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 506℃MySQL service启动脚本浅析(r12笔记第59天)
- 485℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 483℃启用MySQL查询缓存(mysql8.0查询缓存)
- 463℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 443℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 440℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)