Diffusers documentation
Lượng tử hóa
Lượng tử hóa
Các kỹ thuật lượng tử hóa giảm chi phí bộ nhớ và tính toán bằng cách biểu diễn trọng số và kích hoạt bằng các kiểu dữ liệu độ chính xác thấp hơn như số nguyên 8-bit (int8). Điều này cho phép nạp các mô hình lớn hơn mà bình thường bạn không thể chứa vừa trong bộ nhớ, đồng thời tăng tốc độ suy luận.
Tìm hiểu cách lượng tử hóa các mô hình trong hướng dẫn Quantization.
PipelineQuantizationConfig
lớp 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 )
Tham số
- quant_backend (
str) — Backend lượng tử hóa sẽ được sử dụng. Khi sử dụng tùy chọn này, chúng ta giả định rằng backend khả dụng cho cảdiffusersvàtransformers. - quant_kwargs (
dict) — Các tham số để khởi tạo lớp backend lượng tử hóa. - components_to_quantize (
list) — Các thành phần của pipeline cần được lượng tử hóa. - quant_mapping (
dict) — Bản ánh xạ định nghĩa các thông số lượng tử hóa (quantization specs) sẽ được sử dụng cho các thành phần của pipeline. Khi sử dụng đối số này, người dùng không cần cung cấpquant_backend,quant_kawargsvàcomponents_to_quantize.
Lớp cấu hình được sử dụng khi áp dụng lượng tử hóa theo thời gian thực vào from_pretrained().
BFLQuantizationConfig
lớp diffusers.BFLQuantizationConfig
< source >( compute_dtype: 'torch.dtype' | None = None )
Cấu hình để nạp các checkpoint đã lượng tử hóa bằng các phương án fp8r và nvfp4 của Black Forest Labs.
Cả hai phương án đều được đọc từ checkpoint thông qua ~FromSingleFileMixin.from_single_file; việc lượng tử hóa mô hình trực tiếp không được hỗ trợ. Một lớp tuyến tính sẽ được lượng tử hóa khi trọng số của nó đi kèm với các tensor tỷ lệ:
fp8r:weightlàfloat8_e4m3fnvới hình dạng[N, K]vàweight_scalelà thang đo fp32 cho từng hàng[N].nvfp4:weightlàuint8với shape[N, K/2](hai giá trị E2M1 trên mỗi byte),weight_scalelà block scalefloat8_e4m3fn[N, K/16], vàweight_scale_2cùnginput_scalelà các scalar fp32 chứa global weight scale và activation scale đã hiệu chuẩn (bố cục NVFP4 của ModelOpt).
BitsAndBytesConfig
lớp 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 )
Tham số
- load_in_8bit (
bool, tùy chọn, mặc định làFalse) — Cờ này được dùng để bật lượng tử hóa 8-bit với LLM.int8(). - load_in_4bit (
bool, tuỳ chọn, mặc định làFalse) — Cờ này được dùng để bật lượng tử hóa 4-bit bằng cách thay thế các lớp Linear bằng các lớp FP4/NF4 từbitsandbytes. - llm_int8_threshold (
float, tùy chọn, mặc định là 6.0) — Đây là ngưỡng ngoại lệ cho việc phát hiện ngoại lệ như được mô tả trong bài báoLLM.int8() : 8-bit Matrix Multiplication for Transformers at Scale: https://huggingface.co/papers/2208.07339 Bất kỳ giá trị nào của hidden states cao hơn ngưỡng này sẽ được coi là ngoại lệ và các phép toán trên những giá trị đó sẽ được thực hiện ở fp16. Các giá trị thường có phân phối chuẩn, tức là phần lớn các giá trị nằm trong khoảng [-3.5, 3.5], nhưng có một số ngoại lệ hệ thống đặc biệt có phân phối rất khác nhau đối với các mô hình lớn. Những ngoại lệ này thường nằm trong khoảng [-60, -6] hoặc [6, 60]. Lượng tử hóa Int8 hoạt động tốt với các giá trị có độ lớn ~5, nhưng vượt quá mức đó, sẽ có sự suy giảm hiệu suất đáng kể. Ngưỡng mặc định tốt là 6, nhưng có thể cần ngưỡng thấp hơn cho các mô hình kém ổn định hơn (mô hình nhỏ, fine-tuning). - llm_int8_skip_modules (
list[str], tuỳ chọn) — Một danh sách rõ ràng các module mà chúng ta không muốn chuyển đổi sang 8-bit. Điều này hữu ích cho các mô hình như Jukebox, vốn có nhiều đầu (heads) ở các vị trí khác nhau và không nhất thiết ở vị trí cuối cùng. Ví dụ đối với các mô hìnhCausalLM,lm_headcuối cùng thường được giữ nguyêndtypeban đầu. - llm_int8_enable_fp32_cpu_offload (
bool, tuỳ chọn, mặc định làFalse) — Cờ này được dùng cho các trường hợp sử dụng nâng cao và dành cho người dùng đã nắm rõ tính năng này. Nếu bạn muốn tách mô hình của mình thành các phần khác nhau và chạy một số phần ở định dạng int8 trên GPU và một số phần ở định dạng fp32 trên CPU, bạn có thể sử dụng cờ này. Điều này hữu ích để offload các mô hình lớn nhưgoogle/flan-t5-xxl. Lưu ý rằng các thao tác int8 sẽ không được chạy trên CPU. - llm_int8_has_fp16_weight (
bool, tuỳ chọn, mặc định làFalse) — Cờ này chạy LLM.int8() với trọng số chính 16-bit. Điều này hữu ích cho fine-tuning vì trọng số không cần phải được chuyển đổi qua lại cho bước truyền ngược (backward pass). - bnb_4bit_compute_dtype (
torch.dtypehoặc str, tùy chọn, mặc định làtorch.float32) — Tham số này đặt kiểu tính toán, có thể khác với kiểu đầu vào. Ví dụ, đầu vào có thể là fp32, nhưng phép tính có thể được đặt thành bf16 để tăng tốc độ. - bnb_4bit_quant_type (
str, tùy chọn, mặc định là"fp4") — Tham số này đặt kiểu dữ liệu lượng tử hóa trong các lớp bnb.nn.Linear4Bit. Các tùy chọn là kiểu dữ liệu FP4 và NF4, được chỉ định bằngfp4hoặcnf4. - bnb_4bit_use_double_quant (
bool, tuỳ chọn, mặc định làFalse) — Cờ này được dùng cho lượng tử hóa lồng nhau, trong đó các hằng số lượng tử hóa từ lần lượng tử hóa đầu tiên được lượng tử hóa lại. - bnb_4bit_quant_storage (
torch.dtypehoặc str, tùy chọn, mặc định làtorch.uint8) — Tham số này đặt kiểu lưu trữ để đóng gói các tham số 4-bit đã lượng tử hóa. - kwargs (
dict[str, Any], tùy chọn) — Các tham số bổ sung để khởi tạo đối tượng cấu hình.
Đây là một lớp bao (wrapper class) cho tất cả các thuộc tính và tính năng có thể thao tác với một mô hình đã được nạp bằng bitsandbytes.
Điều này thay thế load_in_8bit hoặc load_in_4bit do đó cả hai tùy chọn đều loại trừ lẫn nhau.
Hiện tại chỉ hỗ trợ lượng tử hóa LLM.int8(), FP4 và NF4. Nếu có thêm các phương pháp được thêm vào bitsandbytes,
thì sẽ có thêm các đối số cho lớp này.
Trả về True nếu mô hình có thể lượng tử hóa, ngược lại trả về False.
Trình kiểm tra an toàn để đảm bảo các đối số là chính xác - đồng thời thay thế một số đối số NoneType bằng giá trị mặc định của chúng.
Phương thức này trả về phương pháp lượng tử hóa được sử dụng cho mô hình. Nếu mô hình không thể lượng tử hóa, nó sẽ trả về None.
to_diff_dict
< source >( ) → dict[str, Any]
Trả về
dict[str, Any]
Từ điển chứa tất cả các thuộc tính cấu thành lên bản thể cấu hình này,
Xóa tất cả các thuộc tính khỏi config tương ứng với các thuộc tính config mặc định để tăng tính dễ đọc và chuỗi hóa thành một từ điển Python.
GGUFQuantizationConfig
lớp diffusers.GGUFQuantizationConfig
< source >( compute_dtype: 'torch.dtype' | None = None )
Đây là một lớp cấu hình cho các kỹ thuật Lượng tử hóa GGUF.
NunchakuLiteQuantizationConfig
lớp diffusers.NunchakuLiteQuantizationConfig
< source >( compute_dtype: 'torch.dtype' | str | None = Nonesvdq_w4a4: dict[str, Any] | None = Noneawq_w4a16: dict[str, Any] | None = None**kwargs )
Tham số
- compute_dtype (
torch.dtype, mặc định làtorch.bfloat16) — Dtype thời gian chạy được sử dụng bởi các bộ đệm số dấu phẩy động trong các module lượng tử hóa. - svdq_w4a4 (
dict, tùy chọn) — Cấu hình đích SVDQ W4A4 tường minh vớiprecision,group_size,rankvàtargets. - awq_w4a16 (
dict, tùy chọn) — Cấu hình đích AWQ W4A16 rõ ràng vớiprecision,group_sizevàtargets.
Cấu hình để nạp các checkpoint của Nunchaku Lite.
Hỗ trợ Nunchaku Lite trong Diffusers tải các checkpoint đã lượng tử hóa trước. Để tạo một checkpoint tương thích, hãy sử dụng diffuse-compressor để chọn hoặc điều chỉnh cấu hình đích cho kiến trúc mô hình, lượng tử hóa và xuất transformer, sau đó đóng gói nó thành một pipeline Diffusers với quantization_config gọn nhẹ được lưu trong config.json.
State dict được xuất ra phải khớp chính xác với kiến trúc của model Diffusers đích. Các checkpoint đã được lượng tử hóa với các phép chiếu QKV hợp nhất sẽ không thể nạp vào cấu hình model kỳ vọng các module chiếu Q, K và V riêng biệt.
Ví dụ cấu hình config.json dạng nén:
{
"_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
lớp diffusers.QuantoConfig
< source >( weights_dtype: str = 'int8'modules_to_not_convert: list[str] | None = None**kwargs )
Đây là một lớp bao (wrapper class) cho tất cả các thuộc tính và tính năng có thể thao tác với một mô hình đã được nạp bằng quanto.
QuantoConfigđã bị ngừng hỗ trợ và sẽ bị loại bỏ trong phiên bản 1.0.0. Hãy cân nhắc chuyển sang một trong các backend lượng tử hóa được hỗ trợ khác, chẳng hạn như BitsAndBytesConfig hoặc TorchAoConfig.
modules_to_not_convert (list, tuỳ chọn, mặc định là None):
Danh sách các module không cần lượng tử hóa, hữu ích khi lượng tử hóa các mô hình yêu cầu một số module phải giữ nguyên độ chính xác ban đầu (ví dụ: encoder của Whisper, encoder của Llava, các lớp gate của Mixtral).
Trình kiểm tra an toàn đảm bảo các đối số là chính xác
SDNQConfig
lớp diffusers.SDNQConfig
< source >( *args**kwargs )
Tham số
- weights_dtype (
str, tùy chọn, mặc định là"int8") — Dtype đích cho các trọng số sau khi lượng tử hóa, ví dụ"int8","uint4","float8_e4m3fn". Xemsdnq.common.accepted_weight_dtypesđể biết tất cả các giá trị được hỗ trợ. - group_size (
int, tùy chọn, mặc định là0) — Số lượng phần tử của một tensor chia sẻ cùng một nhóm lượng tử hóa.0tự động chọn dựa trênweights_dtype,-1tắt nhóm hóa và sử dụng lượng tử hóa theo hàng. - use_svd (
bool, tùy chọn, mặc định làFalse) — Liệu có áp dụng thuật toán SVDQuant lên trên lượng tử hóa SDNQ hay không. - use_quantized_matmul (
bool, tuỳ chọn, mặc định làFalse) — Có sử dụng matmul lượng tử INT8 / FP8 / FP16 trong bước forward thay vì BF16 / FP16 hay không. - modules_to_not_convert (
list, tùy chọn, mặc định làNone) — Danh sách các module cần bỏ qua trong quá trình lượng tử hóa. - kwargs (
dict[str, Any], tùy chọn) — Các đối số từ khóa bổ sung được chuyển tiếp đếnsdnq.SDNQConfig(ví dụ:quantized_matmul_dtype,svd_rank,use_hadamard,quant_conv,quant_embedding,modules_dtype_dict).
Lớp cấu hình cho SDNQ (SD.Next Quantization).
Thư viện sdnq đi kèm với cấu hình và bộ lượng tử hóa tương thích với diffusers; lớp này là một nhà máy mỏng, chuyển việc xử lý sang cho chúng để các checkpoint có quant_method="sdnq" được nạp một cách bản địa với diffusers. Tất cả các đối số đều được chuyển tiếp đến sdnq.SDNQConfig. Yêu cầu thư viện sdnq: pip install sdnq.
Tham khảo: https://github.com/Disty0/sdnq
TorchAoConfig
lớp diffusers.TorchAoConfig
< source >( quant_type: 'AOBaseConfig'modules_to_not_convert: list[str] | None = None**kwargs )
Tham số
- quant_type (
AOBaseConfig) — Một instance của subclassAOBaseConfigchỉ định loại lượng tử hóa. Xem tài liệu torchao để biết các lớp cấu hình khả dụng (ví dụ:Int4WeightOnlyConfig,Int8WeightOnlyConfig,Float8WeightOnlyConfig,Float8DynamicActivationFloat8WeightConfig, v.v.). - modules_to_not_convert (
list[str], tuỳ chọn, mặc định làNone) — Danh sách các module không thực hiện lượng tử hóa, hữu ích khi lượng tử hóa các mô hình yêu cầu một số module phải giữ nguyên độ chính xác ban đầu.
Đây là một lớp cấu hình cho các kỹ thuật lượng tử hóa/sparse của torchao.
Ví dụ:
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,
)Tạo cấu hình từ một từ điển.
Tạo phương pháp lượng tử hóa phù hợp dựa trên cấu hình.
Chuyển đổi cấu hình thành từ điển.
DiffusersQuantizer
lớp diffusers.DiffusersQuantizer
< source >( quantization_config: QuantizationConfigMixin**kwargs )
Lớp trừu tượng của bộ lượng tử hóa HuggingFace. Hiện tại hỗ trợ lượng tử hóa các mô hình diffusers của HF để suy luận và/hoặc lượng tử hóa. Lớp này chỉ được sử dụng cho diffusers.models.modeling_utils.ModelMixin.from_pretrained và chưa thể dễ dàng sử dụng bên ngoài phạm vi của phương thức đó.
Thuộc tính
quantization_config (diffusers.quantizers.quantization_config.QuantizationConfigMixin):
Cấu hình lượng tử hóa xác định các tham số lượng tử hóa của mô hình mà bạn muốn lượng tử hóa.
modules_to_not_convert (list[str], tùy chọn):
Danh sách tên module không chuyển đổi khi lượng tử hóa mô hình.
required_packages (list[str], tùy chọn):
Danh sách các gói pip bắt buộc phải cài đặt trước khi sử dụng bộ lượng tử hóa
requires_calibration (bool):
Phương pháp lượng tử hóa có yêu cầu hiệu chuẩn mô hình trước khi sử dụng hay không.
điều chỉnh đối số max_memory của infer_auto_device_map() nếu cần thêm bộ nhớ cho lượng tử hóa
adjust_target_dtype
< source >( torch_dtype: torch.dtype )
Ghi đè phương thức này nếu bạn muốn điều chỉnh biến target_dtype được sử dụng trong from_pretrained để tính toán device_map trong trường hợp device_map là một str. Ví dụ, với bitsandbytes chúng tôi ép đặt target_dtype thành torch.int8 và với 4-bit chúng tôi truyền một enum tùy chỉnh accelerate.CustomDtype.int4.
check_if_quantized_param
< source >( model: ModelMixinparam_value: torch.Tensorparam_name: strstate_dict: dict[str, typing.Any]**kwargs )
kiểm tra xem một thành phần state_dict đã được nạp có phải là một phần của tham số lượng tử hóa + một số kiểm tra hợp lệ; chỉ được định nghĩa cho các phương pháp lượng tử hóa yêu cầu tạo ra các tham số mới cho lượng tử hóa.
kiểm tra xem tham số đã lượng tử hóa có hình dạng mong đợi hay không.
lấy các thành phần cần thiết từ state_dict và tạo tham số đã lượng tử hóa.
Có thể khử lượng tử hóa mô hình để lấy lại mô hình gốc, với một số suy giảm về độ chính xác / hiệu suất. Lưu ý rằng không phải tất cả các phương án lượng tử hóa đều hỗ trợ điều này.
Hệ số được sử dụng trong caching_allocator_warmup để tính số byte cần phân bổ trước nhằm khởi động cuda.
Hệ số 2 có nghĩa là chúng ta phân bổ toàn bộ số byte trong mô hình rỗng (vì chúng ta phân bổ ở fp16), hệ số 4 có nghĩa là
chúng ta phân bổ một nửa bộ nhớ của các trọng số nằm trong mô hình rỗng, v.v…
get_special_dtypes_update
< source >( modeltorch_dtype: torch.dtype )
trả về dtypes cho các module không được lượng tử hóa - được sử dụng để tính toán device_map trong trường hợp truyền một str làm device_map. Phương thức sẽ sử dụng modules_to_not_convert được sửa đổi trong _process_model_before_weight_loading. Các model diffusers hiện chưa có thuộc tính modules_to_not_convert nào nhưng điều này có thể thay đổi trong tương lai.
postprocess_model
< source >( model: ModelMixin**kwargs )
Xử lý hậu xử lý mô hình sau khi nạp trọng số. Đảm bảo ghi đè phương thức trừu tượng _process_model_after_weight_loading.
preprocess_model
< source >( model: ModelMixin**kwargs )
Đặt thuộc tính mô hình và/hoặc chuyển đổi mô hình trước khi nạp trọng số. Tại thời điểm này, mô hình nên được khởi tạo trên thiết bị meta để bạn có thể tự do thao tác trên khung xương của mô hình nhằm thay thế các module tại chỗ. Hãy đảm bảo ghi đè phương thức trừu tượng _process_model_before_weight_loading.
update_device_map
< source >( device_map: dict[str, typing.Any] | None )
Ghi đè phương thức này nếu bạn muốn ghi đè bản đồ thiết bị hiện có bằng một bản đồ mới. Ví dụ, đối với
bitsandbytes, vì accelerate là một yêu cầu bắt buộc, nếu không truyền device_map, thì device_map sẽ được đặt thành
`“auto”“
update_missing_keys
< source >( modelmissing_keys: list[str]prefix: str )
Ghi đè phương thức này nếu bạn muốn điều chỉnh missing_keys.
update_torch_dtype
< source >( torch_dtype: torch.dtype )
Một số phương pháp lượng tử hóa yêu cầu đặt rõ dtype của mô hình thành dtype đích. Bạn cần ghi đè phương thức này nếu muốn đảm bảo hành vi đó được giữ nguyên
Phương thức này được sử dụng để kiểm tra các xung đột tiềm ẩn với các đối số được truyền vào from_pretrained. Bạn cần định nghĩa nó cho tất cả các bộ lượng tử hóa trong tương lai được tích hợp với diffusers. Nếu không cần kiểm tra rõ ràng, chỉ cần trả về không.