DRAMを128GBから256GBに増設したら、ollamaがGPUを認識しなくなった話
結論
DRAMを128GBから256GBに増設したら、ollamaがGPUを認識しなくなりました。
これは、cudaの初期化でエラーになっていました。
CUDA 12.8およびNVIDIA Driver 570シリーズでは、Linuxでメモリが大容量(例:256GB)ある場合、CUDA初期化時に失敗する 既知の不具合 が存在します。特に openソース版のGPUカーネルモジュール を使用している場合、nvidia-uvm
がHMMモードを有効にしようとし、CUDAが初期化できなくなることがあります。
そのため、以下の通り、hmmをdisableにする回避策をとる必要があります。
🔧 対処法:
-
/etc/modprobe.d/nvidia-uvm.conf
などを作成し、以下を記述:options nvidia-uvm uvm_disable_hmm=1
-
その後、再起動または
sudo modprobe -r nvidia_uvm && sudo modprobe nvidia_uvm
。 -
nvidia-smi -q
で GPU の "Addressing Mode" がHMM
→None
に変わったことを確認。
経緯
もともと、Proxmox8.5.3上にLXCコンテナを作成しollamaは正常に動いていました。
CUDA_VISIBLE_DEVICES環境変数で成業すれば、ちゃんと、どちらのGPU上でもLLMを動作させることができていました。
増設前のマシンスペックは以下のようなものでした。
- RAM: 128GB
- GPU1: nvidia rtx-3090 (24GB)
- GPU2: nvidia rtx-4060Ti (16GB)
- CPU: Core i9-13900KF(24C/32T)
- SSD: 2TB
Qwen3:235b-a22b をDRAMに全部載せて動かしたい、という動機でDRAMを128GBから256GBに増設しましたところ、なぜか、ollamaがGPUを認識しなくなりました。
切り分け
- コンテナ上で、nvidia-smiは正常に動作しています。ここから、ドライバは動いていることがわかります。
- Proxmoxのホスト上で、cudaのサンプルのdeviceQueryをビルドして実行すると、以下のようなエラーになりました。
root@rx3090:~/deviceQuery# ./deviceQuery
./deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
cudaGetDeviceCount returned 3
-> initialization error
Result = FAIL
root@rx3090:~/deviceQuery#
これで、コンテナ側の設定ではなく、ホスト側の設定の問題だと確定しました。
この語、マザーボードの設定を触ったり、デバイスドライバのバージョン回りを調整したり、いろいろしましたが、関係なかったので詳細は割愛します。
そして、原因判明
o3のDeepResearchに調査を依頼したところ、いい感じに調べてくれました。
この、原因候補1 が問題だったようで、この対処方法を実行することで、解決しました。
Proxmox LXC + CUDA + メモリ増設後の初期化エラー調査結果
あなたの環境(Proxmox 8.3.5 ホスト + CUDA 12.8 + NVIDIA ドライバ 570.124.04)において、物理メモリを128GBから256GBに増設後、deviceQuery
実行時に cudaGetDeviceCount
が初期化エラー(error code 3)を返す問題について、以下の原因と対処法が考えられます。
✅ 原因候補1:HMM(Heterogeneous Memory Management)とOpen GPU Kernel Modulesの不具合
CUDA 12.8およびNVIDIA Driver 570シリーズでは、Linuxでメモリが大容量(例:256GB)ある場合、CUDA初期化時に失敗する 既知の不具合 が存在します。特に openソース版のGPUカーネルモジュール を使用している場合、nvidia-uvm
がHMMモードを有効にしようとし、CUDAが初期化できなくなることがあります。
🔧 対処法:
-
/etc/modprobe.d/nvidia-uvm.conf
などを作成し、以下を記述:options nvidia-uvm uvm_disable_hmm=1
-
その後、再起動または
sudo modprobe -r nvidia_uvm && sudo modprobe nvidia_uvm
。 -
nvidia-smi -q
で GPU の "Addressing Mode" がHMM
→None
に変わったことを確認。
✅ 原因候補2:プロプライエタリ(closed-source)とopenモジュールの混在や不一致
.run
ファイルでドライバをインストールした場合、インストール時に open GPU kernel modules を選択していると、上述の問題が発生します。実際に多くのユーザーが、openモジュールからプロプライエタリに切り替えることで解決しています。
🔧 対処法:
-
.run
ファイルを再実行し、openカーネルモジュールを無効にしてインストール(--no-open-gpu-kernel-modules
オプション)を選ぶ。
✅ 原因候補3:CUDAランタイムとドライババージョンの不一致
cudaGetDeviceCount
エラーの多くは、CUDAライブラリ(libcuda.so
など)とドライバのバージョンが不一致なことに起因します。特に以前のCUDA環境が残っている場合、旧バージョンのライブラリを読み込んでしまい、初期化に失敗します。
🔧 対処法:
-
nvcc --version
およびnvidia-smi
が 両方とも 12.8 を示していることを確認。 -
ldd ./deviceQuery
で読み込んでいるCUDAライブラリが/usr/local/cuda-12.8/
のものであることを確認。
✅ 原因候補4:BIOS設定の変更(意図せぬリセット含む)
メモリ増設により、BIOS設定がリセットされている可能性があります。特に以下の2点を確認してください:
🔧 必須設定:
- 「Above 4G Decoding」 = Enabled
- 「Resizable BAR(ReBAR)」= 一時的に Disabled で動作確認
※ 一部の組み合わせでは ReBAR が有効だとリソース割り当てに失敗し、GPU初期化に悪影響を与える例が報告されています。
✅ 原因候補5:割り込み(MSI)関連の不具合
一部環境では、MSI(Message Signaled Interrupts) が正しく動作せず CUDAが初期化できない例もあります。
🔧 対処法:
# /etc/modprobe.d/nvidia.conf に以下を追記
options nvidia NVreg_EnableMSI=0
その後、再起動して deviceQuery
を再実行。
✅ Proxmoxコンテナ(LXC)側の確認点
CUDAがホストで正しく動作しても、コンテナに /dev/nvidia が見えていない場合*、CUDAは使用できません。
*.conf
設定例(/etc/pve/lxc/XXX.conf):
🔧 コンテナの lxc.cgroup.devices.allow: c 195:* rwm
lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry: /dev/nvidia1 dev/nvidia1 none bind,optional,create=file
lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
※ コンテナは**特権モード(unprivileged: 0)**にすることを推奨。
✅ 追加のデバッグ方法
-
dmesg | grep -i nvidia
でカーネルログを確認。 -
cuda-memcheck ./deviceQuery
実行で詳細エラーを確認。 -
nvidia-smi -q
で HMM使用状況や各GPUの詳細を確認。
✅ 最終手段
- CUDA 12.8 / ドライバ 570 系ではなく、安定版(例:CUDA 12.4 + Driver 550系)へダウングレードして動作確認。
- マザーボードBIOSのアップデート(特にReBARや大容量メモリ対応が改善されていることがある)も検討。
✅ 優先して試すべき対処手順(まとめ)
優先度 | 対処法 |
---|---|
高 |
uvm_disable_hmm=1 を設定して再起動 |
高 |
.run ファイルで再インストールし、open modules 無効化
|
中 | BIOS設定確認(Above 4G: Enabled / ReBAR: 一時的にDisabled) |
中 |
NVreg_EnableMSI=0 を試して割り込み方式を切り替える |
中 | CUDA toolkit や libcuda.so のバージョンが12.8と一致しているか確認 |
低 | 安定版CUDA/ドライバへダウングレード |
低 | BIOSのアップデート |
CUDAがホスト上で正しく初期化できれば、コンテナ側にも復旧が見込めます。上記を順番に確認していけば、問題の切り分けと修正が可能です。
必要であれば、dmesg
や nvidia-smi -q
の出力を共有いただければ、さらに詳細なアドバイスが可能です。ご希望があればお知らせください。
Discussion