FP8
Tìm hiểu FP8 là gì, E4M3 và E5M2 hoạt động như thế nào, cũng như cách scaling, hỗ trợ phần cứng và mixed precision cải thiện training và inference AI.
FP8, hay số dấu phẩy động 8-bit, là một định dạng số có độ chính xác thấp, lưu trữ mỗi giá trị bằng tám bit. Các hệ thống AI sử dụng FP8 để giảm lưu lượng bộ nhớ và tăng tốc phép nhân ma trận, phép tích chập cùng các phép toán tốn kém khác trên phần cứng tương thích. So với FP16 hoặc FP32, FP8 biểu diễn ít giá trị phân biệt hơn, vì vậy các workflow FP8 hiệu quả kết hợp tính toán nhanh với độ chính xác thấp cùng việc scaling và các phép toán có độ chính xác cao hơn được lựa chọn để duy trì chất lượng model.
Cách FP8 biểu diễn số#
Một giá trị dấu phẩy động gồm dấu, số mũ kiểm soát phạm vi và phần định trị kiểm soát mức độ chi tiết. FP8 thường xuất hiện ở hai định dạng được mô tả trong các kiểu dữ liệu dấu phẩy động của PyTorch:
- E4M3: Một bit dấu, bốn bit số mũ và ba bit phần định trị. Định dạng này cung cấp nhiều chi tiết số hơn nhưng có phạm vi hẹp hơn.
- E5M2: Một bit dấu, năm bit số mũ và hai bit phần định trị. Định dạng này bao phủ phạm vi rộng hơn nhưng làm tròn giá trị mạnh hơn.
E4M3 thường phù hợp với weights và activations, trong khi E5M2 có thể đáp ứng tốt hơn gradients với phạm vi giá trị lớn. Các biến thể chính xác khác nhau giữa các nền tảng, như được trình bày trong tài liệu về số dấu phẩy động độ chính xác thấp của AMD, vì vậy một model FP8 không tự động portable giữa mọi accelerator và runtime.
Vì tám bit không thể biểu diễn đầy đủ phạm vi và độ chi tiết ban đầu của một tensor, các framework thường nhân các giá trị với một hệ số scaling trước khi chuyển đổi. Tài liệu nhập môn về scaling FP8 của NVIDIA mô tả các chiến lược như delayed scaling, trong đó các scale tương lai được suy ra từ các giá trị cực đại đã quan sát trước đó. Scaling hạn chế overflow, underflow và saturation mà không yêu cầu mọi phép toán phải chạy ở độ chính xác cao hơn.
FP8 so với các định dạng liên quan#
FP8 nằm ở vị trí trung gian trong số các kiểu dữ liệu AI phổ biến:
- FP16 hoặc độ chính xác half: Sử dụng số bit gấp đôi, cung cấp nhiều chi tiết số hơn và nhìn chung đơn giản hơn cho quá trình training. FP8 có thể giảm thêm dung lượng lưu trữ và băng thông, nhưng đòi hỏi scaling cẩn thận hơn.
- BF16: Duy trì phạm vi số mũ rộng đồng thời cung cấp ít chi tiết phần thập phân hơn FP16. BF16 thường được dùng làm định dạng có độ chính xác cao hơn đi kèm trong quá trình training FP8.
- INT8: Biểu diễn số nguyên thay vì giá trị dấu phẩy động. Model quantization với INT8 thường dựa vào các scale để ánh xạ giá trị thực lên các mức số nguyên cố định, trong khi FP8 giữ lại số mũ để tạo khoảng cách không đồng đều một cách tự nhiên.
- FP4: Chỉ sử dụng bốn bit và có thể cung cấp mức compression cao hơn, nhưng phạm vi và độ hạt cực kỳ hạn chế thường khiến việc duy trì độ chính xác trở nên khó khăn hơn.
FP8 thường là một phần của workflow độ chính xác hỗn hợp thay vì là kiểu dữ liệu cho mọi tensor. Các phép tích lũy, phép chuẩn hóa, trạng thái optimizer hoặc các layer nhạy cảm có thể vẫn sử dụng BF16, FP16 hoặc FP32. Ngoài ra, độ chính xác số học khác với metric đánh giá độ chính xác, vốn đo lường có bao nhiêu dự đoán dương tính của model là chính xác.
Các ứng dụng trong thực tế#
Hai ứng dụng thực tế dưới đây minh họa lý do FP8 quan trọng:
-
Training model lớn: Quá trình training Transformer liên tục thực hiện các phép nhân ma trận lớn. Một framework hỗ trợ FP8 có thể chuyển các weights và activations phù hợp sang FP8, đồng thời giữ độ chính xác cao hơn ở những vị trí cần thiết để đảm bảo tính ổn định. Điều này làm giảm nhu cầu băng thông và có thể tăng throughput training. Workflow training lượng tử hóa TorchAO bao gồm các lựa chọn scaling theo tensor và theo hàng, giúp đánh đổi tốc độ tối đa với khả năng xử lý outlier tốt hơn.
-
Vision inference throughput cao: Một data center có thể chạy object detection trên hàng trăm stream video bán lẻ, giao thông hoặc sản xuất. Các kernel hỗ trợ FP8 có thể giảm thời gian và bộ nhớ được sử dụng bởi các layer phù hợp của model, qua đó có khả năng giảm inference latency và tăng capacity cho các stream chạy đồng thời. Hướng dẫn về các kiểu lượng tử hóa của TensorRT giải thích cách các phép toán quantize và dequantize tường minh mô tả quá trình thực thi FP8.
Rủi ro số học và hỗ trợ phần cứng#
Scaling không phù hợp có thể khiến các giá trị lớn bị saturation và các giá trị nhỏ bị làm tròn về 0. Outlier đặc biệt gây vấn đề khi một scale bao phủ toàn bộ tensor. Những ảnh hưởng này có thể làm thay đổi confidence score, gây mất ổn định cho quá trình training hoặc làm giảm độ chính xác detection, vì vậy developer nên kiểm thử model đã chuyển đổi với baseline có độ chính xác cao hơn.
Hỗ trợ phần cứng native cũng quan trọng không kém. Kiến trúc NVIDIA Hopper đã giới thiệu khả năng tăng tốc FP8 bằng Tensor Core, trong khi GPU NVIDIA A100 thế hệ cũ hỗ trợ FP16, BF16 và INT8 nhưng không hỗ trợ tính toán FP8 native. Do đó, cần kiểm tra ma trận hỗ trợ phần cứng của TensorRT trước khi lựa chọn độ chính xác triển khai.
Làm việc với FP8 trong thực tế#
Ví dụ PyTorch nhỏ này minh họa việc chuyển đổi sang E4M3 và sai số làm tròn phát sinh khi các giá trị FP8 được khôi phục về FP32:
import torch
values = torch.tensor([0.1, 1.0, 3.14, 100.0], dtype=torch.float32)
# Convert to E4M3 FP8, then restore the values for comparison.
fp8_values = values.to(torch.float8_e4m3fn)
restored = fp8_values.to(torch.float32)
absolute_error = (restored - values).abs()
print(torch.stack((values, restored, absolute_error), dim=1))Workflow export TensorRT của Ultralytics được tài liệu hóa cung cấp các tùy chọn FP16 và INT8 được calibration cho Ultralytics YOLO, thay vì export FP8 bằng một đối số duy nhất. Do đó, việc triển khai FP8 yêu cầu một toolchain chuyển đổi downstream tương thích. Bất kể chọn độ chính xác nào, hãy sử dụng benchmark mode của Ultralytics trên [GPU](https://ultralytics-translation-2.invalid mục tiêu để so sánh latency, throughput, mức sử dụng bộ nhớ và độ chính xác của task trước khi triển khai production.






