Rocky LinuxとRadeon Instinct MI25でROCmを使う①環境準備編

RX480でのROCmが面白かったので、Radeon Instinct MI25入手してみたので、環境準備を行います。

環境は以下の自作PCにRocky Linux9.4をMinimumインストールしました。
CPU:Ryzen 7 2700X
MB:X470 GAMING PLUS
RAM:16GB×2枚 2400 MHz
SSD:BIOSTAR S120-256
GPU#1:MI25
GPU#2:MI25
GPU#3:V3900

とりあえずはWindows環境でMI25にWX9100のBIOSを書き込みます。

もともとは1枚目、2枚目にMI25、3枚目にV3900をつないで、画面はV3900につなぐ算段でしたが、起動時に There is no GOP support detected in this card.と表示され、CSMに設定を変更する旨のメッセージができます。

MI25を使用する際はResizable BarとAbove 4G Decodingの有効化が必要で、そのためにはCSMは無効にする必要があるため、MI25が認識できなくなります。

その状態ではATI FLUSHで認識できなかったので、調べたところV3900のBIOSがUEFI未対応のものだったようでした。とりあえず適当なGT730をつないでMI25をATI FLUSHから認識できたので、WX9100のBIOSを書き込みます。

C:\atiflash_293>.\amdvbflash.exe -i

adapter bn dn fn dID       asic           flash      romsize test    bios p/n
======= == == == ==== =============== ============== ======= ==== ==============
   0    2A 00 00 6860 Vega10          M25P80          100000 pass 113-D0513700-001

C:\atiflash_293>.\amdvbflash.exe -p 0 AMD.WX9100.16384.171219.rom -fs
Old SSID: 0C35
New SSID: 0B0F
The result of RSA signature verify is PASS.
Old DeviceID: 6860
New DeviceID: 6861
Old Product Name: Vega10 D05137 64Mx128 852e/945m
New Product Name: Vega10 D05103 64Mx128 16GB 852e/945m 1.00V
Old BIOS Version: 016.001.001.000.009999
New BIOS Version: 016.001.001.000.009259
Flash type: M25P80
100000/100000h bytes programmed
100000/100000h bytes verified

Restart System To Complete VBIOS Update.

ついでにV3900にUEFI対応版のBIOSを書き込んだら 「There is no GOP support detected in this card.」は出なくなったので、これで行けそうです。

次にOSをRocky Linux9.4にします。

Radeonのドライバをインストールするツールをインストールします。

# dnf install https://repo.radeon.com/amdgpu-install/5.7.3/rhel/9.2/amdgpu-install-5.7.50703-1.el9.noarch.rpm -y

EPELリポジトリとCodeReady Linux Builderリポジトリが必要なので有効にしてから、amdgpu-installを実行します。5系の対応バージョンが9.2までみたいなので、amdgpudistroをセットしておきます。

# echo "9.2" > /etc/yum/vars/amdgpudistro
# dnf install epel-release -y
# crb enable
# amdgpu-install --usecase=rocm

ダウンロードに2.4G程度、ディスクも17G程度要求されたので、しばらく待ちます。

インストール後にsmiで見ると温度なんかも取得できたようです。

# rocm-smi
========================= ROCm System Management Interface =========================
=================================== Concise Info ===================================
GPU[0]          : get_power_avg, Not supported on the given system
GPU[1]          : get_power_avg, Not supported on the given system
GPU  Temp (DieEdge)  AvgPwr  SCLK    MCLK    Fan    Perf  PwrCap  VRAM%  GPU%
0    59.0c           N/A     852Mhz  167Mhz  9.41%  auto  170.0W    0%   0%
1    36.0c           N/A     852Mhz  167Mhz  9.41%  auto  170.0W    0%   0%
====================================================================================
=============================== End of ROCm SMI Log ================================

次にLLMを動かすために、llama.cppをコンパイルします。LLAMA_HIPBLAS=1を指定してROCmを有効にします。

# sudo dnf install git make wget -y
# cd /work
# git clone https://github.com/ggerganov/llama.cpp
# cd /work/llama.cpp
# export CC=/opt/rocm/llvm/bin/clang
# export CXX=/opt/rocm/llvm/bin/clang++
# make LLAMA_HIPBLAS=1 -j

実行してみます。

# export HIP_VISIBLE_DEVICES="0,1"
# /work/llama.cpp/llama-cli -ngl 50 -m /work/model/ELYZA-japanese-Llama-2-13b-fast-instruct-q4_K_M.gguf -p '[INST] <<SYS>>あなたは誠実で優秀な日本人のアシスタントです。<</SYS>>Pythonでmysqlからselectするサンプルを実装して[/INST]'
~~~~~~~~~~~~省略~~~~~~~~~~~~
ggml_cuda_init: GGML_CUDA_FORCE_MMQ:   no
ggml_cuda_init: CUDA_USE_TENSOR_CORES: yes
ggml_cuda_init: found 2 ROCm devices:
  Device 0: Radeon Pro WX 9100, compute capability 9.0, VMM: no
  Device 1: Radeon Pro WX 9100, compute capability 9.0, VMM: no
llm_load_tensors: ggml ctx size =    0.55 MiB
llm_load_tensors: offloading 40 repeating layers to GPU
llm_load_tensors: offloading non-repeating layers to GPU
llm_load_tensors: offloaded 41/41 layers to GPU
llm_load_tensors:      ROCm0 buffer size =  3812.58 MiB
llm_load_tensors:      ROCm1 buffer size =  3650.77 MiB
llm_load_tensors:        CPU buffer size =   122.45 MiB
~~~~~~~~~~~~省略~~~~~~~~~~~~
 [INST] <<SYS>>あなたは誠実で優秀な日本人のアシスタントです。<</SYS>>Pythonでmysqlからselectするサンプルを実装して[/INST] mysql-connector-pythonを使ってselectします。
```
import mysql.connector

connector = mysql.connector.connect(
    host="ホスト名",
    user="ユーザー名",
    passwd="パスワード",
    db="データベース名"
)
cursor = connector.cursor()

query = "SELECT * FROM テーブル名"
result = cursor.execute(query)

if result.fetchall():
    data = result.fetchall()
    print(data)
    for row in data:
        print(row)
connector.close()
``` [end of text]

llama_print_timings:        load time =   23799.79 ms
llama_print_timings:      sample time =       4.29 ms /   137 runs   (    0.03 ms per token, 31934.73 tokens per second)
llama_print_timings: prompt eval time =    1223.14 ms /    37 tokens (   33.06 ms per token,    30.25 tokens per second)
llama_print_timings:        eval time =    5814.39 ms /   136 runs   (   42.75 ms per token,    23.39 tokens per second)
llama_print_timings:       total time =    7059.94 ms /   173 tokens
Log end

今回はprompt eval timeが30.25 tokens per secondでした。前回RX480では1.17 tokens perだったので、30倍速くなっています。

1GPUに絞ってみます。

# export HIP_VISIBLE_DEVICES="0,1"
# /work/llama.cpp/llama-cli -ngl 50 -m /work/model/ELYZA-japanese-Llama-2-13b-fast-instruct-q4_K_M.gguf -p '[INST] <<SYS>>あなたは誠実で優秀な日本人のアシスタントです。<</SYS>>Pythonでmysqlからselectするサンプルを実装して[/INST]'
~~~~~~~~~~~~省略~~~~~~~~~~~~
llama_print_timings:        load time =    3153.63 ms
llama_print_timings:      sample time =       8.35 ms /   260 runs   (    0.03 ms per token, 31148.92 tokens per second)
llama_print_timings: prompt eval time =    1219.20 ms /    37 tokens (   32.95 ms per token,    30.35 tokens per second)
llama_print_timings:        eval time =   12990.60 ms /   259 runs   (   50.16 ms per token,    19.94 tokens per second)
llama_print_timings:       total time =   14252.08 ms /   296 tokens
Log end

1GPUが結構速いです。というか2GPUが遅いです……。

比較してみると以下の速度でした。eval timeはちょっと早くなっているので効果はあるみたいですが、prompt eval timeはほぼ変化ない状態です。

GPUprompt eval timeeval time
RX4801.17 tokens per second12.23 tokens per second
MI2530.35 tokens per second19.94 tokens per second
MI25×230.25 tokens per second23.39 tokens per second
ELYZA-japanese-Llama-2-13b-fast-instruct-q4_K_Mでの比較

マルチGPUの状態でのGPU使用率をrocm-smiで見ていると1GPUの時は常に100%で回っているところが、100%ではないので計算以外のところがボトルネックになっていると考えられます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)