AutoDev LG のローカル LLM を、アプリ作りの中身には手を付けずに「速さ」だけ詰めました。モデルごとに、何を変えて、どれだけ速くなったかの記録です。
今回の変更は、どれも「答えの中身は変えずに、出てくるまでの時間を縮める」ものです。
draft_n_max)ubatch)load_mode)--n-cpu-moe 2)AutoDev LG では 4 つのモデルが役割を分けて働いています。それぞれ採用した設定と、試したけれど見送った設定です。
| モデル | 主な役割 | 採用した設定 | 見送り |
|---|---|---|---|
| Flash-Next | リーダー/コーディング | MTP(先読み 2 → 4)、ubatch 256 → 512、CPU へ一部退避、MTP 対応の llama.cpp(Unsloth 版)に切り替え | スレッド数変更、読み込み方式(効果なし) |
| 27B | テストコード作成 | MTP(先読み 3 → 6)、読み込み方式 none | ubatch 512(効果なし) |
| gemma | レビュー(受け入れテスト・仕様の監査) | MTP(先読み 4、専用の下書きモデル)、ubatch 256 → 512、読み込み方式 none | 先読み数の変更 |
| gpt-oss | 予備 | 変更なし(MTP 用の層を持たないモデル) | — |
同じリクエストを MTP なし/ありで投げ比べた結果です(tok/s は 1 秒あたりに出せるトークン数、大きいほど速い)。
| モデル | 条件 | MTP なし | MTP あり | 先読みの当たり率 |
|---|---|---|---|---|
| Flash-Next | 4 万トークンの長文脈 | 20.3 | 31.7(+56%) | 約 0.71 |
| Flash-Next | 短いプロンプト | 28.5 | 40〜45 | 0.76〜0.93 |
| 27B | 短いプロンプト 2 種 | 29.4 / 29.0 | 56〜71 | 0.74 / 0.92 |
| gemma | 短いプロンプト 2 種 | 33.6 / 30.6 | 52.2 / 62.2 | 0.56 / 0.75 |
どのモデルも、指定した形式(JSON)の答えは MTP ありでも崩れませんでした。27B と gemma の MTP は 9/28 の v141、Flash-Next は 9/29 の v142 で採用。
MTP 入りの構成で走った loop68(PASS)の実際のリクエストを録っておき、それを再生して設定を 1 つずつ変えて測りました(v143)。
| モデル | 変えた設定 | 生成 tok/s | プロンプト読み込み tok/s | 全体の所要時間 |
|---|---|---|---|---|
| Flash-Next | 先読み 2→4、ubatch 256→512 | 41.0 → 49.5 | 247 → 330 | 599 → 464 秒 |
| 27B | 先読み 3→6 | 58.3 → 70.6 | 約 1205 → 約 1175 | 151 → 135 秒 |
| gemma | ubatch 256→512 | 63.9 → 52.2 | 1023 → 1361 | 33 → 29 秒 |
gemma は生成速度こそ下がりましたが、長い指示文を読む時間が縮んだぶん、全体では速くなったので採用しました。
そして本番の run(loop68 → loop69)でも、ほぼ同じ伸びが確認できました。
| モデル | 項目 | loop68(v142) | loop69(v143) |
|---|---|---|---|
| Flash-Next | 生成 | 40.9 tok/s | 49.8 tok/s |
| Flash-Next | プロンプト読み込み | 281 tok/s | 366 tok/s |
| 27B | 生成 | 57.0 tok/s | 68.3 tok/s |
AutoDev LG は役割ごとにモデルを入れ替えるので、そのたびに数十 GB のファイルを読み込みます。loop68 では約 54 分のうち 187 秒がモデルの読み込みでした。大きなモデルは PC のメモリに収まりきらず、ディスクから読む速さが効いてきます。
| モデル | ファイルの大きさ | 既定(mmap) | none | 結果 |
|---|---|---|---|---|
| gemma | 50 GB | 58.9 / 35.0 秒 | 28.0 / 29.1 秒 | 採用 |
| 27B | — | 7.1 / 22.1 秒 | 6.1 / 6.1 秒 | 採用 |
| Flash-Next | 95 GB | 54.0 / 49.3 秒 | 52.9 / 62.1 秒 | 見送り(差なし) |
| gpt-oss | 60 GB | 変更なし | ||
各 2 回ずつ交互に計測。本番の loop69 では gemma 33 → 27〜31 秒、27B 8 → 5〜7 秒になりました。
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 日に試せる回数も増える——それが今回いちばんの収穫です。
開発ログを見る → 仕組みを見る →