广告

百度披露深度学习on K8S技术实现细节

  • 浏览(1,217)
  • 评论(0)
  • 译者:k8s

4月22日,由K8S技术社区、Linux中国联合主办的K8S GeekGathering 2017吸引了国内容器领域关注者100+人到场参与,以下是百度资深研发工程师周倜的演讲实录整理:

百度资深研发工程师周倜


大家好,首先先做个自我介绍,我是主要方向是大规模分布式系统和PaaS平台,09年在上海交大本科毕业,主要负责百度的无人车、AI系统。现在比较热的是深度学习,那么深度学习在百度如何在K8S上跑一个深度学习框架。

1

为什么是K8S与AI做结合?

我们可以看到,类似百度这样的公司,其实是一个数据公司,它每天从网上采集大量的开放数据,并且他对用户的行为会产生大量的数据,而且有很多类似IOT上面的设备,大量的传感器和数据,在大数据处理方面,严重依赖于分布式存储和分布式计算框架,我举的例子都是开源的,百度是另外一套,类似于存储的话是HDFS。为什么我们要用K8S方案不是专有集群,专用集群的问题在于,会建多个不同的集群,成本高昂。专用集群每个集群的利用用难以提高,专用集群的在线伸缩能力弱。

物理机和虚拟机自动扩缩容上没有那么强,为什么我们不用K8S呢?为什么不建立AI的通用集群处理这个事情,摒弃专用集群的概念,等于是CPU内存、磁盘很大的库,可以使集群资源资源共享、分时复用的目的,不需要开发新的Framework来适配K8S,只需要支持Containerization。配上开发商的使用说明,很简单地在K8S集群上配置你的分布式的应用,类似于现在最火的Tensorflow也是,社区很多人会跟上它的分布式版本,这是开源的力量。

2

百度深度学习K8S实践

我主要介绍一下,我们这边最难的两点,一个是网络,一个是存储,基于百度内部系统做这些事情,分布式系统,我们自己有的是内部的,两种,一个是文件系统,一个是对象存储,我们也是完全改造K8S的系统,使内部有自己的名字服务,我们改造我们的K8S网络和服务,没有用服务器的概念,外部在公有云上,现在共享存储用的是我们的对象存储,在对象存储上加一层,构建我们的系统,我们用百度的BPC,用现在比较新的技术,IPVLAN,可以给容器和虚拟机都添加IP,这个IP可以包含在同一个网站上。这些东西的确很难,所以在这儿也不细展开,如果有兴趣可以交流一下。这是我们AI窗口集群的构造,还有一点,我们知道NV的市值涨了两三倍,GPU,在我看来,K8S提供了很好的,就是K8S Label,都可以加上Label,这边,比较大的ram是高的ram,可以使用K8S里面的概念,把相应的直接部署到带GPU的节点上,达到专节点专用的目的,这也是通用集群的概念。

那我们现在看一下,我们目前speech解决方案,这边是我们数据,图象识别、云识别、自然源处理和翻译,这边是云识别的例子,比如某个厂商和某个APP,调用了百度云识别的API,发出来的东西直接发到API server里面,传到kafka,走到paddle上,做线上模型的训练,还有深度学习本身有很多数据需要标注,深度学习最贵的地方是标注的数据,在这离线上有大部分标注的数据,我们百度内部自己的系统进行一个处理,再到我们paddle的模型里面训练,会自己把model返回到server,下面包括GPU的server。

3

百度深度学习平台PaddlePaddle

再介绍一下我们的PaddlePaddle,是百度2016年9月开源的一款深度学习平台,易用、高效、灵活,可伸缩,主要用于伸缩、电商、50多个应用,这个项目是完全开源的。已经5千多个星了。我们介绍一下PaddlePaddle的架构,跟一些主流架构一样,它采用的是参数服务器的架构,参数服务器本身是什么概念,不知道大家是否了解深度学习,深度学习本身是类似于分布式的计算框架,但是有一个特点,它所算的那些数据一定是全局的数据,而别的是拆成,互相算。深度学习的话,是需要每个人算一小块,算完的小块,要回去的时候,那些算的东西回去后是全局的概念,所以需要全局的参数服务器汇总这个整体的数据,在这边可以做个体现,P服务器可以分两种,一个是模型并行,一个是数据并举,模型参数特别多,一定计算量完成不了,界要拆开,在一个段落里面完成不了,要拆成两块,这个是模型并行,数据是数据量特别大,数据分成两块,模型一二和二三组成数据并行,这个基本组成了深度学习的架构。

我们继续看下去PaddlePaddle怎么处理这个架构,PaddlePaddle的分布式结构的特点是他所能做到的是更灵活的数据一致,我们刚才提到,你每次拉下数据之后,在底部汇总,一二三个里面,所有东西算完以后,返回给parameter server,首先问题在万一训练器1挂了怎么办,或者训练器一很快,其他的很慢怎么办。业界提出几个概念,一个是我们刚才说到的是同步技术下载,业界提出两种方案,一种是异步的,一种是同步的,配上缺损值,比如有三个节点,两个节点完成之后,他认为这次节点完成。PaddlePaddle,是同步,三个节点有两个节点返回,就认为是完整的迭代。MPI的框架,是属于密集型计算,不支持节点的fail。

4

PaddlePaddle on K8S技术细节

我们知道PaddlePaddle是深度学习框架,这个深度框架本身有什么部署上面的框架,首先是基于各种类型的应用,PaddlePaddle不只是训练应用,还包括API,还包括PaddlePaddle的服务,不知道大家知不知道,网上可以快速写深度学习的代码,直接返回结果的那种,让学习者学习的那种。还包括PaddlePaddle训练任务。包含多种服务的。我们认为百度内部集群是很大的集群,IDC划分的集群,大集群下做PaddlePaddle大集群下共享的,我们直接用space上的改造,配合百度内部的AP认证,还有代理性混布,我们知道的serving的服务是web服务,训练的服务是离线的,只需要把结果算出来就行。所以serving服务优先于training服务。有软硬限的方式进行超发,如果软限大与硬限就是第二级,如果没有设硬线是第三级,在这边,我们通过在离线混布和通过软硬限设置进行任务的超发,在百度非常常见,我们要保证集群的利用用达到一定高度。我们这边当时自己研发了GPU的调度,把它作为一种资源进行统一的调度,还有一个重要的功能是自动伸缩,我们要保证训练任务白天以serving为主,夜间以training。

分布式PaddlePaddle,做了内嵌式的服务发现,参数服务器和work的地址但写在trainer,我们自己去写了内嵌式的服务发现,可以通过pot接口,自动发现trainer,其他的功能是可以定义Job的并发数和完成度,可以定义训练数据共享目录挂载点和模型日志输出目录挂载点。

我们看到下面是在线服务,包括PaddlePaddle的serve,有一部分的离线计算要保证始终处于有的状态,那些任务只是保证它在使用率比较低的时候进行计算,大家知不知道谷歌有优先级是可以任何任务的优先级。接下来是在离线混布,机器数乘以时间这样的概念,如果深度学习在一集群学习,机器数越高,失败率越高,这是基本上不能接受的。如果你有这样的集群,这是不能接受的,在这边为什么会有那么高的失败率,主要原因并不是软件不软件,而是它有超发的问题,会cue到离线的,如果设置同步的,会等待所有的训练完成。我们的解决方案就是说需要对单个训练进行改造,让它不影响整体的训练。我们目前的改造方案,京东也有一个类似这样的方案,会引入master的进程,把逻辑数据分发给活着的trainer,激变trainer或者paramete sever被杀了,训练作业也能继续进行,当机群上其他高优先级作业后,K8S会增加其他的数量。

在1.6之前的话,为无人车服务的时候,我们需要有一种GPU的支持能力,当时K8S没有支持,我们自己写了一个资源调度,让相应的节点调度到相应的上面,K8S1.6推出了alpha的K8S API,被接受了,还有一个条件是仍然需要这样进行GPU的使用,也可以做资源的限制,这边是新的node,我们的PaddlePaddle是之前K8S和CoreOS等国际团队合作,发布了,当时发布了这样的文章,当时Andrew给了评价。我们再谈一下深度学习对未来的展望,现在PaddlePaddle的话,是百度自研的深度学习框架,12年就开始了,当时12年还没有这种东西,我们也是参考了,当时自己写了这么一套东西,是我们现在会参考MxNet等,优化api,优化分布式计算方法,我们对K8S的期望,因为参与的是更高级的资源管理,更好地支持任务的管理和调度,我们公司对网络IO非常敏感。然后我们更好地支持任务的调度,这块的话,和百度的使用方法不太一样,我们未来会在这方面进行改进,对于百度而言,我们会做CDS,VPC的K8S plugin回馈社区。

点击阅读原文下载演讲PPT。

下载提取码: tbsr

明日为您推送:EasyStack容器架构师王后明来自KubeCon欧洲峰会的热门话题分享和PPT下载。

欢迎广大技术人士投稿,

K8S技术社区将对年度作者给予特别奖励!

投稿信箱:admin@k8s.cn

K8S技术社区当前有两大技术推广平台,K8S技术社区官方网站(www.k8s.cn)和K8S技术社区微信公众平台(kubernetescn),我们欢迎广大K8S技术同好们关注支持,也希望集合K8S技术极客进群交流(筒子们后台留言微信号!),有任何建议或问题都可以随时与我们取得沟通(admin@k8s.cn),感谢支持!

 

  • 分享到:
  • icon
  • icon
  • icon
  • icon
箭头