VRAMに収まらない大きなAIモデルは、llama.cppの新機能で速くなる?〜RTX 5060 Ti(VRAM 16GB)でGLM-5.3-Flashを測った
自分のGPUに載らない大きなモデルを動かすとき、MoE(Mixture of Experts=混合エキスパート。入力ごとに、モデル内の一部の「専門家」だけが働く仕組み)のモデルは、専門家の重みをRAMに置き、CPUで計算させる方法が使えます。llama.cpp では、この指定が -cmoe(–cpu-moe)です。ところが2026年10月、llama.cpp に、RAMに置いた専門家のうち、よく使うものをVRAMに写して持っておく「MoEキャッシュ」(–moe-cache-mib)が入りました。VRAMの一部をキャッシュに回すと、書く速さがどれだけ変わるのかを、実機で測りました。
2026年10月28日時点の内容です。
何を測ったのか
ミニPC(EVO-X2)にOCuLinkで接続したRTX 5060 Ti(VRAM 16GB)で、GLM-5.3-Flash(MoEモデル・93GB)を -cmoe で動かし、MoEキャッシュの容量を変えながら、書く速さ [tok/s]・入力の処理時間 [ms]・VRAM使用量 [MiB] を測りました。キャッシュなしの状態を基準にして、キャッシュを付けたときとの差を見ています。
書く速さは、1秒あたりに生成するトークン数 [tok/s] です(トークンは、文章を分けた単位)。大きいほど速く書きます。
回答の質(文章の良し悪し)は、評価していません。
目的
次の3つを確かめます。1つ目は、キャッシュ容量を 2,200 / 4,400 / 6,600 / 8,800 MiB と変えると、書く速さが何 tok/s になるか。2つ目は、キャッシュに回した分だけVRAMがどれだけ増えるか。3つ目は、入力の処理時間が、キャッシュで変わるか。
方法
使ったもの
| 項目 | 内容 |
|---|---|
| 機体 | EVO-X2(ミニPC)。メインメモリは約122GiB |
| GPU | NVIDIA GeForce RTX 5060 Ti(VRAM 16GB)。OCuLink接続(PCIe Gen4 x4)。このGPU1枚だけが見える設定(CUDA_VISIBLE_DEVICES=1)で測定 |
| ソフト | llama.cpp b11946(公式配布の CUDA 12.8 版)。llama-server を使用 |
| モデル | GLM-5.3-Flash(unsloth 配布の GGUF・量子化 UD-IQ1_S・3分割で合計約93GB) |
| 起動の指定 | -ngl 99 -cmoe -fa on -c 4096 -t 16 –no-warmup。キャッシュありの場合は –moe-cache-mib に容量 [MiB] を指定 |
-cmoe は、専門家の重みをRAMに置いてCPUで計算する指定です。–moe-cache-mib は、そのうちVRAMに写しておく量 [MiB] の指定です。b11946 は、キャッシュの入れ替え方式が LRU(いちばん長く使われていないものから捨てる)から、50/50 SLRU という方式に改良された版を含みます。
モデルの重みは、10/23 公開の別条件の記事で使ったものと、合計バイト数が違いました(10/23の記事は 93,077,724,536 バイト、今回の配布元の表示は 93,087,245,088 バイトで、約9.5MBの差)。配布元で更新された可能性があります。今回の重みは、配布元が示すハッシュ値(sha256)と一致することを確かめています。
測り方
| 項目 | 設定 |
|---|---|
| 入力と出力 | 入力473トークン(毎回、先頭の文を変えて、前回の計算の再利用を避けた)・生成128トークン・temperature 0 |
| 回数 | 各6回。1回目は起動直後の状態で測るため別扱い。残り5回のうち、いちばん速い1回といちばん遅い1回を除いた3回の中央値 |
| 書く速さ [tok/s] | llama-server が返す timings の predicted_per_second |
| 入力の処理時間 [ms] | 同じく timings の prompt_ms(入力473トークンを処理する時間) |
| VRAM [MiB] | nvidia-smi の使用量の最大値(このGPUのみ) |
| 転送量の記録 | キャッシュ4,400 MiB の測定中に、nvidia-smi dmon で、GPUのPCIe受信量 [MB/s] と使用率 [%] を15回記録 |
結果
| –moe-cache-mib [MiB] | 書く速さ 中央3点の中央値 [tok/s] | 基準との比 | 1回目の書く速さ [tok/s] | 入力の処理時間 中央3点の中央値 [ms] | VRAM最大 [MiB] |
|---|---|---|---|---|---|
| なし(基準) | 17.846 | 1.00 | 17.354 | 11,128 | 8,487 |
| 2,200 | 2.774 | 約0.16 | 2.768 | 11,701 | 10,663 |
| 4,400 | 3.943 | 約0.22 | 3.953 | 11,342 | 12,863 |
| 6,600 | 4.428 | 約0.25 | 4.438 | 10,969 | 15,063 |
| 8,800 | 起動時に、GPUのメモリ(CUDA0 バッファ)を確保できず失敗(OOM)。測定できず | ||||
キャッシュなしでは、書く速さが 17.846 tok/s でした。キャッシュを付けると、2,200 MiB で 2.774 tok/s、4,400 MiB で 3.943 tok/s、6,600 MiB で 4.428 tok/s で、どれも基準より遅くなりました。キャッシュ容量を増やすほど速くなる傾向はありますが、基準の約4分の1までしか戻りませんでした。
4,400 MiB は、念のため測り直しました(3回・中央値)。結果は 3.955 tok/s で、1回目の測定と同じ水準でした。
入力の処理時間は、4条件とも約11,000 ms(約11秒)で、キャッシュの有無による差は見えませんでした。入力の処理(473トークン)は、今回の条件では、キャッシュの影響を受けていません。
VRAMは、キャッシュなしでも最大 8,487 MiB 使いました。-cmoe を指定しても、アテンション(文脈を読む層)など専門家以外の重みと、計算用のバッファはGPUに載るためと考えられます。キャッシュを付けると、VRAMは、指定した容量に近い分だけ増えました(2,200 MiB 指定で約2,180 MiB 増、4,400 MiB で約4,380 MiB 増、6,600 MiB で約6,580 MiB 増)。8,800 MiB は、8,487 MiB に加えると16GBのVRAMを超えるため、起動で失敗したと考えられます。失敗の詳しい原因は確かめていません。
考察
この条件では、なぜ遅くなったのか
原因は、今回の測定だけでは断定できません。観測できたのは次の点です。キャッシュ4,400 MiB の測定中、GPUのPCIe受信量は、15回の記録で 4,293〜7,761 MB/s でした。リンクは Gen4 x4 で、GPU使用率は 94〜100% でした。PCIe Gen4 x4 の片方向の理論上の上限は約7.9GB/s です。受信量が、この上限の近くまで上がる記録が多くありました(15回のうち 6,280 MB/s 以上が12回)。
この観測から、キャッシュに入っていない専門家をRAMからVRAMへ送る転送が、OCuLinkのリンクで頭打ちになっている可能性があります。基準(キャッシュなし)では、専門家をCPUがメモリから直接読んで計算するため、この転送は発生しません。ただし、キャッシュに入っていた割合(命中率)は、ログに出ないため確かめていません。転送が原因かどうかは、確かめていません。
もし転送の頭打ちが主な原因なら、帯域の広い接続(PCIe x16)では、差が縮むはずです。この確認は、していません。
キャッシュ容量と書く速さ
キャッシュを大きくすると、書く速さは 2.774 → 3.943 → 4.428 tok/s と上がりました。増え方は、2,200 MiB から 4,400 MiB で約1.2 tok/s、4,400 MiB から 6,600 MiB で約0.5 tok/s です。今回の3点だけでは、これ以上に容量を増やしたとき(8,800 MiB は失敗)どうなるかは分かりません。
VRAMの余裕
16GBのGPUでも、キャッシュなしで 8,487 MiB を使うため、キャッシュに回せる量は、今回の条件では 6,600 MiB(VRAM最大 15,063 MiB)までが、今回成功を確認できた最大でした(間の値は測っていません)。VRAMが小さいGPUでは、回せる量はさらに小さくなります。
今回の測定で確かめていないこと
次のことは、今回確かめていません。
接続は、OCuLink(PCIe Gen4 x4)だけです。PCIe x16 で直接挿した機体での結果は、ありません。
モデルは、GLM-5.3-Flash の UD-IQ1_S(約1.56ビットの量子化)だけです。ほかのMoEモデルや、ほかの量子化では測っていません。量子化が小さいことが結果に影響したかどうかは、切り分けていません。
GPUは、RTX 5060 Ti だけです。同じ機体のRTX 3060(VRAM 12GB)や、内蔵GPUでの挙動は、測っていません。
キャッシュの命中率は、確かめていません。キャッシュ8,800 MiB の起動失敗は、ログの末尾(メモリ確保の失敗)を見ただけで、原因の詳細は調べていません。
入力は473トークン・出力は128トークンの1種類です。長い入力や、長い出力での挙動は、測っていません。回答の質は、評価していません。
まとめ
| 見たこと | 結果(RTX 5060 Ti 16GB・OCuLink・GLM-5.3-Flash UD-IQ1_S・-cmoe) |
|---|---|
| 書く速さ [tok/s] | キャッシュなし 17.846 / 2,200 MiB 2.774 / 4,400 MiB 3.943 / 6,600 MiB 4.428 |
| 入力の処理時間 [ms] | 約11,000 ms。キャッシュの有無で差は見えない |
| VRAM最大 [MiB] | キャッシュなし 8,487 / 2,200 MiB 10,663 / 4,400 MiB 12,863 / 6,600 MiB 15,063。8,800 MiB は起動失敗 |
| 転送の観測(4,400 MiB) | PCIe受信 4,293〜7,761 MB/s・Gen4 x4・GPU使用率 94〜100%。転送で頭打ちの可能性(命中率は未確認) |
この条件では、MoEキャッシュを付けると、書く速さは、キャッシュなしの約0.16〜0.25倍に下がりました。入力の処理時間は変わらず、VRAMは、指定した量に近い分(約2,180〜6,580 MiB)増えました。
自分の機体で試すときは
今回の数字から言えるのは、この条件についてだけです。キャッシュを付けると何が上がり、何の制約が付くかを、次の表に並べます。
| 見たいこと | 今回の結果 |
|---|---|
| 書く速さ | この条件では、付けた分だけ下がった(17.846 → 2.774〜4.428 tok/s)。容量が大きいほど下がり方は小さい |
| 入力の処理時間 | 変化なし(約11,000 ms) |
| VRAM | 指定した容量ぶん増える。キャッシュなしでも8,487 MiB使う |
| 接続の帯域 | PCIe Gen4 x4 では、受信量が上限近くまで上がった。x16 の機体は未測定 |
自分の機体で試す場合は、キャッシュなしの -cmoe で一度測り、そのうえで –moe-cache-mib を足して、同じ入力で書く速さを比べると、差を確かめられます。機体の接続(x4 か x16 か)やモデルが違えば、結果が逆になる可能性があります。
参考: 提案者の報告値(本編の表とは別条件・私は再現していません)
この機能の提案(llama.cpp の Pull Request #29887)には、提案者が報告した速度があります。条件が本編と違うため、本編の表の値とは並べず、私が再現した値でもありません。
| 項目 | 提案者の報告 | 本編との違い |
|---|---|---|
| GPU | RTX 4090 と RTX 5090 | 本編は RTX 5060 Ti(VRAM 16GB) |
| 接続 | PCIe 4.0 x16 | 本編は OCuLink(PCIe Gen4 x4) |
| モデル | Qwen3.8-Flash-Next(Q4_0) | 本編は GLM-5.3-Flash(UD-IQ1_S) |
| 書く速さ | 25.0 → 39.4 tok/s(約1.57倍・4090・キャッシュ6.4GB)/30.8 → 54.5 tok/s(約1.77倍・5090) | 本編は、キャッシュありで下がった |
この値は、PRに書かれた数字を、そのまま写したものです。条件がこれだけ違うため、本編の結果と食い違っているとは言えません。