如何与Nvidia Docker一起使用Nomad?
有没有办法使用nvidia-docker
和Nomad
?
Nvidia上的计算程序在本地工作,但不能与nvidia-docker
(它使用CPU而不是GPU)一起工作。
什么是这样做的首选方法?
- 为
Nomad
使用nvidia-docker
驱动程序 - 使用原始的
docker exec
来运行nvidia-docker
- 以某种方式将
Nomad
连接到nvidia-docker
引擎
有没有人有这方面的经验?
这是我花了很多时间来实现,在这个时候(游牧民0.7.0,虽然运行5.6自己)没有“游牧”的方式来实施一个NVIDIA的docker工作,而不使用原始叉/执行不提供容器编排,服务发现,日志传送,资源pipe理(即装箱)。
我感到惊讶的是,nvidia-docker命令实际上并不代表docker,或者它将命令转发给docker。 唯一有用的时候是调用run / exec命令(例如nvidia-docker run --yar blar
),因为它调用一个帮助器程序,以json格式返回一个json响应以及适当的设备和卷挂载。 当容器数据被发送到实际的docker套接字时,它包含了安装在主机上的cuda版本的正确设备和卷(检查你的容器)。
使用exec驱动程序实现此解决scheme的另一部分是创build一个代表部署的任务,如果您希望进行滚动部署。 我正在使用一个简单的脚本编排与nvidia-docker任务相同的任务组中的滚动部署。 只要你在任务组中使用交错,最大并行(设置为1),并确保你在编配任务中有一个像随机或date那样的dynamic参数(如果0差异,nomad不会更新任务),你应该组。
一旦游牧民有能力计算GPU(在这里需要自定义指纹: https : //github.com/hashicorp/nomad/tree/master/client/fingerprint )资源types,并能够安装非块types的设备(即不一个磁盘),应该有可能规避使用nvidia的docker。 我希望这有帮助,一定要在这里碰到function要求:
https://github.com/hashicorp/nomad/issues/2938
为了扩展使用传统的docker来运行这个操作,你还必须挂载由nvidia-docker创build的卷。 docker volume ls
将显示命名卷,您必须安装您的容器的cuda卷以访问驱动程序(除非您已经装入您的容器,不推荐)。
这个想法是为这个创build一个合适的Docker
镜像:
FROM debian:wheezy # Run Ubuntu in non-interactive mode ENV DEBIAN_FRONTEND noninteractive # Provide CUDA environmental variables that match the installed version on host machine ENV CUDA_DRIVER 375.39 ENV CUDA_INSTALL http://us.download.nvidia.com/XFree86/Linux-x86_64/${CUDA_DRIVER}/NVIDIA-Linux-x86_64-${CUDA_DRIVER}.run # Configure dependencies RUN \ # Update available packages apt-get update \ --quiet \ # Install all requirements && apt-get install \ --yes \ --no-install-recommends \ --no-install-suggests \ build-essential \ module-init-tools \ wget \ # Clean up leftovers && apt-get clean \ && rm -rf /var/lib/apt/lists/* # Install CUDA drivers RUN wget \ $CUDA_INSTALL \ -P /tmp \ --no-verbose \ && chmod +x /tmp/NVIDIA-Linux-x86_64-${CUDA_DRIVER}.run \ && /tmp/NVIDIA-Linux-x86_64-${CUDA_DRIVER}.run \ -s \ -N \ --no-kernel-module \ && rm -rf /tmp/* ENTRYPOINT ["/bin/bash"]
接着:
-
构build基础
Docker
镜像:docker build . -t cuda
-
用
cuda
基础图像启动一个容器执行:docker run \ --device=/dev/nvidia0:/dev/nvidia0 \ --device=/dev/nvidiactl:/dev/nvidiactl \ --device=/dev/nvidia-uvm:/dev/nvidia-uvm \ -it \ --rm cuda
这样的消息:
Failed to initialize NVML: Unknown Error
可能是由于主机和容器驱动程序版本的主机/dev
条目不匹配造成的。