数人云工程师手记 | 在清华OCP实验室玩转NVIDIA GPU实践

新的一周又开始啦,小数又给你们搬来一篇十足的干货~
数人云首席架构师伟涛与你们分享数人云基于Docker/Mesos和NVIDIA GPU的实践。利用容器的技术来提高GPU的资源利用率,扬其长补其短,搭建深度学习平台,就是这么简单:)html

前言

NVIDIA GPU 能够大大加快 Deep Learning 任务的运行速度;同时, GPU 资源又是十分昂贵的,须要尽量提升 GPU 资源的利用率。为了解决上述问题,一个更合理的思路是利用 Mesos 将 GPU 资源汇聚成资源池来实现资源共享,并借用 Docker 交付深度学习的 runtime 环境,很好的解决了上述问题。linux

清华大学交叉信息研究院开放计算项目实验室( OCP 实验室)基于以上背景,与数人云合做解决深度学习环境部署繁琐的问题,该平台从 6 月份开始已经为清华大学的师生提供服务。git

本文首先介绍了深度学习平台经常使用的工具包括 CUDA, Caffe, Mesos, Docker 等;接着介绍整个平台的架构;而后给出了平台搭建须要解决的关键性问题及应对策略;最后罗列了将来须要克服的关键性问题。另外,因为 GPU + Docker 尚未通用的标准,在实际操做中,咱们使用了一些 Tricky 的作法。github

在介绍深度学习平台的工具以前,咱们再详细阐述下用户需求。用户本质要解决两个问题:web

用户会频繁的批量部署深度学习环境,并在使用完后及时销毁环境以释放资源。遇到的难题是深度学习环境的软件包安装繁琐。
深度学习环境用到的 GPU 资源宝贵,用户须要 GPU 资源共享。算法

深度学习平台工具

CUDA: CUDA 是 NVIDIA 开发的一个平行计算平台和编程模型。它利用 GPU 来提升计算性能。 CUDA 运行于 NVIDIA 的 GPU 硬件之上。docker

Caffe: Caffe 是 BVLC 开发的一个深度学习框架。在 GPU mode 下, Caffe 经过 CUDA 调用 GPU 资源。apache

TensorFlow: TensorFlow 是谷歌开源的一个利用数据流图进行数据运算的软件库,在 GPU mode 下, TensorFlow 也依赖于 CUDA 来使用 GPU 资源。编程

jupyter: jupyter 是一个进行交互式数据处理,及结果可视化的 Web 应用,其前身是 Python Notebook。 是数据科学家经常使用的工具之一。json

Docker: Docker 是一种轻量的虚拟化技术,在保证基本的环境隔离前提下,它几乎能够达到裸机的性能。

Apache Mesos: Mesos 是一个分布式系统内核,它参考了 Linux kernel 原理,在数据中心层对资源进行了抽象。

平台架构

这里从节点内部和集群两层介绍平台的架构。

在节点内部,咱们利用 nvidia-docker ( https://github.com/NVIDIA/nvi... ) 来帮助容器内部的程序调用外面主机上的 CUDA driver。以下图一所示, CUDA Driver 及 GPU Driver 安装在外部 Host 上; CUDA Toolkit、其它深度学习组件及用户应用程序运行在 Docker 容器中。这样既能快速配置环境,又保证了 HOST 不受用户应用程序污染。我会在下一章节介绍具体的设置过程。

图片描述
图一 来源 https://github.com/NVIDIA/nvi...

在整个集群层面,利用 Mesos 将资源池化,用户可经过 Marathon 统一入口部署本身的深度学习 Docker Package。以下图二所示,集群包括 3 个 Mesos 管理( Master)节点和多个工做( slave)节点,任务分发到 slave 后, slave 经过 executor 与 Docker daemon 通讯, Docker daemon 按需从内部镜像仓库拉取并加载 Docker image。对应到真实应用场景,带有深度学习依赖组件的 Docker image 将被 pull & run,用户能够经过 ssh 或者 jupyter 的 Web 入口与组件进行交互。

图片描述
图二 来源 https://mesosphere.com/blog/2...

这个方案与 nvidia & mesosphere 合做推出的方案 http://www.nvidia.com/object/... 不一样,后面章节会介绍差别。

基础环境设置

节点设置

第一批机器,咱们选用了 CentOS7.2 操做系统和 NVIDIA Tesla K20c 的显卡。具体的设置过程以下:

  • 安装好显卡并 reboot 机器,而后在终端输入命令

lspci | grep –i nvidia

若是显卡安装成功,则能够得到以下相似输出。
84:00.0 3D controller: NVIDIA Corporation GK110GL [Tesla K20c] (rev a1)

  • 安装显卡驱动, 能够在 NVIDIA 官方网站http://www.nvidia.com/Downloa... 找到相应的显卡驱动,下载并安装。这里须要注意的是,许多的 Linux 发行版已经预装了一个开源的 video driver—Nouveau,而这个 driver 是与 NVIDIA driver 冲突的,须要参考 http://www.dedoimedo.com/comp...
    http://www.allaboutlinux.eu/r... 来禁掉 Nouveau,而后才能成功安装 NVIDIA Driver。

  • 若是 driver 安装成功,能够经过命令 nvidia-smi 获取以下截图三的输出

图片描述
图三

  • 安装 CUDA,在http://docs.nvidia.com/cuda/c... 下载CUDA安装包,CUDA 的安装包比较大,依赖也很是多,以及一些必不可少的环境变量设置,这一步须要费些时间。咱们在实际环境中安装了 CUDA 7.5,目前 NVIDIA 已经发布了 CUDA 8.0 。安装完成后,尤为须要查看 /dev/nvidia* 是否存在,通常来讲,至少 /dev/nvidiactl, /dev/nvidia-uvm 和 /dev/nvidia0 是应该有的,若有缺失,可使用该连接 http://docs.nvidia.com/cuda/c... 提供的脚原本建立缺失的文件。

  • 验证 CUDA 安装成功。安装完毕后,能够经过 CUDA 安装包自带的sample进行验证,譬如:
    `cd /usr/local/cuda-7.5/samples/1_Utilities/deviceQuery

make
./deviceQuery`

应该能够获得以下截图四中的内容。

图片描述
图四

  • 安装 nvidia-docker,nvidia-docker 是 NVIDIA 官方为了让 NVIDIA GPU 与 Docker 容器兼容而封装的 Docker Cli – nvidia-docker。能够在 https://github.com/NVIDIA/nvi... 找到nvidia-docker 相应的 Ubuntu,CentOS 和 二进制安装包。对于 CentOS 来讲,大体步骤以下:

# Install nvidia-docker and nvidia-docker-plugin
wget –P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.0-rc.3/nvidia-docker-1.0.0.rc.3-1.x86_64.rpm
sudo rpm -i /tmp/nvidia-docker*.rpm && rm /tmp/nvidia-docker*.rpm
sudo systemctl start nvidia-docker
# Test nvidia-smi
nvidia-docker run --rm nvidia/cuda:7.5 nvidia-smi

若是设置正常,会获得与第3步截图一样的内容。

  • 为了环境一致性,须要绕过 nvidia-docker 直接使用原生的 Docker 命令:

docker run `curl -s http://localhost:3476/docker/cli` --rm nvidia/cuda:7.5  nvidia-smi

或者:

docker run --volume-driver=nvidia-docker --volume=nvidia_driver_352.39:/usr/local/nvidia:ro --device=/dev/nvidiactl --device=/dev/nvidia-uvm --device=/dev/nvidia0 --rm nvidia/cuda:7.5  nvidia-smi

这里参考了 https://github.com/NVIDIA/nvi...

集群设置

真实环境中,咱们为用户部署了企业版数人云,有些技术细节不便展开。但只使用开源的 Apache Mesos 组件丝绝不会影响集群核心功能的使用。在网络上已经有不少 Apache Mesos,Marathon 和 Docker 安装配置的文章,这里再也不花费篇幅介绍。

若是想要更多feature的调度器,纯命令行mesos scheduler-- https://github.com/Dataman-Cl... 是个不错的选择。
固然,若是感受 Mesos 的配置运维繁复,推荐你们尝试 Crane (https://github.com/Dataman-Cl...),它是基于 Swarmkit 的容器控制面板,上手容易,安装操做都很是简捷。

最终咱们应该能够获得一个 workable 的 Mesos 集群环境。

两个深度学习的Docker镜像

应用户要求,在https://github.com/NVIDIA/nvi... 的 CUDA docker image 基础之上,我又制做了两个包含更多深度学习组件的 Docker 镜像 2breakfast/caffe-sshd:0.14 和 2breakfast/deeplearning:allinone , 你能够在 https://hub.docker.com/r/2bre...https://hub.docker.com/r/2bre... 找到相应的 docker image 及 Dockerfile 连接。

  • 2breakfast/caffe-sshd:0.14
    包含 caffe,sshd 服务。用户能够ssh到相应的docker容器里面使用caffe。能够直接经过命令来测试该 image:

docker run --volume-driver=nvidia-docker --volume=nvidia_driver_352.39:/usr/local/nvidia:ro --device=/dev/nvidiactl --device=/dev/nvidia-uvm --device=/dev/nvidia0 --rm 2breakfast/caffe-sshd:0.14 caffe device_query -gpu all

若是运行正常,能够大体获得以下结果:
图片描述

  • 2breakfast/deeplearning:allinone
    除上述 caffe,sshd 以外,又打包了 Tensorflow, theano, jupyter 等。

经过 Marathon 发布 2breakfast/deeplearning:allinone

下面是获取相应 json 文件并在Marathon 上进行部署的命令。

wget https://raw.githubusercontent.com/vitan/deeplearning-dockerfile/master/deploy-deeplearning.json
curl -k -XPOST -d @deploy-deeplearning.json -H "Content-Type: application/json" http://MARATHON_IP_ADDRESS:8080/v2/apps

部署成功后,能够经过 marathon ui 给出的访问地址,ssh 登陆到容器内部来使用深度学习组件。譬如:

ssh –p 13452 root@10.1.0.170

密码:password ,便可访问。目前容器的默认 ssh account:root , password:password 。

另外,jupyter web 服务并非默认启动,须要用户手动启动它。

小结:遗留问题

  • 用户数据存储及隔离

在运行深度学习算法时,不可避免须要操纵数据。目前的方案是:主机目录 /mnt/data 映射到了容器目录 /mnt/data ,用户须要将持久化保持的数据放到该目录的某个文件下。而主机目录 /mnt/data 是个 nfs 目录,集群节点经过nfs将 /mnt/data 中的数据汇聚到了同一台 server,该 server 上的相应目录是一个 ceph block。

该方案最大的问题是 /mnt/data 目录里面的文件没有隔离,只能要求用户创建各自的 home 目录来放置本身的文件。将来计划经过 LDAP 帐户集成,将数人云企业版帐户和 ceph 目录上的 account 打通,在 ceph 上为不一样的 LDAP 帐户创建不一样的 home 目录并设置相应读写权限,实现隔离。

  • 3476 端口占用

nvidia-docker 会启动一个 web 服务并占用每一个节点的端口 3476,这就须要集群保留端口 3476 资源。在咱们的场景中,直接使用 localhost:3476 获取信息, 将来考虑将其设置为 unix://**nvidia-docker.sock。

  • 让 Mesos 像管理 CPU 资源同样来管理 GPU 资源

Mesos在1.0版本 https://github.com/apache/mes... 实现了对GPU资源的管理。其参考了 nvidia-docker 的作法,将许多设置内置到了 mesos 中,将来考虑 enable 这部分功能以简化配置。

相关文章
相关标签/搜索