😇
マルチGPU環境で学習させるとPCがフリーズ・再起動する場合の対処法
概要
LLMの学習用に、4090×2を搭載したPCを組みました。いざ学習させてみると、シングルGPUの学習では問題なく実行できるコードが、マルチGPUの学習ではうまくいきません。解決にかなり手間取ったので、備忘のためにも、記事にまとめました。
前提条件
環境
- Ubuntu20.04
- 4090×2
- 1650W電源
- intel cpu
- docker-composeで学習環境を構築
- transformers使用
- device_map="auto"やdeepspeedを使用してマルチGPU学習を実行
解決方法
私の場合、コードの問題ではなく、ドライバー等の設定が原因でした。
- ドライバーの更新
ドライバー(バージョン:535.154.05, リリース日:2024.1.16)のリリースハイライトを確認すると、以下の記載がありました。上記のバージョンをインストールすることで、PCがフリーズしなくなりました。Fixed a bug that could cause some multi-GPU systems to crash on suspend.
- NCCLのP2Pを無効化
4090ではP2Pが無効化されており、マルチGPUの学習に失敗するようです。以下の環境変数を設定する必要があります。P2Pの無効化については、こちらの議論が参考になります。NCCL_P2P_DISABLE="1" NCCL_IB_DISABLE="1"
- 共有メモリを増やす
シングルGPU学習と比較して、マルチGPU学習にはより多くの共有メモリを要するようです。shm_size: '16gb'
- GPUのクロック速度制限
1650Wと、家庭で使用できる最大レベルの電源を搭載していたため、問題ないと考えていたのですが、4090×2を使用すると、瞬間的に膨大な電力を要することがあるようです。(この結果、PCが強制的に再起動されました)nvidia-smiを使用して、クロック速度を制限します。下記のコマンドだけでは、PCを再起動するたびに設定がリセットされます。(設定) $ sudo nvidia-smi --lock-gpu-clocks=210,1500 (確認) $ nvidia-smi -q -d CLOCK (リセット) $ sudo nvidia-smi --reset-gpu-clocks
上記以外に試した方法
解決には繋がりませんでしたが、提案されていたその他の方法もまとめておきます。
- IOMMU無効化
GPU間の通信を妨げる要因として、IOMMUが挙げられていました。BIOSから以下を無効にすることで、解決することがあるようです。- VT-d
- VT-x
Discussion