如何仅花25美元并在3小时内完成ImageNet训练?
更多干货内容请关注微信公众号“AI 前线”,(ID:ai-front)
DAWNBench 是斯坦福大学建立的项目,旨在以竞赛形式对不同深度学习方法加以比较。在 Dawnbench 竞赛当中,CIFAR10 与 ImageNet 的表现引起了我们的关注。二者的目标基本一致,在保证相对合理准确度(ImageNet 为 93%,CIFAR 为 94%)的同时尽可能提高图像分类器执行速度并降低运行成本。
在 CIFAR 10 测试当中,我们的参赛作品在两个方向上胜出,分别为速度最快与成本最低。来自 DARPA D3M 项目的独行侠 Ben Johnson 在这两个方向上皆取得亚军成绩。而在 ImageNet 测试当中,我们的结果是:
在公有基础设施上速度最快、在 GPU 上速度最快、在单一计算机上速度最快(甚至超过英特尔利用 128 台计算机建立的集群!)
成本最低(不过 DAWNBench 官方公布的结果并非我们的实际成本,下面将对此作出具体解释)。
总体而言,我们的结论是:
算法创造力比裸机性能更重要。
由 Facebook AI Research 与协作者团队开发出的 Pytorch 能够提供快速迭代与调试能力,从而支持这种创造力。
AWS 竞价实例是快速经济运行实验性负载的绝佳平台。
在本篇文章中,我们将讨论在每轮测试竞赛中使用的具体方法。这里提及的所有方法已经或者正在被合并至 fast.ai 库当中。
fast.ai 作为研究实验室,致力于通过教育与开发更易使用的软件方案降低深度学习入门门槛,从而简化用户的学习流程。在我们看来,拥有最新计算机设备或大规模计算集群不是也不应成为涉足深度学习的必要条件。相反,对现代技术与最新研究成果加以利用,同时清楚了解当前需要努力解决的问题才是其中的关键。作为这项研究的重要组成部分,我们最近开发出一套新的库,用于训练 基于 Pytorch 的深度学习模型——这就是 fastai。
随着时间的推移,我们已经将众多可能未在社区当中得到应有重视的研究论文当中的算法引入 fastai。具体来讲,我们发现当前深度学习社区过分强调斯坦福大学、DeepMind 以及 OpenAI 等高知名度组织公布的研究结果,但却忽略了其它同样具有重要价值但却知名度较低的学术来源。来自海军研究实验室的 Leslie Smith 就是其中一例,他最近发现了一种所谓“超级收敛”的重要现象。他解释称,这种现象可能带来相当于原有已知方法 5 到 10 倍的深度神经网络训练速度,进而给整个领域带来革命性的变化。然而,他的论文并未被学术出版机构所接受,因此无法出现在任何主流软件方案当中。
在对这篇论文进行课上讨论的 24 小时之内,fast.ai 学生 Sylvain Gugger 就已经完成了该方法的具体实现——即将其纳入 fastai 当中。他还开发出一份交互式笔记,用以展示如何尝试其它相关方法。从本质上讲,Smith 的案例表明,如果在训练期间缓慢提高学习率,同时降低动量,则可以极高的学习率完成训练——这意味着我们将能够避免过度训练,并将训练时长压缩至极低水平。
超级收敛理论中的学习率与动量模式
这种新的算法思维转变正是 Pytorch 与 fastai 的亮点所在。Pytorch 支持交互式调试以及对标准 Python 编码方法的使用 ; 而 fastai 则提供多种构建块与钩子(在本示例中体现为回调,其允许实现定制化训练,并利用 fastai.sqdr 建立新的学习率退火方法)。Pytorch 的张量库与 CUDA 则允许用户以探索方式快速尝试新算法的实现。
我们已经建立起一支非正式深度学习研究小组(任何人皆可免费参加),大家在日常课程当中共同参与项目。我们希望通过编码方式验证 Smith 的结论是否像他宣称的那样有效。再加上斯坦福大学正在举办 DAWNBench 竞赛 ,我们认为这绝对是测试其实际效果的好机会。但在决定参加时,距离竞赛开始已经只剩下 10 天时间——形势相当紧迫!
我们的深度学习研究小组
CIFAR 10 与 ImageNet 都属于图像识别类任务。举例来说,假设我们拥有一组猫与狗的照片,而且打算构建一款工具对其进行自动区分。我们首先需要建立一套模型,而后利用大量照片对其进行训练,这样其就能自动分类未见过的猫与狗照片。接下来,我们可以利用这套模型处理规模更大的数据集——例如 CIFAR,这是一套照片集合,每张照片都包含猫、狗以及其它数十种动物 / 载具对象(例如青蛙与飞机)。这些图片比较小巧(32 像素 x32 像素),因此整体数据集也比较袖珍(仅为 160 MB)且易于处理。目前,这套数据集受到的重视程度并不高,因为其在体量上远远不及当下比较流行的大规模数据集。然而,其中的数据量很能体现各类组织所面临的实际情况,而较小的图片尺寸既带来识别挑战同时也降低了访问门槛。
在决定参加比赛时,当时的领先算法在一个多小时内即可达到 94% 的准确率。然而我们很快发现,我们在超级收敛理论的指导下只需要约 15 分钟就能训练出一套 Resnet 50 模型——这无疑是个激动人心的时刻!在此之后,我们还尝试了其它一些架构,并发现 Resnet 18(实际上是 Resnet 18 的一套预激活变体)在 10 分钟内即达到了相同的结果。我们在课堂上进行了讨论,而 Ben Johnson 独自对该方法进行深入开发。他在 fast.ai 当中添加了一种名为“concat pooling”(用于将网络中倒数第二层内的最大池与平均池连接起来)的方法,并成功在单英伟达 GPU 之上实现了 6 分钟模型训练纪录。
在研究小组当中,我们决定专注于多 GPU 训练方向,以便在单一计算机上获得最快的训练结果。总体来讲,我们认为在多台机器上训练模型会增加工程技术与系统管理工作的复杂性。为了尽可能避免这种复杂性,我们努力在单一计算机上提升方法效能。在这里,我们使用一套名为 NCCL 的库,其能够与 Pytorch 配合使用,旨在以最低管理成本利用多个 GPU。
大多数与多 GPU 训练相关的论文与讨论都侧重于关注每秒运算次数,而非网络训练的实际时间周期。我们发现,在多个 GPU 上进行训练时,我们的架构表现出了截然不同的特性。很明显,研究界还需要投入更多精力以真正理解如何立足多个 GPU 在实践当中获得更好的端到端训练结果。举例来说,我们发现在单一 GPU 上运行良好的训练设置,往往会在多 GPU 环境下出现梯度爆炸。我们参考了以往学术论文中的相关建议,并得出了一些合理的结论——但必须承认,我们还远没有利用到计算机的全部资源。
最后,我们发现要真正利用计算机上的 8 块 GPU,我们实际上需要在每个批次当中引入更多任务量——也就是说,我们增加了各个层中的激活次数。在这里,我们再次采用了遭到忽略的学术成果:巴黎大学桥梁学院发表的《Wide Residual Networks》论文,其中对建立残差网络的不同方法作出了广泛分析,同时讨论了此类架构当中所必需的各类构建元素。
我们的另一位研究小组成员 Brett Koonce 开始利用各类不同参数设置进行实验,希望发现最具实效的组合。我们最终为 resnet-34 架构创建了一套“宽化”版本。配合 Brett 精心挑选的超参数,其能够在 3 分钟训练周期之内立足多 GPU 环境实现 94% 的准确度!
这里要感谢 AWS 的帮助。我们希望以并行方式运行多个实验,同时尽可能压缩实验成本。为此,研究小组成员 Andrew Shaw 构建出一套 Python 库,其负责自动启动竞价实例、对其进行设置、训练模型、保存结果,最后关闭该实例。Andrew 甚至完成了训练设置,使得训练过程亦可自动化实现,以确保所有训练皆可在 tmux 会话中发生。如此一来,我们将能够随时登录任意实例并查看当前训练进度。
根据此次竞赛中的经验,我们的建议是,对于大多数数据科学家而言,AWS 竞价实例无疑是进行大规模模型训练或大量模型训练场景下的最佳选择。其使用成本通常仅为按需实例成本的三分之一。遗憾的是,DAWNBench 公布的官方结果并没有报告实际训练成本,而仅提供了基于按需实例的假设成本。我们对这种作法表示质疑,因为在实践当中,竞价实例的价格通常非常稳定,而且相当适合用于模型训练这类工作负载。
从本次竞赛的结果来看,谷歌的 TPU 实例(目前处于 beta 测试阶段)可能也是个不错的选择。但需要强调的是,使用 TPU 则意味着大家必须接受以下限制条件:
使用谷歌硬件(TPU)。
使用谷歌软件 (Tensorflow)。
使用谷歌云平台 (GCP)。
更麻烦的是,TPU 不具备直接编码能力,这严重限制了算法的创造性(正如我们之前所提到,创造力实际上直接决定着最终性能表现)。考虑到 TPU 上有限的神经网络与算法支持范围(例如不支持卷积神经网络,而这对于包括谷歌自己的语言翻译系统等具体应用非常重要),选择谷歌平台将严重影响我们所能解决的具体问题以及可以选择的解决方式。
在另一方面,AWS 则允许我们运行任何软件、架构与算法,而后获取代码结果并在自己的计算机或其它云平台上加以运行。此外,竞价实例的存在也意味着我们能够享受到远低于谷歌云平台的使用成本(谷歌目前也在测试类似的‘竞拍实例’,但其似乎并不支持 TPU,并会以 24 小时为周期清理工作负载内容)。
对于单一 GPU 训练方法来说,另一个理想选项是 Paperspace——也就是我们在新课程当中使用的平台。其设置过程要比 AWS 实例复杂得多,而且预安装有完整的 fastai 架构。此外,其功能丰富性与灵活性也无法与 AWS 相提并论。其成本水平介于 AWS 竞价实例与按需实例之间。我们正是利用 Paperspace 实例在此次竞赛的成本测试单元中胜出——具体价格仅为 0.26 美元。
实现快速训练的另一个关键,在于使用半精度浮点运算。英伟达最新推出的 Volta 架构包含张量核心,其专门用于处理半精度浮点数据。然而,利用这类数据进行训练一直是个复杂的难题,而且目前还很少有成功利用此类数据完成模型训练的案例。英伟达方面非常友好地提供利用半精度浮点数据进行 ImageNet 训练的开源演示,而 Andrew Shaw 则将其中的指导思想纳入到 fastai 当中。目前,我们只需要在代码当中写下 learn.half(),即可坐等系统自动执行所有必要步骤,从而快速准确地利用半精度浮点运算完成模型训练。
相较于 CIFAR 10,ImageNet 就像是同一个问题的不同版本 ; 区别在于后者的图像尺寸更大(224 像素,160 GB)且包含的类别更多(1000 种)。Smith 在他的论文当中展示了 ImageNet 的超级收敛实现方法,但其最终准确度低于原有训练方法。我们也遇到了同样的问题,即在以高学习率进行训练时,模型无法达到 93% 的准确度要求。
为此,我们转而使用 fast.ai 开发的另一种方法——即渐进式尺寸调整。这种技术的变化已经在此前的学术文献(GAN 与强化深层残差网络的渐进式增长)当中有所体现,但我们还从未利用其进行过图像分类。这项技术的原理非常简单:在训练开始时先从较小的图像起步,并随训练的继续逐渐增加图像大小。从直觉角度讲,人类不需要较大的图像就能了解猫与狗的体貌特征 ; 但如果想深入了解不同狗只之间的差异时,图像越大明显学习效果更好。
很多人错误地认为,立足一种图像尺寸训练而成的模型无法适应其它图像尺寸。没错,2013 年的 VGG 架构确实只能处理特定尺寸的图像,但如今情况早已发生变化。问题在于,很多网络会在末端错误地使用固定尺寸的池化层,而未能使用全局 / 自适应池化层。举例来说,官方 Pytorch torchvision 模型就没有正确使用自适应池化层。正因为如此,fastai 与 keras 这类库就显得非常重要——这些库致力于确保即插即用能力,同时尽可能纳入所有相关最佳实践。很明显,Pytorch 与 TensorFlow 等项目的开发者们更关注底层基础,而非最终用户体验。
通过使用渐进式尺寸调整,我们能够显著提升初始阶段的训练速度(因为此时使用 128 x 128 像素图像,而非通常的 224 x 224 像素图像),同时也令最终阶段的准确度保持合理(利用 288 x 288 像素图像获得更高准确度)。除了良好的准确度之外,这种方法还带来了理想的性能表现 ; 而凭借着更为广泛的图像素材尺寸,模型本身也能够更好地解决过度拟合问题。
我在机器学习领域已经拥有 25 年的从业历程,我发现工程师们特别喜欢在自己能找到的最强劲的计算设备上运行规模最大的数据集,而各类媒体也喜欢报道一切“最大”的事物。但事实上,真正的进步并非来源于此——差异性远比规模重要得多。举例来说,dropout 允许我们在较小的数据集上进行训练且避免过度拟合,批量标准化让我们更快完成训练,而修正线性单元则能够避免在训练期间出现梯度爆炸。有追求的研究人员们会考虑采取不同的处理措施,希望帮助我们更快地训练出更好的网络模型。
在与身处谷歌、OpenAI 以及其它实力雄厚机构的朋友们进行交流时,我一直担心他们轻松获取大量资源的优势反而会扼杀其创造力。既然资源几乎无穷无尽,我们还有什么理由进行琢磨与考量?同样需要强调的是,在这些机构之外,资源也往往相当稀缺,因此以资源无限为前提形成的思维习惯将无法给用户真正带来帮助。而更可怕的是,目前几乎没有多少研究人员真正意识到这个问题的存在。
更糟糕的是,交流当中这些朋友往往表示他们并不能真正获得如此可观的资源,因此他们也就放弃了前沿研究。在他们看来,似乎没有大量 GPU 与 CPU 的支持,他们将永远无法完成任何有价值的工作。在我看来,这个结论是完全错误的:卓越的实验者加较差的设备,在研究成果上仍将远超卓越的设备加上较差的实验者。
我们很幸运,因为像 Pytorch 团队这样的积极力量正在构建创造性从业者们最需要的快速迭代与实验工具。我希望看到更多来自小型非营利性实验室与兼职学生的这类高水平成果,从而帮助整个业界破除“无资源、不科研”的认识误区。
原文链接:
http://www.fast.ai/2018/04/30/dawnbench-fastai/
如何仅花25美元并在3小时内完成ImageNet训练?相关推荐
- 吓人!仅花20小时18美元,可瞬间破译1100万个密码
全文共2512字,预计学习时长4分钟 事情是这样发生的. 在某个阳光明媚的下午,热心市民刘先生正吃着火锅唱着歌,"叮~",手机突然收到一条短信.以为是系统短信的他,起期初毫不在意, ...
- 花170美元,我了解了消费级间谍软件的世界
本文讲的是 花170美元,我了解了消费级间谍软件的世界, 在柏林一个破旧而嘈杂的酒吧,我正与朋友进行着私人之间的交流,然而在距离这里4000多公里的纽约,有人却正在窃听着一切. 他只需要通过一条短信, ...
- 只需25美元,算力提升3倍:树莓派4计算模组上线
机器之心报道 编辑:泽南.蛋酱 一年多之后,工业界开发者们终于等来了树莓派 4 的计算模组,即简装版树莓派 4 Model B. 对于每一代嵌入式电脑树莓派(Raspberry Pi)来说,官方都会在 ...
- 花1299美元购买一款基于云端的笔记本值吗?且看Chromebook Pixel与微软Surface Pro和MacBook Air的对比
Google今天发布了一款针对高端用户的首款触屏笔记本Chrome Pixel,基础的WiFi版售价为1299美元,而LTE+WiFi版更是高达1499美元.那么相对于目前微软的Surface Pro ...
- 工作ing_来自ING DIRECT的25美元存款
工作ing This isn't spam, IMHO, but it's a useful enough offer for those of you readers who are interes ...
- 多花5美元提速500%,树莓派新品Zero 2 W发布
行早 发自 凹非寺 量子位 报道 | 公众号 QbitAI 树莓派粉丝期待已久的Zero系列新产品,现在终于来了. 这次树莓派推出了新的Zero 2 W,仅售15美元(不到100元). 新的树莓派Ze ...
- Windows 7 延长支持服务价格曝光:一台电脑最低25美元
Windows 7 系统将于明年1月14日结束免费的扩展技术支持服务,也就是不再对个人和普通企业用户分发任何安全补丁. 不过,不同于 IE10 的"绝情退役",Win7 用户基数依 ...
- 25美元 Linux PC 'Raspberry Pi' 一月上市
为什么80%的码农都做不了架构师?>>> 盼望已久的信用卡大小.价值25美元的计算机 Raspberry Pi将于年初上市.第一轮Beta版设备已经处于测试之中.如果一切顺利,一月你 ...
- PoolTogether 奖池开奖一名用户赢得 43,760 美元,本金仅为 73 美元
以太坊无损彩票 PoolTogether CEO Leighton Cusack 发布推特称,PoolTogether 昨日奖池开奖,一名用户赢得 43,760 美元的奖金,该名用户的成本仅为 73 ...
最新文章
- 于正AI换脸火上热搜,差点骗了全网!古风民族风也能任意切换
- mysql中取出的时间日期多个.0
- JavaWeb中的乱码解决方法总结
- vs2010中自动缩进模式由tab改为space
- 2015-12-01 存储过程
- pip 安装包时出现的连接超时、host不信任问题解决方案
- 内存释放_把微信这两个开关关掉, 手机立马释放大量内存, 快去试试吧
- matlab smooth函数_基于Matlab的机械臂路径规划
- 【bat命令-在for循环中赋值给局部变量后再输出变量时提示“ECHO 处于关闭状态。”或者“ECHO 处于打开状态。”】
- 论文笔记 - 《Deep Learning》(Yann LeCun Yoshua Bengio Geoffrey Hinton)经典
- Spark编程基础-(一)大数据技术概述
- html实现pdf导出excel表格,纯前端文件导出-Excel/PDF
- 网络看不到计算机和设备,网络发现已关闭,网络计算机和设备不可见。请启用网络和共享中心中的网络发现。解决方法...
- 对Parcel的使用学习
- python中with open as f什么意思_Python中 with open(file_abs,'r') as f: 的用法以及意义
- 人工智能/数据科学比赛汇总 2019.9
- 缺氧游戏里能造出计算机吗,缺氧游戏氧气制造方法汇总 缺氧氧气如何制造
- 深圳买房负担全球第一:记得在泡沫破灭前把房子卖掉
- golang_iota
- 全球及中国多晶透明陶瓷行业供需及竞争形势分析报告2021~2026年
热门文章
- 戴尔服务器显示e1810,戴尔服务器提示: PowerEdge2950 E1810 HDD 1 Fault该如何解决?求帮助!!!...
- leetcode189. 旋转数组
- C语言: GDB调试技术(一)
- 算法(27)-最大系列
- LeetCode - Easy - 155. Min Stack
- STL源码剖析 迭代器iterator的概念 和 traits编程技法
- 别让6种不良心理偷走你的好人缘
- 从夫妻吵架中看项目管理
- x264 struct学习 1
- VisualCode 查看代码历史版本、还原代码到既定历史版本