FP4
FP4 là định dạng số dấu phẩy động 4 bit, thường là E2M1, sử dụng scale theo từng block để giảm kích thước và tăng tốc model AI. Nội dung đề cập đến NVFP4, MXFP4, phần cứng và code.
FP4 là định dạng số dấu phẩy động 4 bit dùng để lưu trữ và tính toán trọng số cùng activation của mạng nơ-ron trong lượng tử hóa model. Phần cứng và phần mềm AI sử dụng bố cục E2M1: một bit dấu, hai bit số mũ và một bit định trị, chỉ biểu diễn được 0, ±0.5, ±1, ±1.5, ±2, ±3, ±4 và ±6. Mỗi giá trị chiếm một nửa bộ nhớ so với FP8 và một phần tư so với FP16 (độ chính xác bán phần); điều này quan trọng nhất với mô hình ngôn ngữ lớn và các model AI tạo sinh khác có độ trễ inference chủ yếu do việc chuyển trọng số khỏi bộ nhớ chi phối. Phép toán ma trận FP4 gốc xuất hiện cùng GPU Blackwell của NVIDIA và dòng Instinct MI350 của AMD; FP4 được dùng cho cả inference và ngày càng nhiều trong huấn luyện.
Cách thức hoạt động của FP4#
Mười lăm giá trị riêng biệt không thể bao phủ phạm vi của trọng số và activation thực tế, vì vậy mọi định dạng FP4 khả dụng đều chia tensor thành các block nhỏ và lưu một scale dùng chung cho mỗi block, được chọn sao cho độ lớn lớn nhất của block gần bằng mức tối đa 6 của E2M1. Hai định dạng chính khác nhau về kích thước block và độ chính xác của scale:
- MXFP4: Được định nghĩa trong đặc tả Microscaling (MX) của Open Compute Project, MXFP4 nhóm 32 giá trị và dùng chung một scale lũy thừa hai 8 bit (E8M0). Là một đặc tả mở, định dạng này được hỗ trợ trên nhiều nhà cung cấp, bao gồm dòng MI350 của AMD và GPU Blackwell của NVIDIA.
- NVFP4: Định dạng của NVIDIA nhóm 16 giá trị, dùng chung một scale FP8 (E4M3) và bổ sung một scale FP32 thứ hai cho mỗi tensor. Block nhỏ hơn và scale tinh hơn giúp giảm lỗi lượng tử hóa; NVIDIA báo cáo mức suy giảm độ chính xác không quá 1% so với FP8 trên các benchmark DeepSeek-R1-0528.
Đoạn mã dưới đây làm tròn một tensor có một vài giá trị ngoại lai về các giá trị E2M1 bằng một scale cho toàn tensor, sau đó lần lượt dùng một scale cho mỗi 32 và 16 giá trị, tương ứng với kích thước block của MXFP4 và NVFP4:
import torch
# The eight non-negative values FP4 E2M1 can represent; the sign bit mirrors them
grid = torch.tensor([0.0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0])
torch.manual_seed(0)
x = torch.randn(4096)
x[::512] *= 20 # a few large outliers, as real weight and activation tensors have
# One shared scale for the whole tensor, then MXFP4-sized and NVFP4-sized blocks
for block in [4096, 32, 16]:
blocks = x.reshape(-1, block)
scale = blocks.abs().amax(dim=1, keepdim=True) / 6.0 # map each block's largest value to 6
nearest = ((blocks.abs() / scale).unsqueeze(-1) - grid).abs().argmin(dim=-1)
dequantized = grid[nearest] * blocks.sign() * scale
error = (dequantized.flatten() - x).abs().mean()
print(f"Block size {block:>4}: mean absolute error {error:.4f}")Với một scale cho toàn tensor, các giá trị ngoại lai kéo giãn scale đến mức hầu hết giá trị thông thường bị làm tròn thành không, tạo ra sai số tuyệt đối trung bình 0.7238. Block gồm 32 và 16 giá trị giữ mỗi giá trị ngoại lai trong một block riêng, nhờ đó các block còn lại duy trì scale tinh hơn và sai số giảm xuống lần lượt còn 0.0901 và 0.0747.
Inference và huấn luyện FP4#
Đối với inference, một inference engine như TensorRT lượng tử hóa trọng số, thường cả activation, sang FP4 sau khi huấn luyện; thực hiện phép nhân ma trận bằng FP4 và tích lũy kết quả ở độ chính xác cao hơn. Các cấu hình NVFP4 và MXFP4 của TorchAO hỗ trợ cùng quy trình này trong PyTorch trên các GPU được hỗ trợ. OpenAI phát hành gpt-oss-120b với trọng số mixture-of-experts được hậu huấn luyện bằng MXFP4, cho phép model 117 tỷ tham số chạy trên một GPU 80 GB.
Huấn luyện bằng FP4 mở rộng huấn luyện độ chính xác hỗn hợp xuống 4 bit và khó hơn inference vì phạm vi gradient và activation thay đổi trong suốt quá trình huấn luyện. Nghiên cứu tiền huấn luyện NVFP4 của NVIDIA đã huấn luyện một model 12 tỷ tham số trên 10 nghìn tỷ token bằng NVFP4, đạt loss huấn luyện và độ chính xác trên các tác vụ phía sau tương đương baseline FP8 nhờ kết hợp biến đổi Hadamard ngẫu nhiên để phân tán giá trị ngoại lai, làm tròn ngẫu nhiên cho gradient và giữ một vài lớp ở độ chính xác cao hơn.
Triển khai model FP4#
Tensor core FP4 gốc cần GPU NVIDIA Blackwell trở lên, chẳng hạn B200 và dòng GeForce RTX 50, hoặc bộ tăng tốc AMD Instinct MI350 cho MXFP4; GPU Hopper như H100 tăng tốc FP8 nhưng không hỗ trợ FP4. Ma trận hỗ trợ TensorRT liệt kê độ chính xác mà từng GPU hỗ trợ. Cần kiểm tra độ chính xác sau khi chuyển đổi và trước khi triển khai model, vì các lớp nhạy hoặc model nhỏ có thể suy giảm; huấn luyện có nhận biết lượng tử hóa giúp khôi phục độ chính xác khi lượng tử hóa sau huấn luyện chưa đủ. TensorRT export của Ultralytics YOLO26 tạo engine ở FP16 với quantize=16 hoặc INT8 với quantize=8, là các tùy chọn độ chính xác thấp mà sản phẩm cung cấp cho model YOLO.
FP4 và các định dạng liên quan#
- FP8: FP8 (E4M3 hoặc E5M2) có nhiều giá trị riêng biệt hơn và phạm vi rộng hơn; do huấn luyện FP8 được áp dụng rộng rãi cho các model lớn, FP8 thường là baseline dùng để so sánh kết quả FP4.
- BFloat16: BF16 vẫn là định dạng tiêu chuẩn để huấn luyện và phục vụ model lớn với chất lượng đầy đủ, dùng số bit gấp bốn lần FP4.
- INT4: INT4 phân bố đều 16 mức, trong khi FP4 tập trung nhiều mức hơn gần số không, nơi phần lớn trọng số và activation nằm ở đó. INT4 vẫn phổ biến để nén riêng trọng số của model ngôn ngữ bằng các phương pháp như GPTQ và AWQ.
- Socket FP4 của AMD: FP4 cũng là tên một socket bộ xử lý laptop AMD không liên quan, tức package được dùng trong các APU di động thế hệ Carrizo như FX-8800P.










