AMD Ryzen 7 8700G APUで動くPytorch/ROCmの環境を作る(未完)

※注意※

高負荷が続くと"GPU Hang"でプロセスが死ぬ問題が解決していないので、Pytorch/ROCmを動かす目的でRyzen 7 8700GのPCを組むのは現時点(2024/12/28)でお勧めしません。 現状APUの内蔵GPU自体がROCm公式非サポートなので、サポートされて安定動作するまで待つほうが賢明だと思います。

主な装置構成

  • ベースキット: 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。

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