llama.cpp v1.0公開 推測デコードでRTX 3090が最大55%速く

並んで立つ2頭のラマ AI

手元のPCでLLM(Large Language Model、大規模言語モデル)を動かすときによく使われる llama.cpp が、11月13日に v1.0.0 になりました。これまでは b12359 のような通し番号のビルドを出すだけでしたが、今後はライブラリの C API に互換性のない変更を入れるとき、メジャー番号を上げます。速さも変わりました。RTX 3090 での検証では、1件ずつ生成する速さは前と同じです。推測デコードを使ったときは最大55%、4件を同時に処理したときは合計で22%速くなっています。ただ、消えたオプションやサーバーの認証の決まりなど、そのまま上げると起動しなくなる変更もあります。

背景と文脈

llama.cpp は、Georgi Gerganov さんが2023年に始めた C/C++ のプログラムです。大きな GPU がない PC でも LLM を動かせるようにしたもので、モデルは GGUF(llama.cpp で使うモデルファイルの形式)で読みこみます。Ollama や LM Studio のように、裏で llama.cpp を動かしているアプリも少なくありません。

これまでの llama.cpp には、決まったバージョン番号がありませんでした。変更が入るたびに b7864、b12199 といった番号のビルドが出て、使う側はその番号を追いかけていました。ggml-org のチームが Hugging Face のブログに出したllama.cpp v1.0.0 のお知らせによると、公開から約3年半たち、ライブラリの関数を直接呼ぶアプリが増えたため、API を安定させることにしたそうです。

新しい番号の付け方は semver(セマンティック バージョニング。互換性を壊すとき、機能を足すとき、不具合を直すときで、上げる桁を変える決まり)です。お知らせに載っている決まりは次のとおりです。

上げる桁 上げるとき
メジャー(1.x.x の 1) include フォルダの C API に互換性のない変更を入れたとき
マイナー 互換性を保ったままの機能追加、モデルの対応、GPU などの対応の更新
パッチ API が変わらない不具合の修正

この決まりで守られるのは、ライブラリの C API だけです。コマンドのオプションやサーバーの HTTP API も同じように守るとは、お知らせには書かれていません。実際、v1.0.0 でも --defrag-thold というオプションがなくなりました。通し番号もなくならず、v1.0.0 はビルド b12359 にあたります。

技術/ビジネス面

黒い車のそばに立つ人
Photo by Brandon Paul on Unsplash

速くなったのは、NVIDIA の GPU 向けの新しい計算の仕組みが入ったからです。推測デコード(speculative decoding。先に何トークンか下書きを作り、本体のモデルでまとめて確かめて、合っていた分を一度に採用する方法)では、本体のモデルが2〜24トークンをまとめて計算する場面が多くなります。これまでの計算方法は、この中途半端な数に向いていませんでした。PR #31533「CUDA: few-row MMQ for BS 2-24」で入った方法は、重みを1回だけ読み、確かめるトークン全部に使い回します。

PR によると、対象は Ampere 世代(RTX 30 シリーズ)以降の NVIDIA の GPU です。量子化(モデルの数値を4ビットなどに丸めて小さくすること)の形式も、Q4_K や Q8_0 など8種類に限られます。PR の作者が Qwen3.8-27B と推測デコードで、プログラミングの会話80件を使って測った結果がこちらです。

GPU 前(トークン/秒) PR 後 差
RTX 3090 Ti 57.58 77.70 +34.9%
RTX 5090 141.50 170.67 +20.6%
RTX PRO 6000 Max-Q 122.77 143.31 +16.7%
DGX Spark 32.75 36.05 +10.1%

古い世代の GPU ほど伸びています。80件すべての会話で前より速く、出てくる文章の正確さの指標もほとんど変わっていません。

速さ以外の変更もあります。KV キャッシュ(それまでの会話の計算結果を覚えておくメモリ)を FP8 という8ビットの形で持てるようになりました。MoE(入力ごとに一部の専門家の層だけを動かすモデル)の専門家の層をメインメモリに置いておくキャッシュや、読み上げ用の /v1/audio/speech も入っています。

開発者として試すなら

homebrewserver.club のllama.cpp v1.0 の検証記事が、RTX 3090(24GB)の Linux の PC で、上げる前のビルド12199と v1.0.0 を Docker で比べています。モデルは Qwen3.5 の 9B と 27B(Q4_K_M)で、5回測った真ん中の値です。

条件 前(トークン/秒) v1.0 差
27B、1件ずつ 39.2 38.7 -1.3%
27B、4件同時(合計) 95.6 116.4 +22%
9B、4件同時(合計) 277.7 316.8 +14%
27B、MTP あり、短い質問 45.1 68.5 +52%
27B、MTP あり、長い質問 46.5 71.9 +55%
9B、MTP あり、短い質問 96.5 122.3 +27%
9B、CPU だけ 6.7 6.7 同じ

1件ずつふつうに使うだけなら、上げても速さは変わりません。速くなるのは、何人かが同時につなぐサーバーとして使うときと、推測デコードを使うときです。9B の MTP は、前のビルドでは推測デコードなし(121.8)より遅くなっていました。v1.0 で 122.3 になり、やっと並んだところです。小さいモデルでは、推測デコードを入れてもあまり得をしません。

MTP(Multi-Token Prediction。モデル自身が持っている、次の数トークンを予想する部品)を使う推測デコードは、MTP の部品が入った GGUF を用意して、次のように起動します。検証記事で使われたコマンドです。

llama-server -m Qwen3.5-27B-MTP-Q4_K_M.gguf -c 32768 -np 1 \
  --spec-type draft-mtp --spec-draft-n-max 6

検証記事によると、Docker なら ghcr.io/ggml-org/llama.cpp:server-cuda-v1.0.0-b12359-b1b770d のように版を固定したイメージもあります。llama-server --version で、今のビルド番号を確かめられます。

上げる前に、起動の設定を見直しておくと止まらずに済みます。起動スクリプトに --defrag-thold が残っていたら消してください。llama-server を 127.0.0.1 以外で待ち受けさせて、ツールや MCP(Model Context Protocol。AI に外部の道具をつなぐための決まり)を有効にしている場合は、--api-key で鍵を設定します。llama-server の説明書では、鍵なしで動かすための --allow-unauthenticated-tools は、信頼できるネットワークの中だけで使うものとされています。

画像の URL が社内のアドレスを指している場合も、初期設定では読みこまなくなりました。社内の画像サーバーを使うなら --media-allow-private-urls を付けます。Hugging Face の鍵(HF_TOKEN)は、huggingface.co 以外には送らなくなっています。

Ollama から使っている人は、すぐには速くなりません。検証記事によると、Ollama 0.40.16 に入っている llama.cpp はビルド12177で、v1.0 の変更はまだ含まれていません。

これからどうなるか

llama.cpp をライブラリとして組みこんだアプリを作る人は、メジャー番号を見るだけで、作り直しが要るかどうかがわかるようになります。これまでは、どのビルドで関数が変わったかを自分で追う必要がありました。v1.0.0 でも35個の古い関数が消え、構造体にも項目が増えています。C API を直接呼んでいる場合は、今回だけは手直しが要ります。

サーバーとして使う人には、少し事情が違います。HTTP API やオプションが semver で守られるのかどうかは、まだはっきりしていません。CI や Docker では、v1.0.0 という番号だけでなくビルド番号まで固定しておくと、急にオプションが消えて止まる事故を防げます。

社内で1台の GPU に何人かがつなぐ使い方なら、v1.0 に上げるだけで処理できる量が2割ほど増えそうです。ただしこれは RTX 3090 と 27B で測った1つの結果です。自分の GPU とモデルで、上げる前と後を同じ条件で測ってから決めてください。PR の作者は、次に MoE モデル向けの計算にも同じ仕組みを広げる予定を挙げています。

まとめ

llama.cpp v1.0.0 から、C API の互換性はメジャー番号で守られるようになりました。速さは、RTX 30 シリーズ以降の GPU で推測デコードや同時処理を使うときに上がり、1件ずつ使うだけなら変わりません。上げる前に --defrag-thold の削除と、外に公開したサーバーでのツール・MCP の鍵の設定を確かめてください。Ollama の利用者は、Ollama 側の更新を待つことになります。

参考リンク

アイキャッチ画像: Photo by Tonia Kraakman on Unsplash

タイトルとURLをコピーしました