如何与Nvidia Docker一起使用Nomad?

有没有办法使用nvidia-dockerNomad

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"] 

接着:

  1. 构build基础Docker镜像:

     docker build . -t cuda 
  2. 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条目不匹配造成的。