😇

マルチGPU環境で学習させるとPCがフリーズ・再起動する場合の対処法

2024/01/22に公開

概要

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