前言

NVIDIA GPU 可以大大加快 Deep Learning 任务的运行速度;同时,GPU资源又是十分昂贵的,需要尽可能提高 GPU 资源的利用率。为了解决上述问题,我们利用 Mesos 将 GPU 资源汇聚成资源池来实现资源共享,并借用 Docker 交付深度学习的 runtime 环境,很好的解决了上述问题。该平台是基于清华大学的真实需求搭建的,从6月份开始已经为清华大学的师生提供服务。

本文首先介绍了深度学习平台用到的工具如 CUDA,Caffe,Mesos,Docker 等;接着解释了整个平台的架构;然后给出了平台搭建需要解决的关键性问题及应对策略;最后罗列了未来需要克服的关键性问题。另外,由于 GPU+Docker 还没有通用的标准,在实际操作中,我们使用了一些 Tricky 的做法。

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

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

深度学习环境用到的GPU资源宝贵,用户需要GPU资源共享。

深度学习平台工具

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

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

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

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

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

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

平台架构

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

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

图一 来源https://github.com/NVIDIA/nvidia-docker/wiki

在整个集群层面,利用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/2013/09/26/docker-on-mesos/

这个方案与nvidia&mesosphere合作推出的方案http://www.nvidia.com/object/apache-mesos.html 不同,后面章节会介绍差异。

基础环境设置

节点设置

第一批机器,我们选用了 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/Download/index.aspx?lang=en-us 找到相应的显卡驱动,下载并安装。这里需要注意的是,许多的Linux发行版已经预装了一个开源的video driver—Nouveau,而这个driver是与Nvidia driver冲突的,需要参考http://www.dedoimedo.com/computers/centos-7-nvidia.html或

http://www.allaboutlinux.eu/remove-nouveau-and-install-nvidia-driver-in-ubuntu-15-04/ 来禁掉Nouveau,然后才能成功安装Nvidia Driver。

如果 driver 安装成功,可以通过命令 nvidia-smi 获取如下截图三的输出

图三

安装 CUDA,在http://docs.nvidia.com/cuda/cuda-getting-started-guide-for-linux/下载CUDA安装包,CUDA的安装包比较大,依赖也非常多,以及一些必不可少的环境变量设置,这一步需要费些时间。我们在实际环境中安装了CUDA7.5,目前NVIDIA已经发布了CUDA8.0 。安装完成后,尤其需要查看 /dev/nvidia* 是否存在,一般来说,至少 /dev/nvidiactl, /dev/nvidia-uvm 和 /dev/nvidia0 是应该有的,如有缺失,可以使用该链接http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#runfile-verifications 提供的脚本来创建缺失的文件。

验证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/nvidia-docker/wiki#quick-start找到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/nvidia-docker/wiki/Internals#enabling-gpu-support-in-your-application 。

集群设置

真实环境中,我们为用户部署了企业版数人云,有些技术细节不便展开。但只使用开源的 Apache Mesos 组件丝毫不会影响集群核心功能的使用。在网络上已经有很多 Apache Mesos,Marathon 和 Docker 安装配置的文章,这里不再花费篇幅介绍。最终我们应该可以得到一个workable的 Mesos 集群环境。

两个深度学习的Docker镜像

应用户要求,在https://github.com/NVIDIA/nvidia-docker 的 CUDA docker image基础之上,我又制作了两个包含更多深度学习组件的 Docker 镜像 2breakfast/caffe-sshd:0.14 和2breakfast/deeplearning:allinone , 你可以在 https://hub.docker.com/r/2breakfast/caffe-sshd/ 和 https://hub.docker.com/r/2breakfast/deeplearning/ 找到相应的 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/mesos/blob/master/docs/gpu-support.md 实现了对GPU资源的管理。其参考了nvidia-docker 的做法,将许多设置内置到了mesos中,未来考虑enable这部分功能以简化配置。

作者简介  周伟涛

数人云首席架构师,曾就职于开源解决方案供应商 Red Hat, 红帽认证工程师, Mesos contributor,高级 Python 开发工程师。 是国内较早一批接触使用Docker,Mesos,Swarm 等技术的开发者。

docker gpu 创建 训练环境_基于 Mesos、Docker 和 Nvidia GPU 的深度学习平台实践相关推荐

  1. docker gpu 创建 训练环境_巧用 Docker 快速部署 GPU 环境

    公众号关注 「奇妙的 Linux 世界」设为「星标」,每天带你玩转 Linux ! 在 Linux 服务器上使用 GPU 跑深度学习的模型很正常不过.如果我们想用 Docker 实现同样的需求,就需要 ...

  2. docker gpu 创建 训练环境_通过Dockerfile创建caffe-gpu环境

    自己先安装docker和nvidia-docker再看下面的教程. 我这里GPU型号为 tesla T4, 算力为7.5,会有一些特殊处理.首先是我不会在Dockerfile中编译caffe 本次环境 ...

  3. docker搭建java测试环境_基于docker构建测试环境

    目录 0x01介绍 0x02 镜像基本操作 0x03 容器基本操作 0x04 容器的修改与保存 0x05 使用Dockerfile定制镜像 0x01介绍 Docker 是一个开源的应用容器引擎,基于 ...

  4. gpu填充速率 计算_【经典回顾】Nvidia GPU 上的 CNN 计算速度变迁

    笔者从 2012 年初开始接触 GPU 编程,2014 年上半年开始接触 Caffe,可以毫不谦虚地说是"一天天看着 Nvidia GPU 和 Caffe 长大的". Nvidia ...

  5. 中国电信基于Mesos+Docker的运维自动化在CDN中的实践

    本文讲的是中国电信基于Mesos+Docker的运维自动化在CDN中的实践[编者的话]本次分享将讲解容器技术在CDN系统中的应用,包括应用的容器化,使用Mesos.Marathon.ZooKeeper ...

  6. 基于Ubuntu 18.04机器人操作系统环境和深度学习环境配置

    基于Ubuntu 18.04机器人操作系统环境和深度学习环境配置详解 CUDA+Cudnn+ROS+anaconda+ubuntu装机必备 笔记本双系统安装 U盘启动项安装ubuntu18.04.1 ...

  7. AI大事件 | 谷歌的计算引擎鸟枪换炮用上了更快的GPU,基于Python的亚马逊AWS深度学习AMI

    大数据文摘作品 编译 | 宁云州 呜啦啦啦啦啦大家好呀,又到了本周的AI大事件时间了.过去的一周中AI圈都发生了什么?大佬们互撕了哪些问题?研究者们发布了哪些值得一读的论文?又有哪些开源的代码和数据库 ...

  8. 基于NVIDIA GPUs的深度学习训练新优化

    基于NVIDIA GPUs的深度学习训练新优化 New Optimizations To Accelerate Deep Learning Training on NVIDIA GPUs 不同行业采用 ...

  9. deepfashion 深度学习_基于Alluxio加速混合云下的Intel Analytics Zoo开源深度学习平台...

    本文描述了Alluxio如何在混合云环境中,加速oneAPI支撑的英特尔Analytics Zoo开源平台深度学习模型训练.本文会讨论有关新架构和工作流的细节,以及Alluxio的性能优势和基准测试结 ...

  10. 基于python语言,使用爬虫和深度学习来预测双色球(二、模型训练与测试)

    在上一篇博文中(基于python语言,使用爬虫和深度学习来预测双色球(一.数据的准备)),我们完成了数据的准备,通过爬虫的方式将2003年至今的每一期的中奖数据保存到了txt文件中,那么我们现在就开始 ...

最新文章

  1. 轉:showModalDialog和showModelessDialog使用心得
  2. 关于引进制转换(凌乱)
  3. visualSVN下载与安装
  4. sklearn自学指南(part24)--随机梯度下降
  5. .NET Core使用微软AI认知服务识别文字语言
  6. 面试风云录(02) - 与顶级CTO交手的难忘经验...
  7. JAVA怎么实现网页退出系统_java后台实现js关闭本页面,父页面指定跳转或刷新操作...
  8. 2011系统架构师大会分享-自动化运维中的关系管理
  9. mysql忽略大小写 chmod_Ubuntu18.04下Mysql8.0.15关闭大小写敏感
  10. pantum打印机驱动安装m6506_奔图m6506驱动程序
  11. matlab差分法案例,怎么用matlab实现向前差分法,向后差分法,中心差分法等,最好举个例子,谢谢啦...
  12. linux加静态路由命令,LINUX添加静态路由
  13. 聚合支付机构备案情况分析(截至22年1月27日)
  14. pdf加密文件怎么加密
  15. 基于ERP的WMS系统解决方案
  16. 账单php,php 处理微信账单
  17. 网络安全基础——习题集
  18. 【解决方法】Windows 找不到文件 ‘C:\Users\lwx\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows...
  19. 专防诈骗 法国新型信用卡密码随时变
  20. 制作一个评选优秀老师和学生的系统,系统根据提示输入类别(老师或学生), 如果是老师则输入姓名和论文数,学生则输入姓名和考试成绩,输入若干人员信息后使用结束符完成输入,程序根据输入的数据列出优秀老师和优

热门文章

  1. python访问服务器注册表,使用Python的Windows注册表访问(Winreg)
  2. 简单的php商城,简单的php商城
  3. axure文本框添加水印_Axure教程:限制输入框输入字数
  4. 喇叭正反相位测试音频_音频功放失真的四大要点及改善方法
  5. Eureka 控制台参数说明
  6. VMware 虚拟机安装 android-x86_64 iso镜像
  7. sourceMap到底是个啥玩意?
  8. html代码向下移动,在html表格中向下移动Jquery
  9. c语言输出英文字母表,菜鸟求助,写一个随机输出26个英文字母的程序
  10. 30分钟学会正则表达式