4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

オンプレサーバーでMulti GPUによる計算が実行できなかったときの対処法

Last updated at Posted at 2022-12-12

こんにちは、朝日新聞社メディア研究開発センターの田森です。

アドベントカレンダー12日目の今日は、ちょっとマニアックな内容ですがご容赦ください。

今や機械学習、とりわけ深層学習の実験には欠かすことのできなくなったGPUは、弊社もオンプレミスやクラウドで調達、運用しています。今回は、オンプレミスで購入した際の設定について、みなさんも経験するかもしれない?事例について共有したいと思います。


とりあえず解決方法を記載しておくと

BIOSにて、VT-dの設定項目にあるACS Controlというものだけを無効化することで回避できた。

というオチでした。


先日、実はSupermicroのサーバーを新規導入しました。GPUはA100、CPUはIntel、BIOSはAMI BIOSというものです。PyTorchを利用したいつもの実験スクリプトで動作確認をしていたところ、複数枚のGPUを同時使用すると、GPUを利用するプログラム実行の段階になるとエラーする事象が発生しました。試しに、 CUDA_VISIBLE_DEVICES=0 のように、GPUを1枚だけ指定すると問題なく動作しました。

そこで、CUDA SamplessimpleP2P にて確認をしたところ、やたら時間がかかり、挙げ句「Test failed!」となってしまい、やはりGPU間の通信がうまくいっていないらしいことがわかりました。


[./simpleP2P] - Starting...
Checking for multiple GPUs...
CUDA-capable device count: 2
 
Checking GPU(s) for support of peer to peer memory access...
> Peer access from NVIDIA A100 80GB PCIe (GPU0) -> NVIDIA A100 80GB PCIe (GPU1) : Yes
> Peer access from NVIDIA A100 80GB PCIe (GPU1) -> NVIDIA A100 80GB PCIe (GPU0) : Yes

Enabling peer access between GPU0 and GPU1...
Allocating buffers (64MB on GPU0, GPU1 and CPU Host)...
Creating event handles...
cudaMemcpyPeer / cudaMemcpy between GPU0 and GPU1: 1.07GB/s
Preparing host buffer and memcpy to GPU0...
Run kernel on GPU1, taking source data from GPU0 and writing to GPU1...
Run kernel on GPU0, taking source data from GPU1 and writing to GPU0...
Copy data back to host from GPU0 and verify results...
Verification error @ element 0: val = nan, ref = 0.000000
Verification error @ element 1: val = nan, ref = 4.000000
Verification error @ element 2: val = nan, ref = 8.000000
Verification error @ element 3: val = nan, ref = 12.000000
Verification error @ element 4: val = nan, ref = 16.000000
Verification error @ element 5: val = nan, ref = 20.000000
Verification error @ element 6: val = nan, ref = 24.000000
Verification error @ element 7: val = nan, ref = 28.000000
Verification error @ element 8: val = nan, ref = 32.000000
Verification error @ element 9: val = nan, ref = 36.000000
Verification error @ element 10: val = nan, ref = 40.000000
Verification error @ element 11: val = nan, ref = 44.000000
Disabling peer access...
Shutting down...
Test failed!

このあたりのissueを見てみると、VT-d(仮想化の支援機能、とのことですが…)という設定をBIOS上で無効にすれば、というような記述を発見しました。VT-dを無効にしてみましたが同じくmulti gpuでは動作しませんでした。

最終的にはVT-dの設定項目にあるACS Controlというものだけを無効化することで回避できました。

Untitled (2).png

ACSというのはAccess Control Serviceというものらしく、GPUが装着されているPCI Expressとの通信をコントロールするもののようです(曖昧な表現ですみません…)。

現在ではGPUの利用はクラウドを使われている方がほとんど?だと思うので、あまり関係のない方も多いと思いますが、もしオンプレでこのような事があったときにお役に立てれば幸いです。

現場からは以上です。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?