양자화
양자화 기법은 8비트 정수(int8)와 같은 낮은 정밀도의 데이터 타입으로 가중치와 활성화를 표현하여 메모리 및 계산 비용을 줄입니다. 이를 통해 일반적으로 메모리에 적재할 수 없었던 더 큰 모델을 로드하고 추론 속도를 높일 수 있습니다.
Quantization 가이드에서 모델을 양자화하는 방법을 배워보세요.
PipelineQuantizationConfig
class diffusers.PipelineQuantizationConfig
< source >( quant_backend: str = Nonequant_kwargs: dict[str, str | float | int | dict] = Nonecomponents_to_quantize: list[str] | str | None = Nonequant_mapping: dict[str, DiffQuantConfigMixin | 'TransformersQuantConfigMixin'] = None )
매개변수
- quant_backend (
str) — 사용할 양자화 백엔드입니다. 이 옵션을 사용할 경우, 백엔드가diffusers와transformers양쪽에 모두 사용 가능하다고 가정합니다. - quant_kwargs (
dict) — 양자화 백엔드 클래스를 초기화하는 매개변수. - components_to_quantize (
list) — 양자화할 파이프라인의 구성 요소. - quant_mapping (
dict) — 파이프라인 구성 요소에 사용할 양자화 사양을 정의하는 매핑입니다. 이 인수를 사용할 경우 사용자는quant_backend,quant_kawargs,components_to_quantize를 제공할 필요가 없습니다.
from_pretrained()에 온더플라이(On-the-fly) 양자화를 적용할 때 사용할 구성 클래스입니다.
BFLQuantizationConfig
class diffusers.BFLQuantizationConfig
< source >( compute_dtype: 'torch.dtype' | None = None )
Black Forest Labs의 fp8r 및 nvfp4 스킴으로 양자화된 체크포인트를 로드하기 위한 설정입니다.
두 방식 모두 ~FromSingleFileMixin.from_single_file를 통해 체크포인트에서 읽습니다. 모델의 온플라이 양자화는 지원되지 않습니다. 가중치가 스케일 텐서를 함께 포함하는 경우 선형 레이어가 양자화됩니다:
fp8r:weight은 shape가[N, K]인float8_e4m3fn이고,weight_scale은 행별 fp32 스케일[N]입니다.nvfp4:weight는uint8이며 shape가[N, K/2]입니다(바이트당 E2M1 값 2개),weight_scale는float8_e4m3fn블록 스케일[N, K/16]이고,weight_scale_2와input_scale는 전역 가중치 스케일과 보정된 활성화 스케일을 담는 fp32 스칼라입니다(ModelOpt NVFP4 레이아웃).
BitsAndBytesConfig
class diffusers.BitsAndBytesConfig
< source >( load_in_8bit = Falseload_in_4bit = Falsellm_int8_threshold = 6.0llm_int8_skip_modules = Nonellm_int8_enable_fp32_cpu_offload = Falsellm_int8_has_fp16_weight = Falsebnb_4bit_compute_dtype = Nonebnb_4bit_quant_type = 'fp4'bnb_4bit_use_double_quant = Falsebnb_4bit_quant_storage = None**kwargs )
매개변수
- load_in_8bit (
bool, 선택 사항, 기본값False) — 이 플래그는 LLM.int8()을 사용하여 8-bit 양자화를 활성화하는 데 사용됩니다. - load_in_4bit (
bool, 선택 사항, 기본값False) — 이 플래그는bitsandbytes의 FP4/NF4 레이어로 Linear 레이어를 교체하여 4-bit 양자화를 활성화하는 데 사용됩니다. - llm_int8_threshold (
float, 선택 사항, 기본값 6.0) —LLM.int8() : 8-bit Matrix Multiplication for Transformers at Scale논문에서 설명하는 이상치 감지를 위한 이상치 임계값에 해당합니다: https://huggingface.co/papers/2208.07339 이 임계값을 초과하는 hidden states 값은 이상치로 간주되며, 해당 값에 대한 연산은 fp16으로 수행됩니다. 값은 일반적으로 정규 분포를 따르므로 대부분의 값은 [-3.5, 3.5] 범위에 있지만, 대규모 모델에서는 분포가 현저히 다른 일부 체계적인 이상치가 존재합니다. 이러한 이상치는 주로 [-60, -6] 또는 [6, 60] 구간에 위치합니다. Int8 양자화는 크기가 약 5인 값에 잘 작동하지만, 그 이상에서는 상당한 성능 저하가 발생합니다. 좋은 기본 임계값은 6이지만, 불안정한 모델(작은 모델, fine-tuning)의 경우 더 낮은 임계값이 필요할 수 있습니다. - llm_int8_skip_modules (
list[str], 선택 사항) — 8-bit으로 변환하지 않을 모듈의 명시적인 목록입니다. 이는 Jukebox처럼 여러 위치에 여러 헤드가 있고 반드시 마지막 위치에 있지 않은 모델에 유용합니다. 예를 들어CausalLM모델의 경우, 마지막lm_head는 일반적으로 원래의dtype로 유지됩니다. - llm_int8_enable_fp32_cpu_offload (
bool, 선택 사항, 기본값False) — 이 플래그는 고급 사용 사례 및 해당 기능을 인지한 사용자에게 사용됩니다. 모델을 여러 부분으로 나누어 일부는 GPU에서 int8로, 일부는 CPU에서 fp32로 실행하려면 이 플래그를 사용할 수 있습니다.google/flan-t5-xxl과 같은 대규모 모델을 오프로딩하는 데 유용합니다. int8 연산은 CPU에서 실행되지 않는다는 점에 유의하세요. - llm_int8_has_fp16_weight (
bool, 선택, 기본값False) — 이 플래그는 LLM.int8()을 16비트 메인 가중치와 함께 실행합니다. 가중치를 역전파를 위해 왕복 변환할 필요가 없으므로 미세 조정(fine-tuning)에 유용합니다. - bnb_4bit_compute_dtype (
torch.dtype또는 str, 선택 사항, 기본값은torch.float32) — 입력 타입과 다를 수 있는 계산 타입을 설정합니다. 예를 들어, 입력은 fp32일 수 있지만 속도를 높이기 위해 계산은 bf16으로 설정할 수 있습니다. - bnb_4bit_quant_type (
str, 선택 사항, 기본값"fp4") — bnb.nn.Linear4Bit 레이어의 양자화 데이터 유형을 설정합니다. 옵션은fp4또는nf4로 지정되는 FP4 및 NF4 데이터 유형입니다. - bnb_4bit_use_double_quant (
bool, 선택 사항, 기본값False) — 이 플래그는 첫 번째 양자화에서 생성된 양자화 상수를 다시 양자화하는 중첩 양자화에 사용됩니다. - bnb_4bit_quant_storage (
torch.dtype또는 str, 선택 사항, 기본값torch.uint8) — 양자화된 4비트 파라미터를 패킹하기 위한 저장 타입을 설정합니다. - kwargs (
dict[str, Any], 선택 사항) — 구성 객체를 초기화할 때 사용할 추가 매개변수.
bitsandbytes를 사용하여 로드한 모델에서 사용할 수 있는 모든 가능한 속성과 기능에 대한 래퍼 클래스입니다.
이 옵션은 load_in_8bit 또는 load_in_4bit를 대체하므로 두 옵션은 상호 배타적입니다.
현재 LLM.int8(), FP4, NF4 양자화만 지원합니다. bitsandbytes에 더 많은 방법이 추가되면 이 클래스에도 더 많은 인수가 추가됩니다.
모델이 양자화 가능한 경우 True, 그렇지 않은 경우 False를 반환합니다.
인수가 올바른지 확인하는 안전 검사기 - 일부 NoneType 인수를 기본값으로 대체합니다.
이 메서드는 모델에 사용된 양자화 방법을 반환합니다. 모델이 양자화할 수 없으면 None을 반환합니다.
더 나은 가독성을 위해 기본 config 속성에 해당하는 모든 속성을 config에서 제거하고 Python 딕셔너리로 직렬화합니다.
GGUFQuantizationConfig
class diffusers.GGUFQuantizationConfig
< source >( compute_dtype: 'torch.dtype' | None = None )
이것은 GGUF 양자화 기법을 위한 설정 클래스입니다.
NunchakuLiteQuantizationConfig
class diffusers.NunchakuLiteQuantizationConfig
< source >( compute_dtype: 'torch.dtype' | str | None = Nonesvdq_w4a4: dict[str, Any] | None = Noneawq_w4a16: dict[str, Any] | None = None**kwargs )
Nunchaku Lite 체크포인트를 로드하기 위한 구성입니다.
Diffusers의 Nunchaku Lite 지원은 사전 양자화된 체크포인트를 로드합니다. 호환되는 체크포인트를 만들려면 diffuse-compressor를 사용하여 모델 아키텍처에 대한 대상 구성을 선택하거나 조정하고, transformer를 양자화하여 내보낸 다음, config.json에 저장된 컴팩트한 quantization_config와 함께 Diffusers 파이프라인으로 패키징하세요.
내보낸 state dict는 대상 Diffusers 모델 아키텍처와 정확히 일치해야 합니다. fused QKV projections으로 양자화된 체크포인트는 개별 Q, K, V projection 모듈을 기대하는 모델 구성에 로드되지 않습니다.
컴팩트한 config.json 설정 예시:
{
"_class_name": "ErnieImageTransformer2DModel",
"quantization_config": {
"quant_method": "nunchaku_lite",
"compute_dtype": "bfloat16",
"svdq_w4a4": {
"precision": "nvfp4",
"group_size": 16,
"rank": 32,
"targets": ["layers.0.self_attention.to_q"]
},
"awq_w4a16": {
"precision": "int4",
"group_size": 64,
"targets": ["final_linear"]
}
}
}QuantoConfig
class diffusers.QuantoConfig
< source >( weights_dtype: str = 'int8'modules_to_not_convert: list[str] | None = None**kwargs )
quanto를 사용하여 로드한 모델에서 사용할 수 있는 모든 가능한 속성과 기능에 대한 래퍼 클래스입니다.
QuantoConfig은 비추천(deprecated)되며 1.0.0 버전에서 제거됩니다. BitsAndBytesConfig 또는 TorchAoConfig와 같은 다른 지원되는 양자화 백엔드로 전환하는 것을 고려해 보세요.
modules_to_not_convert (list, 선택 사항, 기본값 None):
양자화하지 않을 모듈 목록입니다. 일부 모듈을 원래 정밀도로 유지해야 하는 모델(예: Whisper encoder, Llava encoder, Mixtral gate layers)을 양자화할 때 유용합니다.
인수가 올바른지 확인하는 안전 검사기
SDNQConfig
클래스 diffusers.SDNQConfig
< source >( *args**kwargs )
매개변수
- weights_dtype (
str, 선택 사항, 기본값"int8") — 양자화 후 가중치의 대상 dtype입니다. 예:"int8","uint4","float8_e4m3fn". 지원되는 모든 값은sdnq.common.accepted_weight_dtypes를 참조하세요. - group_size (
int, 선택 사항, 기본값0) — 텐서의 동일한 양자화 그룹을 공유하는 요소의 수입니다.0은weights_dtype에 따라 자동으로 선택되며,-1은 그룹화를 비활성화하고 행 단위 양자화를 사용합니다. - use_svd (
bool, 선택 사항, 기본값False) — SDNQ 양자화 위에 SVDQuant 알고리즘을 적용할지 여부. - use_quantized_matmul (
bool, 선택 사항, 기본값False) — BF16 / FP16 대신 forward pass에서 양자화된 INT8 / FP8 / FP16 matmul을 사용할지 여부. - modules_to_not_convert (
list, 선택 사항, 기본값None) — 양자화 과정에서 건너뛸 모듈 목록입니다. - kwargs (
dict[str, Any], 선택) —sdnq.SDNQConfig로 전달되는 추가 키워드 인자(예:quantized_matmul_dtype,svd_rank,use_hadamard,quant_conv,quant_embedding,modules_dtype_dict).
SDNQ(SD.Next Quantization)의 설정 클래스입니다.
sdnq 라이브러리는 자체적으로 diffusers 호환 config와 quantizer를 제공합니다. 이 클래스는 얇은 팩토리(thin factory)로, quant_method="sdnq" 체크포인트가 diffusers에서 네이티브로 로드되도록 해당 라이브러리에 위임합니다. 모든 인수는 sdnq.SDNQConfig로 전달됩니다. sdnq 라이브러리가 필요합니다: pip install sdnq.
TorchAoConfig
클래스 diffusers.TorchAoConfig
< source >( quant_type: 'AOBaseConfig'modules_to_not_convert: list[str] | None = None**kwargs )
매개변수
- quant_type (
AOBaseConfig) — 양자화 유형을 지정하는AOBaseConfig하위 클래스 인스턴스입니다. 사용 가능한 설정 클래스(예:Int4WeightOnlyConfig,Int8WeightOnlyConfig,Float8WeightOnlyConfig,Float8DynamicActivationFloat8WeightConfig등)에 대해서는 torchao 문서를 참조하세요. - modules_to_not_convert (
list[str], 선택 사항, 기본값None) — 양자화하지 않을 모듈 목록입니다. 일부 모듈은 원래의 정밀도를 유지해야 하는 모델의 양자화에 유용합니다.
이것은 torchao 양자화/희소화 기법을 위한 config 클래스입니다.
예:
from diffusers import FluxTransformer2DModel, TorchAoConfig
from torchao.quantization import Int8WeightOnlyConfig
quantization_config = TorchAoConfig(Int8WeightOnlyConfig())
transformer = FluxTransformer2DModel.from_pretrained(
"black-forest-labs/Flux.1-Dev",
subfolder="transformer",
quantization_config=quantization_config,
torch_dtype=torch.bfloat16,
)사전에서 구성을 생성합니다.
configuration에 따라 적절한 양자화 방법을 생성합니다.
설정을 사전으로 변환합니다.
DiffusersQuantizer
class diffusers.DiffusersQuantizer
< source >( quantization_config: QuantizationConfigMixin**kwargs )
HuggingFace 양자화기의 추상 클래스입니다. 현재는 추론 및/또는 양자화를 위해 HF diffusers 모델을 양자화하는 것을 지원합니다. 이 클래스는 diffusers.models.modeling_utils.ModelMixin.from_pretrained에서만 사용되며, 아직 해당 메서드의 범위를 벗어나 쉽게 사용할 수 없습니다.
Attributes
quantization_config (diffusers.quantizers.quantization_config.QuantizationConfigMixin):
모델을 양자화할 때 사용할 양자화 매개변수를 정의하는 양자화 설정입니다.
modules_to_not_convert (list[str], 선택 사항):
모델을 양자화할 때 변환하지 않을 모듈 이름 목록입니다.
required_packages (list[str], 선택 사항):
양자화기를 사용하기 전에 설치해야 하는 필수 pip 패키지 목록입니다.
requires_calibration (bool):
양자화 방법이 사용 전에 모델 보정이 필요한지 여부입니다.
양자화에 추가 메모리가 필요한 경우 infer_auto_device_map()의 max_memory 인수를 조정합니다
adjust_target_dtype
< source >( torch_dtype: torch.dtype )
from_pretrained에서 str인 경우 device_map을 계산하는 데 사용되는 target_dtype 변수를 조정하려면 이 메서드를 오버라이드하세요. 예를 들어 bitsandbytes의 경우 target_dtype을 torch.int8으로 강제 설정하고, 4-bit의 경우 커스텀 enum인 accelerate.CustomDtype.int4를 전달합니다.
check_if_quantized_param
< source >( model: ModelMixinparam_value: torch.Tensorparam_name: strstate_dict: dict**kwargs )
state_dict의 로드된 구성 요소가 양자화 파라미터의 일부인지 확인하고 일부 검증을 수행합니다. 양자화를 위해 새로운 파라미터를 생성해야 하는 양자화 방법에서만 정의됩니다.
양자화 파라미터가 예상된 형태를 가지는지 확인합니다.
state_dict에서 필요한 구성 요소를 가져와서 양자화된 파라미터를 생성합니다.
정밀도/성능이 일부 저하될 수 있지만, 모델을 역양자화하여 원래 모델을 복원할 수 있습니다. 모든 양자화 방식이 이를 지원하지는 않습니다.
caching_allocator_warmup에서 cuda를 워밍업하기 위해 사전 할당할 바이트 수를 구하는 데 사용할 계수입니다.
계수가 2이면 빈 모델의 모든 바이트를 할당하는 것을 의미합니다(이때 fp16으로 할당하므로), 계수가 4이면
빈 모델에 있는 가중치의 절반에 해당하는 메모리를 할당하는 것을 의미합니다.
get_special_dtypes_update
< source >( modeltorch_dtype: torch.dtype )
양자화되지 않은 모듈의 dtypes를 반환합니다 - device_map에 str을 전달하는 경우 device_map 계산에 사용됩니다. 이 메서드는 _process_model_before_weight_loading에서 수정되는 modules_to_not_convert를 사용합니다. diffusers 모델에는 아직 modules_to_not_convert 속성이 없지만, 가까운 미래에 변경될 수 있습니다.
postprocess_model
< source >( model: ModelMixin**kwargs )
가중치 로딩 후 모델을 후처리합니다. 추상 메서드 _process_model_after_weight_loading를 오버라이드하는지 확인하세요.
preprocess_model
< source >( model: ModelMixin**kwargs )
가중치 로딩 전에 모델 속성을 설정하고/또는 모델을 변환합니다. 이 시점에서 모델은 meta device에 초기화되어 있어야 하므로, 모듈을 제자리에서 교체하기 위해 모델의 골격을 자유롭게 조작할 수 있습니다. 추상 메서드 _process_model_before_weight_loading를 반드시 오버라이드해야 합니다.
update_device_map
< source >( device_map: dict[str, typing.Any] | None )
기존 device map을 새로운 것으로 덮어쓰기 위해 이 메서드를 오버라이드할 수 있습니다. 예를 들어 accelerate가 필수 요구 사항인 bitsandbytes의 경우, device_map이 전달되지 않으면 device_map이 `“auto”“`로 설정됩니다.
update_missing_keys
< source >( modelmissing_keys: listprefix: str )
missing_keys를 조정하려면 이 메서드를 오버라이드하세요.
update_torch_dtype
< source >( torch_dtype: torch.dtype )
일부 양자화 방법은 모델의 dtype을 대상 dtype으로 명시적으로 설정해야 합니다. 해당 동작이 유지되도록 확인하려면 이 메서드를 오버라이드해야 합니다
이 메서드는 from_pretrained에 전달되는 인자와의 잠재적 충돌을 확인하는 데 사용됩니다. diffusers에 통합되는 모든 향후 quantizer에 대해 이 메서드를 정의해야 합니다. 명시적인 확인이 필요하지 않은 경우, 아무것도 반환하지 않으면 됩니다.