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

今回の目標

  • Stable Diffusionを内蔵GPU(Radeon 780M)で動かす

UEFI設定

  • iGPU ConfigurationをUMA_SPECIFIEDにする
  • UMA frame buffer sizeを最小(256MB)にする
  • IOMMUを無効にする(disable)

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

今回の目標

  • Stable Diffusionを内蔵GPU(Radeon 780M)で動かす

UEFI設定

  • iGPU ConfigurationをUMA_SPECIFIEDにする
  • UMA frame buffer sizeを16Gにする

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

参考:試したときのツイート