コンテンツにスキップ

Diffusionモデル

OpenTernaryは、Diffusersのpipelineのcomponent(transformerやUNetなど)を量子化し、比較のために固定の手順で画像を生成することもできます。先にextraを入れます:

uv tool install "openternary[diffusion]" --python 3.12 --reinstall   # diffusers==0.40.0
openternary setup                                                    # 入れ直しでGPU用のビルドが消えたため

componentを量子化する

pipelineのフォルダには、model_index.json とcomponentごとのサブフォルダがあります。componentは明示して選びます:

openternary plan ./my-pipeline --component transformer
openternary quantize ./my-pipeline --component transformer --device cpu --output runs/pipe-transformer

変換するのは、判別できる2次元の線形層の重みだけです。畳み込みの重みとVAEはそのまま残ります。pipeline全体を低bitにするものではありません。出力のshardにはDiffusersの標準の名前を使うので、Diffusersでcomponentを読み込み直せます。

固定のprofileで評価する

画像の品質を判断するのは人なので、evaluate は生成を再現可能にして証拠を記録しますが、画像を「よい」と判定することはありません。手順はprofileに書きます:

diffusion-profile.json
{
  "schema_version": 1,
  "family": "diffusion",
  "name": "fixed-prompt-v1",
  "prompts": ["A red cube on a white table"],
  "seeds": [42],
  "steps": 20,
  "width": 512,
  "height": 512,
  "guidance_scale": 3.5,
  "warmup": true
}
openternary evaluate ./my-pipeline --profile diffusion-profile.json --dry-run      # profileを確認
openternary evaluate ./my-pipeline --profile diffusion-profile.json --output runs/pipe-original

量子化したcomponentに差し替えて評価するには、profileに "component": "transformer" を加え、成果物を渡します:

openternary evaluate ./my-pipeline --profile diffusion-profile.json \
    --component-artifact runs/pipe-transformer/artifacts/snapshot --output runs/pipe-ternary

差し替えるものは、今のところsafetensorsでなければなりません。

記録されるもの

evaluation.json には、プロンプト・シード・step数・解像度・pipelineのschedulerの設定と、画像ごとのハッシュ・生成時間・画素の統計が保存されます。比較のときには、これらの設定が一致するかを確認します。

結果には必ず human_review_required が付きます。画素の統計やハッシュで分かるのは画像が変わったことで、悪くなったかどうかではありません。そのため、OpenTernaryがdiffusionの結果を品質合格とすることはありません。

検証済みの範囲

32×32ピクセル・2 stepの人工のStable Diffusionのpipelineで、UNetを差し替えた変換と有限値の画像の生成を、 Windows・WSLのCPUと、Radeon RX 9070 XTのFP32・BF16で確認しています。学習済みの実際のpipelineと、画像の品質は評価していません。現在の状況を参照してください。