分享

用GPU和Docker搭建高效灵活的深度学习研发平台

 LZS2851 2016-02-07
  给数据科学家提供最好的工作工具是非常困难的。他们的电脑上几乎需要有所有的功能,如极致的性能,最新的软件,以及随心所欲的试验。

  我们为此开发了一套满足上述所有需求的方案,并且避免了经常困扰系统管理员和开发团队构建系统的重复性劳动。

  tl;dr - 环境创建代码已经上传至Github上。

  它目前仍然是完善中的实验品,但是已经可以工作。因为它的许多工具目前都还在软件生存周期的早期,所以它日后会越来越好。


  告别云

  对于计算密集型业务,公有云的托管费用高的令人望而却步。一个AWS上高性能的跑在GPU上的虚拟机大概要超过正常价格20倍的费用,以日计费会更贵。年费大约是25,000美元。

  内部部署的虚拟服务器会相对便宜点,但是并没有对这些科学计算的用例而针对性调整,并且也不是共享环境友好的。

  当然,还有其他一些问题… …

  你好,老朋友

  你身边的服务器又回来了,并且比以往更好。Nvidia在2015年发布了“Dev Box”,一种数据科学家的梦想机器。虽然它有一点点小贵,大概15,000美元。

  Andrej Karpathy 创建了一个相对完美并且廉价的家庭套装。并且它可以扩展到和Nvidia的机器同样的性能。我们的产品相当类似,并且给它找了个好地方,就在桌子的右下角。

  开发即产品

  现在你已经有了合适的硬件。然后你可以参照Nvidia的指示文档来安装和配置所需的所有软件。接下来花上几个小时手工处理软件包和相互依赖性上。它工作很完美,但是这对系统管理员是个噩梦,因为它是完全定制化的。

  你用这个机器的时间越长,你就越难以去重建它。假如它死机了,或者是你需要做大的版本升级,或者是你需要创建多个一次性使用的临时方案。

  停机时间是你的敌人,但是你引入了一个丑陋的故障点,并且无法享受全自动构建的所有益处。

  解决方案

  第一步:构建Vanilla CoreOS

  假设你已经得到了合适的硬件,然后按照已经验证的快速入门指南之一构建你的裸机。CoreOS支持PXE(无盘工作站),iPXE或者是有盘工作站。选择其中任何适合你的方案即可。我们的方案选择的是PXE构建我们的CoreOS系统

  第二步:安装CUDA驱动以及Nvidia的设备-一次性操作

  克隆Github上的es-dev-stack

  $ git clone http://github.com/emergingstack/es-dev-stack.git

  Docker镜像编译(大概会花费30分钟时间,需要下载大约2.5G的数据)

  $ cd es-dev-stack/corenvidiadrivers$ docker build -t cuda .

  编译完成之后,假如这个镜像非常好使,你可能会想要把这个镜像推送到Docker的registry。从而方便你将来基于这个镜像编译其他的镜像。Dockerfile的示例如下:

  FROM ubuntu:14.04MAINTAINER Mike Orzel .orzel@>RUN apt-get -y update && apt-get -y install git bc make dpkg-dev && mkdir -p /usr/src/kernels && mkdir -p /opt/nvidia/nvidia_installersADD http://developer.download./compute/cuda/7_0/Prod/local_installers/cuda_7.0.28_linux.run /opt/nvidia/WORKDIR /usr/src/kernelsRUN git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linuxWORKDIR linuxRUN git checkout -b stable v`uname -r` && zcat /proc/config.gz > .config && make modules_prepareRUN sed -i -e 's/`uname -r`+/`uname -r`/' include/generated/utsrelease.h # In case a '+' was added# Nvidia drivers setupWORKDIR /opt/nvidia/RUN chmod +x cuda_7.0.28_linux.run && ./cuda_7.0.28_linux.run -extract=`pwd`/nvidia_installersWORKDIR /opt/nvidia/nvidia_installersRUN ./NVIDIA-Linux-x86_64-346.46.run -a -x --ui=noneRUN sed -i 's/read_cr4/__read_cr4/g' NVIDIA-Linux-x86_64-346.46/kernel/nv-pat.cRUN sed -i 's/write_cr4/__write_cr4/g' NVIDIA-Linux-x86_64-346.46/kernel/nv-pat.cCMD ./NVIDIA-Linux-x86_64-346.46/nvidia-installer -q -a -n -s --kernel-source-path=/usr/src/kernels/linux/ && insmod /opt/nvidia/nvidia_installers/NVIDIA-Linux-x86_64-346.46/kernel/uvm/nvidia-uvm.ko

  现在运行CUDA的Docker容器

  # docker run -it --privileged cuda

  确认Nvidia的驱动已经安装

  # lsmod

  你应该能看到几个名为‘Nvidia’的项目已经安装

  安装设备

  在root下执行‘mkdevs’脚本来创建设备

  # ./mkdevs.sh

  确认Nvidia的设备已经安装

  # cd /dev# ls -al | grep -i 'nvidia'

  现在你应该能够看到如下的设备已经存在并准备好映射入Docker的容器

  crw-rw-rw- 1 root root 247, 0 Jan 4 05:54 nvidia-uvmcrw-rw-rw- 1 root root 195, 0 Jan 4 05:54 nvidia0crw-rw-rw- 1 root root 195, 1 Jan 4 05:54 nvidia1crw-rw-rw- 1 root root 195, 255 Jan 4 05:54 nvidiactl

  至此一切完毕。

  现在你应该就可以开始使用几乎一成不变的系统,从而享受容器化带来的益处。请注意,这里我们使用的是特权模式来映射GPU设备到Docker容器,这从共享主机模式角度是一个不安全的方式。

  第三步:基于Google TensorFlow的测试案例

  警告:这个Dockerfile的编译产生的Docker镜像超过10GB,大概会需要30-40分钟来生成。

  这里我们已经添加了一个Jupyter的笔记到Docker镜像来验证GPU功能正常。这是个基本的基于TensorFlow的ConvNet,并足以验证效果。

  Docker镜像构建如下:

  $ cd es-dev-stack/tflowgpu$ docker build -t tflowgpu .

  Dockerfile如下:

  FROM b.gcr.io/tensorflow/tensorflow:latest-gpuMAINTAINER Mike Orzel .orzel@># Add some dependent packages we will need for the build processRUN apt-get -y update && apt-get -y install git bc make dpkg-dev && mkdir -p /usr/src/kernels && mkdir -p /opt/nvidia/nvidia_installers# Download the nvidia cuda packageADD http://developer.download./compute/cuda/7_0/Prod/local_installers/cuda_7.0.28_linux.run /opt/nvidia/RUN chmod +x /opt/nvidia/cuda_7.0.28_linux.run# download the linux kernel source and prepare it for useWORKDIR /usr/src/kernelsRUN git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linuxWORKDIR linuxRUN git checkout -b stable v`uname -r` && zcat /proc/config.gz > .config && make modules_prepareRUN sed -i -e 's/`uname -r`+/`uname -r`/' include/generated/utsrelease.h # In case a '+' was addedRUN sed -i -e 's/`uname -r`+/`uname -r`/' include/config/kernel.release # In case a '+' was added# Nvidia drivers setupWORKDIR /opt/nvidia/RUN chmod +x cuda_7.0.28_linux.run && ./cuda_7.0.28_linux.run -extract=`pwd`/nvidia_installersWORKDIR /opt/nvidia/nvidia_installersRUN ./NVIDIA-Linux-x86_64-346.46.run -a -x --ui=noneRUN sed -i 's/read_cr4/__read_cr4/g' NVIDIA-Linux-x86_64-346.46/kernel/nv-pat.cRUN sed -i 's/write_cr4/__write_cr4/g' NVIDIA-Linux-x86_64-346.46/kernel/nv-pat.cRUN ./NVIDIA-Linux-x86_64-346.46/nvidia-installer -q -a -n -s --kernel-source-path=/usr/src/kernels/linux/ --no-kernel-module# install modules to expected location, cuda will do modprobes in certain situations which require thisWORKDIR /usr/src/kernels/linuxRUN make modules && make modules_installRUN mv /lib/modules/`uname -r`+ /lib/modules/`uname -r`WORKDIR /opt/nvidia/nvidia_installersRUN depmod# Run jupyter notebook and create a folder for the notebooksRUN chmod +x /run_jupyter.shRUN mkdir /examplesWORKDIR /examplesCOPY CNN.ipynb /examples/CNN.ipynbCMD /run_jupyter.sh

  执行TensorFlow的Docker容器

  下面这个‘docker run’命令会映射新安装的GPU设备到TensorFlow容器中。详细命令如下:

  $ docker run --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidia1:/dev/nvidia1 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm -it -p 8888:8888 --privileged tflowgpu

  打开浏览器并访问Jupyter如下:http://{your dev box IP}:8888,并跑几个实例。Nvidia Titan X上的性能测试应该比Intel i7 CPU快了十倍不止。


  现在就开始使用es-dev-stack,也非常欢迎贡献你的版本。本解决方案的灵感来源于以下几个社区,在此感谢:

  Nvidia driver setup via Docker - Joshua Kolden joshua@studiopyxis.com

  ConvNet demo notebook - Edward Banner edward.banner@gmail.com

  在文下一篇章,我们将会演示如何容器化的Spark环境和Kubernetes整合的潜力(依赖于标准 issue 19049的状态)

  原文链接:

  http://www./2016/01/10/Nvidia-GPU-plus-CoreOS-plus-Docker-plus-TensorFlow.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多