如何在 Nvidia Docker 上使用 Nomad?

How to use Nomad with Nvidia Docker?

有什么方法可以将 nvidia-dockerNomad 一起使用吗?

Nvidia 上的计算程序在本地运行,但不适用于 nvidia-docker(它使用 CPU 而不是 GPU)。

这样做的首选方法是什么?

有人有这方面的经验吗?

我们的想法是为此创建一个合适的 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. 构建基础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 条目的主机和容器驱动程序版本不匹配。

这是我花了很多时间实现的东西,目前(游牧 0.7.0 虽然 运行 5.6 我自己)没有 'nomadic' 实现 nvidia-docker 不使用原始 fork/exec 的作业,它不提供容器编排、服务发现、日志传送、资源管理(即装箱)。

令我惊讶的是,nvidia-docker 命令实际上并不代表 docker,而是将命令转发给 docker。它真正有用的唯一一次是在调用 run/exec 命令(即 nvidia-docker run --yar blar)时,因为它调用了一个辅助程序,该程序 returns 使用适当的设备进行 json 响应,并且卷以 json 格式安装。当容器数据发送到实际的 docker 套接字时,它包括主机上安装的 cuda 版本的正确设备和卷(检查您的容器)。

使用 exec 驱动程序实现此解决方案的另一部分是创建一个代表部署执行的任务(如果您希望进行滚动部署)。我正在使用一个简单的脚本在与 nvidia-docker 任务相同的任务组内编排滚动部署。只要您在任务组中使用 stagger、max parallel(设置为 1)并确保您在编排任务中有一个动态参数,如随机或日期(如果差异为 0,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