LLM TUNING LOG · 2026-09-29

同じ GPU のまま、
taskboard の AutoDev LG による
自動生成が 25 分速くなった。

AutoDev LG のローカル LLM を、アプリ作りの中身には手を付けずに「速さ」だけ詰めました。モデルごとに、何を変えて、どれだけ速くなったかの記録です。

79→54 分
taskboard 完走時間(loop67 → loop68、−32%)
+56%
Flash-Next の生成速度(4 万トークンの長文脈)
約 2.8 倍
27B の生成速度(24.4 → 68.3 tok/s)
33→約 29 秒
gemma のモデル読み込み時間

01使った道具

今回の変更は、どれも「答えの中身は変えずに、出てくるまでの時間を縮める」ものです。

MTP(投機的デコード)
小さな「下書き役」が次の数トークンを先読みし、本体のモデルがまとめて答え合わせする仕組み。本体が確認するので出力は変わらず、当たれば一気に進みます。
先読み数(draft_n_max)
下書き役が何トークン先まで予想するか。多いほど当たったときの得は大きく、外れる率も上がります。
バッチサイズ(ubatch)
長い指示文(プロンプト)を一度にどれだけの塊で読み込むか。
読み込み方式(load_mode)
モデルファイルを GPU に載せるときの読み方。既定の「mmap」をやめて、まっすぐ読み込む「none」を試しました。
CPU への一部退避(--n-cpu-moe 2)
Flash-Next の最初の 2 層の一部をメインメモリに置き、空いた GPU に下書き役を載せます。

02モデルごとの設定

AutoDev LG では 4 つのモデルが役割を分けて働いています。それぞれ採用した設定と、試したけれど見送った設定です。

モデル主な役割採用した設定見送り
Flash-Nextリーダー/コーディングMTP(先読み 2 → 4)、ubatch 256 → 512、CPU へ一部退避、MTP 対応の llama.cpp(Unsloth 版)に切り替えスレッド数変更、読み込み方式(効果なし)
27Bテストコード作成MTP(先読み 3 → 6)、読み込み方式 noneubatch 512(効果なし)
gemmaレビュー(受け入れテスト・仕様の監査)MTP(先読み 4、専用の下書きモデル)、ubatch 256 → 512、読み込み方式 none先読み数の変更
gpt-oss予備変更なし(MTP 用の層を持たないモデル)—

03生成速度:MTP を入れたとき

同じリクエストを MTP なし/ありで投げ比べた結果です(tok/s は 1 秒あたりに出せるトークン数、大きいほど速い)。

モデル条件MTP なしMTP あり先読みの当たり率
Flash-Next4 万トークンの長文脈20.331.7(+56%)約 0.71
Flash-Next短いプロンプト28.540〜450.76〜0.93
27B短いプロンプト 2 種29.4 / 29.056〜710.74 / 0.92
gemma短いプロンプト 2 種33.6 / 30.652.2 / 62.20.56 / 0.75

どのモデルも、指定した形式(JSON)の答えは MTP ありでも崩れませんでした。27B と gemma の MTP は 9/28 の v141、Flash-Next は 9/29 の v142 で採用。

04さらに詰める:本番のリクエストで総当たり

MTP 入りの構成で走った loop68(PASS)の実際のリクエストを録っておき、それを再生して設定を 1 つずつ変えて測りました(v143)。

モデル変えた設定生成 tok/sプロンプト読み込み tok/s全体の所要時間
Flash-Next先読み 2→4、ubatch 256→51241.0 → 49.5247 → 330599 → 464 秒
27B先読み 3→658.3 → 70.6約 1205 → 約 1175151 → 135 秒
gemmaubatch 256→51263.9 → 52.21023 → 136133 → 29 秒

gemma は生成速度こそ下がりましたが、長い指示文を読む時間が縮んだぶん、全体では速くなったので採用しました。

そして本番の run(loop68 → loop69)でも、ほぼ同じ伸びが確認できました。

モデル項目loop68(v142)loop69(v143)
Flash-Next生成40.9 tok/s49.8 tok/s
Flash-Nextプロンプト読み込み281 tok/s366 tok/s
27B生成57.0 tok/s68.3 tok/s

05モデルの読み込み時間

AutoDev LG は役割ごとにモデルを入れ替えるので、そのたびに数十 GB のファイルを読み込みます。loop68 では約 54 分のうち 187 秒がモデルの読み込みでした。大きなモデルは PC のメモリに収まりきらず、ディスクから読む速さが効いてきます。

モデルファイルの大きさ既定(mmap)none結果
gemma50 GB58.9 / 35.0 秒28.0 / 29.1 秒採用
27B—7.1 / 22.1 秒6.1 / 6.1 秒採用
Flash-Next95 GB54.0 / 49.3 秒52.9 / 62.1 秒見送り(差なし)
gpt-oss60 GB変更なし

各 2 回ずつ交互に計測。本番の loop69 では gemma 33 → 27〜31 秒、27B 8 → 5〜7 秒になりました。

06まとめと、その後

MTP を入れた最初の構成(v142)で、taskboard は 79 分 → 54 分で PASS。v143 の追い込みも、速度の目標どおりの数字が出ました。

ただし v143 の loop69 と続く loop70 は、速さとは関係のない所(テストの書き方)でつまずいて NOT PASS。それを v144・v145 で直すと、v143 の速度設定のまま走った loop71 が 約 38 分(2261 秒)で PASS。taskboard の最速記録です! この回はモデルへのリクエストが 52 回(loop68 は 81 回)と少なく、モデルの読み込みは 180 秒でした。

速くなった分、1 日に試せる回数も増える——それが今回いちばんの収穫です。

開発ログを見る → 仕組みを見る →