普段はollamaを使用しているが、2025/8/11時点ではipex-llm版のollamaがgpt-ossに対応していないので「Vulkan API版llama-cpp-pythonを使用してA770でgpt-oss動かしたよ。ついでに780Mでも試したよ。」というお話。結論としては両方とも動いた。純粋なWindows環境のみ。
llama-cpp-pythonとは?
llama.cppのPythonラッパーで、OpenAI互換APIサーバとしての機能もある。恐らくllama.cppをそのまま内包しており最新のllama.cppの反映が早い。モデルの管理などはollamaほど統合されておらず、ggufファイルを自分で管理する必要があるが、何をしているのか理解しやすいとも言える。
(llama.cppも単体でサーバとして動作させることができるようになったが、同時に設定できるモデルは1つだけなので不便だ。)
Vulkan版llama-cpp-pythonをインストールする
pip install時にネイティブコードをコンパイルするので、Vulkanのネイティブコードが扱える環境を整えておく必要がある。
しかし、llama-cpp-pythonのドキュメントの「Vulkan」の項には『「CMAKE_ARGS="-DGGML_VULKAN=on"」せよ』としか書いていないので「少なくともCMAKEは要るんだよね」というところから始まる。オリジナルのllama.cppがmakeできる環境を構築するのが近道。
llama.cppの公式ドキュメントの「Vulkan」>「For Windows Users:」>「Git Bash MINGW64」の項に沿って環境を構築する。
- 「Git for Windows」をインストール
- 「Visual Studio Community Edition」のC++環境をインストール
- 「CMake」をインストール
- 「Vulkan SDK」をインストール
スタートメニューから「Git Bash」を起動して以下のコマンドを実行する。
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build -DGGML_VULKAN=ON
cmake --build build --config Release
これでエラーなくmakeが通ればOK。念のために動作確認をする場合、適当なggufファイルを
などからダウンロードして以下のコマンドを実行する。
bin/Release/llama-cli -m "X:\Downloads\qwen2.5-3b-instruct-q4_k_m.gguf" -c 8192 -cnv
これでネイティブコードをコンパイルする環境は構築できた。本題のllama-cpp-pythonのインストールを実施する。
私はminoforgeを使用しているので「Miniforge Prompt」を起動し、以下のコマンドでPythonの仮想環境を作成&有効化する(Pythonの環境管理は何でもよいはず)。
conda create -n llama-cpp-python-vulkan python=3.9.23
conda activate llama-cpp-python-vulkan
その場(llama-cpp-python-vulkanがactiveとなったMiniforge Prompt内)で「Git Bash」を起動する。
"C:\Program Files\Git\git-bash.exe" --cd-to-home
起動した「Git Bash」内で以下のコマンドを実行する。
export CMAKE_ARGS="-DGGML_VULKAN=on"
pip install -v llama-cpp-python[server]
最後に「Successfully」と表示されたら成功。
「Miniforge Prompt」に戻ってOpenAI互換APIのサーバとして起動してみる。
python -m llama_cpp.server --model "C:\Users\yamag\Downloads\qwen2.5-3b-instruct-q4_k_m.gguf" --n_ctx 16384
「Git Bash」で以下のコマンドを実行し呼び出してみる。
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello!"}
]
}'
それらしいレスポンスがあれば成功である。
llama-cpp-pythonをサーバとして仕立てる
目的のモデルをダウンロードする。
今回は上記から「Q8_0」と「F16」をダウンロードした。
以下のようなJSONファイルを作成する。
{
"host" : "0.0.0.0",
"port" : 18880,
"models" : [
{
"model" : "X:\\Downloads\\gpt-oss-20b-Q8_0.gguf",
"model_alias" : "gpt-oss-20b-Q8_0",
"n_gpu_layers" : -1,
"n_threads" : -1,
"n_batch" : 512,
"n_ctx" : 16384
},
{
"model" : "X:\\Downloads\\gpt-oss-20b-F16.gguf",
"model_alias" : "gpt-oss-20b-F16",
"n_gpu_layers" : -1,
"n_threads" : -1,
"n_batch" : 512,
"n_ctx" : 16384
}
]
}
以下のようなバッチファイルを作成する。環境変数「GGML_VK_VISIBLE_DEVICES」で使用するデバイスを指定できる。
chcp 65001
call C:\Users\you\miniforge3\Scripts\activate.bat
call conda activate llama-cpp-python-vulkan
REM AMD Radeon 780Mを使用する
REM set GGML_VK_VISIBLE_DEVICES=0
REM Intel Arc A770を使用する
set GGML_VK_VISIBLE_DEVICES=1
python -m llama_cpp.server --config_file "X:\llama-cpp-python-server.json"
バッチファイルを実行すればサーバが起動する。
あとは「 http://locahost:18880/v1 」をエンドポイントとして指定すればOpenAI互換APIサーバとして使用可能だ。
Open Web UIでの設定例。APIキーは適当で良し。
パフォーマンス
Open Web UIから「gpt-oss-20b-F16」を選択して『おみくじアプリを作って。Webベースで1画面。すべてを1つのhtmlファイルに記述して。』と問いかけた時の速度は以下の通り。
Intel Arc A770 16GB: 45.26 tps
AMD Radeon 780M 16GB+: 15.68 tps
思考中の文字列が画面に生で出てしまうが(Open Web UI側の対応が必要なようだ)最終的な出力内容に問題はないようだ。追ってOpenHands CLIやVS Codeのcontinueでも試してみたい。
感想
- A770はVulkan APIでも十分パフォーマンスが出る
- やはりiGPUとdGPUの差は大きい
- gpt-oss-20bはいまのところ期待したほどではない
- ollamaでA770、llama-cpp-pythonで780Mを動かせばPC1台でLLM同士の対話など試せるかも?