EdgeExpert(MSI版DGX Spark) 熱対策
問題
気温が上がってきてから、高負荷時にEdgeExpertの電源が突然切れるようになった。 ログに怪しいメッセージは何も残らず、Linuxカーネルのクラッシュダンプも出力されない。
熱の問題を疑っていたので、nvidia-smiで観測してみた。これで1秒ごとにGPUの温度が表示される。
$ watch -n 1 nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader
GPUに負荷をかけると温度はどんどん上がり、85℃を超えたあたりで電源が切れた。
対策
Geminiに聞いたら、消費電力を抑える方法として、電力のlimitを指定する方法とクロック周波数を制限する方法を提案されたので、両方指定してみた。
# 消費電力を130Wまでに制限 $ nvidia-smi -pl 130 # クロック周波数を1400MHzまでに制限 $ sudo nvidia-smi -lgc 0,1400
GPUの温度と消費電力、クロック周波数を監視する。
$ watch -n 1 nvidia-smi --query-gpu=temperature.gpu,power.draw,clocks.gr --format=csv,noheader
しばらく負荷をかけ続けると60℃ぐらいで安定。まだ余裕がありそう。クロック周波数の制限に引っかかって、消費電力は全然低い。
60, 24.27 W, 1384 MHz
このとき負荷テスト用のStable Diffusionの速度が1.21it/s。
試しにクロック周波数の上限を2400MHzまで上げてみる。
$ sudo nvidia-smi -lgc 0,2400
すぐに温度が上がり、70℃を超えても上がり続けていたので、75℃に達したところで1400MHz制限に戻した。2400MHzのときは1.52it/s。
中間の1900MHzに設定してみる。
$ sudo nvidia-smi -lgc 0,1900
70℃で安定。1.41it/s。
70, 36.01 W, 1878 MHz
ということで1900MHz制限に決定。消費電力の上限は設定を省略することにした。 OS起動時にsystemdで自動的に設定されるようにする。
$ sudo vi /etc/systemd/system/nvidia-power-limit.service
下記の内容で作成。
[Unit] Description=NVIDIA GPU Power Limit Setter After=nvidia-persistenced.service [Service] Type=oneshot ExecStart=/usr/bin/nvidia-smi -pm 1 ExecStart=/usr/bin/nvidia-smi -lgc 0,1900 RemainAfterExit=yes [Install] WantedBy=multi-user.target
登録する
$ sudo systemctl daemon-reload $ sudo systemctl enable nvidia-power-limit.service $ sudo systemctl start nvidia-power-limit.service
これで大丈夫そうなので、しばらく様子見。もし夏の暑さに耐えられないようならまた設定を見直す。
追記
目標温度を設定できないかと思って -gtt オプションを指定したけど駄目だった。
$ sudo nvidia-smi -gtt 70 GPU Target Temperature Threshold not supported for GPU 0000000F:01:00.0.
EdgeXpert(MSI版DGX Spark) 画像/動画生成 性能評価
EdgeXpert(MSI版DGX Spark)を入手したので、画像生成と動画生成の性能を評価する。 今回は特に何も工夫せずに動かして測定。
比較対象
GeForce RTX 3060を搭載したデスクトップPCと、Ryzen 7 8700G(内蔵GPU: Radeon 780M)を搭載したミニPCを比較対象とする。 GPU性能の比較がメインなので、それぞれRTX3600、Radeon780Mと呼び、EdgeXpertはGB10と呼ぶ。
| 機種 | GB10 | RTX3060 | Radeon780M |
|---|---|---|---|
| VRAM容量 | 128GB(unified) | 12GB | (64GB中)48GB |
| VRAM種別 | LPDDR5x | GDDR6 | DDR5-4800 |
| VRAM帯域 | 273GB/s | 360GB/s | 76.8GB/s |
| CPU | Grace | Ryzen 5 5600X | Ryzen 7 8700G |
| 筐体 | ミニPC | ミニタワー | ミニPC |
画像生成
測定方法
- CompyUIのテンプレートから「SDXLシンプル」を選択
- 設定はデフォルトのまま変更しない。(1024x1024, 25 step)
- バッチ数8で実行し、2~8回目の実行時間("Prompt executed in xx seconds")の平均を求める。
結果
| GB10 | RTX3060 | Radeon780M | |
|---|---|---|---|
| 実行時間[s] | 8.9 | 21.4 | 104.3 |
| 性能比 | 11.8 | 4.9 | 1.0 |
GB10の性能はRadeon780Mの12倍、RTX3060の2.4倍。
動画生成
測定方法
- CompyUIのテンプレートから「Wan 2.2 5Bビデオ生成」を選択
- 動画のサイズを640x640に、長さを81フレームに変更。他の設定はデフォルトのまま。
- バッチ数2で実行し、2回目の実行時間を採用。
結果
| GB10 | RTX3060 | Radeon780M | |
|---|---|---|---|
| 実行時間[s] | 128 | 256 | 1497 |
| 性能比 | 11.7 | 5.8 | 1.0 |
GB10の性能はRadeon780Mの12倍、RTX3060の2倍。
まとめ・感想
画像生成・動画生成ともに、Geforce RTX 3060の2倍以上の性能が得られた。 また、Radeon 780Mと比べると12倍の性能となった。
今回はRTX 3060のVRAMに収まる程度の規模に抑えて評価したが、EdgeXpertには128GBのunified memoryがあるので、もっと大きいモデルも今後動かしたい。 動画生成中でもEdgeXpertの動作音は非常に静か(この点が個人的に重要)。 これでAIワークロードに関しては、3年間使ったRTX 3060から移行できる。 今回使った3台のうち一番音がうるさかったのはRadeon 780Mを内蔵したミニPC(これ今後何に使おうか・・・?)。
AMDの内蔵GPU Radeon 780Mで動くPytorchの環境を作る
主な装置構成
- ベースキット: ASRock DeskMini X600
- CPU(APU): AMD Ryzen 7 8700G (Radeon 780M内蔵)
- Memory: 64GB
- OS: Ubuntu 25.10
今回の目標
UEFI設定
AMDGPU driverのインストール
ROCmのQuick start installation guide に従ってインストールを行う。
wget https://repo.radeon.com/amdgpu-install/7.1/ubuntu/noble/amdgpu-install_7.1.70100-1_all.deb sudo apt install ./amdgpu-install_7.1.70100-1_all.deb sudo apt update sudo apt install "linux-headers-$(uname -r)" "linux-modules-extra-$(uname -r)" sudo apt install amdgpu-dkms
カーネルパラメータの設定
/etc/default/grub を編集し、GPUがメモリを最大48GiBまで使えるようにする。
48*1024*1024*1024/4096=12582912 なので、GRUB_CMDLINE_LINUX_DEFAULTを下記の内容にする。
GPU Hangで止まるのを防ぐために、amdgpu.cwsr_enable=0 も追加。
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=off amdttm.pages_limit=12582912 amdttm.page_pool_size=12582912 amdgpu.cwsr_enable=0"
$ sudo update-grub
ここで一旦rebootしておく。
$ rocm-smi --showmeminfo gtt
途中に GTT Total Memory (B): 51539607552と表示される。(51539607552 Byte = 48GiB)
ROCm と PyTorch と ComfyUI のインストール
後でバージョン問題が出そうなので、venvで仮想環境を作り、必要なパッケージは仮想環境内にインストールする。 ROCmとPyTorchのインストール手順はTheRockのドキュメントに従う。
$ git clone git@github.com:comfyanonymous/ComfyUI.git $ cd ComfyUI/ $ python -m venv .venv && source .venv/bin/activate $ pip install -U --index-url https://rocm.nightlies.amd.com/v2/gfx110X-all/ "rocm[libraries,devel]" $ pip install -U --index-url https://rocm.nightlies.amd.com/v2/gfx110X-all/ --pre torch torchaudio torchvision $ pip install -r requirements.txt
ComfyUIの起動
python main.py --listen 0.0.0.0
ブラウザから http://<IPアドレス>:8188 を開く。
テンプレートからSDXLシンプルを選んで実行。無事動いた。
Wan 2.2 14Bも試したところ、非常に遅いけど動いた。動作中、GPUがメモリを約36GiB使っていた。640x640, 81フレームの動画で所要時間46分。
AMD Ryzen 7 8700G APUで動くPytorch/ROCmの環境を作る(未完)
※注意※
高負荷が続くと"GPU Hang"でプロセスが死ぬ問題が解決していないので、Pytorch/ROCmを動かす目的でRyzen 7 8700GのPCを組むのは現時点(2024/12/28)でお勧めしません。
現状APUの内蔵GPU自体がROCm公式非サポートなので、サポートされて安定動作するまで待つほうが賢明だと思います。
問題が解決したので、新しい手順を AMDの内蔵GPU Radeon 780Mで動くPytorchの環境を作る - errno_mmd’s blog に纏めました。
主な装置構成
- ベースキット: ASRock DeskMini X600
- CPU(APU): AMD Ryzen 7 8700G
- Memory: 64GB (そのうち16GBをVRAMに割り当てる)
- OS: Ubuntu 24.04.1 LTS
今回の目標
UEFI設定
ROCmのインストール
ROCmのQuick start installation guideを参考にしつつ、後で入れるPytorchに合わせて、ROCmバージョン6.2を入れる。
sudo apt update sudo apt install "linux-headers-$(uname -r)" "linux-modules-extra-$(uname -r)" sudo apt install python3-setuptools python3-wheel libpython3.12 sudo usermod -a -G render,video $LOGNAME wget https://repo.radeon.com/amdgpu-install/6.2.4/ubuntu/noble/amdgpu-install_6.2.60204-1_all.deb sudo apt install ./amdgpu-install_6.2.60204-1_all.deb sudo apt update sudo apt install amdgpu-dkms rocm sudo amdgpu-install
終わったら一度rebootする。
stable-diffusion-webui を動かす仮想環境の構築
stable-diffusion-webui の Install and Run on AMD GPUsに従って環境構築を進める。Pythonのバージョンが新しすぎると動かなかったりするので、公式ドキュメントに合わせる。今回は3.10が指定されているので、3.10.16を使う。
Ubuntu 24.04.1のPythonパッケージは3.12。 他のソフトでも別バージョンを使う可能性があるので、pyenvで複数バージョンのPythonを切り替えることにする。 また、使用するライブラリのバージョンが他のソフトと合わないこともよくあるので、venvで仮想環境を作ることにする。
まずはvenvのインストール。
sudo apt install python3-venv
次はpyenv。pyenvのインストール方法に従って、
curl https://pyenv.run | bash
.bashrc に下記の内容を追記する。
export PATH="$HOME/.pyenv/bin:$PATH" eval "$(pyenv init --path)" eval "$(pyenv virtualenv-init -)"
一度bashで入りなおして、次は stable-diffusion-webui を clone
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui cd stable-diffusion-webui
pyenvでPython 3.10をインストールし、使用するPythonのバージョンを切り替える
pyenv install 3.10 pyenv local 3.10.16
仮想環境を作る。公式ではディレクトリ名venvだが、好みで.venvにした。
python3.10 -m venv .venv source .venv/bin/activate
pytorchのサイトのStart Locallyで Stable/Linux/Pip/Python/ROCm6.2を選択すると、実行すべきコマンドが表示されるので、それに従ってROCm版のPytorchをインストール。
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm6.2
stable-diffusion-webui の起動
今のところROCmは内蔵GPUを公式にはサポートしていないので、ごまかして動かす。 Radeon 780MはRDNA3アーキテクチャのgfx1103なので、gfx1100に見せかける。
export PYTORCH_ROCM_ARCH=gfx1100 export HSA_OVERRIDE_GFX_VERSION=11.0.0 ./webui.sh --listen --skip-torch-cuda-test --precision full --no-half
あとはブラウザで http://IPアドレス:7860/ にアクセスして画像を生成させる。
今後の課題
- Radeon 780M 自体は half precision (FP16)対応しているようなのに、"--precision full --no-half" を付けないと動かない
- rocm-smiで見たらVRAM%が0%に見える
- 画像生成の最終stepで長時間待たされることがある
- 連続で動かしていると"GPU Hang"でプロセスが死ぬ
"GPU Hang"問題の補足
HW Exception by GPU node-1 (Agent handle: 0x601800a34760) reason :GPU Hang
のようなメッセージが出てプロセスが死にます。 gdbにcoreを読ませてbtで見ても、例外ハンドラの中でスレッドを殺していることしか分かりません。 ドライバ(かもっと下)が怪しいと思ってdmesgで見ると、amdgpuドライバが
amdgpu: MES failed to respond to msg=REMOVE_QUEUE
というエラーを吐いてGPU resetを発行しています。
この問題はLinux Kernel MLでも報告されていますが、 未解決で、どうもファームウェアの修正を待つしかなさそうに見えます。
VideoPose3D実験メモ
動画からMMDのモーションを自動生成するために使える技術を探して、VideoPose3D を試した。 VideoPose3D は Facebook Research の Dario Pavllo らが開発した 3Dポーズ推定(3D human pose estimation)のソフトウェア。論文は CVPR 2019 で発表された。
VideoPose3Dの特徴
時間方向の畳み込み(temporal convolutions)を適用することによって、3Dポーズ推定の精度を高めた。 また、動画から人の動きをトレースした際の振動が少なく、時間方向に滑らかな推定結果が得られる。 GitHubに貼られた GIF動画 や デモのページ の "Single-image model vs temporal model" のあたりに特徴が表れている。
欠点・制約
関節の相対的な位置しか推定できないので、センターの移動は別の手段でトレースする必要がある。
ソースコード
https://github.com/facebookresearch/VideoPose3D
論文
https://arxiv.org/abs/1811.11742
ツールキット
PyTorch を使用。 また2D keypointの推定には Detectron2 を使う。
ライセンス
VideoPose3D本体はCC BY-NC。 ただし、使用している Human3.6M データセットはより厳格なライセンスなので注意が必要。
インストール
Quick start に従ってインストールする。
Detectron2のインストールは、Linuxなら Install Pre-Built Detectron2 に従ってpipを使うのが簡単。
なお、Dataset setup には Human3.6M データセットを用意するように書いてあるが、 Inference in the wild に従って試すだけなら Human3.6M データセットは無くても動くようだ。
実行
Inference in the wild に従って、2D keypointsの推定(Detectron2を使用)、 custom dataset (data/data_2d_custom_myvideos.npz)の作成、推定結果の描画(rendering a custom video)を行った。
$ cd inference/ $ python infer_video_d2.py --cfg COCO-Keypoints/keypoint_rcnn_R_101_FPN_3x.yaml --output-dir ~/tmp/vp3d --image-ext mp4 ~/work/test_movie/OutdoorTrial-185818419-1.mp4 $ cd ../data $ python prepare_data_2d_custom.py -i ~/tmp/vp3d -o myvideos $ cd .. $ python run.py -d custom -k myvideos -arc 3,3,3,3,3 -c checkpoint --evaluate pretrained_h36m_detectron_coco.bin --render --viz-subject OutdoorTrial-185818419-1.mp4 --viz-action custom --viz-camera 0 --viz-video ~/work/test_movie/OutdoorTrial-185818419-1.mp4 --viz-output ~/tmp/OutdoorTrial-185818419-1-vp3d.mp4 --viz-size 6
2D keypointsの推定が一番重くて GeForce GTX 1050 Ti で約 3 fps、推定結果の描画はCore i7-8700(3.2GHz)で約 10 fps。
参考:試したときのツイート
VideoPose3D、デモではセンター移動も取れているように見えたけど、試してみたら違った。説明の最後あたりに"Predictions are relative to the root joint"と書いてあった。https://t.co/q20mdJDyAe pic.twitter.com/UULJCvySvZ
— 江良野 (@errno_mmd) January 1, 2021