Skip to content

Dockerコンテナ内での「Failed to initialize NVML: Unknown Error」の解決方法

問題の概要

DockerコンテナでGPUを使用している場合、コンテナ起動時は正常に動作するにもかかわらず、数時間または数日経過すると「Failed to initialize NVML: Unknown Error」というエラーが発生し、GPUが利用できなくなる現象が報告されています。ホストマシンではnvidia-smiが正常に動作するにもかかわらず、コンテナ内ではこのエラーが発生します。

原因

この問題の主な原因は、ホストシステムでsystemctl daemon-reloadなどのcgroups関連の操作が実行された際に、NVIDIA GPUへの参照が再読み込みされるためです。これにより、コンテナがGPUへのアクセス権を失ってしまいます。

問題の確認方法

問題が発生しているかどうかを確認するには、以下の手順を実行してください:

bash
# ホストマシンで実行
sudo systemctl daemon-reload

このコマンド実行後、コンテナ内でnvidia-smiがエラーを返すようになる場合は、この問題に該当します。

解決方法

方法1: nvidia-container-runtimeの設定変更(推奨)

最も効果的で安定した解決方法です。

bash
# 設定ファイルの編集
sudo vim /etc/nvidia-container-runtime/config.toml

設定ファイル内でno-cgroups = falseに変更し、保存します。

toml
# 変更前
# no-cgroups = true

# 変更後
no-cgroups = false

その後、Dockerデーモンを再起動します。

bash
sudo systemctl restart docker

変更が適用されたかテストします。

bash
sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi

方法2: Dockerデーモンの設定変更

cgroupsドライバを変更する方法です。

bash
# Dockerデーモン設定ファイルを編集
sudo nano /etc/docker/daemon.json

既存の設定に以下の行を追加します。

json
{
  "runtimes": {
    "nvidia": {
      "args": [],
      "path": "nvidia-container-runtime"
    }
  },
  "exec-opts": ["native.cgroupdriver=cgroupfs"]
}

設定を保存後、Dockerサービスを再起動します。

bash
sudo service docker restart

方法3: カーネルcgroupのバージョンアップグレード

Linuxカーネルをバージョン4.5以上にアップグレードし、cgroup v2を使用する方法です。これは根本的な解決策ですが、環境によっては実施が難しい場合があります。

注意点

カーネルのアップグレードはシステム全体に影響するため、慎重に計画してください。

一時的な回避策

コンテナの再起動

単純にコンテナを再起動するだけで一時的に問題が解決することがあります。

bash
docker restart <container_name>

自動回復システムの導入

コンテナのヘルスチェックと自動再起動を組み合わせた方法です。

dockerfile
HEALTHCHECK \
    --start-period=60s \
    --interval=20s \
    --timeout=10s \
    --retries=2 \
    CMD nvidia-smi || exit 1
yaml
services:
  gpu_container:
    # ... その他の設定
    healthcheck:
      test: ["CMD-SHELL", "nvidia-smi || exit 1"]
      start_period: 1s
      interval: 20s
      timeout: 5s
      retries: 2
    restart: always

その他の考慮事項

  • ドライバのバージョン不一致: ホストマシンの再起動が必要な場合があります
  • システムアップデート後: UbuntuやDockerのメジャーアップデート後は互換性確認が重要です
  • NVIDIAドライバの更新: 最新の安定版ドライバを使用してください

まとめ

Dockerコンテナ内での「Failed to initialize NVML: Unknown Error」は、cgroupsの設定問題が主な原因です。方法1のnvidia-container-runtime設定変更が最も確実な解決策となります。本番環境では、方法3の自動回復システムとの組み合わせを検討することで、より堅牢なシステム構築が可能です。

最新情報の確認

NVIDIAは定期的にドライバとツールキットを更新しています。公式GitHubリポジトリ(NVIDIA/nvidia-docker)で最新の情報を確認してください。