🐶

AMD GPU(Radeon、Instinct)で生成AIを動かしてみた

2023/12/25に公開

はじめに

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検証の様子
MI210検証の様子

使用したPC

個別にパーツを購入して組んだ自作PCを検証に使用した。

PCパーツリスト(ご参考)

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を利用できることを確認する。テスト用のスクリプトが配布されているのでありがたく利用させていただく。

https://gist.github.com/damico/484f7b0a148a0c5f707054cf9c0a0533

$ 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による生成速度を測定した結果が掲載されていて参考になる。

https://chimolog.co/bto-gpu-stable-diffusion-specs/

使用するモデルと設定を合わせることで似たような(よく見ると少し違う)画像を手元でも再現できるようになる。このときの生成速度を確認することで他の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を動かしてみる。

https://huggingface.co/elyza/ELYZA-japanese-Llama-2-7b-fast-instruct

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