Transformers documentation

FP8 chi tiết

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

FP8 chi tiết

Lượng tử hóa FP8 chi tiết lượng tử hóa các trọng số và kích hoạt xuống fp8.

  • Các trọng số được lượng tử hóa xuống 8-bit cho mỗi khối 2D (weight_block_size=(128, 128)).
  • Các kích hoạt được lượng tử hóa xuống 8-bit cho mỗi nhóm trên mỗi token. Giá trị nhóm khớp với trọng số trong kênh đầu vào (mặc định là 128).

Lượng tử hóa FP8 cho phép hỗ trợ DeepSeek-V3 và DeepSeek-R1.

Bạn cần một GPU có Compute Capability>=9 (H100) và cài đặt phiên bản PyTorch tương thích với phiên bản CUDA của GPU đó.

Cài đặt Accelerate và nâng cấp lên phiên bản mới nhất của PyTorch.

pip install --upgrade accelerate torch

Tạo một lớp FineGrainedFP8Config và truyền nó vào from_pretrained() để lượng tử hóa. Mặc định, các trọng số được nạp ở độ chính xác đầy đủ (torch.float32) bất kể kiểu dữ liệu thực tế mà các trọng số được lưu trữ. Đặt dtype="auto" để nạp các trọng số ở kiểu dữ liệu được định nghĩa trong tệp config.json của mô hình, nhằm tự động nạp kiểu dữ liệu tối ưu bộ nhớ nhất.

from transformers import FineGrainedFP8Config, AutoModelForCausalLM, AutoTokenizer

model_name = "meta-llama/Meta-Llama-3-8B"
quantization_config = FineGrainedFP8Config()
quantized_model = AutoModelForCausalLM.from_pretrained(model_name, dtype="auto", device_map="auto", quantization_config=quantization_config)

tokenizer = AutoTokenizer.from_pretrained(model_name)
input_text = "What are we having for dinner?"
input_ids = tokenizer(input_text, return_tensors="pt").to(quantized_model.device.type)

output = quantized_model.generate(**input_ids, max_new_tokens=10)
print(tokenizer.decode(output[0], skip_special_tokens=True))

Sử dụng save_pretrained() để lưu mô hình đã lượng tử hóa và tải lại bằng from_pretrained().

quant_path = "/path/to/save/quantized/model"
quantized_model.save_pretrained(quant_path)
model = AutoModelForCausalLM.from_pretrained(quant_path, device_map="auto")

Đường dẫn nhanh DeepGEMM

Trên GPU Hopper (SM90+) và Blackwell (SM100+), mọi tuyến tính FP8 sẽ tự động chuyển đến các kernel DeepGEMM từ kernels-community/deep-gemm khi weight_block_size=(128, 128) và activation_scheme="dynamic". DeepGEMM nhanh hơn 3-6 lần so với phương án dự phòng Triton. Cài đặt hoặc nâng cấp gói kernels để bật tính năng này.

pip install -U kernels

DeepGEMM biên dịch JIT các kernel của nó bằng nvcc của hệ thống, do đó phải cài đặt đầy đủ bộ công cụ CUDA. Việc chỉ cài đặt thư viện thời gian chạy (các thư viện CUDA không có nvcc) sẽ không hoạt động. Phiên bản tối thiểu của bộ công cụ phụ thuộc vào phần cứng: 12.3 trở lên trên Hopper (SM90), 12.9 trở lên trên Blackwell (SM100).

Transformers tìm bộ công cụ bằng cách kiểm tra CUDA_HOME, sau đó là CUDA_PATH, tiếp theo là nvcc trong PATH của bạn, và cuối cùng là /usr/local/cuda. Hãy đặt CUDA_HOME về thư mục gốc của bộ công cụ nếu nvcc không được phát hiện.

Nếu kernel không thể nạp (thiếu kernels, GPU không được hỗ trợ, không có CUDA toolkit, hoặc nvcc cũ hơn phiên bản yêu cầu), Transformers sẽ ghi log một cảnh báo duy nhất và chuyển sang sử dụng kernel Triton finegrained-fp8. Lượng tử hóa kích hoạt tĩnh luôn được thực hiện trên đường dẫn Triton.

Để buộc sử dụng phương án dự phòng Triton ngay cả khi DeepGEMM khả dụng, hãy đặt TRANSFORMERS_DISABLE_DEEPGEMM_LINEAR=1. Thao tác này chỉ ảnh hưởng đến việc điều phối tuyến tính FP8 và giữ nguyên backend chuyên gia "deepgemm", mà bạn có thể chuyển đổi bằng set_experts_implementation().

Đối với các chuyên gia MoE, đường dẫn DeepGEMM là tùy chọn. Truyền experts_implementation="deepgemm" (hoặc "deepgemm_megamoe" trên Blackwell) khi tải để định tuyến các phép nhân ma trận chuyên gia qua DeepGEMM. Xem hướng dẫn Backends cho chuyên gia để biết đầy đủ các tùy chọn.

Định dạng thang đo UE8M0

Checkpoint theo phong cách DeepSeek V4 lưu trữ thang đo trọng số FP8 ở định dạng đóng gói float8_e8m0fnu thay vì float32. Các checkpoint này đã được lượng tử hóa trước và đặt scale_fmt="ue8m0" trong cấu hình lượng tử hóa. Cả hai kernel DeepGEMM và Triton đều đọc thang đo UE8M0, do đó các checkpoint này chạy được trên cả hai đường dẫn.

Trên Blackwell (SM100+), các kernel chuyên gia của DeepGEMM chỉ hỗ trợ scale UE8M0. Một checkpoint có scale float32 thông thường (scale_fmt="float") sẽ gây ra ValueError. Hãy sử dụng checkpoint scale_fmt="ue8m0", hoặc chạy các chuyên gia bằng grouped_mm hoặc batched_mm, vốn hỗ trợ trực tiếp scale float32. Hopper (SM90+) hỗ trợ scale float32 trên đường dẫn DeepGEMM mà không cần chuyển đổi. Xem hướng dẫn Các backend chuyên gia để biết các tùy chọn backend chuyên gia.

Update on GitHub