【Docker】CUDAランタイムエラーが発生した時の解決法

冒頭:どんな問題が発生したか

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バージョンより古いイメージを используя 导致 版本 不匹配

参考元

おすすめ環境

💡 この問題を根本的に解決するには

ローカル環境でGPUトラブルが頻発する場合、クラウドGPUサービスの利用も検討してみてください。環境構築の手間なく、すぐにAI開発を始められます。

  • RunPod — RTX 4090が$0.44/h〜、ワンクリックでJupyter環境が起動
  • Vast.ai — コミュニティGPUマーケットプレイス、最安値でGPUレンタル
この記事は役に立ちましたか?