Diffusers documentation

Lượng tử hóa

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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

< >

( 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ả diffusers và 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ấp quant_backend, quant_kawargs và 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

< >

( compute_dtype: 'torch.dtype' | None = None )

Tham số

  • compute_dtype (torch.dtype, mặc định là torch.bfloat16) — Dtype của các activation và các lớp chưa được lượng tử hóa. Các thiết bị không có các kernel FP8 hoặc NVFP4 đã tích hợp sẽ khử lượng tử hóa các trọng số sang dtype này trong mỗi lần truyền tiến.

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: weight là float8_e4m3fn với hình dạng [N, K] và weight_scale là thang đo fp32 cho từng hàng [N].
  • nvfp4: weight là uint8 với shape [N, K/2] (hai giá trị E2M1 trên mỗi byte), weight_scale là block scale float8_e4m3fn [N, K/16], và weight_scale_2 cùng input_scale là 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

< >

( 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áo LLM.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ình CausalLM, lm_head cuối cùng thường được giữ nguyên dtype ban đầ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.dtype hoặ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ằng fp4 hoặc nf4.
  • 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.dtype hoặ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.

is_quantizable

< >

( )

Trả về True nếu mô hình có thể lượng tử hóa, ngược lại trả về False.

post_init

< >

( )

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.

quantization_method

< >

( )

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

< >

( ) → 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

< >

( compute_dtype: 'torch.dtype' | None = None )

Tham số

  • compute_dtype — (torch.dtype, 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.

Đâ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

< >

( 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ới precision, group_size, rank và targets.
  • awq_w4a16 (dict, tùy chọn) — Cấu hình đích AWQ W4A16 rõ ràng với precision, group_size và 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

< >

( weights_dtype: str = 'int8'modules_to_not_convert: list[str] | None = None**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. Các giá trị được hỗ trợ là (“float8”,“int8”,“int4”,“int2”)

Đâ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).

post_init

< >

( )

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

< >

( *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". Xem sdnq.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. 0 tự động chọn dựa trên weights_dtype, -1 tắ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 đến sdnq.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

< >

( quant_type: 'AOBaseConfig'modules_to_not_convert: list[str] | None = None**kwargs )

Tham số

  • quant_type (AOBaseConfig) — Một instance của subclass AOBaseConfig chỉ đị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,
)

from_dict

< >

( config_dictreturn_unused_kwargs = False**kwargs )

Tạo cấu hình từ một từ điển.

get_apply_tensor_subclass

< >

( )

Tạo phương pháp lượng tử hóa phù hợp dựa trên cấu hình.

to_dict

< >

( )

Chuyển đổi cấu hình thành từ điển.

DiffusersQuantizer

lớp diffusers.DiffusersQuantizer

< >

( 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.

adjust_max_memory

< >

( max_memory: dict[str, int | str] )

đ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

< >

( torch_dtype: torch.dtype )

Tham số

  • torch_dtype (torch.dtype, tùy chọn) — torch_dtype được sử dụng để tính toán device_map.

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

< >

( 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.

check_quantized_param_shape

< >

( *args**kwargs )

kiểm tra xem tham số đã lượng tử hóa có hình dạng mong đợi hay không.

create_quantized_param

< >

( *args**kwargs )

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.

dequantize

< >

( model )

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.

get_cuda_warm_up_factor

< >

( )

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

< >

( modeltorch_dtype: torch.dtype )

Tham số

  • model (~diffusers.models.modeling_utils.ModelMixin) — Mô hình cần lượng tử hóa
  • torch_dtype (torch.dtype) — dtype được truyền vào phương thức from_pretrained.

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

< >

( model: ModelMixin**kwargs )

Tham số

  • model (~diffusers.models.modeling_utils.ModelMixin) — Mô hình cần lượng tử hóa
  • kwargs (dict, tùy chọn) — Các đối số dạng từ khóa được truyền cùng với _process_model_after_weight_loading.

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

< >

( model: ModelMixin**kwargs )

Tham số

  • model (~diffusers.models.modeling_utils.ModelMixin) — Mô hình cần lượng tử hóa
  • kwargs (dict, tùy chọn) — Các đối số dạng từ khóa được truyền cùng với _process_model_before_weight_loading.

Đặ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

< >

( device_map: dict[str, typing.Any] | None )

Tham số

  • device_map (dict | str, tùy chọn) — device_map được truyền qua phương thức from_pretrained.

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

< >

( modelmissing_keys: list[str]prefix: str )

Tham số

  • missing_keys (list[str], tùy chọn) — Danh sách các khóa bị thiếu trong checkpoint so với state dict của model

Ghi đè phương thức này nếu bạn muốn điều chỉnh missing_keys.

update_torch_dtype

< >

( torch_dtype: torch.dtype )

Tham số

  • torch_dtype (torch.dtype) — dtype đầu vào được truyền vào from_pretrained

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

validate_environment

< >

( *args**kwargs )

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.

Update on GitHub