用Docker玩转深度学习

本文讲的是用Docker玩转深度学习【编者的话】这篇文章介绍了Docker与深度学习结合的例子。Docker的优势是解决了依赖的问题,方便分发个人工作成果;缺点是不直接支持GPU,需要开发者自己安装nvidia-docker。

Docker提供了一种将Linux Kernel中需要的内容静态链接到你的应用中的方法。Docker容器可以使用宿主机的GPUs,因此我们可以把TensorFlow或者机器学习代码的任何依赖都链接到
容器中,这样其他小伙伴就可以使用你的工作成果了。

你可以发布一个可再现的机器学习项目,它几乎不需要用户设置,不需要用户花6小时去下载依赖或者报错:

# 6 hours of installing dependencies
python train.py
> ERROR: libobscure.so cannot open shared object

相反,你可以这样做:

dockrun tensorflow/tensorflow:0.12.1-gpu python train.py
TRAINING SUCCESSFUL

这种方法可以直接运行你的train.py脚本,所有的依赖包括GPU支持都帮你准备好了。

Docker容器是短暂的,不需要持久化任何数据,你可以把Docker容器想象成1G大的tensorflow.exe,它把你所有的依赖都编译进去了。

Why

开源软件因为有难以重现、复杂的依赖网络:不同版本的编译器、丢失头文件、错误的库路径等,所有这些导致在软件的安装配置阶段浪费你大量的时间。

使用Docker时,理论上你只要要让Docker正确工作,然后你所有的代码就可以运行了。幸运的是,Docker已经融资1.8亿美元,并将一部分投入到docker开发中,转换成可以工作的软件。

我打算在Linux上用Docker,Mac上的用法应该一样,除了不支持GPU。

应该怎么做

针对机器学习的使用场景,你最好把你的代码发布到GitHub repo上。你的依赖通常表示成一系列Linux命令行,这些命令行能复制粘帖到终端中运行。(译者注:即依赖放到Dockerfile中)。

Docker用一个命令替换第二部分(译者注:第一部分是把代码放到GitHub repo上,第二部分是在Docker镜像中执行命令行,配置你的依赖),该命令将拉取运行代码所需的正确docker镜像。你会把所有的依赖集成到3G大(压缩后)的镜像中,用户可以直接下载使用你的镜像。

我们看看Torch pix2pix的实现方式:

git clone https://github.com/phillipi/pix2pix.git
cd pix2pix
bash datasets/download_dataset.sh facades
# install dependencies for some time
...
# train
env \
DATA_ROOT=datasets/facades \
name=facades \
niter=200 \
save_latest_freq=400 \
which_direction=BtoA \
display=0 \
gpu=0 \
cudnn=0 \
th train.lua 

尽管训练脚本的依赖很少(做到这样很伟大了),但是脚本使用的工具却有很多依赖,而且这些依赖文档不全面,组合在一个镜像中非常复杂繁琐。

如果你不小心弄乱了依赖,可能会遇到下面的错误:

luajit: symbol lookup error:
/root/torch/install/lib/lua/5.1/libTHNN.so: undefined symbol: TH_CONVERT_ACCREAL_TO_REAL 

Docker提供了一种方法,通过Docker Hub分发二进制镜像(译者注:原文是artifact)。

Dockerized

在Linux server上直接安装docker和nvidia-docker,Docker容器可以访问GPU,没有明显的性能损失。

如果你在Mac上你需要安装Docker for Mac,在Mac上使用Docker我还是有很多经验的。现在你还不能在GPU上运行任何东西,Mac几乎不再支持CUDA。你可以在CPU模式下测试,它工作良好,只是有点慢。

我这里有一个在Ubuntu 16.04 LTS上安装Docker的脚本,适用于云服务提供商:

curl -fsSL https://affinelayer.com/docker/setup-docker.py | sudo python3

装好Docker后,运行pix2pix代码:

sudo docker run --rm --volume /:/host --workdir /host$PWD affinelayer/pix2pix <command>

下面是完整的脚本,多行显示方便阅读:

git clone https://github.com/phillipi/pix2pix.git
cd pix2pix
bash datasets/download_dataset.sh facades
sudo docker run \
--rm \
--volume /:/host \
--workdir /host$PWD \
affinelayer/pix2pix \
env \
DATA_ROOT=datasets/facades \
name=facades \
niter=200 \
save_latest_freq=400 \
which_direction=BtoA \
display=0 \
gpu=0 \
cudnn=0 \
th train.lua

它会下载我构建的镜像(镜像包含Torch,支持nvidia-docker),大小在3G。

运行后会打印debug信息,到这里已经很棒了。但运行在GPU上更重要,因为pix2pix的架构设计在GPU上可以获得足够的训练速度。

GPU

在GPU上运行只需要把上面命令中的docker镜像替换成nvidia-docker

nvidia-docker不包含在标准Docker中,所以你需要额外的工作。下面的脚本可以在Ubuntu 16.04 LTS上配置nvidia-docker:

curl -fsSL https://affinelayer.com/docker/setup-nvidia-docker.py | sudo python3

大概花费5分钟,而且我已经在AWS和Azure上测试过了。两者都是NVIDIA K80卡,额定值为2.9 FP32 TFLOPS。

nvidia-docker配置好运行:

sudo nvidia-docker run --rm nvidia/cuda nvidia-smi

假设上面的命令正常运行,重新运行pix2pix的脚本:

sudo nvidia-docker run \
--rm \
--volume /:/host \
--workdir /host$PWD \
affinelayer/pix2pix \
env \
DATA_ROOT=datasets/facades \
name=facades \
niter=200 \
save_latest_freq=400 \
which_direction=BtoA \
display=0 \
th train.lua

它使用相同的Docker镜像,但是支持GPU。

提示

使用Python和TensorFlow时,有许多有用的命令行选项:

--env PYTHONUNBUFFERED=x

这会让python立即打印输出,而不是先缓存起来。

--env CUDA_CACHE_PATH=/host/tmp/cuda-cache

这使得你每次启动Tensorflow时都没有1分钟的延迟,它必须从头重新编译CUDA内核。

这两个选项集成到Docker命令行中后:

sudo nvidia-docker run \
--rm \
--volume /:/host \
--workdir /host$PWD \
--env PYTHONUNBUFFERED=x \
--env CUDA_CACHE_PATH=/host/tmp/cuda-cache \
<image> \
<command>

这个命令很长,你可以定义命令别名:

alias dockrun="sudo nvidia-docker run --rm --volume /:/host --workdir /host\$PWD --env PYTHONUNBUFFERED=x --env CUDA_CACHE_PATH=/host/tmp/cuda-cache"

定义别名后运行pix2pix-tensorflow

git clone https://github.com/affinelayer/pix2pix-tensorflow.git
cd pix2pix-tensorflow
python tools/download-dataset.py facades
dockrun affinelayer/pix2pix-tensorflow python pix2pix.py \
--mode train \
--output_dir facades_train \
--max_epochs 200 \
--input_dir facades/train \
--which_direction BtoA

pix2pix-tensorflow除了Tensorflow 0.12.1(当时当前发布的版本)之外没有别的依赖关系。但是即使如此,第一个GitHub issue是一个用户使用错误版本的Tensorflow导致的。

如何集成

幸运地是,集成到你自己的项目中非常简单。

你先新建空目录,新建文件Dockerfile。然后构建镜像:

mkdir docker-build
cd docker-build
curl -O https://affinelayer.com/docker/Dockerfile
sudo docker build --rm --no-cache --tag pix2pix .

构建结束后你就可以查看镜像了:

sudo docker images pix2pix
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
pix2pix             latest              bf5bd6bb35f8        3 seconds ago       11.38 GB

通过docker push把你的镜像推送到Docker Hub上:

sudo docker tag pix2pix <accountname>/pix2pix
sudo docker push <accountname>/pix2pix

Docker新用户可以先使用我的镜像。docker提供了不依赖Docker Hub分发镜像的机制,但是他用起来不是很方便:

# save image to disk, this took about 18 minutes
sudo docker save pix2pix | gzip > pix2pix.image.gz
# load image from disk, this took about 4 minutes
gunzip --stdout pix2pix.image.gz | sudo docker load

再现性

虽然Docker镜像容易复制,但是从Dockerfile到镜像的转换不一定是可复制的。你可以使用下面的命令检查镜像的构建历史记录:

sudo docker history --no-trunc pix2pix

它不会显示被添加到镜像中的所有文件。比如,如果你的Dockerfile包含git clone或者apt-get update,很可能在两个不同的日子里构建产生不同的镜像。

另外,如果docker构建时指定了cpu版本,那么镜像在其它机器上很可能不工作。

只要我们分发的是Docker镜像,那么它就是可再现的。如果你想通过Dockerfile再现镜像,如果你不非常小心编写构建Dockerfile的话,很可能失败。(译者注:镜像构建好后不会变,可再现,但是从Dockerfile构建,很可能因为cpu版本、git clone仓库更新而不可再现镜像)

目前还不清楚这些优势是否值得付出努力,但是如果你的Dockerfile是从头开始构建的,并且使用--network none选项,大多数情形镜像是可重现的。

如果镜像再现很容易,这项技术将会很酷。现在Docker已经取得实质性进展,让依赖再现成为可能,这是伟大的进步。

译者说

这篇文章介绍了Docker与深度学习结合的例子。Docker的优势是解决了依赖的问题,方便分发个人工作成果;缺点是不直接支持GPU,需要开发者自己安装nvidia-docker。

文章最后作者论述了Docker镜像的可再现问题,总结如下:

  • 分发的是Docker镜像,那么基本可以保证镜像的一致性(可再现)。
  • 分发的是Dockerfile,Dockerfile中存在git clone或者apt update,会因为时间因素导致clone的repo更新导致镜像不一致。

原文链接:Deep Learning with Docker(翻译:卢文泉)

原文发布时间为:2017-03-05

本文作者:卢文泉

本文来自合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:用Docker玩转深度学习

时间: 2024-11-08 18:58:38

用Docker玩转深度学习的相关文章

深度学习必备手册(上)

更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud 请收下这份关于人工智能的根目录--博客整理系列(一) 关于数据科学的那些事--博客整理系列(二) 机器学习必备手册--博客整理系列(三) 扩展眼界的都在这--博客整理系列(四) 深度学习必备手册--博客整理系列(六) 深度学习的概念源于人工神经网络的研究,如果追溯深度学习的概念还是要回到2006年Hinton那篇论文,基于深信度网(DNB)提出非监督贪心逐层训练算法,未解决深层结构相关的优化难题出现的论文.

惊!C++竟然还能有这种操作——高性能深度学习库(DLL)

更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud  作为一个深度学习的老司机,你是不是以为只有Python才能够玩转深度学习?如果是这样的话,那么本文作者可能就要教你怎么"做人"了.毕竟大牛的世界我们不懂! 第一个版本C++的深度学习库(DLL)1.0发布了!DLL是一个关注速度和易用性的神经网络库.大约4年前,作者就开始编写这个库.为了获得博士学位,作者需要一个很好的库来训练和使用受限制的玻尔兹曼机器(RBMs),因为当时还没有很好的库来完成这项

AI 从业者该如何选择深度学习开源框架丨硬创公开课

编者按:本文内容来自微软美国总部机器学习科学家彭河森博士在雷锋网(公众号:雷锋网)硬创公开课的分享,并由彭河森博士亲自整理成文. 正如程序语言一样,深度学习开源框架同样各有优劣和适用的场景,那么 AI 从业者该如何有针对性地选择这些平台来玩转深度学习? 本期公开课特邀了先后在谷歌.亚马逊.微软供职的机器学习科学家彭河森博士为大家讲述<MXNet火了,AI从业者该如何选择深度学习开源框架>.彭河森博士亲眼见证并深入参与了这三家巨头布局深度学习的过程. 嘉宾介绍 彭河森,埃默里大学统计学博士.现担

数人云联合清华OCP实验室共建深度学习平台

<企业网D1Net>11月14日(北京)近日,数人云与清华大学交叉信息研究院开放计算项目实验室(OCP实验室)合作共建深度学习平台,该平台通过数人云操作系统实现GPU资源共享,利用Docker技术交付深度学习的运行环境,让深度学习项目组师生可以更加灵活地使用GPU资源,并解决深度学习环境部署繁琐的问题. 深度学习算法的计算性能依赖强大的GPU计算能力,为了尽可能提高GPU资源利用率,数人云利用Mesos将GPU资源汇聚成资源池实现资源共享,并借用Docker交付深度学习的运行环境. 深度学习平

预告:MXNet火了,AI从业者该如何选择深度学习开源框架丨硬创公开课

近日 MXNet 被亚马逊AWS 正式选成为官方深度学习平台,使得前者再次火遍整个 AI 圈. 除了 MXNet 外,谷歌.微软.亚马逊.百度等巨头都围绕深度学习搭建了自己的开源平台.目前研究人员正在使用的深度学习框架不尽相同,有 TensorFlow.CNTK.MXNet.Torch .Caffe.Theano.Deeplearning4j 等. 正如程序语言之争一样,深度学习开源框架同样各有优劣和适用的场景,那么 AI 从业者该如何有针对性地选择这些平台来玩转深度学习? 本期公开课特邀先后在

【玩转数据系列十】利用阿里云机器学习在深度学习框架下实现智能图片分类

伴随着今日阿里云机器学习PAI在云栖大会的重磅发布,快来感受下人工智能的魅力. 一.背景 随着互联网的发展,产生了大量的图片以及语音数据,如何对这部分非结构化数据行之有效的利用起来,一直是困扰数据挖掘工程师的一到难题.首先,解决非结构化数据常常要使用深度学习算法,上手门槛高.其次,对于这部分数据的处理,往往需要依赖GPU计算引擎,计算资源代价大.本文将介绍一种利用深度学习实现的图片识别案例,这种功能可以服用到图片的检黄.人脸识别.物体检测等各个领域. 下面尝试通过阿里云机器学习平台产品,利用深度

如何利用Docker、AWS和深度学习伪装成一个艺术家

本文讲的是如何利用Docker.AWS和深度学习伪装成一个艺术家[编者的话]本篇文章描述了如何利用Docker.AWS和深度学习将一张普通的图片转换成艺术家的作品. "能工摹形,巧匠窃意(Good artists copy, great artists steal)" -- 毕加索 在英国第四频道纪录片系列之"Faking it"中,Paul O'Hare(一名来自利物浦的画家和室内装潢师)需要在四个星期的时间内,将自己伪装成一个艺术家,并且尝试着去欺骗伦敦美术馆的

【玩转数据系列十二】PAI平台深度学习Caffe框架实现图像分类的模型训练

PAI平台深度学习Caffe框架实现图像分类的模型训练 背景 我们在之前的文章中介绍过如何通过PAI内置的TensorFlow框架实验基于Cifar10的图像分类,文章链接:https://yq.aliyun.com/articles/72841.使用Tensorflow做深度学习做深度学习的网络搭建和训练需要通过PYTHON代码才能使用,对于不太会写代码的同学还是有一定的使用门槛的.本文将介绍另一个深度学习框架Caffe,通过Caffe只需要填写一些配置文件就可以实现图像分类的模型训练.关于P

Docker在云平台上的最佳实践: 当容器服务遇到深度学习

12月9日云栖计算之旅线下沙龙第2期<Docker在云平台上的最佳实践>,阿里云技术专家必嘫给大家带来了"当容器服务遇到了深度学习"的演讲.本文主要从深度学习的兴起开始谈起,进而介绍了Docker技术.阿里云容器服务,重点介绍了支持云上的高性能计算应用需要哪些,包括GPU的调度.隔离和监控. 视频回顾 深度学习 人工智能已经进入了深度学习时代.传统的让机器自动化的方式已经不再适合解决一些问题,机器学习开始兴起,让机器像小孩子一样自己去认识世界.而深度学习本身是机器学习的一个