banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

Nvidia CUDA開発環境 Dockerコンテナでのグラフィックスカードの有効化

Nvidia CUDA 開発環境 Docker コンテナでの GPU の有効化

  1. Docker の準備 > 19.03 環境を整え、nvidia-container-toolkit を設定します。
  2. ホストマシンにインストールされている GPU ドライバのバージョンを確認し、必要なコンテナのバージョンと一致させます。
  3. 基本的な Docker イメージを Pull します。公式サイトまたは Docker Hub からダウンロードできます。https://ngc.nvidia.com/catalog/containers/nvidia/tags https://gitlab.com/nvidia/container-images/cuda

cuda10-py36-conda の Dockerfile

FROM nvidia/cuda:10.0-cudnn7-devel-ubuntu18.04
MAINTAINER Limc #close frontend
ENV DEBIAN_FRONTEND noninteractive

cuda ユーザーを追加#

--disabled-password = パスワードを割り当てない#

OpenShift の互換性のために root グループを使用#

ENV CUDA_USER_NAME=cuda10
ENV CUDA_USER_GROUP=root

ユーザーを追加#

RUN adduser --system --group --disabled-password --no-create-home --disabled-login $CUDA_USER_NAME
RUN adduser $CUDA_USER_NAME $CUDA_USER_GROUP

基本的な依存関係をインストール#

RUN apt-get update && apt-get install -y --no-install-recommends
build-essential
cmake
git
wget
libopencv-dev
libsnappy-dev
python-dev
python-pip
#tzdata
vim

Python のために conda をインストール#

RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.2-Linux-x86_64.sh -O ~/miniconda.sh &&
/bin/bash ~/miniconda.sh -b -p /opt/conda &&
rm ~/miniconda.sh

ロケールを設定#

ENV LANG C.UTF-8 LC_ALL=C.UTF-8

ENV PATH /opt/conda/bin:$PATH

RUN ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh &&
echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc &&
echo "conda activate base" >> ~/.bashrc &&
find /opt/conda/ -follow -type f -name '.a' -delete &&
find /opt/conda/ -follow -type f -name '
.js.map' -delete &&
/opt/conda/bin/conda clean -afy

entrypoint.sh をコピー#

#COPY ./entrypoint.sh /entrypoint.sh

インストール#

#ENTRYPOINT ["/entrypoint.sh"]

ワークスペースを初期化#

COPY ./app /app

ワークディレクトリを作成#

WORKDIR /app

必要に応じて pip をアップグレード#

#RUN pip install --upgrade --no-cache-dir pip

gunicorn をインストール#

RUN pip install --no-cache-dir -r ./requirements.txt#

conda を使用してインストール#

#RUN conda install --yes --file ./requirements.txt
RUN while read requirement; do conda install --yes $requirement; done < requirements.txt

entrypoint.sh をコピー#

COPY ./entrypoint.sh /entrypoint.sh

インストール#

ENTRYPOINT ["/entrypoint.sh"]

非ルートユーザーに切り替え#

USER $CUDA_USER_NAME

コンテナの実行 Makefile

IMG:=cat Name
GPU_OPT:=all
MOUNT_ETC:=
MOUNT_LOG:=
MOUNT_APP:=-v pwd/work/app:/app
MOUNT:=$(MOUNT_ETC) $(MOUNT_LOG) $(MOUNT_APP)
EXT_VOL:=
PORT_MAP:=
LINK_MAP:=
RESTART:=no
CONTAINER_NAME:=docker-cuda10-py36-hello

echo:
echo $(IMG)

run:
docker rm $(CONTAINER_NAME) || echo
docker run -d --gpus $(GPU_OPT) --name $(CONTAINER_NAME) $(LINK_MAP) $(PORT_MAP) --restart=$(RESTART)
$(EXT_VOL) $(MOUNT) $(IMG)

run_i:
docker rm $(CONTAINER_NAME) || echo
docker run -i -t --gpus $(GPU_OPT) --name $(CONTAINER_NAME) $(LINK_MAP) $(PORT_MAP)
$(EXT_VOL) $(MOUNT) $(IMG) /bin/bash

exec_i:
docker exec -i -t --name $(CONTAINER_NAME) /bin/bash

stop:
docker stop $(CONTAINER_NAME)

rm: stop
docker rm $(CONTAINER_NAME)

Entrypoint.sh

set -e

必要に応じて python を追加#

if [ "${1:0:1}" = '-' ]; then
set -- python "$@"
fi

gunicorn を実行している場合は root 権限を削除#

コンテナを `--user` オプションで起動できるようにする#

if [ "$1" = 'python' -a "$(id -u)" = '0' ]; then
# ユーザーが変更可能なディレクトリの所有権を gunicorn に変更
for path in
/app
/usr/local/cuda/
; do
chown -R cuda10 "$path"
done

set -- su-exec python "$@"
#exec su-exec elasticsearch "$BASH_SOURCE" "$@"

fi

引数が gunicorn と関連していない場合は、ユーザーが独自のプロセスを実行したいと想定し、#

例えばこのイメージを探索するための `bash` シェルを実行します#

exec "$@"

注意事項

  1. GPU の実行には root ユーザーの権限が必要です。そうでない場合、以下のエラーが発生します。docker: Error response from daemon: OCI runtime create failed: container_linux.go:345 セキュリティを考慮して、コンテナ内で新しいユーザーを作成し、root グループに追加することができます。
  2. ホストマシンの GPU ドライバと CUDA は、公式コンテナのバージョンと一致する必要があります。ただし、cudnn は一致する必要はありません。異なるバージョンの cudnn を使用することができますが、GPU の要件を満たす必要があります。
  3. Docker コンテナの異常終了時には GPU が占有されます。フリーズすると、コンテナの外部で使用できなくなり、docker-daemon の再起動も効果がありません。この場合、コンピュータを再起動する必要があります。

完全なソースコードはこちらです。https://github.com/limccn/ultrasound-nerve-segmentation-in-tensorflow/commit/d7de1cbeb641d2fae4f5a78ff590a0254667b398

参考文献 https://gitlab.com/nvidia/container-images/cuda

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。