Transformers documentation

GPTQ

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

GPTQ

Dự án GPT-QModel (gói Python gptqmodel) triển khai thuật toán GPTQ, một kỹ thuật lượng tử hóa sau huấn luyện, trong đó mỗi hàng của ma trận trọng số được lượng tử hóa độc lập để tìm phiên bản trọng số làm giảm thiểu sai số. Các trọng số này được lượng tử hóa xuống int4, nhưng chúng được khôi phục về fp16 ngay lập tức trong quá trình suy luận. Điều này có thể tiết kiệm 4 lần dung lượng bộ nhớ vì các trọng số int4 được khử lượng tử hóa trong một kernel hợp nhất thay vì trong bộ nhớ toàn cục của GPU. Quá trình suy luận cũng nhanh hơn vì độ rộng bit thấp hơn cần ít thời gian hơn để truyền thông.

AutoGPTQ không còn được hỗ trợ trong Transformers. Hãy cài đặt GPT-QModel thay thế.

Trước tiên, hãy cài đặt Accelerate, Transformers và Optimum.

pip install --upgrade accelerate optimum transformers

Sau đó, chạy lệnh bên dưới để cài đặt GPT-QModel.

pip install gptqmodel --no-build-isolation

Tạo một lớp GPTQConfig và đặt số bit để lượng tử hóa, một bộ dữ liệu để hiệu chỉnh trọng số cho lượng tử hóa, và một tokenizer để chuẩn bị bộ dữ liệu.

from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig

tokenizer = AutoTokenizer.from_pretrained("facebook/opt-125m")
gptq_config = GPTQConfig(bits=4, dataset="c4", tokenizer=tokenizer)

Bạn có thể truyền dataset của riêng mình dưới dạng danh sách các chuỗi, nhưng rất khuyến khích sử dụng cùng một dataset từ bài báo GPTQ.

dataset = ["gptqmodel is an easy-to-use model quantization library with user-friendly apis, based on the GPTQ algorithm."]
gptq_config = GPTQConfig(bits=4, dataset=dataset, tokenizer=tokenizer)

Tải một model để lượng tử hóa và truyền GPTQConfig vào from_pretrained(). Đặt device_map="auto" để tự động offload model sang CPU, giúp model vừa với bộ nhớ, và cho phép các module của model được di chuyển giữa CPU và GPU để lượng tử hóa.

quantized_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m", device_map="auto", quantization_config=gptq_config)

Nếu bạn đang hết bộ nhớ vì một tập dữ liệu quá lớn (không hỗ trợ offloading xuống đĩa), hãy thử truyền tham số max_memory để phân bổ lượng bộ nhớ cần sử dụng trên thiết bị của bạn (GPU và CPU).

quantized_model = AutoModelForCausalLM.from_pretrained(
    "facebook/opt-125m",
    device_map="auto",
    max_memory={0: "30GiB", 1: "46GiB", "cpu": "30GiB"},
    quantization_config=gptq_config
)

Tùy thuộc vào phần cứng của bạn, việc lượng tử hóa một mô hình từ đầu có thể mất một khoảng thời gian nhất định. Trên GPU thuộc gói miễn phí của Google Colab, việc lượng tử hóa mô hình facebook/opt-350m có thể mất khoảng 5 phút, nhưng sẽ mất khoảng 4 giờ để lượng tử hóa một mô hình có 175 tỷ tham số trên NVIDIA A100. Trước khi lượng tử hóa một mô hình, bạn nên kiểm tra trên Hub xem đã có phiên bản GPTQ-quantized của mô hình đó hay chưa.

Khi một model đã được lượng tử hóa, bạn có thể sử dụng push_to_hub() để đẩy model và tokenizer lên Hub, nơi chúng có thể được chia sẻ và truy cập dễ dàng. Thao tác này sẽ lưu lại GPTQConfig.

quantized_model.push_to_hub("opt-125m-gptq")
tokenizer.push_to_hub("opt-125m-gptq")

save_pretrained() lưu mô hình đã lượng tử hóa cục bộ. Nếu mô hình được lượng tử hóa với tham số device_map, hãy đảm bảo di chuyển toàn bộ mô hình sang GPU hoặc CPU trước khi lưu. Ví dụ bên dưới lưu mô hình trên CPU.

quantized_model.save_pretrained("opt-125m-gptq")
tokenizer.save_pretrained("opt-125m-gptq")

# if quantized with device_map set
quantized_model.to("cpu")
quantized_model.save_pretrained("opt-125m-gptq")

Tải lại một mô hình đã lượng tử hóa bằng from_pretrained(), và đặt device_map="auto" để tự động phân phối mô hình trên tất cả các GPU khả dụng, giúp tải mô hình nhanh hơn mà không sử dụng nhiều bộ nhớ hơn mức cần thiết.

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("{your_username}/opt-125m-gptq", device_map="auto")

Marlin

Marlin là kernel CUDA GPTQ chỉ hỗ trợ 4-bit, được tối ưu hóa cao cho kiến trúc GPU NVIDIA A100 (Ampere). Các thao tác nạp, khử lượng hóa và thực thi trọng số sau khử lượng hóa được song song hóa cao, mang lại cải thiện đáng kể về suy luận so với kernel CUDA GPTQ gốc. Marlin chỉ khả dụng cho suy luận đã lượng hóa và không hỗ trợ lượng hóa mô hình.

Suy luận Marlin có thể được kích hoạt bằng tham số backend trong GPTQConfig.


from transformers import AutoModelForCausalLM, GPTQConfig

model = AutoModelForCausalLM.from_pretrained("{your_username}/opt-125m-gptq", device_map="auto", quantization_config=GPTQConfig(bits=4, backend="marlin"))

GPT-QModel

GPT-QModel là backend đang được bảo trì tích cực cho GPTQ trong Transformers. Nó ban đầu được fork từ AutoGPTQ, nhưng sau đó đã phân kỳ với những cải tiến đáng kể như lượng tử hóa nhanh hơn, mức sử dụng bộ nhớ thấp hơn và các giá trị mặc định chính xác hơn.

GPT-QModel cung cấp lượng tử hóa bất đối xứng, có khả năng giảm sai số lượng tử hóa so với lượng tử hóa đối xứng. Nó không tương thích ngược với các checkpoint AutoGPTQ cũ, và không phải tất cả các kernel (Marlin) đều hỗ trợ lượng tử hóa bất đối xứng.

GPT-QModel cũng hỗ trợ rộng rãi hơn cho các mô hình LLM mới nhất, các mô hình đa phương thức (Qwen2-VL và Ovis1.6-VL), các nền tảng (Linux, macOS, Windows 11) và phần cứng (AMD ROCm, Apple Silicon, CPU Intel/AMD, và GPU Intel Datacenter Max/Arc, v.v.).

Các kernel Marlin cũng được cập nhật cho GPU A100 và các kernel khác được cập nhật để bao gồm auto-padding cho các mô hình cũ và các mô hình có in/out-features không đồng nhất.

Tài nguyên

Chạy lượng tử hóa GPTQ với notebook PEFT để có trải nghiệm thực hành.

Update on GitHub