OpenAI 教你如何构建深度学习研究的基础设施
编者按:OpenAI研究工程师 Vicki Cheung, Jonas Schneider , Ilya Sutskever, and Greg Brockman在本文中分享了从事Deep Learning研究工作所需要的基础设施(软件、硬件、配置和编制),举例说明如何运用开源Kubernetes-ec2-autoscaler自动扩展深度学习研究中的网络模型,将有助于广大深度学习研究爱好者构建自己的深度学习基础设施。
深度学习是一门实证科学,一个研究团队的基础设施建设将对未来的研究工作产生重大影响。所幸,当今的开源生态系统能够使任何人具备构建更为完善的深度学习基础设施的能力。
在这篇文章中,我们将为大家介绍深度学习研究通常是如何进行的,描述我们为了支持深度学习研究所选择基础设施,和开源Kubernetes-ec2-autoscaler,一种用于Kubernetes的批次优化扩展管理器。我们希望,这篇文章有助于你构建自己的深度学习基础设施。
用例
深度学习的发展通常源于一个构想,你运用一个小问题来测试该构想的可行性。 在这个阶段,你想要快速开展许多特设实验。理想条件下,你仅需要运用SSH(外壳安全协议)连接一台计算机,在屏幕上编写脚本代码,通过这样的操作,获取结果,整个研究过程耗时不超过一个小时。
要使构建的模型真的有用通常会经历很多次失败,之后找到可行的方案克服模型本身存在的局限性。(这一过程与随意建立一种新型软件系统相似,你需要多次重复运行自己的代码,这样之后才能够想象出它们将产生何种结果)。
你需要多角度检测自己的模型,才能想象出这些模型到底是如何学习的。Dario Amodei的这种强化学习智能体(控制右边的球拍)在乒乓球比赛中获得较高得分,但是,当你观察它是如何打球时,会发现右边的球拍一直停留在原地没有移动。因此,深度学习基础设施必须能够允许用户灵活地反观所采用的模型,仅仅展示出总结性的统计结果是不够的。
当你的模型一旦具有广阔的应用前景时,你会想要将其扩展应用到更大的数据集中和分辨率更高的GPU中。 这将是一个长远的工作,需要做很多轮的检测,会持续很多天。 在扩展应用过程中,需要认真管理实验过程,非常谨慎地选择超参数变化范围。
早期的研究过程缺乏系统性,且操作快;相比之下,后期的研究是有条不紊地进行的,虽然在某种程度上显得费力,但是,对于获取良好的实验结果是必不可少的。
实例
论文Improved Techniques for Training GANs开篇便讲述了Tim Salimans曾设计出几种方法,用于改进 生成对抗性网络(GAN)训练 。我们在这里将以最简化的方式描述这些观点(这些观点恰好能够产生最为美观的样本,尽管不是最好的半监督学习)。
GANs由一个生成器网络和一个鉴别器网络构成的。生成器试图愚弄鉴别器,鉴别器试图区分生成性数据和真实数据。凭直觉,我们会认为一个能够愚弄所有鉴别器的生成器必定具有良好的性能。但是,仍然存在一个难以克服的难题:总是输出几乎相同的(简直是逼真的)样本将致使生成器“崩溃”。
Tim提出下列观点,即 为鉴别器提供小批次的样本作为输入信息,而不是仅仅提供一个样本 。这样一来,鉴别器能够分辨出生成器是否总是产出一种单一图像。当生成器“崩溃”时,网络将对生成器进行梯度调整来纠正这一问题。
下一步将是基于MNIST和CIFAR-10的观点 构建原型 。这要求尽可能快地为一个小型模型构建原型,然后,将所构建的模型原型在真实数据上运行,并检测获取的结果。经过几次快速循环后,Tim获取了CIFAR-10样本,这一成果令人感到兴奋不已,是我们见过的在该数据集中获得的最好的样本。
然而, 深度学习(通常称之为AI算法)必须得到扩展 ,使之真正取得令人印象深刻的应用成果—— 一个小型 神经网络 能够用来证实一个构想(或概念),但是,一个大型神经网络能够用于解决实际问题,得到切实可行的方案。因而,Ian Goodfellow曾深度扩展该模型,致力于研究ImageNet。
运用我们的模型学习生成的ImageNet图像
利用一个更大的模型和一个更为大型的数据集,Ian需要在多个GPU中并行运行该模型。研究过程中每一阶段的作业都将把多台计算机的CPU与GPU利用率提升至90%,但是,即便是这种模型也需要花费很多天进行训练。在这个研究过程中,所进行的每一个实验都变得非常有价值,他将认真地记录每个实验的结果。
基础设施
软件
我们TensorFlow代码的样本
在我们的研究中,大部分代码是用Python编写的,这一点可以从我们的开源项目中略知一二。通常情况下,我们用TensorFlow(在特殊情况下,运用Theano)计算GPU;使用Numpy或其他框架计算CPU。有时,我们的研究员也运用一些优于TensorFlow的框架来计算GPU或CPU,如Keras。
与很多深度学习研究团队一样,我们运用Python 2.7。通常我们使用能够便捷打包且用于性能优化的Anaconda处理难以打包的数据库,如OpenCV,并 优化一些科学数据库的性能。
硬件
对于一个理想的批次作业,使集群中的结点数量成倍增长将会把代码运行的时间缩减一半。遗憾的是,在深度学习中,人们通常从许多GPU中观察到次线性加速现象。要具备高性能的模型需要顶级的GPU。我们也将多数CPU用于模拟器,强化学习环境,或小规模模型(在CPU上的运行速度并不比在GPU上快)。
Nvidia-smi下满载的Titan Xs
AWS为我们慷慨地提供了大量的计算方法。我们正将这些计算方法应用到CPU实例中,并用于水平扩展GPU。我们也运行自己的服务器,主要以运行Titan X GPU为主。我们期望研发出一种混合云:对于用不同的GPU,连接和其他技术开展实验极为重要,这将有助于未来深度学习研究工作的发展。
在htop上同样的物理单元显示有许多未占用的CPU。我们通常将CPU密集型工作与GPU密集型分开运行。
配置
我们对待深度学习研究的基础设施,就像许多公司对待自己的产品一样:它必须能够呈现出一种简单的界面,可用性与功能性同等重要。我们运用一套相互关联的工具管理所有的服务器,尽可能保证每台服务器的配置都一样。
Terraform配置片段管理自动扩展组。Terraform创建,调整,或销毁运行的云资源来匹配你的配置文件。
我们运用Terraform建立AWS云资源(实例,网络路由,DNS记录等)。我们的云和物理结点现在运行Ubuntu,并用Chef进行配置。为了实现加速处理,我们运用Packe预处理AMI集群。我们的所有集群均使用非重叠的IP范围,运用用户的便携式电脑上的OpenVPN和物理结点(用作AWS的用户门户)的strongSwan连接公共网络。
我们将用户的主目录,数据集和结果存储在NFS(在物理硬件上)和EFS/S3(在AWS上)上。
编制
可扩展的基础设施经常致使简单地情况变复杂。我们对小规模工作和大规模工作一视同仁,投入相同的努力构建基础设施。当前正在积极扩充工具包,以便用户能够同时享用分布式用例和局部用例。
我们为特设的实验提供一个SSH结点集群,运行Kubernetes作为物理结点和AWS结点的集群调度器。集群跨越3个AWS区域——我们的作业具有突发性,有时会突然占用某些单个区域的全部资源。
Kubernetes要求每一个作业都是一个Docker容器 ,这样便能够为我们提供依赖分离和代码快照。但是,建立一个新的Docker容器能够为研究员操作代码循环增加额外的宝贵时间,因而,我们也提供工具,旨在透明地将研究员便携式电脑上的代码转移到一幅标准图像上。
在TensorBoard上构建学习曲线
我们将Kubernetes的flannel网络直接应用到研究员的便携式电脑上,允许用户使用无缝网络访问研究员运行的作业。这对于访问监测服务,如TensorBoard,非常有用。(我们最初采用的方法要求——从严格的分离角度来看,更为快速无误——要求人们为其想要暴露的端口提供一种Kubernets服务,但是,我们发现采用这种方法会遇到很多难题)。
Kubernetes-ec2-autoscaler
我们的工作量具有突发性和不可预测性:一系列研究可能快速地从单台计算机实验扩展到1000台。例如,几周内,一个实验从一个交互式阶段发展到要在单一的Titan X上运行,再到需要60 Titan X,最后发展到需要在将近1600个 AWS GPU上运行。因而,我们的云基础设施需要动态配置Kubernetes结点。
在自动扩展组内能够很容易地运行Kubernetes结点,但是,要合理地控制这些自动扩展组的规模将变得越来越难。在批次作业结束后,集群将能够准确地了解到自己所需要的资源,能够直接分配这些资源。(与之形成鲜明对比的是,AWS的扩展策略能够逐个加速每一个新结点,直到仍有剩余资源,这个扩展过程将持续多个循环。)因而,在集群终止这些结点前,需要洩流这些结点,以避免丢失正在运行的作业。
仅利用原始的EC2进行大批量作业是非常诱人的,的确,这也是我们研究工作的起点。但是,Kubernetes生态系统带来的价值更大:低阻力的工具,日志,监测,具备脱离正在运行的实例管理物理结点的能力等类似优点。合理地扩展Kubernetes要比基于原始EC2重新构建该生态系统更为简单。
我们将要发行Kubernetes-ec2-autoscaler,一种用于Kubernetes的批量优化扩展管理器。这种管理器能够在Kubernetes的一种常规Pod上运行,仅要求你的工作结点在自动扩展组内。
Kubernetes集群的启动配置
自动扩展器通过搜集Kubernetes主结点的状态进行工作,主节点的状态包括需要用于计算集群资源问询和能力的一切资源。 在可用资源过量的条件下,自动扩展器洩流相关的结点,最终终止这些结点 。如果需要更多的资源,自动扩展器将计算得出应当创建什么类型的服务器,并适当地扩大自动扩展组的规模(或简单地释放被洩流的结点,这将缩减新结点加速花费的时间)。
Kubernetes-ec2-autoscaler能够同时兼顾多个自动扩展组,享有CPU之外的资源(内存和GPU),并且能够精细地约束你所运行的作业,如AWS区域和实例规模。 此外,由于即便是AWS也不具备无限的内存,突发性工作量将导致自动扩展组超时运行,并产生误差。在这种情况下,Kubernetes-ec2-autoscaler能够检测误差,并将多余的作业分配到次级AWS区域。
我们用于深度学习的基础设施旨在最大限度地提高深度学习研究者的工作效率,使他们能够专心致志地投入到科研中。我们正在构建工具进一步改进我们的基础设施,完善工作流程,并将在未来几周和几个月内分享这些工具。欢迎大家共同努力加快深度学习研究的发展!
via Vicki Cheung et al
本文由雷锋网 (搜索“雷锋网”公众号关注) 独家编译,未经允许拒绝转载!