PaddlePaddle发布基于Docker的AI系统开发流程

继两周前(2017年3月11日)PaddlePaddle社区发布新的PythonAPI之后,最近又发布了对应的新版Docker镜像,并优化了镜像的体积和组织方式。

这些工作的目的是方便大家在单机和Kubernetes机群上运行分布式深度学习作业。当Baidu Research官方Twitter账号发布这条消息并且被Andrew Ng转发后,收到了很多反馈。其中有朋友们好奇Docker在AI中的应用是不是“overkill”。其实这些工作都是为了简化用户需要做的操作。只是Docker在AI系统中的应用还刚刚开始,大家可能还不熟悉,所以我们写作本文,介绍PaddlePaddle与众不同的基于Docker的编译、开发、测试、调试、发布、部署、和运行的全流程及其背后的设计思路。

除了PaddlePaddle本身,基于它开发的Deep Learning入门教材也是基于Docker image 的形式发布的。这本书中的每一章都是一个Jupyter Notebook。而Docker image里包括了Jupyter server、PaddlePaddle和所有被依赖的软件,所以大家不需要安装软件即可运行和浏览这本书,修改文中的例子程序并且执行和观察变化。

引入Docker也使得我们不需要修改PaddlePaddle的源码即可同时支持多种操作系统 -- Linux、Mac、Windows -- 因为这些操作系统都可以运行Docker了。

而且PaddlePaddle的开发环境(各种软件和配置)本身也被发布为一个Docker image,所以不仅是PaddlePaddle程序的用户、基于PaddlePaddle开发AI程序的用户,甚至PaddlePaddle的开发者,也都使用Docker container来开发和调试。

如果不希望使用Docker运行Paddle应用,用户可以使用开发环境镜像快速编译Paddle的.deb安装包,直接安装在企业的特定运行环境中运行!

应用镜像

《Deep Leanring 101》这本书是在Github社区里开发的一个PaddlePaddle应用程序。让我们先从这本书开始,解释PaddlePaddle应用开发和发布的过程吧。

因为PaddlePaddle社区已经把书籍的Docker镜像发布到了dockerhub.com,所以大家只需要执行一条命令即可运行这本书:

docker run -p 8888:8888 paddlepaddle/book:0.10.0rc2

如果从国内访问dockerhub.com速度慢,也可以访问PaddlePaddle社区在中国香港维护的Docker registry 服务:

docker run -p 8888:8888 docker.paddlepaddle.org/book:0.10.0rc2

随后只需要在浏览器打开链接 http://localhost:8888,选择一个感兴趣的章节,即可在浏览器里阅读书籍。界面如下图所以。用户可以点击上方工具栏的“运行”按钮来运行样例代码,查看输出的结果,并对照书籍开始学习,体验Paddle带来的深度学习之旅。

如果大家好奇这本书的Docker镜像的创建方法,可以参见这个脚本程序 https://github.com/PaddlePaddle/book/blob/develop/.tools/build_docker.sh,并参见下文。大家可以把自己基于PaddlePaddle开发的应用发布出来,便于用户在单机和Kubernetes机群上运行。

生产环境镜像

上述书籍镜像都是基于PaddlePaddle的生产环境镜像(production iamge)构建的。生产环境镜像是任何PaddlePaddle应用镜像的基础,其中只包括build好的PaddlePaddle以及Python等必要的依赖,这样使其体积尽量小。目前PaddlePaddle社区维护以下四种生产镜像,分别对应包括不同CPU和GPU指令集的程序。

  • GPU/AVX paddle:0.10.0rc2-gpu
  • GPU/no-AVX paddle:0.10.0rc2-gpu-noavx
  • no-GPU/AVX paddle:0.10.0rc2
  • no-GPU/no-AVX paddle:0.10.0rc2-noavx

其中GPU版本镜像由于包含CUDA driver,体积会略大于纯CPU版本的镜像。而no-AVX镜像则提供可以兼容部分较早型号的不支持AVX指令集的CPU。也有一些云服务提供商提供的虚拟机不支持AVX指令集。

基于生产环境镜像开发应用

下面我们演示使用PaddlePaddle 生产环境镜像构建应用的方法。首先我们编写一个应用程序/work/myapp.py:

import paddle.v2 as paddle import paddle.v2.dataset.uci_housing as uci_housing def main(): paddle.init(use_gpu=False, trainer_count=1) x = paddle.layer.data(name='x',type=paddle.data_type.dense_vector(13)) y_predict = paddle.layer.fc(input=x, size=1) y = paddle.layer.data(name='y', type=paddle.data_type.dense_vector(1)) cost = paddle.layer.mse_cost(input=y_predict, label=y) parameters = paddle.parameters.create(cost) optimizer = paddle.optimizer.Momentum(momentum=0) def event_handler(event): if isinstance(event, paddle.event.EndPass): result = trainer.test( reader=paddle.batch(uci_housing.test(), batch_size=2), feeding=feeding) print "Test %d, Cost %f" % (event.pass_id, result.cost) trainer = paddle.trainer.SGD( cost=cost, parameters=parameters, update_equation=optimizer) feeding = {'x': 0, 'y': 1} uci_housing.feature_range = lambda x,y: None trainer.train( reader=paddle.batch( paddle.reader.shuffle(uci_housing.train(), buf_size=500), batch_size=2), feeding=feeding, event_handler=event_handler, num_passes=30) if __name__ == '__main__': main()

我们可以执行生产镜像,利用其中编译好的PaddlePaddle来执行我们的应用程序:

docker run -v $PWD:/work --rm paddlepaddle/paddle:0.10.0rc2 python /work/myapp.py

这个例子里,/work目录为保存run.py文件的目录,run.py程序和其依赖以及数据都会放在这个目录下,通过-v参数挂载到容器中,运行run.py即可启动我们的训练任务。

如果dockerhub.com速度慢,也可以使用PaddlePaddle社区维护的Docker registry:

docker run -v $PWD:/work docker.paddlepaddle.org/paddle:0.10.0rc2 python /work/myapp.py

可以看到如下输出(截取部分):

I0323 14:15:48.564875 1 Util.cpp:160] commandline: --use_gpu=False --trainer_count=1 ... I0323 14:15:48.574769 1 GradientMachine.cpp:86] Initing parameters.. ... I0323 14:15:48.574852 1 GradientMachine.cpp:93] Init Pass 29, Batch 200, Cost 10.353333 Test 29, Cost 13.175418

对于更加复杂的深度学习应用,比如应用可能依赖官方Docker镜像之外的库,用户可以直接基于PaddlePaddle 的生产环境镜像打包自己的应用,创建如下的Dockerfile:

FROM paddlepaddle/paddle:0.10.0rc2 RUN pip install matplotlib ... # 增加应用的更多依赖 ADD start.sh / # 增加自定义的启动脚本 CMD ["/start.sh"]

使用诸如此类的Dockerfile即可根据用户的需要构建自己的镜像并应用于实际生产环境。

使用开发镜像

我们将PaddlePaddle的Docker镜像区分为生产环境和开发环境。生产环境仅包含应用运行必要的动态连接库,三方库和应用二进制文件;而开发环境则需要提供Paddle源代码、头文件、编译工具以及丰富的开发工具,包括:

  • gcc/clang
  • nvcc
  • Python
  • sphinx
  • woboq
  • sshd

开发环境镜像会极大的方便以下角色的工作: 1. 深度学习应用开发者:不再需要安装配置一台Ubuntu Linux机器并安装大量的依赖,只需要安装Docker。这样开发者可以使用自己的电脑或者远程的开发服务器都可以。 2. Paddle版本发布工程师:Paddle后续的版本发布更新均使用开发环境Docker镜像,根据Paddle的github分支/标签直接生成多个Paddle生产环境Docker镜像 3. 文档编写/Paddle网站更新:Paddle的文档通常是以“.md/.rst”格式保存在github上的,并随着源代码的更新而更新。文档和网站内容都是通过github的这些文档生成的,开发环境镜像会提供相应的工具,将“.md/.rst”格式解压、转换并生成html页面。

下面介绍如何使用开发环境镜像。考虑我们完成日常工作的方式,开发者可能会使用自己的笔记本/台式机/安装有GPU的工作站:

许多开发者会使用一台远程的安装了GPU的机器完成日常的开发工作,他们通常会ssh登录到这台服务器上开发。开发环境镜像也提供了sshd服务,这样开发者可以直接ssh登录到PaddlePaddle的开发环境容器中启动训练任务:

一个基本思路是: 使用git clone下载PaddlePaddle源码到开发机或本地,然后就可以使用自己惯用的编辑器(如Eclipse/VIM)开始代码编写工作。编译和测试则可以使用docker run -v挂载Paddle源代码目录到Docker开发环境镜像。这样就可以在Docker容器中直接编译和测试刚才修改的代码:

git clone https://github.com/PaddlePaddle/paddle.git cd paddle docker run -p 2202:22 paddledev/paddle:<version>-dev sshd

您可以使用下面的命令快速下载并启动一个PaddlePaddle开发环境的容器,并启动一个sshd服务。在https://hub.docker.com/r/paddlepaddle/paddle/tags/ 找到您需要的版本替换 <version>。

总结

PaddlePaddle团队将以易用性为目标,持续更新,为AI从业者和对深度学习感兴趣的同学提供更方便的镜像和工具,把深度学习带给更多的人!

作者简介

武毅:毕业于武汉理工大学,开源爱好者&geek,活跃于多个开源社区,积极推进开源事业。曾任百分点高级架构师,现任百度资深研发工程师,负责PaddlePaddle大规模分布式计算框架开发和推进。

闫旭:2017年3月加入PaddlePaddle,主要负责PaddlePaddle基于Kubernetes的分布式训练方向。2012年毕业于大连民族大学,曾在百分点负责云平台的建设,热衷开源社区,重点探究Docker以及Kubernetes方向。

巩伟宝:一个工作过很多年的程序员行业从业者,感兴趣的方向主要在并行分布式计算,目前是百度深度学习实验室的资深研发工程师,从事PaddlePaddle分布式和Cloud的开发。

原文发布于微信公众号 - PaddlePaddle(PaddleOpenSource)

原文发表时间:2017-05-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

KVM基于内核的虚拟机概念理解与客户机浅析

作为一个KVM的学习者,如果你想要自己完善一个KVM样品级的解决方案,仅仅学会图形化界面使用和简单的配置(详情见上一篇文章)是远远不够的。在上文中感谢@laow...

43540
来自专栏Albert陈凯

5分钟弄懂Docker

尽管之前久闻Docker的大名了,但是天资愚钝,对其到底是个啥东西一直摸不清,最近花了一段时间整理了一下,算是整理出一点头绪来。 官网的介绍是这样的: Do...

35250
来自专栏新智元

PaddlePaddle发布基于Docker的AI系统开发流程

【新智元导读】 本文来自PaddlePaddle团队,介绍了PaddlePaddle与众不同的基于Docker的编译、开发、测试、调试、发布、部署、和运行的全...

41670
来自专栏CSDN技术头条

如何解决容器网络性能及复杂网络部署问题?

近两年,容器已经随着 Docker 技术的传播火遍全球,现在已经有越来越多的企业用户在开发、测试甚至生产环境中开始采用 Docker 等容器技术。 然而,目前主...

767100

在任何地方部署Kubernetes

容器提供了将应用程序及其依赖关系与操作系统解耦的能力。通过与虚拟机镜像相同的不打包操作系统的方式,容器可以节省大量的系统资源:计算,内存和磁盘空间。容器的下载,...

234100
来自专栏编程坑太多

跟我一起学docker(一)--认识

22540
来自专栏大魏分享(微信公众号:david-share)

容器生产落地需要考虑的几点因素

前言: 本文是笔者与同事陈耿共同完成,不代表任何官方观点。 随着容器技术的持续发酵,以及互联网+应用的持续扩张,目前金融行业使用容器云上生产的案例越来越多。在本...

38740
来自专栏ImportSource

Docker架构里那些名字背后的秘密

Docker作为一个linux平台上一款轻量级虚拟化容器的管理引擎。在短短的两三年内火得不得了。人人都在说docker,大大小小的容器summit。 Docke...

41550
来自专栏技术翻译

Kubernetes扩展容器架构的7 个工具

Kubernetes是最初由Google开发的容器编排工具,已成为敏捷和DevOps团队的重要资源。作为一个开源工具,Kubernetes本身正在成为一个生态系...

13540
来自专栏Debian社区

OpenStack 基金会发布新容器项目 Kata

OpenStack 基金会发布了一个新的容器项目,叫作 Kata 容器 ,以英特尔的 Clear 容器和 Hyper 的 runV 项目为基础。Kata 容器兼...

11830

扫码关注云+社区

领取腾讯云代金券