Nvidia CUDA 開発環境 Docker コンテナでの GPU の有効化
- Docker の準備 > 19.03 環境を整え、nvidia-container-toolkit を設定します。
- ホストマシンにインストールされている GPU ドライバのバージョンを確認し、必要なコンテナのバージョンと一致させます。
- 基本的な 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 "$@"
注意事項
- GPU の実行には root ユーザーの権限が必要です。そうでない場合、以下のエラーが発生します。docker: Error response from daemon: OCI runtime create failed: container_linux.go:345 セキュリティを考慮して、コンテナ内で新しいユーザーを作成し、root グループに追加することができます。
- ホストマシンの GPU ドライバと CUDA は、公式コンテナのバージョンと一致する必要があります。ただし、cudnn は一致する必要はありません。異なるバージョンの cudnn を使用することができますが、GPU の要件を満たす必要があります。
- Docker コンテナの異常終了時には GPU が占有されます。フリーズすると、コンテナの外部で使用できなくなり、docker-daemon の再起動も効果がありません。この場合、コンピュータを再起動する必要があります。
完全なソースコードはこちらです。https://github.com/limccn/ultrasound-nerve-segmentation-in-tensorflow/commit/d7de1cbeb641d2fae4f5a78ff590a0254667b398