OpenArchLabOpen Architecture — From Models to Systems

D · Mathematical foundation

Hiểu precision và sai số trong phép tính

Đặc tính biểu diễn số thực trên phần cứng (FP32, BF16, FP16, FP8, INT4) và cách kiểm soát sai số làm tròn, tràn số trong mô hình.

LESSON ID numerics GROUP Kiến trúc Inference
Mục lục bài học

1Định nghĩa

Số học máy tính (numerics) trong học sâu giải quyết việc máy tính biểu diễn các giá trị thực bằng số lượng bit hữu hạn. Mỗi kiểu dữ liệu (dtype) chia ngân sách bit giữa phần mũ (exponent — quyết định dải giá trị lớn/nhỏ tối đa) và phần trị (mantissa — quyết định độ mịn hay độ chính xác giữa hai số liền kề).

Ví dụ, BF16 giữ nguyên dải giá trị rộng như FP32 để tránh tràn số (overflow/underflow) khi huấn luyện nhưng giảm độ mịn, trong khi FP8 và INT4 trong lượng tử hóa nén mạnh hơn nữa để tiết kiệm HBM. Để sai số không tích lũy làm lệch bảng điểm logits, các kernels thường nhân ở định dạng thấp nhưng cộng dồn (accumulate) kết quả trung gian ở FP32.

Ví dụ đời thường: Biểu diễn số học máy tính giống như việc chọn thước đo và cách ghi chép sổ sách. Thước dây dài 100 mét đo được cả mảnh đất lớn nhưng vạch chia thưa (giống BF16 có dải rộng nhưng độ mịn vừa phải), còn thước kẹp cơ khí đo chính xác từng phần mười milimét nhưng chỉ kẹp được vật nhỏ (dải hẹp, dễ tràn số); lúc cộng tổng cuối ngày, kế toán luôn cộng trên sổ lớn (FP32) để không bị lệch tiền lẻ.

2Luồng

Sơ đồ luồng (4 bước)
  1. Chọn dtype và reference

    Xác định format và tolerance.

  2. Thực hiện phép tính

    Bao gồm rounding và accumulation.

  3. So số học

    Đo lỗi trên tensors/gradients.

  4. So hành vi model

    Kiểm tra tác vụ sau thay đổi.

Mã Mermaid
flowchart TD
  step1["Chọn dtype và reference"]
  step2["Thực hiện phép tính"]
  step3["So số học"]
  step4["So hành vi model"]
  step1 --> step2
  step2 --> step3
  step3 --> step4

3Giải pháp

Dùng accumulation phù hợp cho tổng lớn; ưu tiên công thức ổn định như log-softmax thay log của softmax tính riêng. Khi huấn luyện với FP16, loss scaling có thể giúp gradients nhỏ.

Không đặt cùng tolerance cho mọi dtype và phép toán; cũng không xem pass numerical test là đủ thay task evaluation.

4Profiling

  • Error và non-finite values

    So absolute/relative error, số NaN và infinity trên inputs đại diện.

  • Task sensitivity

    Xem các nhóm output đổi khi logits chênh nhỏ, nhất là token gần đồng điểm.

Mẹo đo lường: ghim số liệu trên workload thật, ghi cả p50/p95/p99 thay vì chỉ trung bình, và luôn ghi lại điều kiện chạy (batch, cache, đồng thời, phần cứng) trước và sau khi tối ưu. Số đo thiếu điều kiện chạy thì không so sánh được.

5Ví dụ

Cross entropy có logits lớn

Công thức ổn định tránh tính exp quá lớn gây overflow.

Hai token gần bằng nhau

Rounding nhỏ có thể đổi token greedy; cần phân biệt sai số cho phép với chất lượng ứng dụng.

6Thuật ngữ

Overflow / underflow
Giá trị vượt phạm vi biểu diễn hoặc quá nhỏ so với format.
Relative error
Sai số tương đối so với độ lớn của giá trị reference.
Brain Floating Point 16-bit
Format thường gọi BF16; có range và precision khác IEEE half precision FP16.
Glossary (4)
Data type
Kiểu dữ liệu của tensor, quyết định cách biểu diễn số.
Tensor
Mảng số nhiều chiều, như một vector, ma trận hoặc nhóm ma trận.
Logits
Điểm số chưa chuẩn hóa cho các token ứng viên trước khi chọn token.
Kernel
Hàm tính toán chạy trên thiết bị; thường xử lý nhiều phần tử song song.

7Bài liên quan

8Nguồn

9Bài lab

INT8 đối xứng và sai số khôi phục

Tính toán tham chiếu · số học gần đúng

Thêm outlier vào W; quan sát scale, clipping, sai số output và byte payload lý thuyết.

Kết quả mong đợiFP32 payload là 24 bytes; INT8 payload là 6 bytes, cộng 4 bytes scale theo tensor hoặc 8 bytes scale theo hai output channels. Có so sánh sai số hai cách scaling và kiểm tra tensor toàn 0. Các số chưa tính metadata, allocator/workspace; phép nhân vẫn dùng số float sau khôi phục nên không đo tốc độ kernel INT8.

Tải quant.py ↓

quant.pyPYTHON
Python outputSẵn sàng.