路雪 张倩翻译

现在,所有人都可以在18分钟内训练ImageNet了

由 fast.ai 学员 Andrew Shaw、DIU 研究员 Yaroslav Bulatov 和 Jeremy Howard(fast.ai 创始研究员)组成的团队在 18 分钟内成功完成训练 Imagenet 的任务,准确率达到 93%。他们使用了 16 个 AWS 云实例(每个实例使用 8 个英伟达 V100 GPU)来运行 fastai 和 PyTorch 库。这一速度打破了在公共基础架构上训练 Imagenet 达到 93% 准确率的速度记录,且比谷歌在 DAWNBench 竞赛中使用其专有 TPU Pod 集群的训练速度快 40%。该团队使用的处理单元数量和谷歌的基准(128)一样,运行成本约 40 美元。

该团队的主要训练方法是:fast.ai 用于分类任务的渐进式调整大小和矩形图像验证;英伟达的 NCCL 库,该库整合了 PyTorch 的 all-reduce 分布式模块;腾讯的权重衰减调整方法;谷歌大脑的动态批量大小的一个变体,学习率逐步预热(Goyal 等人 2018、Leslie Smith 2018)。该团队使用经典的 ResNet-50 架构和具备动量的 SGD。

背景

四个月前,fast.ai 团队在 DAWNBench 竞赛中取得了巨大成功,他们使用单个机器(标准 AWS 公有云实例)实现了最快的 Imagenet 训练速度。谷歌在竞赛中的表现也很抢眼,其使用尚未公开的 TPU Pod 集群赢得了整个 Imagenet 速度类别的冠军。fast.ai 团队使用单个机器的训练时间为三小时,而谷歌的 TPU Pod 集群仅用了约半小时。而在该比赛之前,在公有云上训练 ImageNet 需要花费数天。

实验基础架构

快速迭代需要面临诸多挑战,比如:

  • 如何在没有大量可持续运行的昂贵实例时,在多台机器上轻松运行多个实验?

  • 如何便捷地利用 AWS 的 EC2 Spot 实例(比一般实例便宜 70%)?每次使用该实例时都需要从零开始重新设置。

fast.ai 为 DAWNBench 竞赛构建了一个系统,包括用于启动和配置新实例、运行实验、收集结果和查看进展的 Python API。该系统还有一些更有趣的设计:

  • 未使用配置文件,而是利用 Python API 写代码来配置实验。因此,该团队能够使用循环(loop)、条件句(conditional)等来快速设计和运行结构化实验,如参数搜索。

  • 围绕 tmux 和 ssh 写一个 Python API 封装,并启动 tmux 会话中的所有设置和训练任务。这方便后续登录机器和连接 tmux 会话,以监控进展、修复问题等。

  • 一切「从简」:避免 Docker 等容器技术或 Horovod 等分布式计算系统。该团队未使用复杂的集群架构(这样的架构需要单独的参数服务器、存储数组、集群管理节点等),而是仅使用具备常规 EBS 存储卷的单个实例类型。

单独来看,DIU 面临一系列挑战,最终开发出一个具备相似动机和设计的集群网络,能够并行运行很多大规模训练实验。该 nexus-scheduler 解决方案受到 Yaroslav 在谷歌 Borg 系统上运行机器学习实验的经验启发。

fast.ai 开发的工具集则关注单个机器实验的快速迭代,DIU 开发的 nexus-scheduler 关注鲁棒性和多机器实验。Andrew Shaw 将 fast.ai 软件的一部分融入 nexus-scheduler,这样创建出的系统就融合了二者最好的部分,可用于实验。

使用 nexus-scheduler 帮助该团队在分布式实验上进行迭代,如:

  • 为单个实验启动多台机器以实现分布式训练。这些用于分布式运行的机器被自动归为放置组(placement group),实现了更快的网络性能。

  • 通过 Tensorboard 进行监控,事件文件和检查点存储在区域级文件系统上。

  • 自动设置。分布式训练的多种必备资源(如 VPC、安全组和 EFS)以透明的方式进行创建。

AWS 提供了一个非常有用的 API(https://boto3.readthedocs.io/en/latest/),帮助该团队快速轻松地构建好所需的一切。他们使用英伟达的 NCCL 库进行分布式计算,该库实现了环形集群,且整合了 PyTorch 的 all-reduce 分布式模块。该团队发现 AWS 的实例非常可靠,且提供持续性能,这对利用 all-reduce 算法取得最好结果非常重要。

nexus-scheduler 将在 8 月 25 日进行首次官方发布。

使用 Tensorboard 分析网络利用情况。

一种简单的训练新技巧:矩形图像!

DAWNBench 竞赛之后,Jeremy Howard 认为深度学习实践者在做一件非常愚蠢的事情:大家用的是矩形图像(如 ImageNet 中使用的那些),在做预测的时候只裁剪中间的部分。还有一种广泛使用的方法(速度很慢)是裁剪 5 个位置(左上、左下、右上、右下及中心),并算出预测的平均值。这就引出了一个明显的问题:为什么不直接用矩形图像呢?

很多人对卷积神经网络有误解,认为它只能处理一种固定尺寸的图像,而且一定要是矩形。然而,多数库支持「适应」或「全局」池化层,这就完全克服了这一局限。当一些库(如 Pytorch)分配不使用这一特征的模型时,这没有什么用处——这意味着除非这些库的用户替换掉那些层,否则他们就只能使用固定尺寸和形状的图像(通常是 224x224 像素)。fastai 库可以自动将固定尺寸的模型转换为动态尺寸的模型。

目前还没看到有人尝试使用矩形图像进行训练,也没在任何论文中看到类似表述。目前也没有一个标准的深度学习库支持这一点。因此 Andrew 找到一种方法:结合 fastai 和 Pytorch 进行预测。

结果令人惊艳——fast.ai 达到 93% 的基准准确率所花费的时间缩短了 23%。

  • 不同方法的对比可点击以下链接进行查看:https://nbviewer.jupyter.org/github/bearpelican/Experiments/blob/master/rectangular_images/RectangularImageVisualization.html;

  • 它们的准确率对比参见:https://nbviewer.jupyter.org/github/bearpelican/Experiments/blob/master/rectangular_images/RectangularImageValidationComparison.html。

对比不同剪裁方法的 Jupyter Notebook 片段。「Center Crop Image」是原始图像,「FastAi rectangular」是 fastai 团队提出的新方法,「Imagenet Center」是标准方法,「Test Time Augmentation」是 multi-crop 方法的示例。

渐进式调整大小、动态批量大小等

fast.ai 在 DAWNBench 竞赛中取得的主要进展是引入了渐进式图像尺寸调整来进行分类——在训练开始时使用小图像,随着训练的进行逐渐增加图像尺寸。采用这种做法,刚开始的时候模型非常不准确,但它可以很快看到大量图像并取得快速进展,在接下来的训练中,模型可以看更大的图像,学习更加细粒度的区别。

这一新研究还对一些中间的 epoch 使用更大的批量大小,以更好地利用 GPU RAM 并避免网络延迟。

最近,腾讯发布了一篇很不错的研究论文(https://arxiv.org/abs/1807.11205),显示可以在 2048 块 GPU 上用不到 7 分钟的时间训练 Imagenet。他们提到了一个 fast.ai 之前没有尝试过的方法,但这个方法非常合理:移除批归一化层上的权重衰减。使用这种方法可以从训练时间中再缩减几个 epoch。-(腾讯的论文还使用了 NVIDIA Research 开发的动态学习率方法 LARS,fastai 团队也开发了研究人员为 fastai 开发的,但还没有包含在这些结果中。)

结果

综合以上种种,fast.ai 在 16 个 AWS 实例上用 18 分钟的时间完成 Imagenet 训练,计算总成本大约为 40 美元(包括机器配置时间的成本)。能够在超过 100 万张图像的数据集上进行训练有很多好处,比如:

  • 拥有大型图像库的组织(如放射科、汽车保险公司、房源挂牌服务和电子商务网站)现在可以创建自己的定制化模型。虽然使用如此多的图像进行迁移学习通常会过犹不及,但是对于高度专业化的图像类型或细粒度分类(如医学成像中常见的),使用大量数据可能会得到更好的结果。

  • 小型研究实验室可以利用不同的架构、损失函数优化器等进行实验,并在 Imagenet 上进行测试,这也是许多评审人员希望在论文中看到的。

  • 使用标准公共云基础架构,则开启前沿深度学习研究就不需要前期成本投入。

过去 25 年,各种关于「好结果需要大量计算」的言论层出不穷,但是研究人员目前提出的有趣想法很少是利用大量计算做出的,如批归一化、ReLU、dropout、adam/adamw、LSTM 等。今天,每个人都可以获取到所需的大量计算基础设施。使深度学习更平民化比只关注大公司的成就有更长远的影响力,因为前者可以利用全世界数百万研究人员的聪明才智。

原文链接:http://www.fast.ai/2018/08/10/fastai-diu-imagenet/

产业ImageNetGPU
2
相关数据
卷积神经网络技术
Convolutional neural network

卷积神经网路(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。卷积神经网路由一个或多个卷积层和顶端的全连通层(对应经典的神经网路)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网路能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网路在图像和语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网路,卷积神经网路需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。 卷积网络是一种专门用于处理具有已知的、网格状拓扑的数据的神经网络。例如时间序列数据,它可以被认为是以一定时间间隔采样的一维网格,又如图像数据,其可以被认为是二维像素网格。

分布式计算技术
Distributed computing

在计算机科学中,分布式计算,又译为分散式運算。这个研究领域,主要研究分布式系统如何进行计算。分布式系统是一组电脑,通过网络相互链接传递消息与通信后并协调它们的行为而形成的系统。组件之间彼此进行交互以实现一个共同的目标。

超参数技术
Hyperparameter

在机器学习中,超参数是在学习过程开始之前设置其值的参数。 相反,其他参数的值是通过训练得出的。 不同的模型训练算法需要不同的超参数,一些简单的算法(如普通最小二乘回归)不需要。 给定这些超参数,训练算法从数据中学习参数。相同种类的机器学习模型可能需要不同的超参数来适应不同的数据模式,并且必须对其进行调整以便模型能够最优地解决机器学习问题。 在实际应用中一般需要对超参数进行优化,以找到一个超参数元组(tuple),由这些超参数元组形成一个最优化模型,该模型可以将在给定的独立数据上预定义的损失函数最小化。

学习率技术
Learning rate

在使用不同优化器(例如随机梯度下降,Adam)神经网络相关训练中,学习速率作为一个超参数控制了权重更新的幅度,以及训练的速度和精度。学习速率太大容易导致目标(代价)函数波动较大从而难以找到最优,而弱学习速率设置太小,则会导致收敛过慢耗时太长

机器学习技术
Machine Learning

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

损失函数技术
Loss function

在数学优化,统计学,计量经济学,决策理论,机器学习和计算神经科学等领域,损失函数或成本函数是将一或多个变量的一个事件或值映射为可以直观地表示某种与之相关“成本”的实数的函数。

动量技术
Momentum

优化器的一种,是模拟物理里动量的概念,其在相关方向可以加速SGD,抑制振荡,从而加快收敛

优化器技术
Optimizer

优化器基类提供了计算梯度loss的方法,并可以将梯度应用于变量。优化器里包含了实现了经典的优化算法,如梯度下降和Adagrad。 优化器是提供了一个可以使用各种优化算法的接口,可以让用户直接调用一些经典的优化算法,如梯度下降法等等。优化器(optimizers)类的基类。这个类定义了在训练模型的时候添加一个操作的API。用户基本上不会直接使用这个类,但是你会用到他的子类比如GradientDescentOptimizer, AdagradOptimizer, MomentumOptimizer(tensorflow下的优化器包)等等这些算法。

池化技术
Pooling

池化(Pooling)是卷积神经网络中的一个重要的概念,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效的原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。

参数技术
parameter

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

迁移学习技术
Transfer learning

迁移学习是一种机器学习方法,就是把为任务 A 开发的模型作为初始点,重新使用在为任务 B 开发模型的过程中。迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务,虽然大多数机器学习算法都是为了解决单个任务而设计的,但是促进迁移学习的算法的开发是机器学习社区持续关注的话题。 迁移学习对人类来说很常见,例如,我们可能会发现学习识别苹果可能有助于识别梨,或者学习弹奏电子琴可能有助于学习钢琴。

权重技术
Weight

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

深度学习技术
Deep learning

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

张量技术
Tensor

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

准确率技术
Accuracy

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

机器之心
机器之心

机器之心是国内领先的前沿科技媒体和产业服务平台,关注人工智能、机器人和神经认知科学,坚持为从业者提供高质量内容和多项产业服务。

返回顶部