Strataは、Qwen3.8-Flash-NextをGPU・RAM・CPU・SSDにまたがって実行する推論エンジンです。Windows版でもAMD Radeon向けのHIP backendが使えるようになったので、手元のRX 7900 XTXで実際に動かしてみました。
Windows 11 + RX 7900 XTXでは、モデルの起動、短文推論、selftestまでは成功しました。 一方で、prefillでhipErrorInvalidDeviceFunctionが返り、engineが終了する問題を再現しました。入力が70 token前後でも起きます。
GitHub Issueで報告したところ、WindowsのDLLロード順によって、Strata同梱のrocBLASがSystem32側のAMD HIP runtimeを使ってしまう可能性が高いと開発者から回答がありました。指定されたDLLをengine\直下へコピーして再検証すると、以前失敗していた72 tokenを含め、80 tokenまで正常に通るようになりました。
この記事では、インストールから最初の推論成功、32Kベンチでのクラッシュ、原因の切り分け、Issue報告、回避策での再検証までを順に記録します。
検証環境
今回使ったPCの構成は次の通りです。
- OS: Windows 11 64-bit
- CPU: AMD Ryzen 7 9800X3D
- GPU: AMD Radeon RX 7900 XTX 24GB
- RAM: DDR5 64GB
- Strata commit:
1678de333d0e0711bc414ad992b640e1a37dd814 - Strata engine:
0.1.34 - Backend: HIP
- Model:
Qwen3.8-Flash-Next-GSQ-RCO-IQ2_XS - Context: 32768
- KV cache: 8-bit
- Vision: disabled
- AMD display driver:
32.0.31041.1004
リポジトリはNiko1221/Strataです。
まずはハードウェアチェック
最初に、Strata付属のチェックを実行しました。
.\START-HERE.bat --check
RX 7900 XTXは問題なく認識されています。
GPU 0: AMD Radeon RX 7900 XTX
gfx1100
24 GB
ただし、このPCにはRyzen 7 9800X3Dの内蔵GPUもあるので、HIPのデバイス一覧は次のようになります。
device 0: AMD Radeon(TM) Graphics
arch gfx1036
device 1: AMD Radeon RX 7900 XTX
arch gfx1100, 24.0 GiB, wave32
セットアップはRX 7900 XTXを正しく選んでくれました。
チェック時には、Windowsのpage fileが約3.9GBという警告も出ました。Windows側では「すべてのドライブのページング ファイルのサイズを自動的に管理する」が有効だったため、まずは設定を変えずに進めています。
後述しますが、今回最終的に出たエラーはOOMではなく、rocBLAS/HIP側のエラーでした。そのため、少なくとも今回観測したクラッシュをpage file不足と断定できる材料はありません。
IQ2_XSを起動する
今回は次の条件でセットアップしました。
.\START-HERE.bat --backend hip --model IQ2_XS --context 32768 --vision no --yes
初回はモデルやMTP関連のデータをダウンロードするため、時間がかかります。
起動ログを見ると、IQ2_XSのmodel shardが約39.23GB + 28.80GB、expert arenaが33.02GiB、GPU expert cacheが18.36GiBという構成でした。
strata generate: loaded 33.02 GiB at 5.78 GiB/s
strata generate: expert cache 13696 slots, 18.36 GiB of VRAM
strata generate: session is up (engine 0.1.34)
VRAMはかなりギリギリで、すべてロードした状態では次のように表示されていました。
strata serve: 477 MiB of VRAM free with everything loaded
それでも、Web UIから「こんにちは」と送ると普通に応答が返ってきます。
strata serve: prompt 53 tokens = 0 reused + 53 read in 634 ms (83.6 tok/s),
47 generated in 775 ms (60.6 tok/s)
strata serve: decode expert cache hit rate: 88.5%
少なくとも、Windows + RX 7900 XTXでStrata自体がまったく動かないわけではありません。短文ではprefill約83.6 tok/s、decode約60.6 tok/sで応答できました。
32K級のprefillを試したところengineが落ちる
次に、32K contextでのprefill性能を確認するため、自作のベンチスクリプトから長めのpromptを送ってみました。結果はHTTP 503です。
urllib.error.HTTPError: HTTP Error 503: Service Unavailable
Strata側では、engineがexit code 1で終了していました。ログ末尾には、原因を示していそうな行があります。
rocBLAS error from hip error code: 'hipErrorInvalidDeviceFunction':98
prefill gemm: cublasGemmEx: cuBLAS status 6
同じ条件でもう一度実行しても、結果は変わりませんでした。
最初は「32Kが重すぎるのでは」と考えましたが、ログにOOMは出ていません。そこで、入力サイズを小さくしながら、どこから落ちるのかを調べることにしました。
selftestは正常に通る
入力サイズを絞り込む前に、GPUとHIP runtime自体に問題がないかを確認しました。
そのまま--selftestを実行すると、内蔵GPUのgfx1036がdevice 0になっているため失敗します。
strata-device: GPU 0 (AMD Radeon(TM) Graphics, gfx1036) is not an architecture this Strata engine was compiled for
そこでHIP_VISIBLE_DEVICESを指定し、RX 7900 XTXだけが見える状態でselftestを実行します。
$env:PATH = "$PWD\engine\rocm\bin;$env:PATH"
$env:HIP_VISIBLE_DEVICES = "1"
.\engine\strata-device.exe --list-devices
.\engine\strata-device.exe --selftest
selftestは成功しました。
device 0: AMD Radeon RX 7900 XTX
HIP arch gfx1100 wave32
multiprocessors 48
VRAM total / free 23.984 GiB / 23.839 GiB
driver / runtime 70260201 / 70260201
memory plan --max-context 20480
plan + KV vs free FITS
strata-device selftest OK
これで、GPUの認識と基本的なHIP動作、メモリ計画がVRAMに収まることまでは確認できました。ただし、実際に失敗しているprefill GEMMの経路までselftestが検証しているわけではありません。
テスト後は環境変数を解除しています。
Remove-Item Env:HIP_VISIBLE_DEVICES
実は70 token前後でも再現した
32K固有の問題かどうかを確かめるため、入力を徐々に短くしていきました。
最初は文字数からtoken数を推定していましたが、この方法では正確な値が分かりません。さらに、似たpromptを連続して送ると、Strataのprefix cacheで前の入力が再利用されるため、境界の調査には向いていませんでした。
そこで最終的には、Strata自身の/v1/messages/count_tokensで実token数を数え、ケースごとに異なるprefixを使って再利用を避けました。結果は次の通りです。
actual input tokens 61 -> OK
actual input tokens 62 -> OK
actual input tokens 61 -> OK
actual input tokens 72 -> HTTP 503 / engine exit
72 tokenのケースでも、32K級を投げたときと同じエラーが出ています。
rocBLAS error from hip error code: 'hipErrorInvalidDeviceFunction':98
prefill gemm: cublasGemmEx: cuBLAS status 6
さらに、内蔵GPUの影響を除外するため、HIP_VISIBLE_DEVICES=1でRX 7900 XTXだけが見える状態にしてStrataを起動し直しました。同じテストを再実行しても、61〜62 tokenは成功し、72 tokenでHTTP 503 / engine exitを再現しています。
この時点で、少なくとも「32K contextを使ったから落ちる」という見方は違うと判断しました。
1 token単位で境界を特定することもできます。ただ、今回の目的はStrataの内部デバッグではなく、実際に動かして性能を見ることです。再現条件としては十分なので、ここで切り上げました。
ソースを見るとplain hipBLAS側で落ちている
Strataのsrc/prefill/gemm.cuも確認しました。Windows AMD環境でhipBLASLtのtuning tableを利用できない場合、Strataはplain hipBLAS側にフォールバックし、互換層経由でcublasGemmExを呼びます。今回のログは、この呼び出しで失敗しています。
ただし、「tuning tableがないことが原因」とまでは断定できません。 確認できたのは、prefill GEMMの実行時にrocBLASからhipErrorInvalidDeviceFunctionが返り、Strataがengineを終了している、というところまでです。
PCIe probeにも気になる値が出ていた
engineを再起動したときのログには、次のような値も出ていました。
PCIe probe: 9038.2 GB/s host->device
PCIe probe: 10294.7 GB/s host->device
PCIe probe: 19416.7 GB/s host->device
PCIe probe: 18417.5 GB/s host->device
PCIe probe: 5598.2 GB/s host->device
PCIe帯域としては明らかに現実的ではない値です。今回のprefill crashと関係があるかは分かりません。ただ、Windows AMD版の診断情報として気になったので、Issueにも記載しました。
GitHub Issueを作成した
既存Issueを検索すると、RX 7900 XTX / gfx1100に関する報告はありました。ただ、Windows 11 + engine 0.1.34 + prefill GEMM + hipErrorInvalidDeviceFunctionという組み合わせの報告は見つかりませんでした。そこで、次のIssueを作成しました。
Windows AMD (RX 7900 XTX / gfx1100): prefill GEMM crashes with hipErrorInvalidDeviceFunction
Issueには次の情報を含めています。
- Windows / Strata / driver / modelのバージョン
- RX 7900 XTXのdevice情報
-
strata-device --selftestの成功結果 - 53〜62 token程度では推論できること
- 独立promptの72 tokenでengineが終了すること
-
hipErrorInvalidDeviceFunctionのログ - PCIe probeの異常に見える値
- 関連Issueとの差分
開発者から原因候補と回避策が返ってきた
Issue #461には、Strataの開発者から次の説明がありました。
Windowsでは、AMDドライバが配置するC:\Windows\System32\amdhip64_7.dllが、Strataのengine\rocm\binにある同梱版より先に読み込まれることがあるとのことです。その状態では、Strata同梱のrocBLASがAMDドライバ側のHIP runtime上で動くことになります。
開発者によると、小さいGEMMは動作しても、大きめのshapeでrocBLASのpacked kernelを使うとhipErrorInvalidDeviceFunctionになる可能性が高く、今回の症状はIssue #468と同じ原因とみられるとのことでした。
次のリリースでは、同梱runtimeをstrata.exeと同じ場所に置くことで、このDLLロード順の問題を避ける予定とのことです。
現行版で試せる回避策として、次の2ファイルをengine\直下へコピーするよう案内がありました。
copy engine\rocm\bin\amdhip64_7.dll engine\
copy engine\rocm\bin\amd_comgr.dll engine\
コピー後にStrataを再起動し、実際に読み込まれているHIP runtimeを確認しました。
Get-Process strata |
% Modules |
? ModuleName -like 'amdhip*' |
Select-Object FileName
結果は次の通りです。
C:\Users\kopug\Work\Strata\engine\amdhip64_7.dll
System32側ではなく、engine\直下へコピーしたDLLが読み込まれていることを確認できました。
回避策適用後は72 tokenでも落ちなくなった
同じbench_prefill_threshold_nocache.pyを再実行しました。
actual input tokens 61 -> OK
actual input tokens 62 -> OK
actual input tokens 61 -> OK
actual input tokens 72 -> OK
actual input tokens 70 -> OK
actual input tokens 72 -> OK
actual input tokens 79 -> OK
actual input tokens 80 -> OK
回避策適用前は72 tokenでHTTP 503 / engine exitになっていましたが、適用後は80 tokenまで正常に完走しました。
これだけで内部原因を完全に証明できたわけではありませんが、同じ環境・同じテストでDLL配置だけを変えたところ再現しなくなったため、今回のhipErrorInvalidDeviceFunctionはWindowsのDLLロード順によるHIP runtimeの取り違えが原因だった可能性がかなり高いと考えています。
なお、開発者からはAMDドライバ32.0.31041がROCm 10.2に対してやや古いため、最新のAMD Softwareも試す価値があるとのコメントもありました。ただし今回は、DLL配置の変更だけで再現しなくなったため、原因の切り分けを保つ目的でドライバ更新は行っていません。
まとめ
Windows 11 + RX 7900 XTXでStrata 0.1.34を試したところ、モデルのロード、Web UI、短文推論、device selftestまでは問題なく動きました。短文では、prefill約83.6 tok/s、decode約60.6 tok/sを実測しています。
その後、prefillでhipErrorInvalidDeviceFunctionによってengineが終了する問題を再現しました。32K級だけでなく70 token前後の短い入力でも発生し、内蔵GPUを除外しても再現しています。
Issue #461で報告したところ、WindowsがSystem32側のamdhip64_7.dllを優先して読み込むことで、Strata同梱のrocBLASとHIP runtimeの組み合わせが崩れている可能性が高いと分かりました。開発者から案内されたDLLをengine\直下へ配置した後は、同じテストで80 tokenまで正常に通っています。
今回の検証では、単に「AMDで落ちた」で終わらず、再現条件を絞り、Issueとして報告し、開発者からの回避策を同じ環境で確認するところまで進められました。
次のリリースではDLL配置が修正される予定とのことなので、正式対応版が出たら改めてベンチを取りたいと思います。その際は、手元のRTX 5070 Ti環境とも同条件で比較する予定です。