如何仅花25美元并在3小时内完成ImageNet训练?

译者 | 核子可乐
编辑 | Debra、Vincent
AI 前线导读:在斯坦福大学建立的项目 DAWNBench 竞赛中,CIFAR10 与 ImageNet 的表现引起了人们的关注,在目标基本一致的前提下,两者的准确度分别达 94% 和 93%,在成本和速度上均有亮眼的表现,其中 ImageNet 训练成本低至 25 美元,CIFAR10 训练成本仅为 0.26 美元!它们是如何做到这一点的?竞赛中还有哪些让人意外的发现呢?

更多干货内容请关注微信公众号“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

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 与竞价实例

这里要感谢 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(),即可坐等系统自动执行所有必要步骤,从而快速准确地利用半精度浮点运算完成模型训练。

ImageNet

相较于 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/


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中什么是上下文

所谓上下文,它是用来存储系统的一些初始化信息,例如在jboss中通过配置文件指定了数据源,那么在jboss启动的时候就把这个文件的相关信息加载到上下文中,于是在我们使用这个数据源的时候,就需要先获得系统的上下文&#…

jquery文件上传插件uploadify 讲解

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1.名词解释: tracker服务器:中文叫做跟踪器,主要做调度工作,在访问上起负载均衡的作用。&…

POJ 1651 Multiplication Puzzle(类似矩阵连乘 区间dp)

传送门:http://poj.org/problem?id1651 Multiplication PuzzleTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 13109 Accepted: 8034Description The multiplication puzzle is played with a row of cards, each containing a single positive integ…

25--最后一个单词的长度

文章目录1.问题描述2.代码详情1.问题描述 给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。 如果不存在最后一个单词,请返回 0 。 说明&…

MySQL 企业监控器 2.3.10 正式版发布

Oracle于近日发布了 MySQL 企业监控器 2.3.10 正式版。 MySQL企业监控器主要用于实施对数据库进行监控和管理。通过它,数据库管理员不但可以获得高级的数据复制和数据库监控功能,同时还可以简化安装流程。而且,无论是对于MySQL企业版&#xf…

Docker 跨主机网络方案分析

PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家。 上篇文章介绍了容器网络的单主机网络,本文将进一步…

java中为什么使用上转型和下转型

为什么使用上转型?因为当一个父类有很多子类,子类都重写了父类的方法并加以使用。这时候,如果要在之前代码让你用其他子类来实现,就变得很简单,只需要把A a new B();换成A a new C();(假设B和C都继承了A&…

session和cache的区别

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 以前实现数据的缓存有很多种方法,有客户端的Cookie,有服务器端的Session和Application。 其中Cookie是保存在客…

第四个

。 转载于:https://www.cnblogs.com/wxy2000/p/9657823.html

26-- 转换成小写字母

文章目录1.问题描述2.代码详情1.问题描述 实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。 示例 1: 输入: “Hello” 输出: “hello” 示例 2:…

java守护线程和用户线程的区别

Java中的线程可以分为两类,即用户线程和守护线程。用户线程是为了完成任务,而守护线程主要是为其他线程服务。 守护线程的唯一用途是为其他线程提供服务。守护线程会随时中断,因此不要在守护线程上使用需要释放资源的资源,如输入输…

初学duboo+zookeeper

看了很多相关资料,其实都没有自己动手试一次印象更深刻一些。找了很多教程,下工具,花了几个小时终于让程序跑起来了,下面说下步骤:1.java环境也就安装jdk,我使用的是1.7版本,jdk安装就不在这复述…

Fedora 17 Beta 版发布

Fedora团队今天发布了Fedora 17 Beta版本,这是正式版本发布前的最后一个重要的里程碑版本。据该团队介绍,正式版将在今年5月发布,将主要修复Beta版中发现的关键性bug。针对普通用户的桌面改进: 采用GNOME 3.4,提升了用…

27--字符串相加

文章目录1.问题描述2.代码详情1.问题描述 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。 注意: num1 和num2 的长度都小于 5100. num1 和num2 都只包含数字 0-9. num1 和num2 都不包含任何前导零。 你不能使用任何內建 BigInteger 库&…

[转] 一文弄懂神经网络中的反向传播法——BackPropagation

在看CNN和RNN的相关算法TF实现,总感觉有些细枝末节理解不到位,浮在表面。那么就一点点扣细节吧。 这个作者讲方向传播也是没谁了,666~ 原文地址:https://www.cnblogs.com/charlotte77/p/5629865.html 最近在看深度学习…

java线程组

线程组 线程组是Java线程编程所持有的概念。在Java中,线程组是指java.lang.ThreadGroup类的对象,每个线程都隶属于唯一的一个线程组,这个线程组在线程创建时指定并在线程的整个生命周期内都不能更改。可以通过调用包含ThreadGroup类型参数的T…

FreeBSD 8.3 发布

近日,FreeBSD开发团队放出了8.x稳定分支的8.3版本。此次发行的版本将支持amd64、i386、pc98和 sparc64等处理器类型。FreeBSD是一种类UNIX操作系统,但不是真正意义上的 UNIX 操作系统,它是由经过 BSD、386BSD 和 4.4BSD 发展而来的 Unix 的一…

Java中四种访问权限总结

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 一、Java中有四种访问权限, 其中三种有访问权限修饰符,分别为private、public、protected,还有一种不…

28--仅仅反转字母

文章目录1.问题描述2.代码详情1.问题描述 给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。 示例 1: 输入:“ab-cd” 输出:“dc-ba” 示例 2&…

Moving Average

移动平均算法Demo #!/usr/bin/python2.7 # Fetch data from BD and analyse.import json import urllib import traceback import numpy as np # import pandas as pd import matplotlib.pyplot as plt #from scipy import statsdef fetch_raw_data(url):try:response urllib.…