web-dev-qa-db-ja.com

港湾労働者のコンテナからGPUを使用する?

私はdocker containerの中からGPUを使う方法を探しています。

コンテナは任意のコードを実行するので、特権モードを使用したくありません。

任意のヒント?

以前の調査から、私はrun -vやLXC cgroupがその方法であることを理解していましたが、それを正確にやめる方法がわかりません。

127
Regan

わかりました - 私はようやく--privilegedモードを使用せずにそれを行うことができました。

私はUbuntuのサーバー14.04で実行していると私は最新のCUDA(Linux用の6.0.37 13.04 64ビット)を使用しています。


準備

あなたのホストにnvidiaドライバとcudaをインストールしてください。 (それは少しトリッキーかもしれませんので私はあなたがこのガイドに従うことをお勧めします https://askubuntu.com/questions/451672/installation-and-testing-cuda-in-ubuntu-14-04

注意:Host cudaのインストールに使用したファイルを保存することはとても重要です。


Lxcを使ってDockerデーモンを実行する

設定を変更してコンテナからデバイスにアクセスできるようにするには、lxcドライバを使用してdocker daemonを実行する必要があります。

一回限りの利用:

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の行は次のようになります。

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

結果が空白の場合は、ホストでサンプルの1つを起動してトリックを実行してください。結果はそのようになるはずです enter image description here ご覧のとおり、グループと日付の間には2つの数字があります。これら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
38
Regan

Reganの答えは素晴らしいですが、正しい方法はDockerが持っているようにlxc実行コンテキストを避けることです drop LXC docker 0.9以降のデフォルトの実行コンテキストとして、これはやや時代遅れです。

代わりに、--deviceフラグを使ってnvidiaデバイスについてdockerに通知し、lxcではなくネイティブの実行コンテキストを使用するほうが良いでしょう。

環境

これらの手順は、次の環境でテストされています。

  • Ubuntu 14.04
  • CUDA 6.5
  • AWS GPUインスタンス.

あなたのホストにnvidiaドライバとcudaをインストールしてください

ホストマシンの設定を取得するには、 buntu 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 image を作成しました。このイメージがどのように構築されたかを知りたい場合は、 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
122
tleyden

実験的な GitHubリポジトリ をリリースしました。これにより、Dockerコンテナ内でNVIDIA GPUを使用するプロセスが簡単になります。

28
3XX0

Cuda-8.0をubuntu 16.04で更新しました

Dockerfile

FROM ubuntu:16.04
MAINTAINER Jonathan Kosgei <[email protected]>

# 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
  1. コンテナーを実行する

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

17
Jonathan

NVIDIAによる最近の機能強化により、これを行うためのはるかに堅牢な方法が生まれました。

本質的に彼らはコンテナの中にCUDA/GPUドライバをインストールする必要性を避けそしてそれをホストカーネルモジュールと一致させる方法を見つけました。

代わりに、ドライバはホスト上にあり、コンテナはそれらを必要としません。今は修正されたdocker-cliが必要です。

これは素晴らしいことです。今ではコンテナーの方がはるかにポータブルになっているからです。

enter image description here

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コンテナ and: https://github.com/NVIDIA/nvidia-docker を参照してください。

16
Matt

ネイティブのDockerを使用する代わりに、docker containerからGPUを使用するには、Nvidia-dockerを使用します。 Nvidia dockerをインストールするには、次のコマンドを使用します。

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey |  Sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/AMD64/nvidia-
docker.list | Sudo tee /etc/apt/sources.list.d/nvidia-docker.list
Sudo apt-get update
Sudo apt-get install -y nvidia-docker
Sudo pkill -SIGHUP dockerd # Restart Docker Engine
Sudo nvidia-docker run --rm nvidia/cuda nvidia-smi # finally run nvidia-smi in the same container
1
Patel Sunil

Mviereckによる x11docker を使ってください。

https://github.com/mviereck/x11docker#hardware-acceleration によると

ハードウェアアクセラレーション

OpenGLのためのハードウェアアクセラレーションはオプション-g、 - gpuで可能です。

これは、ほとんどの場合、ホスト上のオープンソースドライバを使用している場合にはそのまま使用できます。そうでなければ、ウィキ:機能の依存関係を見てください。クローズドソースのNVIDIAドライバはいくつかの設定を必要とし、より少ないx11docker Xサーバーオプションをサポートします。

このスクリプトはすべての設定と設定を処理するので非常に便利です。 gpuを使ってX上でdockerイメージを実行するのと同じくらい簡単です。

x11docker --gpu imagename
0
Blauhirn