💻

RX7900XTX + WSL2 + ROCm + vLLMでローカルLLM環境を構築する

に公開

はじめに

本記事の内容

この記事は、AMD GPU でローカル LLM に挑戦したい人や、クラウド AI の制限から解放されたい人に向けて、Windows 11 + WSL2 + ROCm + vLLM の組み合わせで、RX 7900 XTX を使ったローカル LLM 環境の構築手順について自分が奮闘した結果をまとめたものです。

この記事を読むと、こんなことができるようになります:

  • RX 7900 XTX で 7B クラスのモデルを 270+ tok/s で快適に動作
  • OpenAI 互換 API として他のツールから利用可能
  • プライバシーを守りながら、制限なく LLM を使い倒せる

なぜローカル LLM 環境を構築しようと思ったのか

私は日常的に AI を活用しているヘビーユーザーで、某クラウド AI の Pro プランを契約しており、簡単な調べ物から対話形式の深い推論、思考の拡張、ホームラボの相談、文章作成など、あらゆる場面で LLM を使っています。

しかし、2026 年に入ってから Pro プランの制限が厳しくなってしまい、かと言って MAX プランは高いしどうにかならないものかと感じることが増えてきました。

そこで、ローカル LLM 環境を構築すれば、制限なく使い放題なのでは? と思ったのがきっかけです。

手元にあるのは RX 7900 XTX(NVIDIA じゃない)

ただ、自分が所有している GPU は AMD Radeon RX 7900 XTX (24GB) であり、LLM 界隈で主流の NVIDIA GPU は持っていなかったので、そもそも AMD GPU でローカル LLM できるの?というところから調査を始めました。

私がこの GPU を購入したときには、AI 性能と言えば NVIDIA で、AMD では出来なくはないけれど適性的に厳しいというイメージが強かったです。

しかしながら、調査を進めるうちに最近は AMD GPU でもそれなりに動くようになってきたという情報が得られたため、数日間試行錯誤し、WSL2 + ROCm + vLLM で実用的なローカル LLM 環境を構築することに成功しました


RX 7900 XTX で戦えるのか

AMD Radeon RX 7900 XTX (24GB) は、ROCm の成熟と vLLM の正式対応によって、2026 年 2 月現在十分戦える GPU になってきました。

ざっくりとした GPU の比較(2026 年 2 月時点)です。

GPU VRAM 価格帯(目安) 円/GB(目安) LLM 用途の評価
RX 7900 XTX 24GB 約 13 万円〜 約 5,400 円/GB ★★★★★
RTX 4090 24GB 約 28 万円〜 約 11,600 円/GB ★★★★☆
RX 7900 XT 20GB 約 10 万円〜 約 5,000 円/GB ★★★★☆
RTX 4080 SUPER 16GB 約 18 万円〜 約 11,200 円/GB ★★★☆☆

RX 7900 XTX の強み:

  • 24GB の大容量 VRAM を積んでいる
  • RTX 4090 の半額以下というコスパ
  • ROCm + vLLM が(制約はあるものの)ちゃんと動く
  • vLLM で「ファーストクラスプラットフォーム」として正式サポート(2026 年 1 月発表)

実際に構築してみた結果:

  • Qwen2.5-7B-Instruct: 272 tok/s
  • Mistral-7B-Instruct: 207 tok/s
  • これだけのスピードが出れば実用的以上(より大規模モデルを使用する場合はこの限りではありませんが)

結論として、「AMD GPU でも十分戦える」 というのが、数日間試行錯誤した末の私の実感です。

もちろん、NVIDIA と比べて制約はあります(FP8 KV キャッシュ量子化が使えない等)。
しかし、ホームラボ用途でコスパを重視するなら、RX 7900 XTX は非常に良い選択肢だと思います。


環境情報

ハードウェア構成(執筆者のPC)

  • CPU: Intel Core i7-14700KF (20コア28スレッド)
  • メモリ: DDR4 64GB
  • GPU: AMD Radeon RX7900XTX (24GB VRAM)
  • ストレージ: NVMe SSD 2TB
  • マザーボード: ASUS TUF GAMING Z790-PLUS WIFI D4
  • 電源: 1200W (80PLUS Gold)

ソフトウェア構成

  • OS (ホスト): Windows 11 25H2
  • AMD GPUドライバー: AMD Software Adrenalin Edition 26.1.1
  • WSL2: Ubuntu 24.04 LTS
    • 割り当てメモリ: 48GB
    • 割り当てプロセッサ: 16コア
    • スワップ: 16GB
  • ROCm: 7.2
  • PyTorch: 2.9.1+rocm7.2.0
  • vLLM: v0.15.0
  • Python: 3.12

.wslconfig 設定

Windows 側 C:\Users\<ユーザー名>\.wslconfig:

[wsl2]
memory=48GB
processors=16
swap=16GB

※ 設定後に PowerShell で wsl --shutdown してから再度 WSL を起動します。

最小推奨スペックの目安

項目 最低ライン 推奨ライン
CPU Ryzen 5 / Core i5 (6コア以上) Ryzen 7 / Core i7 (8コア以上)
メモリ 32GB(WSL2に16GB割り当て) 64GB(WSL2に32GB以上割り当て)
GPU RX 7900 XT (20GB VRAM) RX 7900 XTX (24GB VRAM)
SSD NVMe 500GB NVMe 1TB以上
電源 750W以上 800〜850W以上

1. WSL2 と Ubuntu 24.04 のセットアップ

1-1. WSL2 の有効化

PowerShell(管理者)で:

wsl --install

再起動後、バージョンを確認しておきます。

wsl --version

1-2. WSL2 のリソース割り当て (.wslconfig)

前述の .wslconfig を作成します。
memory をホストメモリの 70〜75%、processors を物理コア数の 80% くらいを目安に。

作成・編集後、PowerShell で:

wsl --shutdown

1-3. Ubuntu 24.04 のインストール

wsl --install -d Ubuntu-24.04

初回起動時にユーザー名 / パスワードを設定します。

1-4. 基本パッケージのインストール

WSL で Ubuntu を起動して:

sudo apt update && sudo apt upgrade -y
sudo apt install -y \
  build-essential git wget curl \
  python3-pip python3-venv \
  ninja-build

2. AMD GPU ドライバーと ROCm のセットアップ

2-1. Windows 側の AMD ドライバー

  • AMD Software: Adrenalin Edition 26.1.1 をインストール。
  • 既に別バージョンを入れている場合も、26.1.1 以降にしておくと無難です。

(細かい手順は公式インストーラに従うだけなので割愛します)

2-2. ROCm のインストール(Ubuntu-24.04 上)

ROCm のインストール方法はバージョンごとに変わりがちなので、まずは公式手順を確認することを強くおすすめします。

wget https://repo.radeon.com/amdgpu-install/7.2/ubuntu/noble/amdgpu-install_7.2.70200-1_all.deb
sudo apt install ./amdgpu-install_7.2.70200-1_all.deb
sudo amdgpu-install -y --usecase=wsl,rocm --no-dkms

2-3. GPU 認識確認(Ubuntu-24.04 上)

rocm-smi は WSL だと動かないので、rocminfo で確認します。

rocminfo | grep "Name:"

gfx1100 が含まれていれば RX 7900 XTX が正しく認識されています。


3. ROCm 対応 PyTorch のインストール

3-1. Python 仮想環境の作成

ホームディレクトリ直下に venv を作ります。

python3 -m venv ~/ai-ws
cd ~/ai-ws
source ~/ai-ws/bin/activate

ディレクトリ名 ai-ws は任意の名前で大丈夫です。

3-2. PyTorch (ROCm build) インストール

pip3 install --upgrade pip wheel

wget https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torch-2.9.1%2Brocm7.2.0.lw.git7e1940d4-cp312-cp312-linux_x86_64.whl
wget https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torchvision-0.24.0%2Brocm7.2.0.gitb919bd0c-cp312-cp312-linux_x86_64.whl
wget https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/triton-3.5.1%2Brocm7.2.0.gita272dfa8-cp312-cp312-linux_x86_64.whl
wget https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torchaudio-2.9.0%2Brocm7.2.0.gite3c6ee2b-cp312-cp312-linux_x86_64.whl
pip3 uninstall torch torchvision triton torchaudio
pip3 install torch-2.9.1+rocm7.2.0.lw.git7e1940d4-cp312-cp312-linux_x86_64.whl torchvision-0.24.0+rocm7.2.0.gitb919bd0c-cp312-cp312-linux_x86_64.whl torchaudio-2.9.0+rocm7.2.0.gite3c6ee2b-cp312-cp312-linux_x86_64.whl triton-3.5.1+rocm7.2.0.gita272dfa8-cp312-cp312-linux_x86_64.whl

3-3. 動作確認

python - << 'PY'
import torch
print("CUDA available:", torch.cuda.is_available())
if torch.cuda.is_available():
    print("Device count:", torch.cuda.device_count())
    print("Device name:", torch.cuda.get_device_name(0))
PY

こんな感じで出れば OK:

CUDA available: True
Device count: 1
Device name: AMD Radeon RX 7900 XTX

4. vLLM のインストール

4-1. vLLM のバージョン選択

記事執筆時点(2026 年 2 月)での vLLM 最新版は v0.16.0 ですが、安定版は v0.15.0 なので
今回は v0.15.0 を使うこととします。一応以下にそれぞれの特徴をまとめました。

v0.15.0 の特徴

  • MLA サポートなし
  • Flash Attention はオプション扱い
  • シンプルで安定した構成

v0.16.0 の特徴

  • MLA サポート追加(DeepSeek v3 などのモデル向け)
  • Flash Attention 前提に変更(環境変数 BUILD_FA=0 を設定することで回避可能)
  • 標準 Attention モデル(Qwen2.5、Mistral など)は問題なく動作

RX 7900 XTX における注意点

RX 7900 XTX (RDNA3 / gfx1100) は Flash Attention に未対応です。

v0.16.0 を使う場合、以下の点に注意:

  1. デフォルトでは Flash Attention が必要
  2. BUILD_FA=0 環境変数を設定すれば Flash Attention なしでビルド可能
  3. Triton Attention が使われるので性能面での問題なし
  4. 標準 Attention モデルは正常に動作
  5. MLA モデル(GLM-4.7-Flash、DeepSeek-V2/V3 など)は使用不可

結論

  • 標準 Attention モデルのみ使う場合: v0.15.0 / v0.16.0 どちらでも OK
  • シンプルさ重視: v0.15.0 を推奨
  • 最新機能を試したい: v0.16.0 + 環境変数にBUILD_FA=0を追記 で OK

4-2. リポジトリのクローン

cd ~/ai-ws
git clone https://github.com/vllm-project/vllm.git
cd vllm
git fetch --tags
git checkout v0.15.0

git checkout v0.15.0 で前述のバージョン指定をしています。

4-3. use_existing_torch.py を適応(重要)

vLLM には、既にインストール済みの PyTorch を前提にビルドするスクリプトがあります。

これを適用しておかないと以下のような状態になります。

  • vLLM のデフォルトビルドは、依存関係として CUDA 版の PyTorch を自動的にインストールしようとする
  • せっかくインストールした ROCm 版の PyTorch (2.9.1+rocm7.2.0) が上書きされてしまう
  • 結果、GPU が認識されなくなる

なので、忘れずに適用しておきましょう。

python use_existing_torch.py

4-4. 依存関係のインストール

pip install -r requirements/build.txt
pip install -r requirements/rocm.txt
pip install ninja cmake wheel packaging pybind11

4-5. ROCm 用環境変数の設定

export PYTORCH_ROCM_ARCH="gfx1100"
export HSA_OVERRIDE_GFX_VERSION=11.0.0

v0.16.0 を使う場合は以下も追加:

export BUILD_FA=0  # Flash Attention なしでビルド

4-6. vLLM をビルド

pip install -e . --no-build-isolation

完了までに10分程度かかるので気長に待ちましょう。

4-7. インストール確認

python - << 'PY'
import vllm
print("vLLM version:", vllm.__version__)
PY

0.15.0+... のような文字列が出れば OK です。


5. 【重要】WSL2 環境特有の問題と修正

スクラップでもかなりハマった部分です。この修正をしないと vLLM が起動しません。

5-1. ROCm プラットフォームが検出されない

WSL2 上で vLLM を起動しようとすると、こんなエラーが出ます:

RuntimeError: Device string must not be empty

何が起きているのか?

一見すると「デバイス名が空」というエラーですが、実際の原因はもっと手前にあります。

vLLM は起動時に「ROCm が使えるかどうか」を amdsmi (AMD System Management Interface) というツールで確認します。
しかし、WSL2 では amdsmi が動かないため、ROCm プラットフォームの検出に失敗します。

詳しくログを見ると:

ROCm platform is not available because: Error code: 34

結果として:

  1. ROCm プラットフォームの検出が失敗
  2. GPU が認識されない
  3. デバイス名が空になる
  4. RuntimeError: Device string must not be empty が発生

5-2. コードの修正

amdsmi の代わりに、PyTorch を使って ROCm を検出するように修正します。

修正するファイル
~/ai-ws/vllm/vllm/platforms/__init__.py

nano ~/ai-ws/vllm/vllm/platforms/__init__.py

修正内容
rocm_platform_plugin() 関数を以下のように書き換えます。

def rocm_platform_plugin() -> str | None:
    is_rocm = False
    logger.debug("Checking if ROCm platform is available.")
    try:
        # amdsmi の代わりに PyTorch を使用
        import torch
        if hasattr(torch.version, 'hip') and torch.version.hip is not None:
            is_rocm = torch.cuda.is_available() and torch.cuda.device_count() > 0
            if is_rocm:
                logger.debug("Confirmed ROCm platform is available via torch.version.hip.")
            else:
                logger.debug("ROCm platform is not available because no GPU is found.")
        else:
            logger.debug("ROCm platform is not available because torch.version.hip is not found.")
    except Exception as e:
        logger.debug("ROCm platform is not available because: %s", str(e))

    return "vllm.platforms.rocm.RocmPlatform" if is_rocm else None
元のコード(参考)
def rocm_platform_plugin() -> str | None:
    is_rocm = False
    logger.debug("Checking if ROCm platform is available.")
    try:
        import amdsmi  # ← これが WSL2 で動かない
        amdsmi.amdsmi_init()  # ← Error code: 34 で失敗
        try:
            if len(amdsmi.amdsmi_get_processor_handles()) > 0:
                is_rocm = True
                logger.debug("Confirmed ROCm platform is available.")
            else:
                logger.debug("ROCm platform is not available because no GPU is found.")
        finally:
            amdsmi.amdsmi_shut_down()
    except Exception as e:
        logger.debug("ROCm platform is not available because: %s", str(e))
    
    return "vllm.platforms.rocm.RocmPlatform" if is_rocm else None
項目 修正前 修正後
検出方法 amdsmi torch.version.hip
GPU 確認 amdsmi.amdsmi_get_processor_handles() torch.cuda.is_available()
WSL2 対応 ❌ 動作しない ✅ 動作する

なぜ PyTorch なら動くのか?

WSL2 の制約:

Linux ネイティブのような直接的な GPU 管理ができないので、rocm-smi や amdsmi といった AMD の管理ツールが使えません。Windows ホスト経由でのアクセスになります。

PyTorch は WSL2 対応済み:

  1. torch.version.hip で ROCm のバージョン情報を取得できる
  2. torch.cuda.is_available() で GPU の存在を確認できる
  3. Windows ホスト経由でも正常に動作する仕組みを持っている

5-3. 動作確認

修正後、以下のコマンドで確認します:

python -c "from vllm.platforms import rocm_platform_plugin; print(rocm_platform_plugin())"

期待される出力:

/home/username/ai-ws/lib/python3.12/site-packages/torch/cuda/__init__.py:814: UserWarning: Can't initialize amdsmi - Error code: 34
  warnings.warn(f"Can't initialize amdsmi - Error code: {e.err_code}")
vllm.platforms.rocm.RocmPlatform

これが表示されれば、ROCm プラットフォームの検出に成功しています。
最初の2行で amdsmi のエラーが出ていますが問題ありません。
ようやく WSL2 で vLLM が動くようになりました。


6. 環境変数の永続化(.bashrc

毎回 export するのは面倒なので、.bashrc に書いておきます。

nano ~/.bashrc

末尾に以下を追記:

# ROCm 環境
export PYTORCH_ROCM_ARCH="gfx1100"
export HSA_OVERRIDE_GFX_VERSION=11.0.0
export BUILD_FA=0
export ROCM_LLVM_ENABLE_WAVE_PROFILER=0

# 任意: この環境でだけ作業するなら自動で venv を有効化
source ~/ai-ws/bin/activate

反映:

source ~/.bashrc

7. vLLM の基本動作確認

ではテストプログラムを作成して実際に Python から直接 vLLM を呼び出してテストしてみましょう。

nano test_vllm.py
# test_vllm.py
from vllm import LLM, SamplingParams

if __name__ == '__main__':
    # 軽量モデルで動作確認
    llm = LLM(model="facebook/opt-125m")
    
    # シンプルなプロンプト
    prompts = ["Hello, my name is", "The future of AI is"]
    
    # 生成パラメータ
    sampling_params = SamplingParams(temperature=0.8, max_tokens=50)
    
    # 推論実行
    outputs = llm.generate(prompts, sampling_params)
    
    # 結果表示
    for output in outputs:
        prompt = output.prompt
        generated = output.outputs[0].text
        print(f"Prompt: {prompt}")
        print(f"Output: {generated}")
        print("-" * 80)

実行:

python test_vllm.py

正常に output が表示されれば成功です。

OpenWebUI から API として呼出すといった話は、別記事を書く予定です。


8. ベンチマーク結果と実用性

せっかくなので、ベンチマークとってみました。

8-1. 測定条件

  • GPU: AMD Radeon RX 7900 XTX (24GB)
  • ROCm: 7.2
  • vLLM: v0.15.0
  • PyTorch: 2.9.1+rocm7.2.0
  • WSL2: Ubuntu 24.04
  • テスト設定:
    • プロンプト数: 10
    • 最大生成トークン: 512 / 出力
    • コンテキスト長: 4096
    • gpu_memory_utilization=0.9

8-2. 使用したベンチマークスクリプト

nano benchmark_simple.py
# benchmark_simple.py
import time
from vllm import LLM, SamplingParams

def benchmark_model(model_name, num_prompts=10, max_tokens=512):
    print("\n" + "="*60)
    print(f"Model: {model_name}")
    print("="*60)

    print("Loading model...")
    t0 = time.time()
    llm = LLM(
        model=model_name,
        trust_remote_code=True,
        gpu_memory_utilization=0.9,
        max_model_len=4096,
    )
    load_time = time.time() - t0
    print(f"Load time: {load_time:.2f}s")

    prompts = [
        "Write a short story about artificial intelligence.",
        "Explain quantum computing in simple terms.",
        "What are the benefits of exercise?",
        "Describe the process of photosynthesis.",
        "Write a poem about nature.",
    ] * (num_prompts // 5)

    sampling_params = SamplingParams(
        temperature=0.8,
        top_p=0.95,
        max_tokens=max_tokens,
    )

    # Warmup
    _ = llm.generate(prompts[:1], sampling_params)

    print(f"\nRunning benchmark ({num_prompts} prompts, max {max_tokens} tokens)...")
    t1 = time.time()
    outputs = llm.generate(prompts, sampling_params)
    elapsed = time.time() - t1

    total_tokens = sum(len(output.outputs[0].token_ids) for output in outputs)
    avg_tokens = total_tokens / len(outputs)
    tps = total_tokens / elapsed

    print("\n" + "="*60)
    print("Results:")
    print(f"  Total time: {elapsed:.2f}s")
    print(f"  Total tokens generated: {total_tokens}")
    print(f"  Average tokens per output: {avg_tokens:.1f}")
    print(f"  Throughput: {tps:.2f} tokens/s")
    print("="*60)

    return {
        "model": model_name,
        "load_time": load_time,
        "total_time": elapsed,
        "total_tokens": total_tokens,
        "tps": tps,
    }

if __name__ == "__main__":
    models = [
        "Qwen/Qwen2.5-7B-Instruct",
        "mistralai/Mistral-7B-Instruct-v0.3",
    ]
    for m in models:
        benchmark_model(m, num_prompts=10, max_tokens=512)
        input("\nPress Enter to continue...")

実行:

python benchmark_simple.py

8-3. 結果

Qwen/Qwen2.5-7B-Instruct

  • モデルロード時 VRAM: 14.5 GB
  • 推論時 VRAM(最大): 21.9 GB
  • 平均生成トークン数: 約 453 tokens
  • スループット: 272.34 tokens/s

mistralai/Mistral-7B-Instruct-v0.3

  • モデルロード時 VRAM: 13.8 GB
  • 推論時 VRAM(最大): 21.2 GB
  • 平均生成トークン数: 約 401 tokens
  • スループット: 206.69 tokens/s

8-4. 所感

  • Qwen2.5-7B は日本語も強く、かつ 270 tok/s 超えで、体感的にはほぼ待ち時間ゼロです。
  • Mistral-7B も 200 tok/s 超えで十分実用的。
  • 推論中の VRAM 使用量は 21〜22GB 程度なので、24GB VRAM でも 2〜3GB の余裕あり。

この余裕で、

  • コンテキスト長を増やす
  • バッチサイズを少し増やす

といった調整ができます。

8-5. 24GB VRAM でのモデルサイズ目安

ざっくりとした目安:

量子化 モデルサイズ 推奨度 コメント
FP16 7B 余裕あり(この記事の構成)
FP16 10B ギリギリ。コンテキスト短め前提
AWQ 32B チューニングすれば実用ライン
AWQ 70B × 24GB VRAM では基本的に厳しい

まとめと次のステップ

この記事では、以下のところまで進めました。

  • RX 7900 XTX + WSL2 + ROCm + vLLM でローカル LLM を構築
  • Qwen2.5-7B / Mistral-7B を 200〜270 tok/s で動作確認
  • WSL2 特有の amdsmi 問題を回避

次のステップとして考えていること:

  1. vLLM + OpenWebUI 連携(別記事予定)
    • WSL 上で Docker から OpenWebUI を起動
    • vLLM の OpenAI 互換エンドポイントに接続
    • ChatGPT ライクな UI でローカル LLM を使う
  2. 量子化モデルを使って 30B クラスを動かす(記事書きました!)
    • Qwen3-Coder-30B-AWQ などを RX 7900 XTX で動かす
  3. MoE モデルを使う場合の注意点まとめ(記事書きました!)
    • MoE モデルを使う場合は vLLM の実行ファイルを一部書き換える必要がある話
  4. KV キャッシュを FP8 量子化してコンテキスト長を2倍にする(記事書きました!)
    • vLLM v0.16.0 で ROCm の FP8 量子化が出来るようになった

ここまで読んでいただきありがとうございます。
同じように RX 7900 XTX + WSL2 で vLLM 動かしたい人の参考になれば嬉しいです。

質問やフィードバックがあれば、コメントで教えてください。

Discussion