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

时间:2017-05-16 14:54:47

标签: docker gpu nvidia nomad nvidia-docker

有没有办法将nvidia-dockerNomad一起使用?

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

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

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

有没有人经历过这个?

3 个答案:

答案 0 :(得分:1)

这是我花了很多时间实现的,此时(nomad 0.7.0虽然自己运行5.6)没有“游牧”方式来实现nvidia-docker作业而不使用raw fork / exec不提供容器编排,服务发现,日志传送,资源管理(即装箱包装)。

我很惊讶nvidia-docker命令实际上并不代表docker,或者它将命令转发给docker。唯一真正有用的是调用run / exec命令(即nvidia-docker run --yar blar),因为它调用一个帮助程序,该程序返回一个json响应,其中相应的设备和卷以json格式安装。当容器数据发送到实际的docker socket时,它包含安装在主机上的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卷才能访问驱动程序(除非您已经填充到容器中,不推荐使用)。

答案 1 :(得分:0)

答案 2 :(得分:-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
    
  3. 消息如:

    Failed to initialize NVML: Unknown Error
    

    可能是由于缺少主机/dev条目的主机和容器驱动程序版本不匹配。