要点だけまとめると、DiffusionGemma GGUFは普通のGGUFモデルとして扱うと詰まる、というのが最大のポイントです。
先に知るべきこと
DiffusionGemmaは通常のautoregressive LLMではなく、diffusion-gemma architectureのGGUFです。なので、普通のllama-cli、llama-server、LM Studio、Ollama、Unsloth Studioの通常推論経路では、モデルファイル自体が正しくても実行できないことがあります。
典型的なエラーはこれです。
unknown model architecture: 'diffusion-gemma'
llama.cpp does not support this GGUF's model architecture ('diffusion-gemma')
この場合、モデルが壊れているのではなく、runner側が未対応です。
必要なrunner
現状はDiffusionGemma対応入りのllama.cpp PR/ブランチを使い、通常のllama-cliではなく、専用の:
llama-diffusion-cli
をビルドして使うのが本筋です。
CUDAビルドの罠
GPUで使うならCUDAビルドが必要です。ただし古いCUDA Toolkitだと、最近のMSVCでビルドに失敗します。
典型例:
error STL1002: Unexpected compiler version, expected CUDA 12.4 or newer.
これはCUDAが古いという意味です。CUDA 12.4以上を使うのが安全です。
低VRAMでの現実
8GB VRAM級ではモデル全体は載りません。全部GPUに載せようとするより、部分オフロードが現実的です。
実用ラインはだいたい:
-ngl 8
--diffusion-kv-cache on
--diffusion-eb on
-ngl autoや-ngl allは一見便利ですが、低VRAM環境ではVRAM/RAMを攻めすぎて不安定になりがちです。手動で-nglを固定した方が安全です。
KV cacheはON
--diffusion-kv-cache onはかなり効きます。
OFFだと毎stepの負荷が重くなりやすいです。まずONで試すべきです。
KV cache量子化は万能ではない
通常LLM感覚で、
-ctk q8_0
-ctv q8_0
-ctk q4_0
などを入れたくなりますが、DiffusionGemmaでは必ず速くなるとは限りません。特にV cache量子化はFlash Attention絡みで失敗・低速化する可能性があります。まずはデフォルトKV型でよいです。
-nの意味が普通と違う
DiffusionGemmaでは-nは普通の「最大生成token数」として体感しにくいです。
内部では固定長canvasをブロック単位でdenoiseします。
今回のモデルでは:
canvas_length = 256
-n 1 -> 1ブロック
-n 512 -> 2ブロック
-n 1024 -> 4ブロック
短い回答なら-n 1で十分。
献立や計画のような長めの回答は-n 512が必要です。
step数と品質
--diffusion-eb-max-stepsが実用上かなり重要です。
16 steps: 速いが崩れやすい
32 steps: 遅いがだいぶ読める
--diffusion-stepsだけ下げても、EB modeでは--diffusion-eb-max-steps側が効いている場合があります。両方揃えるのが分かりやすいです。
--diffusion-eb-max-steps 32
--diffusion-steps 32
visual modeが面白い
DiffusionGemmaを試す価値は、普通のtoken streamingではなく、canvasがstepごとに更新されるところです。
--diffusion-visual
--diffusion-visual-progress
--diffusion-visual-interval 1
を付けると、途中で文が崩れたり整ったりする過程が見えます。
日本語プロンプトの罠
Windowsでは日本語を-pで直接渡すと文字化けすることがあります。
UTF-8のプロンプトファイルを作って:
-f prompt.txt
で渡すのが安全です。
thinking/channel問題
モデルやテンプレート次第で、出力にこういうものが混ざります。
<|channel>thought
...
<channel|>
これはチャットテンプレート/モデル形式/runner未成熟の問題です。
可能ならテンプレートにenable_thinking=falseを渡す、または表示側で<channel|>以降だけ抜くと扱いやすくなります。
ただし、観察目的なら全部見えていた方が面白いです。
反復検出の罠
runner側が反復を見つけて出力を切ることがあります。
しししし
多多多多
********
みたいな崩れを止める目的ですが、DiffusionGemmaではこれが暴発して、-n 512で2ブロック生成するはずが1ブロックで止まることがあります。
理想は:
EOG tokenなら終了
反復は表示上trimしてもよい
でも反復だけで次ブロック生成を止めない
です。
おすすめ初期設定
まず試すならこれです。
llama-diffusion-cli `
-m model.gguf `
-f prompt.txt `
-dev CUDA0 `
-ngl 8 `
-n 512 `
--fit off `
--diffusion-eb on `
--diffusion-kv-cache on `
--diffusion-eb-max-steps 32 `
--diffusion-steps 32 `
--diffusion-visual `
--diffusion-visual-progress `
--diffusion-visual-interval 1
短文なら:
-n 1
--diffusion-eb-max-steps 16
長めなら:
-n 512
--diffusion-eb-max-steps 32
最終評価
低VRAM環境では、DiffusionGemmaはまだ普通のLLMより実用的とは言いにくいです。
ただし、5 canvas-token/s相当くらいは出ることがあり、visual mode込みの「面白枠」「研究枠」「将来比較用」としてはかなり価値があります。
一発でやるなら、最初からこう考えるのが近道です。
普通のGGUF runnerではなく専用diffusion runnerが必要
CUDA 12.4以上でビルド
-nglは手動固定
KV cacheはON
-nはcanvasブロック数
品質はEB stepsで調整
日本語はUTF-8ファイル
visual modeで観察
反復停止は信用しすぎない