有什么方法可以使用nvidia-docker
withNomad
吗?
Nvidia 上的计算程序可以在本地工作,但不能正常工作nvidia-docker
(它使用 CPU 而不是 GPU)。
这样做的首选方法是什么?
- 使用
nvidia-docker
驱动程序Nomad
- 使用 raw
docker exec
运行nvidia-docker
- 以某种方式连接
Nomad
到nvidia-docker
引擎
有没有人有这方面的经验?
有什么方法可以使用nvidia-docker
withNomad
吗?
Nvidia 上的计算程序可以在本地工作,但不能正常工作nvidia-docker
(它使用 CPU 而不是 GPU)。
这样做的首选方法是什么?
nvidia-docker
驱动程序Nomad
docker exec
运行nvidia-docker
Nomad
到nvidia-docker
引擎有没有人有这方面的经验?
这是我花了很多时间实现的东西,目前(虽然我自己运行 5.6,但游牧 0.7.0)没有“游牧”方式来实现 nvidia-docker 作业而不使用原始 fork/exec 不提供容器编排、服务发现、日志投递、资源管理(即装箱)。
我很惊讶 nvidia-docker 命令实际上并没有代表 docker,而是将命令转发给 docker。唯一真正有用的时候是调用 run/exec 命令(即nvidia-docker run --yar blar
),因为它调用了一个帮助程序,该程序返回一个 json 响应,带有适当的设备和 json 格式的卷挂载。当容器数据发送到实际的 docker 套接字时,它包括安装在主机上的 cuda 版本的正确设备和卷(检查你的容器)。
使用 exec 驱动程序实施此解决方案的另一部分是创建一个代表部署的任务,如果您希望进行滚动部署。我正在使用一个简单的脚本在与 nvidia-docker 任务相同的任务组内编排滚动部署。只要您在任务组中使用交错、最大并行(设置为 1)并确保在编排任务中有一个动态参数,如随机或日期(如果有 0 个差异,nomad 将不会更新任务),您应该是放。
一旦 nomad 有能力计算 gpu(这里需要自定义指纹: https ://github.com/hashicorp/nomad/tree/master/client/fingerprint )资源类型并能够安装非块类型设备(即不是一个磁盘)应该可以使用 nvidia-docker 来规避。我希望这会有所帮助,请务必在此处提出功能请求:
https://github.com/hashicorp/nomad/issues/2938
要扩展使用传统 docker 运行此操作,您还必须挂载由 nvidia-docker 创建的卷。docker volume ls
将显示命名卷,您必须为您的容器安装 cuda 卷才能访问驱动程序(除非您已经填充到您的容器中,不推荐)。
这从 Nomad 0.9 开始具有本机支持: https ://www.hashicorp.com/blog/using-hashicorp-nomad-to-schedule-gpu-workloads
这个想法是为此创建一个适当的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"]
接着:
构建基础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
条目的主机和容器驱动程序版本不匹配。