Transformers documentation
Giữ các module ở độ chính xác đầy đủ
Giữ các module ở độ chính xác đầy đủ
Một số module mất độ chính xác nhiều hơn các module khác khi được lượng tử hóa. Giữ chúng ở độ chính xác gốc sẽ tốn thêm một chút bộ nhớ và có thể khôi phục phần lớn độ chính xác. Điều này áp dụng khi bạn lượng tử hóa một mô hình trong quá trình tải. Một checkpoint đã được lượng tử hóa trước đó đã ghi lại các module mà nó đã bỏ qua.
Các module bị bỏ qua mặc định
Nếu bạn không truyền vào danh sách bỏ qua, hầu hết các phương thức sẽ giữ các module này ở trạng thái chưa lượng tử hóa.
- Các embedding đầu ra, thường là
lm_head. - Các trọng số được liên kết với các trọng số khác, chẳng hạn như các embedding đầu vào chia sẻ trọng số với
lm_head. - Module cuối cùng của mô hình.
- Các module mà model liệt kê trong
_keep_in_fp32_modules.
Một số phương pháp đặt giá trị mặc định riêng. HQQ, FP-Quant và Four Over Six chỉ bỏ qua lm_head. SINQ chỉ bỏ qua các module trong _keep_in_fp32_modules.
Truyền vào một danh sách bỏ qua
Truyền tên module vào đối số danh sách bỏ qua của cấu hình phương thức. Ví dụ bên dưới giữ lm_head và các phép chiếu xuống của MLP ở bf16 bằng bitsandbytes.
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
llm_int8_skip_modules=["lm_head", "mlp.down_proj"],
)
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen3-0.6B",
quantization_config=quantization_config,
device_map="auto",
)Skip list thay thế các module bị bỏ qua mặc định thay vì thêm vào chúng, mặc dù các module trong
_keep_in_fp32_modulesvẫn bị bỏ qua. Hãy bao gồmlm_headtrong danh sách của bạn nếu bạn vẫn muốn nó không bị lượng tử hóa. AWQ là ngoại lệ và sẽ thêm danh sách của bạn vào các giá trị mặc định.
Tên của đối số phụ thuộc vào phương thức.
| Tham số | Phương thức |
|---|---|
modules_to_not_convert | Hầu hết các phương pháp, bao gồm AWQ, EETQ, FBGEMM FP8, Fine-grained FP8, Four Over Six, FP-Quant, HIGGS, Metal, MXFP4, NVFP4, Quanto, SINQ và torchao |
llm_int8_skip_modules | bitsandbytes, ở cả chế độ 4-bit và 8-bit |
skip_modules | HQQ |
GPTQ áp dụng cách tiếp cận ngược lại. modules_in_block_to_quantize liệt kê các module cần lượng tử hóa, và mọi thứ khác trong khối sẽ được giữ nguyên không lượng tử hóa.
Khớp tên module
Hầu hết các phương pháp khớp mỗi mục trong danh sách bỏ qua với tên module đầy đủ từ model.named_modules(), chẳng hạn như model.layers.3.mlp.down_proj. HQQ là ngoại lệ và khớp chính xác với tên lớp. Một mục sẽ khớp theo một trong ba cách.
- Dưới dạng hậu tố.
mlp.down_projkhớp với phép chiếu xuống (down projection) trong mọi lớp. - Dưới dạng tiền tố kết thúc tại ranh giới module.
model.layers.1khớp vớimodel.layers.1.mlpnhưng không khớp vớimodel.layers.11.mlp. - Dưới dạng biểu thức chính quy với cùng ranh giới.
model\.layers\.(0|1)khớp với hai lớp đầu tiên.
In tên các module để tìm các mục phù hợp.
for name, _ in model.named_modules():
print(name)Chọn các module cần bỏ qua
Bỏ qua các module mà lỗi làm tròn ảnh hưởng nhiều nhất đến độ chính xác nhưng lại tiết kiệm ít bộ nhớ nhất. Bắt đầu với các giá trị mặc định, đo độ chính xác trên tác vụ của bạn và chỉ thêm các module nếu độ chính xác giảm xuống.
lm_headtạo ra logits cho mọi token trong bảng từ vựng, do đó lỗi ở đây sẽ trực tiếp thay đổi token được chọn. Mặc định, lớp này bị bỏ qua. Trên các mô hình có bảng từ vựng lớn, đây cũng là một trong những lớp đơn lẻ lớn nhất, nên lượng hóa nó sẽ tiết kiệm đáng kể bộ nhớ nếu độ chính xác được duy trì.- Các lớp router hoặc gate của MoE, chẳng hạn như
mlp.gatetrong Qwen3-MoE hoặcmlp.routertrong gpt-oss, quyết định token nào sẽ được gửi đến chuyên gia nào. Chúng rất nhỏ, và một sai số làm tròn có thể khiến token bị gửi đến chuyên gia sai, vì vậy chúng gần như luôn đáng để bỏ qua. - Bộ mã hóa thị giác và bộ chiếu đa phương thức trong các mô hình ngôn ngữ-thị giác có kích thước nhỏ so với mô hình ngôn ngữ, và các lỗi ở đó sẽ làm méo mọi token hình ảnh. Hãy bỏ qua chúng nếu khả năng hiểu hình ảnh bị suy giảm.
- Một vài lớp decoder đầu tiên và cuối cùng thường có nhiều ngoại lệ kích hoạt hơn so với các lớp ở giữa. Hãy bỏ qua chúng khi độ chính xác của mô hình đã lượng tử hóa kém hơn rõ rệt so với bf16.
Mọi module bạn bỏ qua sẽ giữ nguyên độ chính xác ban đầu và tiêu tốn bộ nhớ. Hãy kiểm tra xem mô hình có vừa với bộ nhớ sau khi bạn thêm vào danh sách bỏ qua hay không.
Update on GitHub