冒頭:どんな問題が発生したか
DockerコンテナでGPUを使用тингаを пытающихся запустить GPU 対応コンテナを実行したところ、以下のようなエラーが発生する場合があります:
docker: Error response from daemon: OCI runtime create failed: container_linux.go: starting container process caused: process_linux.go: mounting "proc" to rootfs "..." caused: operation not permitted
あるいは:
docker: Error response from daemon: could not select runtime "nvidia"
さらに、CUDA バージョンの不一致导致的次のようなエラーも頻繁に発生します:
CUDA error: no kernel image is available for execution on the device
これらのエラーは、ホスト環境のNVIDIA Driverとコンテナ内のCUDA Runtimeのバージョン互換性が 确保されていない場合に発生します。 Docker 19.03以降ではnvidia-dockerの代わりに標準の–gpusフラグを使用しますが、設定如果不完整的话,就会导致GPU无法使用。
結論:解決策を一言で
nvidia-container-toolkitを正しくインストールし、–gpusフラグでGPUを明示的に指定することで、DockerコンテナからGPUを正しく利用できるようになります。
具体的な手順:ステップバイステップ
ステップ1:ホスト環境のNVIDIA Driverを確認する
まず、ホストマシンにインストールされているNVIDIA Driverのバージョンを確認します:
nvidia-smi
このコマンドにより、Driver Version、CUDA Versionが表示されます。これらの情報は后续步骤で很重要。
ステップ2:nvidia-container-toolkitをインストールする
Ubuntu/Debianの場合:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
CentOS/RHELの場合:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo
sudo yum install -y nvidia-container-toolkit
ステップ3:Dockerデーモンを設定する
nvidia-container-runtimeをDockerデーモンのデフォルトランタイムとして設定します:
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
ステップ4:Docker демон設定を確認する
/etc/docker/daemon.jsonが以下のように設定されていることを確認します:
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia"
}
ステップ5:GPUを指定してコンテナを実行する
Docker 19.03以降では、nvidia-dockerの代わりに–gpusフラグを使用します:
docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi
特定のGPUのみを定する場合:
docker run --rm --gpus device=0 nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi
ステップ6:CUDAバージョンの互換性を確認する
ホスト環境のCUDAバージョンに合わせて、適切なCUDAイメージを選択することが重要です。NVIDIA公式のCUDA Dockerイメージから、適切なタグ付いたイメージを使用してください。
例えば、ホスト環境がCUDA 11.8の場合は:
docker run --rm --gpus all nvidia/cuda:11.8.0-runtime nvidia-smi
# または
docker run --rm --gpus all nvidia/cuda:11.8.0-devel nvidia-smi
補足・注意点
バージョン依存の落とし穴
- Dockerバージョンの確認:–gpusフラグはDocker 19.03以降で使用可能ですそれ以前のバージョンではnvidia-docker(旧バージョン)が必要です
- CUDA DriverとRuntimeの互換性:ホスト環境のNVIDIA DriverがサポートするCUDAバージョンより新しいCUDA Runtimeイメージをコンテナ内で使用すると Compatibility Error が発生しやすいです
- TensorRT・cuDNNのバージョン管理:深層学習フレームワークを使用する場合は、TensorRTやcuDNNのバージョンも合わせる必要があります
環境差異による問題
- WSL2環境:Windows Subsystem for Linux 2でDocker Desktopを使用する場合、追加の設定が必要な場合があります
- Rootlessモード:rootless DockerではGPUアクセスに 的な権限設定が必要な場合があります
- Podmanとの比較:Podmanでは動作するがDockerでは動作しない場合があるため、設定の違いを確認してください
よくある落とし穴
- nvidia-container-runtimeがインストールされていない状態で–runtime=nvidiaを指定する
- daemon.jsonの設定変更後にDockerを再起動しない
- ホスト環境のCUDAバージョンより古いイメージを используя 导致 版本 不匹配
参考元
- nvidia/cuda – Docker Image
- Cuda Runtime/Driver incompatibility in docker container – Stack Overflow
- Building docker image with cuda runtime – Stack Overflow
- Docker Fails to Launch GPU Containers with NVIDIA Runtime – Docker Community Forums