Buckets:
| # Quanto | |
| > [!WARNING] | |
| > Quanto バックエンドは非推奨となり、バージョン 1.0.0 で削除されます。[bitsandbytes](./bitsandbytes) や [torchao](./torchao) など、他のサポートされている [量子化バックエンド](./overview) への切り替えをご検討ください。 | |
| [Quanto](https://github.com/huggingface/optimum-quanto)は、[Optimum](https://huggingface.co/docs/optimum/en/index)向けのPyTorch量子化バックエンドです。多様性とシンプルさを念頭に設計されています: | |
| - すべての機能は eager モードで利用可能です(トレースできないモデルでも動作します) | |
| - 量子化認識トレーニングをサポート | |
| - 量子化モデルは`torch.compile`と互換性があります | |
| - 量子化モデルはデバイス非依存です(例: CUDA、XPU、MPS、CPU)。 | |
| Quantoバックエンドを使用するには、まず`optimum-quanto>=0.2.6`と`accelerate`をインストールする必要があります。 | |
| ```shell | |
| pip install optimum-quanto accelerate | |
| ``` | |
| `QuantoConfig` オブジェクトを `from_pretrained()` メソッドに渡すことで、モデルの量子化を行うことができます。Quanto ライブラリでは `nn.Conv2d` および `nn.LayerNorm` モジュールの量子化も可能ですが、現時点で Diffusers がサポートしているのは、モデルの `nn.Linear` レイヤーの重みの量子化のみです。以下のスニペットは、Quanto を用いて `float8` 量子化を適用する方法を示しています。 | |
| ```python | |
| import torch | |
| from diffusers import FluxTransformer2DModel, QuantoConfig | |
| model_id = "black-forest-labs/FLUX.1-dev" | |
| quantization_config = QuantoConfig(weights_dtype="float8") | |
| transformer = FluxTransformer2DModel.from_pretrained( | |
| model_id, | |
| subfolder="transformer", | |
| quantization_config=quantization_config, | |
| dtype=torch.bfloat16, | |
| ) | |
| pipe = FluxPipeline.from_pretrained(model_id, transformer=transformer, dtype=dtype) | |
| pipe.to("cuda") # or "mps", "xpu", "cpu" | |
| prompt = "A cat holding a sign that says hello world" | |
| image = pipe( | |
| prompt, num_inference_steps=50, guidance_scale=4.5, max_sequence_length=512 | |
| ).images[0] | |
| image.save("output.png") | |
| ``` | |
| ## 特定のモジュールでのQuantizationのスキップ | |
| `QuantoConfig` の `modules_to_not_convert` 引数を使用することで、特定のモジュールに対して量子化を適用しないようにすることができます。この引数に渡すモジュールが、`state_dict` 内のモジュールのキーと一致していることを確認してください。 | |
| ```python | |
| import torch | |
| from diffusers import FluxTransformer2DModel, QuantoConfig | |
| model_id = "black-forest-labs/FLUX.1-dev" | |
| quantization_config = QuantoConfig(weights_dtype="float8", modules_to_not_convert=["proj_out"]) | |
| transformer = FluxTransformer2DModel.from_pretrained( | |
| model_id, | |
| subfolder="transformer", | |
| quantization_config=quantization_config, | |
| dtype=torch.bfloat16, | |
| ) | |
| ``` | |
| ## Quanto Backend を使用して`from_single_file`を呼び出す | |
| `QuantoConfig` は `~FromOriginalModelMixin.from_single_file` と互換性があります。 | |
| ```python | |
| import torch | |
| from diffusers import FluxTransformer2DModel, QuantoConfig | |
| ckpt_path = "https://huggingface.co/black-forest-labs/FLUX.1-dev/blob/main/flux1-dev.safetensors" | |
| quantization_config = QuantoConfig(weights_dtype="float8") | |
| transformer = FluxTransformer2DModel.from_single_file(ckpt_path, quantization_config=quantization_config, dtype=torch.bfloat16) | |
| ``` | |
| ## 量子化モデルの保存 | |
| Diffusers は、`~ModelMixin.save_pretrained` メソッドを使用して Quanto モデルのシリアライズをサポートしています。 | |
| Quantoライブラリで直接量子化されたモデルと、Quantoをバックエンドとして使用してDiffusersで量子化されたモデルでは、シリアライズおよび読み込みの要件が異なります。現在、Quantoで直接量子化されたモデルを`~ModelMixin.from_pretrained`を使用してDiffusersに読み込むことはできません。 | |
| ```python | |
| import torch | |
| from diffusers import FluxTransformer2DModel, QuantoConfig | |
| model_id = "black-forest-labs/FLUX.1-dev" | |
| quantization_config = QuantoConfig(weights_dtype="float8") | |
| transformer = FluxTransformer2DModel.from_pretrained( | |
| model_id, | |
| subfolder="transformer", | |
| quantization_config=quantization_config, | |
| dtype=torch.bfloat16, | |
| ) | |
| # save quantized model to reuse | |
| transformer.save_pretrained("<your quantized model save path>") | |
| # you can reload your quantized model with | |
| model = FluxTransformer2DModel.from_pretrained("<your quantized model save path>") | |
| ``` | |
| ## Quantoで`torch.compile`を使用する | |
| 現在、Quantoバックエンドは、以下の量子化タイプに対して`torch.compile`をサポートしています。 | |
| - `int8`重み | |
| ```python | |
| import torch | |
| from diffusers import FluxPipeline, FluxTransformer2DModel, QuantoConfig | |
| model_id = "black-forest-labs/FLUX.1-dev" | |
| quantization_config = QuantoConfig(weights_dtype="int8") | |
| transformer = FluxTransformer2DModel.from_pretrained( | |
| model_id, | |
| subfolder="transformer", | |
| quantization_config=quantization_config, | |
| dtype=torch.bfloat16, | |
| ) | |
| transformer = torch.compile(transformer, mode="max-autotune", fullgraph=True) | |
| pipe = FluxPipeline.from_pretrained( | |
| model_id, transformer=transformer, dtype=dtype | |
| ) | |
| pipe.to("cuda") # or "mps", "xpu", "cpu" | |
| images = pipe("A cat holding a sign that says hello").images[0] | |
| images.save("flux-quanto-compile.png") | |
| ``` | |
| ## サポートされている量子化タイプ | |
| ### 重み | |
| - float8 | |
| - int8 | |
| - int4 | |
| - int2 | |
Xet Storage Details
- Size:
- 5.69 kB
- Xet hash:
- 9a70f2e443ee09c8662496ab4ba4ce2f6cac924faedf24a799dd95febb91e70f
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.