量子化されたモデルかどうかを、落とす前に判定する

12GB のモデルをダウンロードして、動かして、自分の GPU では動かないと気づく。これを 172KB の取得で回避できます。

ヘッダーに全部書いてある

safetensors の並びは「先頭8バイト=ヘッダー長」「ヘッダー JSON」「テンソル本体」です。ヘッダー JSON にはテンソル名・型・ファイル内の位置がすべて入っているので、本体を1バイトも読まずに中身の構成が分かります。

そして ComfyUI は、量子化の設定をメタデータではなくテンソルとして書き込みます。層ごとに comfy_quant という名前の U8 テンソルがあり、中身は JSON です。

double_blocks.0.img_attn.qkv.comfy_quant{"format":"int8_tensorwise","per_row":true,"convrot":true,"convrot_groupsize":256}

テンソル名はヘッダーに載っているので「量子化されているか」はヘッダーだけで判定でき、data_offsets も載っているので、この JSON 本体だけを追加で数十バイト取得できます。

実測

2026-07-25

Hugging Face 上の実ファイルに対して HTTP Range で計測した値です。「取得」は判定に必要だった実際のバイト数です。

モデル全体取得比率型の分布判定
Comfy-Org/Qwen-Image_ComfyUI
qwen_image_distill_full_bf16.safetensors
38,968 MiB229 KB0.0006%BF16 ×1,933量子化なし
AX1Y2JP/FLUX.1-dev-INT8-ConvRot
flux1-dev-int8-convrot.safetensors
11,767 MiB172 KB0.0014%F32 ×266 / BF16 ×514 / I8 ×266 / U8 ×266int8_tensorwise + per_row + convrot
martin-rizzo/Z-Image-Turbo-INT8-ConvRot-ComfyUI
z_image_turbo_int8_convrot_bf16emixed.safetensors
5,888 MiB92 KB0.0015%F32 ×204 / BF16 ×249 / I8 ×204 / U8 ×204int8_tensorwise + convrot
martin-rizzo/Qwen3-4B-INT8-ConvRot-ComfyUI
qwen3-4b_int8_convrot_fp16emixed.safetensors
4,211 MiB102 KB0.0023%F32 ×252 / F16 ×146 / I8 ×252 / U8 ×252int8_tensorwise + convrot
dummy9996/qwen3-0.6b-4b-mxfp8-nvfp4-int8-convrot-comfyui
qwen_3_06b_base-int8cr.safetensors
717 MiB84 KB0.0111%BF16 ×114 / F32 ×196 / I8 ×196 / U8 ×196int8_tensorwise(convrot なし)

一番上は対照として置いた素の BF16 モデルです。39GB ありますが 229KB で「量子化されていない」と確定できます。

ファイル名は当てにならない

最後の行を見てください。ファイル名は int8cr、リポジトリ名にも convrot と入っているのに、中身の設定は convrot を含みません。念のため 12 層をサンプリングしましたが、すべて同じでした。

qwen_3_06b_base-int8cr{"format":"int8_tensorwise"}
flux1-dev-int8-convrot{"format":"int8_tensorwise","per_row":true,"convrot":true,"convrot_groupsize":256}

同じ層で設定が混ざることは今のところ観測していません。混ざるとすればファイル間であって、ファイル内ではないようです。いずれにせよ、名前ではなくヘッダーを見るのが確実です。

INT8 でも、全部が INT8 ではない

型の分布を見ると、I8 と U8 が必ず同数で並び、その横に BF16 や F16 が残っています。I8 が量子化された重み、U8 がその設定、F32 がスケール、そして残りは量子化されなかった層です。FLUX.1-dev の例では I8 が 266 本に対して BF16 が 514 本、つまり本数で言えば大半は元の精度のままです。

ファイル名の bf16emixed / fp16emixed はこの「残った側」の精度を指しています。ヘッダーを読めば、その表記が正しいかどうかも確認できます。

動く GPU の条件

ConvRot の INT8 経路は ComfyUI の comfy/quant_ops.py で有効・無効が決まります。読むと条件はこうです。

NVIDIA / CUDAPyTorch が cu130 以上。それ未満は警告を出して無効化されます。Turing 世代以降が対象です。
AMD / ROCmTriton 3.7 以上、かつ行列演算ユニットを持つ GPU(RDNA3 以降の WMMA、CDNA の MFMA)。RDNA1・RDNA2 は WMMA を持たず、INT8 経路に入れると GPU がハングするため除外されています。
Apple Silicon / MPS読み込みは通り、量子化アルゴリズムも登録されます(M2 Max・torch 2.13 で実測)。ただし高速化はしません。comfy-kitchen の CUDA 拡張は macOS 版に同梱されておらず、Triton も入らないため、残るのは eager バックエンドだけです。さらに PyTorch の INT8 行列積 aten::_int_mm が MPS 未実装なので、重みは float に戻してから計算されます。

Hugging Face のモデルページはこの条件を表示しません。ダウンロードしてから分かることを、ヘッダーの判定で先に潰せます。

自分のファイルで試す

このサイトのビューアに .safetensors をドロップするか、Hugging Face の URL を貼ると、型の分布・テンソル構成・メタデータをブラウザだけで表示します。ファイルはアップロードされません。

ビューアを開く

PR AI動画生成スタジオ・動かし式部

その一枚が、動き出す。

生成した画像も、お気に入りの一枚も。アップロードするだけで、AIがそっと命を吹き込みます。

無料で試してみる →Googleアカウントですぐ・無料クレジットで1本作れます

よくある質問

ダウンロードせずに量子化の有無が分かるのはなぜですか?
safetensors は「先頭8バイトのヘッダー長 → ヘッダー JSON → テンソル本体」という並びで、ヘッダー JSON にすべてのテンソル名・型・配置が入っています。ComfyUI は量子化設定をテンソルとしてファイル内に書き込むため、その名前がヘッダーに現れます。つまりヘッダーだけ読めば判定できます。
I8 のテンソルがあれば INT8 量子化ですか?
必ずしもそうとは限りません。判定の根拠にすべきは comfy_quant テンソルの有無です。実測した3本ではいずれも I8 と U8 が同数(重みとスケール)で、加えて BF16 や F16 の層が半分以上残っていました。「INT8 量子化」といっても全層が INT8 になるわけではありません。
ファイル名の bf16emixed や fp16emixed は何を意味しますか?
量子化されなかった層がどの精度で残っているかを指しています。ヘッダーの型分布を見ると裏付けが取れます。たとえば Z-Image-Turbo の bf16emixed では BF16 が 249 本残っており、Qwen3-4B の fp16emixed では F16 が 146 本でした。
ConvRot とは何ですか?
ComfyUI v0.27.0 で追加された INT8 量子化の方式です。設定に convrot_groupsize が付くことから、一定数(実測ではすべて 256)ごとに回転を掛けてから量子化する系統と読めますが、これは名称と設定値からの推測です。実装は comfy/quant_ops.py と comfy-kitchen パッケージにあります。
自分の GPU で動きますか?
高速な INT8 カーネルが使えるのは、PyTorch が cu130 以上の NVIDIA(Turing 以降)か、Triton 3.7 以上かつ行列演算ユニットを持つ AMD(RDNA3 以降、CDNA)です。Mac でも読み込み自体は通りますが、速くはなりません。
Mac で int8 モデルを読ませると実際どうなりますか?
M2 Max / torch 2.13 で実測したところ、ファイルは問題なく読めて(702 テンソル、重みは torch.int8)、量子化アルゴリズムも登録されました。ただし comfy-kitchen のバックエンドは eager だけが有効で、CUDA 拡張は macOS 版に同梱されておらず(_C.abi3.so が無い)、Triton も入りません。加えて PyTorch の INT8 行列積 aten::_int_mm が MPS 未実装のため、INT8 のまま計算する経路がありません。つまり容量は小さくなりますが、速度の利得はありません。

出典

PR 生成した画像を動かしてみたい方は、AI動画生成 「動かし式部」もどうぞ。画像1枚から動画になります。