摘要:深度学习是一门依据经验的科学,基础设施的质量,能够对深度学习的效果起到非常大的作用。幸" /> 摘要:深度学习是一门依据经验的科学,基础设施的质量,能够对深度学习的效果起到非常大的作用。幸运的是,如今的开源生态系统,能让任何人都搭建起优秀的深度学习基础设施。在这篇文章中,我们将会讲述深度学习的工作方式,以及它所依赖的基础设施。     (转载至:) 说到机器学习、大数据,大家听..." />

深度学习基础设施

深度学习基础设施

class=”zhaiyao”>摘要:深度学习是一门依据经验的科学,基础设施的质量,能够对深度学习的效果起到非常大的作用。幸运的是,如今的开源生态系统,能让任何人都搭建起优秀的深度学习基础设施。在这篇文章中,我们将会讲述深度学习的工作方式,以及它所依赖的基础设施。

   
(转载至:)
说到机器学习、大数据,大家听到的是 Hadoop 和 Spark 居多,它们跟
TensorFlow 是一个什么样的关系呢?是不是有 TensorFlow 就不需要 Spark
这些?
     像 Hadoop 跟
Spark,背后都是 MapReduce。Hadoop 更多是去写文件,Spark
更多是通过内存。它们通过 MapReduce,下发 task 给这些 executor
去做。它们擅长的这种并行运算叫“Embarrassingly
Parallel”,这种并行是非常完美的并行,要非常完美,最后收集结果。那么
Hadoop、Spark 用在哪?

澳门新葡亰游戏网址 1

 
 澳门新葡亰游戏网址 2

深度学习是一门依据经验的科学,基础设施的质量,能够对深度学习的效果起到非常大的作用。幸运的是,如今的开源生态系统,能让任何人都搭建起优秀的深度学习基础设施。

  
机器学习第一步非常关键,就是对数据的预处理,因为互联网公司有非常多结构化数据,存在
Hive、MySQL
里面。这些数据经过处理以后才能供机器学习使用。这类的预处理非常适合用
Hadoop、Spark
这些来做。

在这篇文章中,我们将会讲述深度学习的工作方式,以及它所依赖的基础设施。

   TensorFlow
特别擅长做深度学习
,如果一些神经网络,最后放在一个 graph
上看的话,很轻松就会达到一个很复杂的程度。所以,这样一个 graph,用前面的
MapReduce
其实很难写,而且它也没办法那样完美并行,而且深度学习还有个反向传播的过程,更难做了。所以 Hadoop 跟 Spark
从架构本质上,根本就是做不了深度学习的
。所以就出现了
TensorFlow。

使用场景


一般情况下,深度学习的作用是着手去让一个想法生效,然后你再用这个想法去解决某个小问题。在这个时候,你要立刻进行大量的ad-hoc实验。理想情况下,你只需要SSH进一台机器,在屏幕中运行一段代码,然后在不到一个小时的时间里,就可以获得结果。

要想让这个模式起作用,通常情况下需要看到它在哪种情况下无法起作用,然后再去寻找解决这些限制的方式(和开发新软件系统差不多,你需要多次运行代码,了解它的表现情况)。 

你需要从多个角度来审视深度学习的模式,才能真正的了解它在学习些什么。 

在你证明了模式有效之后,你就需要扩大其规模,为其配备更大的数据集和更多的GPU。这个工作需要你付出巨大的精力,还要好几天的时间。

早期的研究过程不成架构,但是速度快;之后的研究过程则更加有条理,但是过程却很痛苦。然而,要想获得好的结果,你必须要经历这种痛苦。 

   为什么需要
TensorFlow 来做深度学习?TensorFlow 大体的思路是这样,用
Python,一般是用 Python 定义好深度学习神经网络以后,TensorFlow 会做成
DAG,有向无环图,然后把 DAG 交给 TensorFlow 的 C++ Core
来运行,这样保证它的运算效率非常高。所以我个人认为,对于一个 framework
是否支持深度学习,最关键的就是:它是否支持构建 DAG 和进行 DAG
运算

基础设施 


  • 软件

澳门新葡亰游戏网址 3 

我们的大多数研究代码都是用Python写的。在GPU计算方面,我们主要使用TensorFlow(在一些特别的时候还会使用Theano)。而在CPU方面,除了TensorFlow和Theano之外,我们还使用了Numpy。有的时候,研究人员还会在TensorFlow之上使用一些更高级别的框架,例如Keras。与大多数深度学习社区一样,我们使用的是Python
2.7版本。

  • 硬件 

在理想状态下,让cluster中node的数量翻倍,能够让runtime所需的时间减少一半。然而,在深度学习领域,很多GPU却并非如此。要想获得最好的性能,你就需要使用最好的GPU。我们还需要很多的CPU,用作模拟装置,加强学习环境,或者降低模块的规模。

澳门新葡亰游戏网址 4 

澳门新葡亰游戏网址,AWS为我们贡献了很好的计算能力,我们使用它们来当做CPU实例,减少GPU的负担。我们需要自己的实体服务器,主要用来运行Titan
X
GPU。从长期来看,我们还需要一个混合云:在使用不同的GPU、互联连接时,它会发挥重要的作用,对于未来的深度学习来说非常重要。 

澳门新葡亰游戏网址 5 

  • 供给

我们使搭建基础设施的方式,类似许多公司对待产品的方式:它必须要展示一个简单的界面,可用性和功能性一样重要。我们使用了多种工具来管理所有服务器,并且尽可能用相同的方式对它们进行配置。

澳门新葡亰游戏网址 6 

在设置AWS云资源(实例、网络路由、DNS记录等)时,我们使用了 Terraform。我们的云端和物理node运行的是 Ubuntu,并且使用用Chef进行配置的。所有的cluster都使用了非重叠IP范围,在接入公共互联网的时候,都使用了用户笔记本上的OpenVPN,以及物理node上的strongSwan(它扮演的是AWS Customer
Gateways的角色)。

我们会储存人们的home目录、数据集、以及 NFS(实体硬件上)和EFS/S3(AWS上)的结果。

  • 组织

很多时候,可扩展基础设施会让一些简单的事情变得复杂。因此我们为此付出了很多的经历,我们不断使用新的工具,让使用分布式use-case变得和本地use-case一样简单。

我们提供了一个SSH node的cluster用来完成ad-hoc实验,并且为物理和AWS
node运行 Kubernetes。我们的cluster覆盖了3种AWS区域。

Kubernetes要求每一个job都是一个Docker容器,这给我们提供了依赖隔绝和代码快照功能。然而,打造一个新的Docker容器会让研究者花费更多本来已经非常宝贵的时间,因此我们提供了一个工具,它可以将研究者笔记本中的代码转化为一张标准图像。

澳门新葡亰游戏网址 7 

TensorBoard中的模式学习曲线

我们将Kubernetes的flannel网络直接暴露在研究者的笔记本上,允许用户将无缝通过网络接入正在运行的job,这对于接入TensorBoard等检测服务来说非常实用。

 澳门新葡亰游戏网址 8

kubernetes-ec2-autoscaler


我们的工作充满了突发性和各种难以预料的事情:一个原本只需要一个核心的实验突然需要1000个核心。例如,在几周的时间内,一个本来只需要一个Titan
X的实验,变成了需要60个Titan X的实验,然后突然又需要将近1600个AWS
GPU。因此,我们的云端基础设施需要能够动态调节Kubernetes node的能力。

在 Auto
Scaling群组中运行Kubernetes
node很简单,但是很难正确管理这些群组的数量。在batch
job提交之后,cluster就能马上知道它所需要的资源,并且直接对资源进行分配。(对比之下,AWS的Scaling
Policies会逐渐的增加新node,知道满足对资源的需求,这种做法需要经过多次迭代)。另外,在终止它们以避免丢失in-flight
job之前,cluster还需要drain node,

在进行大规模的batch
job时,我们总是会倾向于使用原始EC2,然而Kubernetes生态系统却能给我们带来很多价值:简单易用的工具、登录、检测、在运行的实例中对物理node进行拆分管理等等。准确的让Kubernetes完成自动规模化,比使用原始EC2重建整个生态系统要简单的多。

因此,我们推出了kubernetes-ec2-autoscaler,这是一个针对Kubernetes推出的对批处理进行了优化的规模化管理工具。在Kubernetes上,它扮演了普通的Pod的角色,而且只需要将你的worker
node放在Auto Scaling群组中。 

澳门新葡亰游戏网址 9 

Kubernetes cluster的Launch配置

只有在poll了Kubernetes master的状态后,自动规模化工具才会生效,如果有额外的计算能力存在,它会耗干相关的node,并且最终终止它们。如果需要更多的资源,它会计算哪些服务器需要被创建,然后根据计算结果增加适量的Auto
Scaling群组。

kubernetes-ec2-autoscaler会处理多个Auto
Scaling群组、CPU之外的资源(内存和GPU),以及Job的细微限制(例如AWS区域和实例体积)。

另外,突发的工作量会导致Auto
Scaling群组超时和错误,这是由于AWS并不提供无线的容量。在这些情况下,kubernetes-ec2-autoscaler会探测错误,并且向次要的AWS区域进行溢出。

我们的基础设施,正在为深度学习研究人员提供最大化的效率,让他们专注于科研。我们正在打造更多的工具,继续改善这个基础设施,并且将会在未来几周或几个月内将最新进展分享给所有人。

转载自:SDK.cn

原    文:Infrastructure for Deep
Learning
译    文:SDK.cn
作    者:Christian(编译)

来源:SDK.cn

数据准备好了之后,我们把数据放在分布式存储里面。上面跑分布式
TensorFlow
,然后 TensorFlow 用集群里的 CPU 资源和 GPU 资源做
training
。 当模型训练好,用 TensorFlow Serving
能够接收线上的请求,实时做出预测
。分布式存储和计算,这样两块组合起来,这是深度学习平台
elearn 做的事情

澳门新葡亰游戏网址 10

overview


    elearn 是 TaaS
(TensorFlow as a Service),去年 8 月底开始研发,受到 Google CloudML
的启发。我们 elearn
的一个核心想法就是:我们让算法工程师可以专注于算法,他们不用再多花精力去搞
CPU 资源、去搞发布
。他们只要专心写算法就可以了,后面的事情全部交给
elearn。繁琐的事情,比如分布式存储、计算资源的弹性伸缩、IP / port
的管理、container 的生命周期,全部变成 API,不用管了。尤其这里面 IP
的管理 pod 的管理,本来也不应该算法工程师操心的。

  
而他们的现在现状是什么呢?现在算法工程师要操心非常多,他写完了之后,不知道怎么转化成工程产品;怎样大规模做
training;怎么做模型的版本管理,再到上线了以后,预测的性能不行。
  
这一切,导致深度学习没有办法拓展到更多业务,无法拓展到工程师这边来。然后让我们觉得
Deep Learning 好像有一点束之高阁的感觉

GPU: 讲到深度学习,大家一般都比较好奇
GPU 这方面的东西。GPU 很有意思,一般服务器会装好多块 GPU
卡,但是如果用的时候不做限制,就会导致 10
块卡全部用满。因此,需要所有同事建个微信群,大家商量好,你用 1
号卡,我用 2 号卡,第三个人用 3 号卡,基本上沟通靠微信群。这样 10
块卡的利用率极低。关键问题就在于需要手动设置两个环境变量
CUDA_DEVICE_ORDER 和 CUDA_VISIBLE_DEVICES 来限制使用 GPU。
你要知道没有开发者能一定记得每次设置这两个环境变量,而且这两个环境变量不能写在
.bashrc 这样的配置里面,因为每个人每次能够用的空闲 GPU
卡是不一样的。
但是如果在 elearn 的
container 里看到的,机器上虽然有 10 块卡,如果你只要一块卡,那么 elearn
就能做到让你在 container
里就只能看到一块卡,即使用爆了,也只能用这一张卡。这就是为什么要通过
container 来使用 GPU

澳门新葡亰游戏网址 11

  • 说到
    GPU,提一句它的“内存”,跟平常的内存不一样, TensorFlow
    里它默认是抢占式的
    ,一上来就把这块 GPU
    所有的内存都抢掉,防止后续的内存碎片问题,但这个设置其实是可以取消的。
  • 再看 GPU 的 Docker
    image 直接用 Nvidia 打的 image 就可以了,还有基于此的
    TensorFlow官方GPU image,非常好用。
  • 最后讲到 GPU 跟
    Docker。一说到在 Docker 上用 GPU,很多人都以为一定要用 Nvidia
    修改版的 nvidia-docker 才行。其实根本不需要,直接用原生 Docker
    就能做到前面的效果,而且 Kubernetes 也是这样做的。Kubernetes
    只是帮你分 GPU ID,剩下的事情,比如原来 nvidia-docker
    帮你做掉的事情,是需要 elearn 帮你做的。
网站地图xml地图