从docker容器中使用GPU?

 手机用户2502870923 发布于 2022-12-29 13:38

我正在寻找一种从docker容器中使用GPU的方法.

容器将执行任意代码,因此我不想使用特权模式.

有小费吗?

从以前的研究中我了解到run -v和/或LXC cgroup是要走的路,但我不确定如何完全解决这个问题

6 个回答
  • 我们刚刚发布了一个实验性的GitHub存储库,它可以简化在Docker容器中使用NVIDIA GPU的过程.

    2022-12-29 13:40 回答
  • 好吧,我终于设法在不使用--privileged模式的情况下完成了.

    我正在运行ubuntu服务器14.04,我正在使用最新的cuda(6.0.37 for linux 13.04 64 bit).


    制备

    在您的主机上安装nvidia驱动程序和cuda.(这可能有点棘手,所以我建议你按照这个指南https://askubuntu.com/questions/451672/installing-and-testing-cuda-in-ubuntu-14-04)

    注意:保留用于主机cuda安装的文件非常重要


    使用lxc运行Docker Daemon

    我们需要使用lxc驱动程序运行docker守护程序,以便能够修改配置并让容器访问设备.

    一次使用:

    sudo service docker stop
    sudo docker -d -e lxc
    

    永久配置 修改位于/ etc/default/docker中的docker配置文件通过添加'-e lxc'来更改DOCKER_OPTS行这是修改后的我的行

    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -e lxc"
    

    然后使用重启守护进程

    sudo service docker restart
    

    如何检查守护进程是否有效使用lxc驱动程序?

    docker info
    

    执行驱动程序行应如下所示:

    Execution Driver: lxc-1.0.5
    

    使用NVIDIA和CUDA驱动程序构建映像.

    这是一个用于构建CUDA兼容映像的基本Dockerfile.

    FROM ubuntu:14.04
    MAINTAINER Regan <http://stackoverflow.com/questions/25185405/using-gpu-from-a-docker-container>
    
    RUN apt-get update && apt-get install -y build-essential
    RUN apt-get --purge remove -y nvidia*
    
    ADD ./Downloads/nvidia_installers /tmp/nvidia                             > Get the install files you used to install CUDA and the NVIDIA drivers on your host
    RUN /tmp/nvidia/NVIDIA-Linux-x86_64-331.62.run -s -N --no-kernel-module   > Install the driver.
    RUN rm -rf /tmp/selfgz7                                                   > For some reason the driver installer left temp files when used during a docker build (i don't have any explanation why) and the CUDA installer will fail if there still there so we delete them.
    RUN /tmp/nvidia/cuda-linux64-rel-6.0.37-18176142.run -noprompt            > CUDA driver installer.
    RUN /tmp/nvidia/cuda-samples-linux-6.0.37-18176142.run -noprompt -cudaprefix=/usr/local/cuda-6.0   > CUDA samples comment if you don't want them.
    RUN export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64         > Add CUDA library into your PATH
    RUN touch /etc/ld.so.conf.d/cuda.conf                                     > Update the ld.so.conf.d directory
    RUN rm -rf /temp/*  > Delete installer files.
    

    运行你的形象.

    首先,您需要确定与您的设备相关的主要号码.最简单的方法是执行以下命令:

    ls -la /dev | grep nvidia
    

    如果结果为空,请使用启动主机上的其中一个样本.结果应该是这样的 在此输入图像描述 如您所见,组和日期之间有一组2个数字.这两个数字称为主要和次要数字(按此顺序写入)并设计一个设备.为方便起见,我们将使用主要数字.

    为什么我们激活了lxc驱动程序?使用允许我们允许容器访问这些设备的lxc conf选项.选项是:(我建议使用*作为次要编号,因为它会减少运行命令的长度)

    --lxc-conf ='lxc.cgroup.devices.allow = c [主要号码]:[次要号码或*] rwm'

    所以如果我想发布一个容器(假设您的图像名称是cuda).

    docker run -ti --lxc-conf='lxc.cgroup.devices.allow = c 195:* rwm' --lxc-conf='lxc.cgroup.devices.allow = c 243:* rwm' cuda
    

    2022-12-29 13:40 回答
  • Regan的答案很棒,但它有点过时,因为正确的方法是避免lxc执行上下文,因为Docker已将LXC作为docker 0.9的默认执行上下文.

    相反,最好通过--device标志告诉docker关于nvidia设备,并且只使用本机执行上下文而不是lxc.

    环境

    这些说明在以下环境中进行了测试:

    Ubuntu 14.04

    CUDA 6.5

    AWS GPU实例.

    在您的主机上安装nvidia驱动程序和cuda

    请参阅运行Ubuntu 14.04的AWS GPU实例上的CUDA 6.5以获取主机设置.

    安装Docker

    $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
    $ sudo sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
    $ sudo apt-get update && sudo apt-get install lxc-docker
    

    找到你的nvidia设备

    ls -la /dev | grep nvidia
    
    crw-rw-rw-  1 root root    195,   0 Oct 25 19:37 nvidia0 
    crw-rw-rw-  1 root root    195, 255 Oct 25 19:37 nvidiactl
    crw-rw-rw-  1 root root    251,   0 Oct 25 19:37 nvidia-uvm
    

    运行预先安装了nvidia驱动程序的Docker容器

    我已经创建了一个预先安装了cuda驱动程序的docker 镜像.该dockerfile,如果你想知道这个图片是如何构建的,请在dockerhub.

    您需要自定义此命令以匹配您的nvidia设备.这对我有用:

     $ sudo docker run -ti --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm tleyden5iwx/ubuntu-cuda /bin/bash
    

    验证CUDA已正确安装

    这应该从刚刚启动的docker容器内部运行.

    安装CUDA样本:

    $ cd /opt/nvidia_installers
    $ ./cuda-samples-linux-6.5.14-18745345.run -noprompt -cudaprefix=/usr/local/cuda-6.5/
    

    构建deviceQuery示例:

    $ cd /usr/local/cuda/samples/1_Utilities/deviceQuery
    $ make
    $ ./deviceQuery   
    

    如果一切正常,您应该看到以下输出:

    deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 6.5, CUDA Runtime Version = 6.5, NumDevs =    1, Device0 = GRID K520
    Result = PASS
    

    2022-12-29 13:40 回答
  • NVIDIA最近的增强功能已经产生了一种更加强大的方式来实现这一目标.

    基本上,他们已经找到了一种方法来避免在容器中安装CUDA/GPU驱动程序并使其与主机内核模块匹配.

    相反,驱动程序在主机上,容器不需要它们.它现在需要修改的docker-cli.

    这很棒,因为现在容器更便携.

    在此输入图像描述

    对Ubuntu的快速测试:

    # Install nvidia-docker and nvidia-docker-plugin
    wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
    sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb
    
    # Test nvidia-smi
    nvidia-docker run --rm nvidia/cuda nvidia-smi
    

    有关更多详细信息,请参阅:支持 GPU的Docker容器 和:https://github.com/NVIDIA/nvidia-docker

    2022-12-29 13:40 回答
  • 编写更新后的答案,因为到目前为止大多数已经存在的答案已经过时了。

    早于Docker 19.03要求nvidia-docker2--runtime=nvidia标志的版本。

    从开始Docker 19.03,您需要安装nvidia-container-toolkit软件包,然后使用该--gpus all标志。

    所以,这是基础

    套件安装

    nvidia-container-toolkit根据Github上的官方文档安装软件包。

    对于基于Redhat的操作系统,请执行以下命令集:

    $ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
    $ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo
    
    $ sudo yum install -y nvidia-container-toolkit
    $ sudo systemctl restart docker
    

    对于基于Debian的操作系统,请执行以下命令集:

    # Add the package repositories
    $ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
    $ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
    $ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
    
    $ sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
    $ sudo systemctl restart docker
    

    在GPU支持下运行Docker

    docker run --name my_all_gpu_container --gpus all -t nvidia/cuda
    

    请注意,该标志--gpus all用于将所有可用gpu分配给docker容器。

    要将特定的GPU分配给Docker容器(如果您的计算机中有多个GPU)

    docker run --name my_first_gpu_container --gpus device=0 nvidia/cuda
    

    要么

    docker run --name my_first_gpu_container --gpus '"device=0"' nvidia/cuda
    

    2022-12-29 13:40 回答
  • 更新了ubuntu 16.04上的cuda-8.0

    安装docker https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04

    构建包含nvidia驱动程序和cuda工具包的以下映像

    Dockerfile

    FROM ubuntu:16.04
    MAINTAINER Jonathan Kosgei <jonathan@saharacluster.com>
    
    # A docker container with the Nvidia kernel module and CUDA drivers installed
    
    ENV CUDA_RUN https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda_8.0.44_linux-run
    
    RUN apt-get update && apt-get install -q -y \
      wget \
      module-init-tools \
      build-essential 
    
    RUN cd /opt && \
      wget $CUDA_RUN && \
      chmod +x cuda_8.0.44_linux-run && \
      mkdir nvidia_installers && \
      ./cuda_8.0.44_linux-run -extract=`pwd`/nvidia_installers && \
      cd nvidia_installers && \
      ./NVIDIA-Linux-x86_64-367.48.run -s -N --no-kernel-module
    
    RUN cd /opt/nvidia_installers && \
      ./cuda-linux64-rel-8.0.44-21122537.run -noprompt
    
    # Ensure the CUDA libs and binaries are in the correct environment variables
    ENV LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-8.0/lib64
    ENV PATH=$PATH:/usr/local/cuda-8.0/bin
    
    RUN cd /opt/nvidia_installers &&\
        ./cuda-samples-linux-8.0.44-21122537.run -noprompt -cudaprefix=/usr/local/cuda-8.0 &&\
        cd /usr/local/cuda/samples/1_Utilities/deviceQuery &&\ 
        make
    
    WORKDIR /usr/local/cuda/samples/1_Utilities/deviceQuery
    

      运行你的容器

    sudo docker run -ti --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm <built-image> ./deviceQuery

    您应该看到类似于的输出:

    deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GRID K520 Result = PASS

    2022-12-29 13:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有