
INT8 ConvRot変換ツールの解説
INT8 ConvRot形式のモデル配布が増えてきていますが、FP16/BF16形式しか配布されていないモデルもあります。INT8 ConvRot形式への変換方法が分からないというモデル製作者さん、または変換方法にこだわってより高精度なINT8 ConvRot形式モデルを自分で作ってみたいというユーザーもいると思います。
本記事ではそのような人たちのために、INT8 ConvRot形式への変換ツールについて解説します。
2026/7/17: 「変換後モデルの概要」に追記
2026/7/17: 「④ Haoming02/sd-forge-compressor」にINT4 ConvRot対応が追加されたことを追記
2026/7/17: 「⑤ Starnodes2024/comfyui-starnodes-modelconverter」を追加(一覧表や比較への追加はしません)
2026/7/15: 各ツールの「変換除外層に関するコード」を追加
前提知識
本記事を読もうとしている時点で大丈夫だと思いますが、INT8 ConvRotについての基礎的な知識があることを前提としています。
モデル変換における重要な要素
変換元モデルの精度
適切な変換がされている前提であれば、モデル形式毎の推論精度は以下の順になります。
FP16 ≒ BF16 > INT8 ConvRot > MXFP8 > FP8 Scaled > FP8 > NVFP4
しかしINT8 ConvRotよりも推論精度の低い形式、たとえばFP8 Scaled形式からINT8 ConvRot形式に変換した場合、推論精度はFP8 Scaledよりも低くなってしまいます。
INT8 ConvRot形式に変換する場合は、変換元はINT8 ConvRot形式より精度の高いFP32/FP16/BF16形式が望ましいです。
変換を除外する層 (Layers)
AIモデルは階層構造で表すことができます。
たとえばAnima base v1.0の公式BF16モデルは、次のような
1+2+1+(6+6+2+2+2+2)×28+3+118 = 計685個
のtensorによる階層構造になっています。
Model (net)
├─ t_embedder (2個)
├─ t_embedding_norm (1個)
├─ x_embedder (1個)
├─ blocks.0
│ ├─ adaln_modulation_cross_attn (2個)
│ ├─ adaln_modulation_mlp (2個)
│ ├─ adaln_modulation_self_attn (2個)
│ ├─ cross_attn (6個)
│ ├─ mlp (2個)
│ └─ self_attn (6個)
├─ blocks.1
├─ ...
├─ blocks.27
├─ final_layer (3個)
└─ llm_adapter (118個)モデル変換において、生成画像の画質に与える影響が大きい層を変換から除外して元の精度のままとすることで、推論精度の低下を抑えることができます。当然、除外する層が増えればそれだけファイルサイズは大きくなり、画像生成の速度は遅くなります。
上のAnima base v1.0の場合、本記事で紹介するツールはいずれもblocks.0層~blocks.27層以外の層は変換から除外する設計になっています。ツールによってさらにblocks.0層やadaln層を除外するなど違いがあります。
このことが、同じINT8 ConvRot形式でもツールによって変換後の階層構成とファイルサイズ、そして生成画像が異なる要因となっています。
なお、ツールによっては除外する層を任意に設定することも可能なものもあります。
ちなみにsafetensorsの階層構造は、HuggingFace上で見ることができますし、以下のようなPythonコードで簡単に調べることができます。(実行にはPythonのsafetensorsライブラリが必要です。)
import sys
from safetensors import safe_open
def main():
if len(sys.argv) != 2:
print("Usage:")
print(f" python {sys.argv[0]} <model.safetensors>")
sys.exit(1)
model_path = sys.argv[1]
with safe_open(model_path, framework="pt") as f:
print(f"Model: {model_path}")
print(f"Number of tensors: {len(list(f.keys()))}")
print()
for key in sorted(f.keys()):
shape = tuple(f.get_tensor(key).shape)
print(f"{str(shape):20} {key}")
if __name__ == "__main__":
main()使用例
python layers.py anima-base-v1.0.safetensorsHuggingFaceでの表示例
https://huggingface.co/circlestone-labs/Anima/blob/main/split_files/diffusion_models/anima-base-v1.0.safetensors

最適化手法
FP16/BF16からINT8への変換は、単純化すると16bitから8bitへ数値表現の桁数を減らすことです。四捨五入、切り捨て、切り上げなどの単純かつ一律なルールのみで変換すると精度が半分になってしまうため、それを防止するために画像生成モデルに適した最適化手法が考えられています。
ConvRotも最適化の一つですが、ConvRot以外にもConvRotと組み合わせることができる最適化があります。
※ SVD: Singular Value Decomposition(特異値分解)
SVDやAdaRoundを使うとさらに推論精度の低下を抑えることができますが、かなり処理時間が必要です。上表の「時間」はGeForce RTX 5090でAnima base v1.0の公式BF16モデルをINT8に変換した場合の目安です。
層の除外と異なり、変換後のファイルサイズや生成速度への影響はないはずです。
モデル変換ツールの解説
主要な変換ツールと概要
下表が主要な変換ツールの一覧です。

表の上に行くほど機能が多くて使いこなすのが難しく、下に行くほど機能が少なくて使うのが簡単です。
①は変換除外層や最適化手法など多くの設定があり、もっとも精度の高い変換が可能です。しかしすべて引数での指定が必要なため、適切に指定しないと②~④以下の精度になったり、ComfyUIで使用できない形式になったりすることもあります。
②~④は複雑な設定をしなくても、各ツールの設計にもとづく層が除外されるようになっており、初心者でも標準的な精度の変換ができるようになっています。ただし③と④は手動の設定はほとんどできず、ほぼツール任せです。
できれば①か②を、こだわりがあるなら①を使いましょう。
CLI操作が無理であれば、利用ツールに合わせて③か④を使ってください。
① silveroxides/convert_to_quant
本記事で紹介する中でもっとも高機能な変換ツールです。
様々な設定が可能な反面、画像生成モデル毎のプリセット、長い処理時間が必要なこともある最適化手法、ComfyUI互換形式など、適切な変換には適切な引数指定が必要です。
インストール手順や使い方はGitHubリポジトリのREADMEを読めば分かると思います。それすら分からないなら他のツールを使ったほうがよいです。
コマンドのヘルプ
>ctq -h
usage: ctq [-h] -i INPUT [-o OUTPUT] [--comfy_quant] [--simple] [--full_precision_matrix_mult] [--heur] [--device DEVICE]
[--verbose {DEBUG,VERBOSE,NORMAL,MINIMAL}] [--manual_seed MANUAL_SEED] [--use_speed] [--save-quant-metadata] [--verbose-pinned] [--low-memory]
Convert safetensors weights to Scaled FP8 format.
Default behavior: FP8 quantization with per-tensor scaling.
For INT8 and other experimental options, see --help-experimental.
For model-specific layer exclusions, see --help-filters.
For advanced LR tuning and early stopping, see --help-advanced.
For conversion and utility modes, see --help-modes.
Standard Options:
-h, --help show this help message and exit
-i INPUT, --input INPUT
Input safetensors file path.
-o OUTPUT, --output OUTPUT
Output safetensors file path. Auto-generated if not provided.
--comfy_quant, --comfy-quant
Use Comfy quantization method.
--simple Skip SVD optimization, use simple quantization.
--full_precision_matrix_mult, --full-precision-matrix-mult, -fpmm
Add full_precision_matrix_mult=True to .comfy_quant metadata.
--heur Skip layers with poor quantization characteristics (aspect ratio, size).
--device DEVICE Device to use for quantization (e.g., 'cpu', 'cuda'). Overrides auto-detection. Recommended with --simple for FP8/INT8.
--verbose {DEBUG,VERBOSE,NORMAL,MINIMAL}
Set verbosity: NORMAL (default), VERBOSE (increased), MINIMAL (reduced), DEBUG (all).
--manual_seed MANUAL_SEED, --manual-seed MANUAL_SEED
Set a manual seed for reproducibility. Use -1 for random.
--use_speed, --use-speed
[Prodigy] Enabled the use_speed parameter for Prodigy optimizer.
--save-quant-metadata, --save_quant_metadata
Save quantization metadata in safetensors header (under _quantization_metadata key)
--verbose-pinned, --verbose_pinned
Print per-tensor pinned memory transfer details
--low-memory, --low_memory, -lm
Use streaming tensor loading to reduce RAM usage (recommended for models >50% of available RAM)変換除外プリセットの一覧
>ctq -hf
Model-Specific Exclusion Filters
============================================================
These flags keep certain model-specific layers in high precision
(not quantized). Multiple filters can be combined.
Text Encoders:
----------------------------------------
--gemma4 Gemma4 text/multimodal model: skip audio, per_layer_input_gate, per_layer_projection, vision, multi_modal_projector
--qwen35 Qwen2.5 text/multimodal model: skip first/last layers, embeddings, visual components
--t5xxl T5-XXL text encoder: skip norms/biases, remove decoder layers
--mistral Mistral text encoder exclusions
--visual Visual encoder: skip MLP layers (down/up/gate proj)
--generic_text Generic text encoder: skip MLP layers (down/up/gate proj)
Diffusion Models (Flux-style):
----------------------------------------
--anima Anima diffusion model: keep first blocks, adaln_modulation, final/embedding layers high-precision
--lens LENS diffusion model: keep time_text_embed, img_in, norm_out, proj_out, some mod layers high-precision
--flux2 Flux.2: keep modulation/guidance/time/final layers high-precision
--distillation_large Chroma/distilled (large): keep distilled_guidance, final, img/txt_in high-precision
--distillation_small Chroma/distilled (small): keep only distilled_guidance high-precision
--nerf_large NeRF (large): keep nerf_blocks, distilled_guidance, txt_in high-precision
--nerf_small NeRF (small): keep nerf_blocks, distilled_guidance high-precision
--radiance Radiance model: keep img_in_patch, nerf_final_layer high-precision
--krea2 Krea2: keep firs, las, tml, txtfusion, last.modulation, tpro layers high-precision
--ideogram4 Ideogram4: keep embed_image_indicator, t_embedding, adaln_proj, final_layer, input_proj layers high-precision
Video Models:
----------------------------------------
--wan WAN video model: skip embeddings, encoders, head
--hunyuan Hunyuan Video 1.5: skip layernorm, attn norms, vision_in
--ltxv2 LTXv2: keep some transformer blocks high-precision and exclude vae and vocoder
Image Models:
----------------------------------------
--qwen Qwen Image: skip added norms, keep time_text_embed high-precision
--zimage Z-Image: skip cap_embedder/norms, keep x_embedder/final high-precision
--zimage_refiner Z-Image Refiner: keep context/noise refiner high-precision
--boogu Boogu: keep image_index_embedding, ref_image_patch_embedder, time_caption_embed, x_embedder high-precision変換除外層に関するコード(Animaプリセット)
https://github.com/silveroxides/convert_to_quant/blob/main/convert_to_quant/constants.py 73行目付近
ANIMA_LAYER_KEYNAMES = [
"net.blocks.0.", "net.blocks.1.adaln_modulation", "final_layer", "llm_adapter", "t_embedder", "x_embedder"
]② Comfy-Org/comfy-model-tools
Comfy-Org公式の変換ツールです。どのような設定をしてもComfyUIネイティブノード互換の形式に変換できる安心感があります。
INT8 ConvRot形式への変換には、quant_int8_convrot.pyを使います。
実行にComfyUIは不要ですが、comfy_kitchenを前提とするのでComfyUIのvenvにインストールするのが楽です。
画像生成モデル毎のプリセットや処理時間が必要な最適化手法はありませんが、変換除外層を手動設定することもできる公式らしいバランスの取れたツールだと思います。
インストール手順の例
cd ComfyUI
.\venv\Scripts\activate.bat
git clone https://github.com/Comfy-Org/comfy-model-toolsコマンドのヘルプ
>python quant_int8_convrot.py -h
usage: quant_int8_convrot.py [-h] [--dry-run] [--exclude EXCLUDE] [--include INCLUDE] [--min-gemm MIN_GEMM]
[--mseclip] [--downcast-fp32] [--warn-thresh WARN_THRESH] [--verify-report VERIFY_REPORT]
src [dst]
positional arguments:
src
dst output .safetensors; if omitted, derived from SRC by replacing bf16/fp16/fp32 with
int8_convrot (or appending _int8_convrot)
options:
-h, --help show this help message and exit
--dry-run report the plan, write nothing
--exclude EXCLUDE regex; matching layers are FORCED to passthrough
--include INCLUDE regex; matching eligible layers are FORCED to quantize
--min-gemm MIN_GEMM skip a layer if min(N,K) < this (default 256: a GEMM whose small side is under ~256 never
beats bf16 at any M, so int8 is pure overhead). --min-gemm 0 disables.
--mseclip MSE-optimal clip instead of absmax (~2-3% lower weight error, but a proxy — validate output
before trusting it)
--downcast-fp32 downcast stray fp32 passthrough linears to compute dtype
--warn-thresh WARN_THRESH
warn on any quantized layer whose relerr% exceeds this (default 2.0)
--verify-report VERIFY_REPORT
write the full per-lay変換除外層に関するコード(既定)
https://github.com/Comfy-Org/comfy-model-tools/blob/main/quant_int8_convrot.py 89行目付近
EXCLUDE_SEG = re.compile(
r"scale_shift|rope|rotary|rel_pos|pos_?embed|embedder|"
r"gate_logits|router|routing|logit|temperature|"
r"(?:^|_)time|temb|t_emb|guidance|register|refiner_blocks|adapter|"
r"(?:^|_)(?:final|head|proj_out|out_layer)(?:_|$)")③ BobJohnson24/ComfyUI-INT8-Fast
INT8 ConvRotが注目されるきっかけとなったComfyUIのカスタムノードです。モデル変換だけでなくComfyUIでINT8形式のモデルを活用するための各種ノードが含まれます。
例えばFP16/BF16形式のモデルをINT8 ConvRot形式に変換してファイル保存せず、オンザフライで利用することも可能です。
ファイル保存する場合は、int8_save_convrot_model.jsonというワークフローを使います。


ただしこのノードで変換されるINT8 ConvRot形式は、ComfyUIネイティブノードと互換性がありません(ComfyUI側が後方互換のためにメタデータで特別な識別子を使用しているため)。ComfyUIネイティブノードで利用する場合は、convert_to_comfy.pyというツールで変換が必要です。
ちなみにAnima, Z-Image, LTX2等のプリセットで全blockのadaln層を除外しているなど、他ツールと比べて変換から除外する層が多く、変換後のファイルサイズが他ツールよりも大きく生成速度も劣ります。手動による除外設定もできないため、変換ツールとして扱いづらい部分があります。
変換除外層に関するコード(Animaプリセット)
https://github.com/BobJohnson24/ComfyUI-INT8-Fast/blob/main/int8_unet_loader.py 126行目付近
elif model_type == "anima":
Int8TensorwiseOps.excluded_names = [
'embed', 'llm', 'adaln',
]④ Haoming02/sd-forge-compressor
Forge Neoの開発者であるHaoming02氏が開発した変換ツールで、Forge Neoの拡張機能として動作します。

まだ開発途中・実験段階とのことで、パラメータ設定はなくツール規定設定での変換しかできません。しかし基本的な除外キーワードがハードコードされているため、このツールで変換したモデルでも大きな問題はなく利用できます。
2026/7/17追記:
2026/7/15の更新でconvrot_w4a4 (INT4 ConvRot) への変換機能が追加されました。
変換除外層に関するコード(既定)
https://github.com/Haoming02/sd-forge-compressor/blob/main/lib_compressor/quant/quant.py 24行目付近
EXCL: Final[tuple[str]] = (
"embed",
"bias",
"norm",
"scale",
"llm",
"adaln",
"first_stage_model",
"cond_stage_model",
"vae",
"text",
"time",
)⑤ Starnodes2024/comfyui-starnodes-modelconverter
ComfyUI用カスタムノードです。ただしBobJohnson24/ComfyUI-INT8-Fastのようなオンザフライでの利用はできず、ファイルへの変換しかできません。
なお、INT4 ConvRot形式への変換に対応しています。


変換除外層に関するコード(Animaプリセット)
https://github.com/Starnodes2024/comfyui-starnodes-modelconverter/blob/main/models.json 13行目付近
"Anima": {
"_note": "Anima (Cosmos-based) requires the 'llm_adapter' keys, biases, and normalizations to remain unquantized to prevent color banding and generation artifacts.",
"blacklist": ["bias", "norm", "scale", "llm_adapter", "final_layer", "proj_out", "x_embedder", "t_embedder", "context_embedder"],
"fp8_layers": [],
"preserve_extended_metadata": false
},(参考)引数・パラメータの比較
下表は各ツールの引数とパラメータの比較表です。
silveroxides/convert_to_quant はこれ以外にも多くの引数があり、書ききれません。
可能な範囲でドキュメントやソースコードを確認して、自分用に簡易的に作成したものであるため見づらい部分があります。間違っている可能性があり、またツールのバージョンアップで変更されることもあるため参考程度にしてください。

Animaでの使用例
Anima公式のBF16形式モデルを、silveroxides/convert_to_quantとComfy-Org/comfy-model-toolsを使ってINT8 ConvRot形式に変換する例を示します。
① silveroxides/convert_to_quant
anima-base-v1.0.safetensors用(変換時間:十数秒)
SVD optimization、AdaRoundは使用せずに1分以内で変換できるように指定したものです。
ctq -i anima-base-v1.0.safetensors -o anima-base-v1.0_int8.safetensors --int8 --scaling_mode row --simple --convrot --convrot-group-size 64 --comfy_quant --save-quant-metadata --animaanima_aestheticV10.safetensors用(変換時間:十数秒)
anima_aestheticV10ではモデル階層のキー名称が "net" から "model.diffusion_model” に変更されており、"--anima" プリセットのうち "net.blocks.0.|net.blocks.1.adaln_modulation” が効かなくなっています。
そのため ”--exclude-layers” で追加設定したものです。
ctq -i anima_aestheticV10.safetensors -o anima_aestheticV10_int8.safetensors --int8 --scaling_mode row --simple --convrot --convrot-group-size 64 --comfy_quant --save-quant-metadata --anima --exclude-layers "blocks\.0\.|blocks\.1\.adaln_modulation"anima-base-v1.0.safetensors用(変換時間:数十分)
SVD optimizationを使用するよう ”--simple" を外したものです。
ctq -i anima-base-v1.0.safetensors -o anima-base-v1.0_int8.safetensors --int8 --scaling_mode row --convrot --convrot-group-size 64 --comfy_quant --save-quant-metadata --animaanima-base-v1.0.safetensors用(変換時間:数時間~)
さらにAdaRoundを使用するよう ”--scale-optimization dualround" を追加したものです。
ctq -i anima-base-v1.0.safetensors -o anima-base-v1.0_int8.safetensors --int8 --scaling_mode row --convrot --convrot-group-size 64 --comfy_quant --save-quant-metadata --anima --scale-optimization dualround② Comfy-Org/comfy-model-tools
既定(変換時間:数秒)
absmaxの代わりにMSE-Optimal clipを使用するよう "--mseclip" を指定したものです。何も指定しないより少しだけ精度が良くなるはずです。
python quant_int8_convrot.py anima-base-v1.0.safetensors anima-base-v1.0_int8.safetensors --mseclip除外層追加(変換時間:数秒)
silveroxides/convert_to_quantの "--anima" プリセットと同等になるよう、”--exclude” で除外層を追加したものです。さらに少しだけ精度が良くなるはずです。
python quant_int8_convrot.py anima-base-v1.0.safetensors anima-base-v1.0_int8.safetensors --mseclip --exclude "blocks\.0\.|blocks\.1\.adaln_modulation" 変換後モデルの概要
前述したとおりAnima base v1.0の公式BF16モデルのtensor数は合計685個ですが、変換によってtensorが追加されます。
ツール既定の設定、また使用例で示したような引数によって変換から除外する層が異なることにより、INT8 ConvRot形式に変換後のモデルのtensor数とファイルサイズが異なることを示したのが下表です。
前述したとおりBobJohnson24/ComfyUI-INT8-Fastのanimaプリセットは、全blockのadaln層を除外しているため他のツールより除外層が多く、変換後のファイルサイズが大きくなっていることが分かります。
画像生成の時間はファイルサイズに比例して少し長くなりますが、推論精度、つまり生成される画像はそれほど変化しないはずです。この中ではtensor数が1537になるよう変換するのが最適な気がします。
2026/7/17追記:
ファイルサイズがもっとも大きい ③BobJohnson24/ComfyUI-INT8-Fast で変換したものが他よりも0.1秒ほど生成時間が短くなったため、画像生成時間とファイルサイズに比例関係はないようです。層によって内部処理が異なるため、INT8に変換せずBF16のままとしたほうが処理が速い層があるのだと思います。
生成画像は少し変化しますが、優劣と言えるような差は無いように感じました。ただしモデルによっても結果が異なると思われ、本記事では生成画像の差異について大した検証はしていないため、言及しないことにします。
まとめ
任意のモデルをINT8 ConvRot形式に変換するツールについて解説しました。INT8 ConvRot形式へ変換する場合の参考になれば幸いです。
このような感じで、技術的な内容を分かりやすく基本無料で解説しています。「スキ」「フォロー」「チップ」で応援よろしくお願いします。質問がありましたら遠慮なく「質問箱」へどうぞ。
関連記事
本記事の文章・画像等の無断転載・複製・改変・盗用を禁じます。
発見した場合は黙認せず対応します。これらの行為を発見された方は、相手ではなく私までお知らせください。