Buckets:
| # NVIDIA ModelOpt | |
| [NVIDIA-ModelOpt](https://github.com/NVIDIA/Model-Optimizer) — это единая библиотека передовых методов оптимизации моделей, таких как квантование, обрезка, дистилляция, спекулятивное декодирование и другие. Она сжимает модели глубокого обучения для фреймворков развертывания, таких как TensorRT-LLM или TensorRT, с целью оптимизации скорости вывода. | |
| Перед началом убедитесь, что у вас установлен nvidia_modelopt. | |
| ```bash | |
| pip install -U "nvidia_modelopt[hf]" | |
| ``` | |
| Квантуйте модель, передав `NVIDIAModelOptConfig` в [from_pretrained()](/docs/diffusers/v0.43.0/ru/api/models/overview#diffusers.ModelMixin.from_pretrained) (также можно загрузить предварительно квантованные модели). Это работает для любой модели в любой модальности, если она поддерживает загрузку с помощью [Accelerate](https://hf.co/docs/accelerate/index) и содержит слои `torch.nn.Linear`. | |
| Приведённый ниже пример квантует только веса до FP8. | |
| ```python | |
| import torch | |
| from diffusers import AutoModel, SanaPipeline, NVIDIAModelOptConfig | |
| model_id = "Efficient-Large-Model/Sana_600M_1024px_diffusers" | |
| dtype = torch.bfloat16 | |
| quantization_config = NVIDIAModelOptConfig(quant_type="FP8", quant_method="modelopt") | |
| transformer = AutoModel.from_pretrained( | |
| model_id, | |
| subfolder="transformer", | |
| quantization_config=quantization_config, | |
| dtype=dtype, | |
| ) | |
| pipe = SanaPipeline.from_pretrained( | |
| model_id, | |
| transformer=transformer, | |
| dtype=dtype, | |
| ) | |
| pipe.to("cuda") # or "mps", "xpu", "cpu" | |
| print(f"Pipeline memory usage: {torch.cuda.max_memory_reserved() / 1024**3:.3f} GB") | |
| 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") | |
| ``` | |
| > **Примечание:** | |
| > | |
| > Методы квантования в NVIDIA-ModelOpt разработаны для снижения объёма памяти, занимаемой весами модели, с использованием различных техник QAT (Quantization-Aware Training) и PTQ (Post-Training Quantization) при сохранении производительности модели. Однако фактический прирост производительности на этапе инференса зависит от фреймворка развёртывания (например, TRT-LLM, TensorRT) и конкретной аппаратной конфигурации. | |
| > | |
| > Подробнее можно узнать [здесь](https://github.com/NVIDIA/Model-Optimizer/tree/main/examples). | |
| ## NVIDIAModelOptConfig | |
| Класс `NVIDIAModelOptConfig` принимает три параметра: | |
| - `quant_type`: строковое значение, указывающее один из следующих типов квантования. | |
| - `modules_to_not_convert`: список полных или частичных имён модулей, для которых не следует выполнять квантование. Например, чтобы не выполнять квантование блоков проекции pos_embed модели [SD3Transformer2DModel](/docs/diffusers/v0.43.0/ru/api/models/sd3_transformer2d#diffusers.SD3Transformer2DModel), нужно указать: `modules_to_not_convert=["pos_embed.proj.weight"]`. | |
| - `disable_conv_quantization`: логическое значение, которое при установке в `True` отключает квантование для всех свёрточных слоёв в модели. Это полезно, так как квантование по каналам и блокам, как правило, плохо работает со свёрточными слоями (используется с INT4, NF4, NVFP4). Если вы хотите отключить квантование для конкретных свёрточных слоёв, используйте вместо этого `modules_to_not_convert`. | |
| - `algorithm`: Алгоритм, используемый для определения масштаба, по умолчанию `"max"`. Дополнительные сведения об алгоритмах и деталях см. в документации modelopt. | |
| - `forward_loop`: функция прямого прохода, используемая для калибровки активаций при квантовании. Если не задана, используются статические значения масштаба, вычисленные только на основе весов. | |
| - `kwargs`: словарь именованных аргументов, передаваемых в базовый метод квантования, который будет вызван в зависимости от `quant_type`. | |
| ## Поддерживаемые типы квантования | |
| ModelOpt поддерживает квантование весов, каналов и блоков в форматах int8, fp8, int4, nf4 и nvfp4. Методы квантования разработаны для уменьшения объёма памяти, занимаемого весами модели, при сохранении её производительности во время инференса. | |
| Квантование только весов хранит веса модели в определённом формате с низким числом бит, но выполняет вычисления в формате с более высокой точностью, например `bfloat16`. Это снижает требования к памяти, связанные с весами модели, но сохраняет пиковые значения памяти для вычислений активаций. | |
| Поддерживаются следующие методы квантования: | |
| | **Тип квантования** | **Поддерживаемые схемы** | **Обязательные аргументы** | **Дополнительные примечания** | | |
| |-----------------------|-----------------------|---------------------|----------------------| | |
| | **INT8** | `int8 weight only`, `int8 channel quantization`, `int8 block quantization` | `quant_type`, `quant_type + channel_quantize`, `quant_type + channel_quantize + block_quantize` | | |
| | **FP8** | `fp8 weight only`, `fp8 channel quantization`, `fp8 block quantization` | `quant_type`, `quant_type + channel_quantize`, `quant_type + channel_quantize + block_quantize` | | |
| | **INT4** | `int4 weight only`, `int4 block quantization` | `quant_type`, `quant_type + channel_quantize + block_quantize` | `channel_quantize = -1 is only supported for now`| | |
| | **NF4** | `nf4 weight only`, `nf4 double block quantization` | `quant_type`, `quant_type + channel_quantize + block_quantize + scale_channel_quantize` + `scale_block_quantize` | `channel_quantize = -1 and scale_channel_quantize = -1 are only supported for now` | | |
| | **NVFP4** | `nvfp4 weight only`, `nvfp4 block quantization` | `quant_type`, `quant_type + channel_quantize + block_quantize` | `channel_quantize = -1 is only supported for now`| | |
| См. [официальную документацию modelopt](https://nvidia.github.io/Model-Optimizer/), чтобы лучше понять доступные методы квантования и полный список доступных параметров конфигурации. | |
| ## Сериализация и десериализация квантованных моделей | |
| Чтобы сериализовать квантованную модель в заданном типе данных, сначала загрузите модель с нужным типом данных для квантования, а затем сохраните её с помощью метода [save_pretrained()](/docs/diffusers/v0.43.0/ru/api/models/overview#diffusers.ModelMixin.save_pretrained). | |
| ```python | |
| import torch | |
| from diffusers import AutoModel, NVIDIAModelOptConfig | |
| from modelopt.torch.opt import enable_huggingface_checkpointing | |
| enable_huggingface_checkpointing() | |
| model_id = "Efficient-Large-Model/Sana_600M_1024px_diffusers" | |
| quant_config_fp8 = {"quant_type": "FP8", "quant_method": "modelopt"} | |
| quant_config_fp8 = NVIDIAModelOptConfig(**quant_config_fp8) | |
| model = AutoModel.from_pretrained( | |
| model_id, | |
| subfolder="transformer", | |
| quantization_config=quant_config_fp8, | |
| dtype=torch.bfloat16, | |
| ) | |
| model.save_pretrained('path/to/sana_fp8', safe_serialization=False) | |
| ``` | |
| Чтобы загрузить сериализованную квантованную модель, используйте метод [from_pretrained()](/docs/diffusers/v0.43.0/ru/api/models/overview#diffusers.ModelMixin.from_pretrained). | |
| ```python | |
| import torch | |
| from diffusers import AutoModel, NVIDIAModelOptConfig, SanaPipeline | |
| from modelopt.torch.opt import enable_huggingface_checkpointing | |
| enable_huggingface_checkpointing() | |
| quantization_config = NVIDIAModelOptConfig(quant_type="FP8", quant_method="modelopt") | |
| transformer = AutoModel.from_pretrained( | |
| "path/to/sana_fp8", | |
| subfolder="transformer", | |
| quantization_config=quantization_config, | |
| dtype=torch.bfloat16, | |
| ) | |
| pipe = SanaPipeline.from_pretrained( | |
| "Efficient-Large-Model/Sana_600M_1024px_diffusers", | |
| transformer=transformer, | |
| dtype=torch.bfloat16, | |
| ) | |
| 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") | |
| ``` | |
Xet Storage Details
- Size:
- 10.2 kB
- Xet hash:
- d3a36e3a2d1ec0ace11e2d0e6c71c70ac38ff007060c269ede1b8052b1399fad
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.