私はdocker containerの中からGPUを使う方法を探しています。
コンテナは任意のコードを実行するので、特権モードを使用したくありません。
任意のヒント?
以前の調査から、私はrun -v
やLXC cgroup
がその方法であることを理解していましたが、それを正確にやめる方法がわかりません。
わかりました - 私はようやく--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 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
これは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つを起動してトリックを実行してください。結果はそのようになるはずです ご覧のとおり、グループと日付の間には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
Reganの答えは素晴らしいですが、正しい方法はDockerが持っているようにlxc実行コンテキストを避けることです drop LXC docker 0.9以降のデフォルトの実行コンテキストとして、これはやや時代遅れです。
代わりに、--deviceフラグを使ってnvidiaデバイスについてdockerに通知し、lxcではなくネイティブの実行コンテキストを使用するほうが良いでしょう。
これらの手順は、次の環境でテストされています。
ホストマシンの設定を取得するには、 buntu 14.04を実行しているAWS GPUインスタンスのCUDA 6.5 を参照してください。
$ 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
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
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
これは、起動した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
実験的な GitHubリポジトリ をリリースしました。これにより、Dockerコンテナ内でNVIDIA GPUを使用するプロセスが簡単になります。
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 <[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
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
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コンテナ and: https://github.com/NVIDIA/nvidia-docker を参照してください。
ネイティブの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
Mviereckによる x11docker を使ってください。
https://github.com/mviereck/x11docker#hardware-acceleration によると
ハードウェアアクセラレーション
OpenGLのためのハードウェアアクセラレーションはオプション-g、 - gpuで可能です。
これは、ほとんどの場合、ホスト上のオープンソースドライバを使用している場合にはそのまま使用できます。そうでなければ、ウィキ:機能の依存関係を見てください。クローズドソースのNVIDIAドライバはいくつかの設定を必要とし、より少ないx11docker Xサーバーオプションをサポートします。
このスクリプトはすべての設定と設定を処理するので非常に便利です。 gpuを使ってX上でdockerイメージを実行するのと同じくらい簡単です。
x11docker --gpu imagename