メインコンテンツへスキップ
見出し画像

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.safetensors
    画像

    最適化手法

    FP16/BF16からINT8への変換は、単純化すると16bitから8bitへ数値表現の桁数を減らすことです。四捨五入、切り捨て、切り上げなどの単純かつ一律なルールのみで変換すると精度が半分になってしまうため、それを防止するために画像生成モデルに適した最適化手法が考えられています。
    ConvRotも最適化の一つですが、ConvRot以外にもConvRotと組み合わせることができる最適化があります。

    手法最適化の対象目的処理時間SVD重み行列の構造重みの構造を整理する数十分ConvRot重みの分布外れ値を分散する数秒AdaRound丸め方向丸め方を最適化する数時間\begin{array} {l|l|l|l} \bf{手法} & \bf{最適化の対象} & \bf{目的} & \bf{処理時間} \\ \hline \text{SVD} & \text{重み行列の構造} & \text{重みの構造を整理する} & \text{数十分} \\ \hline \text{ConvRot} & \text{重みの分布} & \text{外れ値を分散する} & \text{数秒} \\ \hline \text{AdaRound} & \text{丸め方向} & \text{丸め方を最適化する} & \text{数時間} \\ \end{array}

    ※ 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_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
    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_save_convrot_model.jsonのワークフロー
    画像
    変換除外プリセットの一覧

    ただしこのノードで変換されるINT8 ConvRot形式は、ComfyUIネイティブノードと互換性がありません(ComfyUI側が後方互換のためにメタデータで特別な識別子を使用しているため)。ComfyUIネイティブノードで利用する場合は、convert_to_comfy.pyというツールで変換が必要です。

    ちなみにAnima, Z-Image, LTX2等のプリセットで全blockのadaln層を除外しているなど、他ツールと比べて変換から除外する層が多く、変換後のファイルサイズが他ツールよりも大きく生成速度も劣ります。手動による除外設定もできないため、変換ツールとして扱いづらい部分があります。

            elif model_type == "anima":
                Int8TensorwiseOps.excluded_names = [
                    'embed', 'llm', 'adaln',
                ]

    ④ Haoming02/sd-forge-compressor

    Forge Neoの開発者であるHaoming02氏が開発した変換ツールで、Forge Neoの拡張機能として動作します。

    画像
    sd-forge-compressorのUI

    まだ開発途中・実験段階とのことで、パラメータ設定はなくツール規定設定での変換しかできません。しかし基本的な除外キーワードがハードコードされているため、このツールで変換したモデルでも大きな問題はなく利用できます。


    2026/7/17追記:
    2026/7/15の更新でconvrot_w4a4 (INT4 ConvRot) への変換機能が追加されました。

    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形式への変換に対応しています。

    画像
    Star Ultimate Model Converterノード
    画像
    変換の一覧
        "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 --anima
    • anima_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 --anima
    • anima-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数とファイルサイズが異なることを示したのが下表です。

    ツールモデル除外設定tensor数ファイル サイズ変換前base-6853.89GB① silveroxides/base–anima15372.17GBconvert_to_quant① silveroxides/aesthetic–anima15812.10GBconvert_to_quant① silveroxides/aesthetic–anima15372.17GBconvert_to_quant –exclude-layers② Comfy-Org/base既定15812.10GBcomfy-model-tools② Comfy-Org/base–exclude15372.17GBcomfy-model-tools③ BobJohnson24/baseanima12472.26GBComfyUI-INT8-Fast④ Haoming02/base既定15872.09GBsd-forge-compressor\begin{array} {l|c|c|c|c} \bf{ツール} & \bf{モデル} & \bf{除外設定} & \bf{tensor数} & \bf{ファイル} \\ & & & & \bf{サイズ} \\ \hline \text{変換前} & \text{base} & \text{-} & \text{685} & \text{3.89GB} \\ \\ \hline \text{① silveroxides/} & \text{base} & \text{--anima} & \text{1537} & \text{2.17GB} \\ \text{convert\_to\_quant} \\ \hline \text{① silveroxides/} & \text{aesthetic} & \text{--anima} & \text{1581} & \text{2.10GB} \\ \text{convert\_to\_quant} \\ \hline \text{① silveroxides/} & \text{aesthetic} & \text{--anima} & \text{1537} & \text{2.17GB} \\ \text{convert\_to\_quant} & & \text{--exclude-layers} \\ \hline \text{② Comfy-Org/} & \text{base} & \text{既定} & \text{1581} & \text{2.10GB} \\ \text{comfy-model-tools} \\ \hline \text{② Comfy-Org/} & \text{base} & \text{--exclude} & \text{1537} & \text{2.17GB} \\ \text{comfy-model-tools} \\ \hline \text{③ BobJohnson24/} & \text{base} & \text{anima} & \text{1247} & \text{2.26GB} \\ \text{ComfyUI-INT8-Fast} \\ \hline \text{④ Haoming02/} & \text{base} & \text{既定} & \text{1587} & \text{2.09GB} \\ \text{sd-forge-compressor} \\ \end{array}

    前述したとおりBobJohnson24/ComfyUI-INT8-Fastのanimaプリセットは、全blockのadaln層を除外しているため他のツールより除外層が多く、変換後のファイルサイズが大きくなっていることが分かります。

    画像生成の時間はファイルサイズに比例して少し長くなりますが、推論精度、つまり生成される画像はそれほど変化しないはずです。この中ではtensor数が1537になるよう変換するのが最適な気がします。


    2026/7/17追記:
    ファイルサイズがもっとも大きい ③BobJohnson24/ComfyUI-INT8-Fast で変換したものが他よりも0.1秒ほど生成時間が短くなったため、画像生成時間とファイルサイズに比例関係はないようです。層によって内部処理が異なるため、INT8に変換せずBF16のままとしたほうが処理が速い層があるのだと思います。
    生成画像は少し変化しますが、優劣と言えるような差は無いように感じました。ただしモデルによっても結果が異なると思われ、本記事では生成画像の差異について大した検証はしていないため、言及しないことにします。

    まとめ

    任意のモデルをINT8 ConvRot形式に変換するツールについて解説しました。INT8 ConvRot形式へ変換する場合の参考になれば幸いです。

    このような感じで、技術的な内容を分かりやすく基本無料で解説しています。「スキ」「フォロー」「チップ」で応援よろしくお願いします。質問がありましたら遠慮なく「質問箱」へどうぞ。

    関連記事


    本記事の文章・画像等の無断転載・複製・改変・盗用を禁じます。
    発見した場合は黙認せず対応します。これらの行為を発見された方は、相手ではなく私までお知らせください。

    あなたへのおすすめ