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はほぼ変化ない状態です。
GPU | prompt eval time | eval time |
RX480 | 1.17 tokens per second | 12.23 tokens per second |
MI25 | 30.35 tokens per second | 19.94 tokens per second |
MI25×2 | 30.25 tokens per second | 23.39 tokens per second |
マルチGPUの状態でのGPU使用率をrocm-smiで見ていると1GPUの時は常に100%で回っているところが、100%ではないので計算以外のところがボトルネックになっていると考えられます。