如何将 Nomad 与 Nvidia Docker 一起使用?

Posted

技术标签:

【中文标题】如何将 Nomad 与 Nvidia Docker 一起使用?【英文标题】:How to use Nomad with Nvidia Docker? 【发布时间】:2017-10-15 17:43:08 【问题描述】:

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

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

最好的方法是什么?

Nomad 使用nvidia-docker 驱动程序 使用原始docker exec 运行nvidia-docker 以某种方式将Nomad 连接到nvidia-docker 引擎

有人有这方面的经验吗?

【问题讨论】:

【参考方案1】:

这是我花了很多时间实现的东西,目前(虽然我自己运行的是 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 能够计算 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 卷才能访问驱动程序(除非您已经填充到您的容器中,不推荐)。

【讨论】:

【参考方案2】:

从 Nomad 0.9 开始,它具有原生支持: https://www.hashicorp.com/blog/using-hashicorp-nomad-to-schedule-gpu-workloads

【讨论】:

【参考方案3】:

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

【讨论】:

您正在 docker 映像/dockerfile 中安装 nvidia 驱动程序。这使nvidia-docker 的意图无效。 nvidia-docker 的重点是主机和容器驱动版本之间不会不匹配。

以上是关于如何将 Nomad 与 Nvidia Docker 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Nomad 连接两个 docker 容器

如何在 HashiCorp nomad 环境中管理网络和存储?

如何在我的 docker ubuntu 映像中获取 nvidia 驱动程序?

如何在 nvidia/cuda 基础 docker 中仅安装 nvcc?

Tensorflow/nvidia/cuda docker 版本不匹配

ubuntu20.04如何安装nvidia-docker?