AMD GPU(Radeon、Instinct)で生成AIを動かしてみた
はじめに
AMDのGPU(RX7900 XTXとMI210)を使用して生成AIを動作させるまでの手順をまとめる。手順さえ分かってしまえばStable DiffusionやLLMなどのAIを問題なく、実用的な速度で動作させられることが分かった。
追記:以下で紹介しているAMD Instinct MI210は現在ACRiルームに設置されており、ACRiルームのアカウントを作成することで無償で利用できる。大容量のVRAMを積んだMI210で生成AIを試すことができる。
検証環境
AMD GPUをインストールした2台のPCで検証を行った。
RX7900 XTX
CPU | AMD Ryzen 9 7950X |
---|---|
GPU | AMD Radeon RX7900 XTX 24GB |
Memory | 64GB |
OS | Ubuntu 22.04.3 LTS |
Linux Kernel | 6.2.0-37-generic |
MI210
CPU | AMD Ryzen 9 7900X |
---|---|
GPU | AMD Instinct MI210 64GB |
Memory | 64GB |
OS | Ubuntu 22.04.3 LTS |
Linux Kernel | 6.2.0-39-generic |
小型のPCケースではGPUが入らなかったのでライザーケーブルでGPUを接続した。冷却用にファンを自作して取り付けた。
MI210検証の様子
使用したPC
個別にパーツを購入して組んだ自作PCを検証に使用した。
PCパーツリスト(ご参考)
このケースならちゃんとGPU入ります。
PyTorch環境のセットアップ
Ubuntu 22.04
既存の環境にインストールしても良いが、再現性のためクリーンインストールからの手順を記録する。Nvidia GPUを利用していた環境でAMD GPUに乗り換える場合はNvidiaドライバを削除(sudo apt purge nvidia*
)しておかないとGUIが表示されなくなってしまうので注意すること。Ubuntu 22.04をクリーンインストールし、パッケージをアップデート、再起動する。
$ sudo apt update
$ sudo apt upgrade -y
$ sudo reboot
作業時のOSバージョンはこちら。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.3 LTS
Release: 22.04
Codename: jammy
$ uname -r
6.2.0-39-generic
GPU
GPUがシステムに認識されていること、PCIe Gen4x16でリンクアップしていることをlspciで確認する。RX7900 XTX、MI210ともに次のような結果となる。
$ lspci -d 1002:164e
6d:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Device 164e (rev c2)
$ sudo lspci -d 1002:164e -vv | grep LnkSta:
LnkSta: Speed 16GT/s (ok), Width x16 (ok)
ROCm 5.7.1
ROCm 5.7.1をインストールする。これ以外のバージョンやインストール方法も試したがうまくいかなかった。ROCm 5.7.0ではAI推論実行時にクラッシュする症状が見られた。
$ wget https://repo.radeon.com/amdgpu-install/5.7.1/ubuntu/jammy/amdgpu-install_5.7.50701-1_all.deb
$ sudo apt install ./amdgpu-install_5.7.50701-1_all.deb -y
$ sudo amdgpu-install --usecase=rocm --rocmrelease=5.7.1 --no-dkms
ユーザーがROCmにアクセスできるように、ユーザーをrender
グループ、video
グループに追加する。
$ sudo usermod -a -G render,video $LOGNAME
$ newgrp render
ROCmのコマンドを使ってGPUが正常に認識されていることを確認する。
RX7900 XTXの場合
$ /opt/rocm/bin/rocm-smi --showproductname
========================= ROCm System Management Interface =========================
=================================== Product Info ===================================
GPU[0] : Card series: 0x744c
GPU[0] : Card model: 0x2422
GPU[0] : Card vendor: Advanced Micro Devices, Inc. [AMD/ATI]
GPU[0] : Card SKU: TIC106615
GPU[1] : Card series: 0x164e
GPU[1] : Card model: 0x8877
GPU[1] : Card vendor: Advanced Micro Devices, Inc. [AMD/ATI]
GPU[1] : Card SKU: RAPHAEL
====================================================================================
=============================== End of ROCm SMI Log ================================
MI210の場合。
$ /opt/rocm/bin/rocm-smi --showproductname
========================= ROCm System Management Interface =========================
=================================== Product Info ===================================
GPU[0] : Card series: Instinct MI210
GPU[0] : Card model: 0x0c34
GPU[0] : Card vendor: Advanced Micro Devices, Inc. [AMD/ATI]
GPU[0] : Card SKU: D67301
GPU[1] : Card series: 0x164e
GPU[1] : Card model: 0x8877
GPU[1] : Card vendor: Advanced Micro Devices, Inc. [AMD/ATI]
GPU[1] : Card SKU: RAPHAEL
====================================================================================
=============================== End of ROCm SMI Log ================================
rocminfo
も叩いてみて正常に情報が得られることを確認する。
RX7900 XTX
$ rocminfo
ROCk module is loaded
=====================
HSA System Attributes
=====================
Runtime Version: 1.1
System Timestamp Freq.: 1000.000000MHz
Sig. Max Wait Duration: 18446744073709551615 (0xFFFFFFFFFFFFFFFF) (timestamp count)
Machine Model: LARGE
System Endianness: LITTLE
Mwaitx: DISABLED
DMAbuf Support: NO
==========
HSA Agents
==========
*******
Agent 1
*******
Name: AMD Ryzen 9 7950X 16-Core Processor
Uuid: CPU-XX
Marketing Name: AMD Ryzen 9 7950X 16-Core Processor
Vendor Name: CPU
Feature: None specified
Profile: FULL_PROFILE
Float Round Mode: NEAR
Max Queue Number: 0(0x0)
Queue Min Size: 0(0x0)
Queue Max Size: 0(0x0)
Queue Type: MULTI
Node: 0
Device Type: CPU
Cache Info:
L1: 32768(0x8000) KB
Chip ID: 0(0x0)
ASIC Revision: 0(0x0)
Cacheline Size: 64(0x40)
Max Clock Freq. (MHz): 4500
BDFID: 0
Internal Node ID: 0
Compute Unit: 32
SIMDs per CU: 0
Shader Engines: 0
Shader Arrs. per Eng.: 0
WatchPts on Addr. Ranges:1
Features: None
Pool Info:
Pool 1
Segment: GLOBAL; FLAGS: FINE GRAINED
Size: 64939500(0x3dee5ec) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Alignment: 4KB
Accessible by all: TRUE
Pool 2
Segment: GLOBAL; FLAGS: KERNARG, FINE GRAINED
Size: 64939500(0x3dee5ec) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Alignment: 4KB
Accessible by all: TRUE
Pool 3
Segment: GLOBAL; FLAGS: COARSE GRAINED
Size: 64939500(0x3dee5ec) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Alignment: 4KB
Accessible by all: TRUE
ISA Info:
*******
Agent 2
*******
Name: gfx1100
Uuid: GPU-cfcfba3c00000000
Marketing Name: Radeon RX 7900 XTX
Vendor Name: AMD
Feature: KERNEL_DISPATCH
Profile: BASE_PROFILE
Float Round Mode: NEAR
Max Queue Number: 128(0x80)
Queue Min Size: 64(0x40)
Queue Max Size: 131072(0x20000)
Queue Type: MULTI
Node: 1
Device Type: GPU
Cache Info:
L1: 32(0x20) KB
L2: 6144(0x1800) KB
L3: 98304(0x18000) KB
Chip ID: 29772(0x744c)
ASIC Revision: 0(0x0)
Cacheline Size: 64(0x40)
Max Clock Freq. (MHz): 2371
BDFID: 768
Internal Node ID: 1
Compute Unit: 96
SIMDs per CU: 2
Shader Engines: 6
Shader Arrs. per Eng.: 2
WatchPts on Addr. Ranges:4
Features: KERNEL_DISPATCH
Fast F16 Operation: TRUE
Wavefront Size: 32(0x20)
Workgroup Max Size: 1024(0x400)
Workgroup Max Size per Dimension:
x 1024(0x400)
y 1024(0x400)
z 1024(0x400)
Max Waves Per CU: 32(0x20)
Max Work-item Per CU: 1024(0x400)
Grid Max Size: 4294967295(0xffffffff)
Grid Max Size per Dimension:
x 4294967295(0xffffffff)
y 4294967295(0xffffffff)
z 4294967295(0xffffffff)
Max fbarriers/Workgrp: 32
Packet Processor uCode:: 510
SDMA engine uCode:: 19
IOMMU Support:: None
Pool Info:
Pool 1
Segment: GLOBAL; FLAGS: COARSE GRAINED
Size: 25149440(0x17fc000) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Alignment: 4KB
Accessible by all: FALSE
Pool 2
Segment: GLOBAL; FLAGS:
Size: 25149440(0x17fc000) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Alignment: 4KB
Accessible by all: FALSE
Pool 3
Segment: GROUP
Size: 64(0x40) KB
Allocatable: FALSE
Alloc Granule: 0KB
Alloc Alignment: 0KB
Accessible by all: FALSE
ISA Info:
ISA 1
Name: amdgcn-amd-amdhsa--gfx1100
Machine Models: HSA_MACHINE_MODEL_LARGE
Profiles: HSA_PROFILE_BASE
Default Rounding Mode: NEAR
Default Rounding Mode: NEAR
Fast f16: TRUE
Workgroup Max Size: 1024(0x400)
Workgroup Max Size per Dimension:
x 1024(0x400)
y 1024(0x400)
z 1024(0x400)
Grid Max Size: 4294967295(0xffffffff)
Grid Max Size per Dimension:
x 4294967295(0xffffffff)
y 4294967295(0xffffffff)
z 4294967295(0xffffffff)
FBarrier Max Size: 32
*******
Agent 3
*******
Name: gfx1036
Uuid: GPU-XX
Marketing Name: AMD Radeon Graphics
Vendor Name: AMD
Feature: KERNEL_DISPATCH
Profile: BASE_PROFILE
Float Round Mode: NEAR
Max Queue Number: 128(0x80)
Queue Min Size: 64(0x40)
Queue Max Size: 131072(0x20000)
Queue Type: MULTI
Node: 2
Device Type: GPU
Cache Info:
L1: 16(0x10) KB
L2: 256(0x100) KB
Chip ID: 5710(0x164e)
ASIC Revision: 1(0x1)
Cacheline Size: 64(0x40)
Max Clock Freq. (MHz): 2200
BDFID: 28160
Internal Node ID: 2
Compute Unit: 2
SIMDs per CU: 2
Shader Engines: 1
Shader Arrs. per Eng.: 1
WatchPts on Addr. Ranges:4
Features: KERNEL_DISPATCH
Fast F16 Operation: TRUE
Wavefront Size: 32(0x20)
Workgroup Max Size: 1024(0x400)
Workgroup Max Size per Dimension:
x 1024(0x400)
y 1024(0x400)
z 1024(0x400)
Max Waves Per CU: 32(0x20)
Max Work-item Per CU: 1024(0x400)
Grid Max Size: 4294967295(0xffffffff)
Grid Max Size per Dimension:
x 4294967295(0xffffffff)
y 4294967295(0xffffffff)
z 4294967295(0xffffffff)
Max fbarriers/Workgrp: 32
Packet Processor uCode:: 18
SDMA engine uCode:: 1
IOMMU Support:: None
Pool Info:
Pool 1
Segment: GLOBAL; FLAGS: COARSE GRAINED
Size: 524288(0x80000) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Alignment: 4KB
Accessible by all: FALSE
Pool 2
Segment: GLOBAL; FLAGS:
Size: 524288(0x80000) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Alignment: 4KB
Accessible by all: FALSE
Pool 3
Segment: GROUP
Size: 64(0x40) KB
Allocatable: FALSE
Alloc Granule: 0KB
Alloc Alignment: 0KB
Accessible by all: FALSE
ISA Info:
ISA 1
Name: amdgcn-amd-amdhsa--gfx1036
Machine Models: HSA_MACHINE_MODEL_LARGE
Profiles: HSA_PROFILE_BASE
Default Rounding Mode: NEAR
Default Rounding Mode: NEAR
Fast f16: TRUE
Workgroup Max Size: 1024(0x400)
Workgroup Max Size per Dimension:
x 1024(0x400)
y 1024(0x400)
z 1024(0x400)
Grid Max Size: 4294967295(0xffffffff)
Grid Max Size per Dimension:
x 4294967295(0xffffffff)
y 4294967295(0xffffffff)
z 4294967295(0xffffffff)
FBarrier Max Size: 32
*** Done ***
MI210
$ rocminfo
ROCk module is loaded
=====================
HSA System Attributes
=====================
Runtime Version: 1.1
System Timestamp Freq.: 1000.000000MHz
Sig. Max Wait Duration: 18446744073709551615 (0xFFFFFFFFFFFFFFFF) (timestamp count)
Machine Model: LARGE
System Endianness: LITTLE
Mwaitx: DISABLED
DMAbuf Support: NO
==========
HSA Agents
==========
*******
Agent 1
*******
Name: AMD Ryzen 9 7900X 12-Core Processor
Uuid: CPU-XX
Marketing Name: AMD Ryzen 9 7900X 12-Core Processor
Vendor Name: CPU
Feature: None specified
Profile: FULL_PROFILE
Float Round Mode: NEAR
Max Queue Number: 0(0x0)
Queue Min Size: 0(0x0)
Queue Max Size: 0(0x0)
Queue Type: MULTI
Node: 0
Device Type: CPU
Cache Info:
L1: 32768(0x8000) KB
Chip ID: 0(0x0)
ASIC Revision: 0(0x0)
Cacheline Size: 64(0x40)
Max Clock Freq. (MHz): 4700
BDFID: 0
Internal Node ID: 0
Compute Unit: 24
SIMDs per CU: 0
Shader Engines: 0
Shader Arrs. per Eng.: 0
WatchPts on Addr. Ranges:1
Features: None
Pool Info:
Pool 1
Segment: GLOBAL; FLAGS: FINE GRAINED
Size: 64940468(0x3dee9b4) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Alignment: 4KB
Accessible by all: TRUE
Pool 2
Segment: GLOBAL; FLAGS: KERNARG, FINE GRAINED
Size: 64940468(0x3dee9b4) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Alignment: 4KB
Accessible by all: TRUE
Pool 3
Segment: GLOBAL; FLAGS: COARSE GRAINED
Size: 64940468(0x3dee9b4) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Alignment: 4KB
Accessible by all: TRUE
ISA Info:
*******
Agent 2
*******
Name: gfx90a
Uuid: GPU-dae6c0bb452b1070
Marketing Name: AMD Instinct MI210
Vendor Name: AMD
Feature: KERNEL_DISPATCH
Profile: BASE_PROFILE
Float Round Mode: NEAR
Max Queue Number: 128(0x80)
Queue Min Size: 64(0x40)
Queue Max Size: 131072(0x20000)
Queue Type: MULTI
Node: 1
Device Type: GPU
Cache Info:
L1: 16(0x10) KB
L2: 8192(0x2000) KB
Chip ID: 29711(0x740f)
ASIC Revision: 1(0x1)
Cacheline Size: 64(0x40)
Max Clock Freq. (MHz): 1700
BDFID: 768
Internal Node ID: 1
Compute Unit: 104
SIMDs per CU: 4
Shader Engines: 8
Shader Arrs. per Eng.: 1
WatchPts on Addr. Ranges:4
Features: KERNEL_DISPATCH
Fast F16 Operation: TRUE
Wavefront Size: 64(0x40)
Workgroup Max Size: 1024(0x400)
Workgroup Max Size per Dimension:
x 1024(0x400)
y 1024(0x400)
z 1024(0x400)
Max Waves Per CU: 32(0x20)
Max Work-item Per CU: 2048(0x800)
Grid Max Size: 4294967295(0xffffffff)
Grid Max Size per Dimension:
x 4294967295(0xffffffff)
y 4294967295(0xffffffff)
z 4294967295(0xffffffff)
Max fbarriers/Workgrp: 32
Packet Processor uCode:: 55
SDMA engine uCode:: 8
IOMMU Support:: None
Pool Info:
Pool 1
Segment: GLOBAL; FLAGS: COARSE GRAINED
Size: 67092480(0x3ffc000) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Alignment: 4KB
Accessible by all: FALSE
Pool 2
Segment: GLOBAL; FLAGS:
Size: 67092480(0x3ffc000) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Alignment: 4KB
Accessible by all: FALSE
Pool 3
Segment: GROUP
Size: 64(0x40) KB
Allocatable: FALSE
Alloc Granule: 0KB
Alloc Alignment: 0KB
Accessible by all: FALSE
ISA Info:
ISA 1
Name: amdgcn-amd-amdhsa--gfx90a:sramecc+:xnack-
Machine Models: HSA_MACHINE_MODEL_LARGE
Profiles: HSA_PROFILE_BASE
Default Rounding Mode: NEAR
Default Rounding Mode: NEAR
Fast f16: TRUE
Workgroup Max Size: 1024(0x400)
Workgroup Max Size per Dimension:
x 1024(0x400)
y 1024(0x400)
z 1024(0x400)
Grid Max Size: 4294967295(0xffffffff)
Grid Max Size per Dimension:
x 4294967295(0xffffffff)
y 4294967295(0xffffffff)
z 4294967295(0xffffffff)
FBarrier Max Size: 32
*******
Agent 3
*******
Name: gfx1036
Uuid: GPU-XX
Marketing Name: AMD Radeon Graphics
Vendor Name: AMD
Feature: KERNEL_DISPATCH
Profile: BASE_PROFILE
Float Round Mode: NEAR
Max Queue Number: 128(0x80)
Queue Min Size: 64(0x40)
Queue Max Size: 131072(0x20000)
Queue Type: MULTI
Node: 2
Device Type: GPU
Cache Info:
L1: 16(0x10) KB
L2: 256(0x100) KB
Chip ID: 5710(0x164e)
ASIC Revision: 1(0x1)
Cacheline Size: 64(0x40)
Max Clock Freq. (MHz): 2200
BDFID: 27904
Internal Node ID: 2
Compute Unit: 2
SIMDs per CU: 2
Shader Engines: 1
Shader Arrs. per Eng.: 1
WatchPts on Addr. Ranges:4
Features: KERNEL_DISPATCH
Fast F16 Operation: TRUE
Wavefront Size: 32(0x20)
Workgroup Max Size: 1024(0x400)
Workgroup Max Size per Dimension:
x 1024(0x400)
y 1024(0x400)
z 1024(0x400)
Max Waves Per CU: 32(0x20)
Max Work-item Per CU: 1024(0x400)
Grid Max Size: 4294967295(0xffffffff)
Grid Max Size per Dimension:
x 4294967295(0xffffffff)
y 4294967295(0xffffffff)
z 4294967295(0xffffffff)
Max fbarriers/Workgrp: 32
Packet Processor uCode:: 18
SDMA engine uCode:: 1
IOMMU Support:: None
Pool Info:
Pool 1
Segment: GLOBAL; FLAGS: COARSE GRAINED
Size: 524288(0x80000) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Alignment: 4KB
Accessible by all: FALSE
Pool 2
Segment: GLOBAL; FLAGS:
Size: 524288(0x80000) KB
Allocatable: TRUE
Alloc Granule: 4KB
Alloc Alignment: 4KB
Accessible by all: FALSE
Pool 3
Segment: GROUP
Size: 64(0x40) KB
Allocatable: FALSE
Alloc Granule: 0KB
Alloc Alignment: 0KB
Accessible by all: FALSE
ISA Info:
ISA 1
Name: amdgcn-amd-amdhsa--gfx1036
Machine Models: HSA_MACHINE_MODEL_LARGE
Profiles: HSA_PROFILE_BASE
Default Rounding Mode: NEAR
Default Rounding Mode: NEAR
Fast f16: TRUE
Workgroup Max Size: 1024(0x400)
Workgroup Max Size per Dimension:
x 1024(0x400)
y 1024(0x400)
z 1024(0x400)
Grid Max Size: 4294967295(0xffffffff)
Grid Max Size per Dimension:
x 4294967295(0xffffffff)
y 4294967295(0xffffffff)
z 4294967295(0xffffffff)
FBarrier Max Size: 32
*** Done ***
PyTorch 2.1.2
Python仮想環境(venv)をセットアップする。
$ sudo apt install -y python3 python3-venv python-is-python3
$ python -m venv venv
$ source ./venv/bin/activate
PyTorch 2.1.2(ROCm 5.6)をインストールする。ROCm 5.7はNightly版のPyTorchでサポートされているようだが完全に一致させなくても問題なかった。Stable版のPyTorchを利用する。
$ pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm5.6
PyTorchからGPUを利用できることを確認する。テスト用のスクリプトが配布されているのでありがたく利用させていただく。
$ wget https://gist.github.com/damico/484f7b0a148a0c5f707054cf9c0a0533/raw/43c317bfbde626d9112d44462d815613194988e0/test-rocm.py
RX7900 XTXの場合。
$ python test-rocm.py
Checking ROCM support...
GOOD: ROCM devices found: 3
Checking PyTorch...
GOOD: PyTorch is working fine.
Checking user groups...
GOOD: The user jun is in RENDER and VIDEO groups.
GOOD: PyTorch ROCM support found.
Testing PyTorch ROCM support...
Everything fine! You can run PyTorch code inside of:
---> AMD Ryzen 9 7950X 16-Core Processor
---> gfx1100
---> gfx1036
ROCm実行環境としてCPU(Ryzen 9 7950X)、RX7900 XTX(gfx1100)、CPU内蔵GPU(gfx1036)がリストアップされた。
MI210の場合。
$ python test-rocm.py
Checking ROCM support...
GOOD: ROCM devices found: 3
Checking PyTorch...
GOOD: PyTorch is working fine.
Checking user groups...
GOOD: The user x is in RENDER and VIDEO groups.
GOOD: PyTorch ROCM support found.
Testing PyTorch ROCM support...
Everything fine! You can run PyTorch code inside of:
---> AMD Ryzen 9 7900X 12-Core Processor
---> gfx90a
---> gfx1036
ROCm実行環境としてCPU(Ryzen 9 7900X)、MI210(gfx90a)、CPU内蔵GPU(gfx1036)がリストアップされた。
Stable Diffusion
stable-diffusion-webui 1.7.0
AUTOMATIC1111/stable-diffusion-webuiをインストールしてお絵描きAIを動かしてみる。バージョンは1.7.0を使用した。
$ sudo apt install -y git
$ git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
$ cd stable-diffusion-webui
$ git checkout v1.7.0
TCMallocをインストールする。これを使用することでメモリリークを防ぐことができるらしい?
$ sudo apt install -y libtcmalloc-minimal4
webui.sh
を実行する。こちらを参考にしてAMD GPU向けに--upcast-sampling
を引数で与えている(あってもなくても結果は変わらないようだった)。--listen
を与えることでマシンの外からもWeb UIにアクセスできるようになる。--no-gradio-queue
はプロキシが設定された環境で実行するために必要だった。
$ ./webui.sh --upcast-sampling --listen --no-gradio-queue
webui.sh
を初めて実行すると自動で必要なソフトウェアやモデルがダウンロードされる。CPU内蔵GPUがある場合、次のように落ちてしまうことがある。
$ ./webui.sh: line 256: 3827 Segmentation fault (core dumped) "${python_cmd}" -u "${LAUNCH_SCRIPT}" "$@"
次のようにしてWeb UIが使用するGPUを限定するとうまく実行できた。
$ CUDA_VISIBLE_DEVICES=0 ./webui.sh --upcast-sampling --listen --no-gradio-queue
http://localhost:7860をブラウザで開くと次のような画面が表示される。
Promptと書いてあるテキストボックスにdog
と入れてGenerateボタンを押すとAIが描いた犬の写真が出力された。MI210の場合、お絵描きにかかった時間は1.4秒だった。
画像サイズを変更したときの実行時間の変化は次のようになった(複数回実行し最も短かった時間を記録した)。
Resolution | RX7900 XTX | MI210 |
---|---|---|
512x512 | 1.3 | 1.4 |
512x768 | 2.2 | 2.3 |
512x1024 | 2.9 | 3.6 |
1024x512 | 2.9 | 3.6 |
1024x1024 | 8.6 | 10.6 |
2048x2048 | 2m 27.9 | 4m 5.2 |
ここまでできれば後の使い方はNvidia GPUと同じのためウェブを参考にして新しいモデルを入れたり、拡張をインストールしたりできる。AMD GPUでも生成AIでお絵描きできることが分かった。
ハローアスカベンチマーク
こちらのサイトに様々なGPUでのStable Diffusionによる生成速度を測定した結果が掲載されていて参考になる。
使用するモデルと設定を合わせることで似たような(よく見ると少し違う)画像を手元でも再現できるようになる。このときの生成速度を確認することで他のGPUとの性能の比較ができる。
ROCm 5.7.1とPyTorch 2.1.2の組み合わせでは次の生成速度が得られた。RTX 4070からRTX 4070 Tiの間くらいの性能が出ていることが分かった。
Metrics | RX7900 XTX | MI210 |
---|---|---|
Time [s] | 17.5 | 20.1 |
LLM
text-generation-webui
oobabooga/text-generation-webuiをインストールして大規模言語モデルを動かしてみる。
$ sudo apt install -y git curl
$ git clone https://github.com/oobabooga/text-generation-webui.git
$ cd text-generation-webui
バージョンを固定したかったがうまくいかなかったのでmainブランチのまま進める(特定のバージョンにチェックアウトすると初期セットアップが正常に完了しなかった)。次のコマンドを実行する。
$ CUDA_VISIBLE_DEVICES=0 ./start_linux.sh --listen
途中でGPUを聞かれるのでBを入力する。
What is your GPU?
A) NVIDIA
B) AMD (Linux/MacOS only. Requires ROCm SDK 5.6 on Linux)
C) Apple M Series
D) Intel Arc (IPEX)
N) None (I want to run models in CPU mode)
Input> B
Conda環境内にPyTorchを含む様々なパッケージがインストールされる。
http://localhost:7860をブラウザで開くと次のように表示される。
日本語LLMであるELYZAを動かしてみる。
Modelタブを選択する。Download model or LoRAにelyza/ELYZA-japanese-Llama-2-7b-fast-instruct
を入力、Downloadボタンを押す。
ダウンロードが完了したら🔃ボタンを押す。ダウンロードしたモデルを選択してLoadボタンを押す。
モデルのロードが完了するまで待つ。この間にrocm-smi
コマンドを叩くとモデルがGPUに読み込まれVRAM使用率が上昇していく様子が見られる。80秒ほどかかった。
モデルのロードが完了後、特に設定は変更しなくてもChatタブで話しかけると答えてくれる。
最初の数回の受け答えはゆっくりだったが途中から突然生成速度が速くなった。上記の応答の生成速度は39.68 tokens/sで人間が文章を読むスピードよりも十分高速だった。
Chatタブの下の方にあるCharacter galleryからチャットの相手を変更することができる。Exampleを選択すると、Chiharu Yamadaというキャラクターがチャット相手になる。
Chat styleをmessengerに変更するとチャット画面の表示が変わる。
LXD
AMD GPUをコンテナ環境から利用する方法を確認する。(root権限で実行する)Dockerでは特に問題なかったが、LXDでは正常に動作させるのに手間取った。
LXDをインストールし、Ubuntu 22.04のコンテナを作成する。lxd init
はすべてデフォルトで設定した。
$ sudo snap install lxd
$ lxd init
$ lxc init ubuntu:22.04 test
AMD GPUにアクセスできるようにするためにデバイスをコンテナに追加する。
$ lxc config device add test kfd disk source=/dev/kfd path=/dev/kfd
$ lxc config device add test dri disk source=/dev/dri path=/dev/dri
コンテナ内のrender, videoグループのIDをホストと一致させる。
$ echo -e "gid 110 110\ngid 44 44" | lxc config set test raw.idmap -
コンテナを起動し、bashを実行する。
$ lxc start test
$ lxc exec test bash
これ以降はコンテナ内での作業となる。
ubuntuユーザーがAMD GPUを利用できるようにrender,videoグループに追加する。
# usermod -a -G render,video ubuntu
ホストと同様にコンテナ内にROCmをインストールする。
# wget https://repo.radeon.com/amdgpu-install/5.7.1/ubuntu/jammy/amdgpu-install_5.7.50701-1_all.deb
# apt install ./amdgpu-install_5.7.50701-1_all.deb -y
# amdgpu-install --usecase=rocm --rocmrelease=5.7.1 --no-dkms
venvも入れておく。
# apt install -y python3 python3-venv python-is-python3
ubuntuユーザーに切り替え、romcinfoが正常に結果を返すことを確認する。
# su ubuntu
$ rocminfo
PyTorchをインストールし動作を確認する。
$ python -m venv venv
$ source ./venv/bin/activate
$ pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm5.6
$ wget https://gist.github.com/damico/484f7b0a148a0c5f707054cf9c0a0533/raw/43c317bfbde626d9112d44462d815613194988e0/test-rocm.py
正常に動作するようにスクリプトを修正し、実行する。
$ sed -i 's/os.getlogin/getpass.getuser/' ./test-rocm.py
$ sed -i 's/os/getpass/' ./test-rocm.py
$ python ./test-rocm.py
Rootless Docker
Rootless Docker環境でAMD GPUを使用するには、コンテナ内のユーザーがvideoおよびrenderグループに所属し、かつコンテナ内のvideoおよびrenderグループがホストのこれらのグループと対応している必要がある。
試した環境ではホストの/dev/kfd/
および/dev/dri/renderD*
の所有グループはrenderであった。また、ホストのrenderグループのIDは110、コンテナのrenderグループのIDは109となっていた。ここでコンテナのrenderグループがホストのrenderグループと対応するようにマッピングを行う。グループIDのマッピングを制御するために/etc/subgid
を編集する。
Rootless Dockerをセットアップした時点で/etc/subgid
を次のように設定していたとする。
user:100000:65536
コンテナ内のグループIDをホストの100000番から順に割り当てる設定となっている。
コンテナ内のグループID 109番をホストの110番に割り振り、その他はホストに存在しない大きな番号にしたい場合、次のように記述すればよい。
user:100000:108
user:110:1
user:110000:65536
設定を反映するにはDockerを再起動する必要がある(systemctl --user restart docker.service
)。こうすると、コンテナ内の1~108の108個のグループIDはホストの100000~100107に割り当てられ、109が110に、110以降は110000以降に割り当てられ、意図通りになる。
上記の設定を行うことでRootless Docker環境でAMD GPUを使用することができた。
ROCm 6.0を試す
5.7.1から6.0へアップデートしPyTorchが正常に動作するか試す。まずは古いROCmをアンインストールする。
$ amdgpu-uninstall --rocmrelease=all
公式のドキュメントに従いインストールしてみる。
Quick-start install guide — ROCm installation (Linux)
$ wget https://repo.radeon.com/amdgpu-install/6.0/ubuntu/jammy/amdgpu-install_6.0.60000-1_all.deb
$ sudo apt install ./amdgpu-install_6.0.60000-1_all.deb
$ sudo amdgpu-install --usecase=rocm
正常にインストールできた。rocm-smi
の表示が新しくなっている。
PyTorch 2.1.2(ROCm 5.6)の環境でStable Diffusionを試したが特に問題なく動作した。ハローアスカベンチマークを実行したがRX7900 XTX、MI210ともにROCmをアップデートしたことによる性能の改善は見られなかった。
LLMについても同様に問題なく動作した。性能も同等のように思われる。
PyTorch 2.3(Nightly)を試す
venv仮想環境を新しく作り、Nightly版のPyTorchをインストールする。Stable版がROCm 5.6に対応しているのに対し、Nightly版はROCm 5.7に対応している。
$ pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/rocm5.7
そのままではstable-diffusion-webuiの実行時にエラーが出てしまうので次のようにしてライブラリのコードを修正する。
$ sed -i 's/from torchvision.transforms.functional_tensor import rgb_to_grayscale/from torchvision.transforms.functional import rgb_to_grayscale/' $VIRTUAL_ENV/lib/python3.10/site-packages/basicsr/data/degradations.py
ハローアスカベンチマークを実行したところRX7900 XTXでの生成時間がわずかに短縮した。
ROCm | PyTorch | Time [s] |
---|---|---|
5.7.1 | 2.1.2 | 17.5 |
6.0 | 2.3 | 17.2 |
Discussion