1

有什么方法可以使用nvidia-dockerwithNomad吗?

Nvidia 上的计算程序可以在本地工作,但不能正常工作nvidia-docker(它使用 CPU 而不是 GPU)。

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

  • 使用nvidia-docker驱动程序Nomad
  • 使用 rawdocker exec运行nvidia-docker
  • 以某种方式连接Nomadnvidia-docker引擎

有没有人有这方面的经验?

4

3 回答 3

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 将不会更新任务),您应该是放。

一旦 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 卷才能访问驱动程序(除非您已经填充到您的容器中,不推荐)。

于 2017-11-03T14:55:05.720 回答
0

这从 Nomad 0.9 开始具有本机支持: https ://www.hashicorp.com/blog/using-hashicorp-nomad-to-schedule-gpu-workloads

于 2019-09-12T11:31:02.857 回答
-2

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

于 2017-05-20T08:54:50.860 回答