1. Dockerfileの定義
深層学習モデルの開発に適したベースイメージを選択し、必要な依存ライブラリをインストールするためのDockerfileを作成します。ここでは、PyTorchとCUDA 11.3をベースにした環境を構築します。
FROM pytorch/pytorch:1.10.0-cuda11.3-cudnn8-devel
# パッケージマネージャーのクリーンアップとミラーサイトの設定
RUN rm -f /etc/apt/sources.list.d/cuda.list /etc/apt/sources.list.d/nvidia-ml.list && \
apt-key del 7fa2af80 && \
sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
# 必須ツールのインストール
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
vim \
git \
wget \
ca-certificates && \
rm -rf /var/lib/apt/lists/*
# CUDA関連のレポジトリキー更新
RUN wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-keyring_1.0-1_all.deb && \
dpkg -i cuda-keyring_1.0-1_all.deb
# Python依存関係のコピー
COPY ./requirements.txt /tmp/requirements.txt
2. イメージのビルドとコンテナの実行
作成したDockerfileを基にイメージをビルドします。ホストのネットワーク設定を継承するために --network=host を指定します。
# イメージ名とタグを指定してビルド
docker build -t custom_dl_env:v1.0 . --network=host
# GPUを有効化してコンテナを起動
docker run -it --gpus all --network=host --name dl_container custom_dl_env:v1.0 /bin/bash
一度終了したコンテナを再起動する場合は、以下のコマンドを使用します。
docker start -ia dl_container
3. コンテナ内でのpip最適化
ライブラリのインストール速度を向上させるため、pipの国内ミラーサーバーを設定します。~/.config/pip/pip.conf を編集または作成します。
mkdir -p ~/.config/pip
cat <<EOF > ~/.config/pip/pip.conf
[global]
index-url = https://mirrors.aliyun.com/pypi/simple
[install]
trusted-host = mirrors.aliyun.com
EOF
4. コンテナの状態をイメージとして保存
環境構築が完了した後、その状態を新しいイメージとしてコミットします。
# 実行中のコンテナIDを確認
docker ps
# コンテナをイメージとして保存
docker commit [CONTAINER_ID] custom_dl_env:final_v1
# Docker Hubやプライベートレジストリにプッシュ
docker login
docker push custom_dl_env:final_v1
5. トラブルシューティング
エラー1: CUDAヘッダーが見つからない
CUDA関連のコンパイル時に cuda_runtime_api.h: No such file or directory というエラーが発生した場合、環境変数のパスが通っていない可能性があります。~/.bashrc に以下を追記します。
export CUDA_PATH=/usr/local/cuda-11.3
export CUDA_HOME=$CUDA_PATH
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
export NVCC=$CUDA_HOME/bin/nvcc
追記後、source ~/.bashrc で反映させてください。
エラー2: PyTorchのCUDAアーキテクチャリストのインデックスエラー
IndexError: list index out of range が発生する場合、ビルド時に適切なGPUアーキテクチャが検出されていません。環境変数 TORCH_CUDA_ARCH_LIST を手動で設定することで回避できます。
# CUDAバージョンに基づいてアーキテクチャを明示的に指定
TARGET_CUDA_VER=$(nvcc --version | grep -Po 'release \K[^,]+')
if [[ "${TARGET_CUDA_VER}" == "11."* ]]; then
export TORCH_CUDA_ARCH_LIST="6.0;6.1;7.0;7.5;8.0;8.6+PTX"
elif [[ "${TARGET_CUDA_VER}" == "10."* ]]; then
export TORCH_CUDA_ARCH_LIST="3.5;5.0;6.0;6.1;7.0;7.5+PTX"
fi
エラー3: 共有ライブラリの欠落
OpenCVなどのライブラリを使用する際、libGL.so.1 や libgthread-2.0.so.0 が見つからないエラーが発生することがあります。これらはOSレベルのパッケージをインストールすることで解決します。
apt-get update
# libGLのインストール
apt-get install -y libgl1
# GLibおよびX11関連のインストール
apt-get install -y libglib2.0-0 libsm6 libxrender1 libxext6
また、CUDAソースのコンパイルを行う際は、コンテナ起動時に必ず --gpus all フラグを付与していることを確認してください。