Nền tảng Máy tính
Một bảng thông số kỹ thuật thường nêu thông lượng đỉnh; nhưng khối lượng công việc (workload) gần như không bao giờ đạt được mức đó. Để thu hẹp khoảng cách, cần biết giới hạn vật lý nào kìm hãm việc thực thi trước tiên: độ trễ, băng thông bộ nhớ, cường độ tính toán hay năng lượng. Phụ lục này tập hợp các mô hình phần cứng ổn định và các giá trị theo bậc độ lớn, làm điểm tựa cho lập luận trên một nút đơn xuyên suốt cuốn sách. Nó cung cấp các chuẩn toán học để kiểm tra hoặc mở rộng các ước tính trong các chương. Các mô hình này giả định người đọc có nền tảng kiến trúc máy tính ở bậc đại học, đặc biệt là về hệ thống phân cấp bộ nhớ.
Cách sử dụng Phụ lục này
Phụ lục này được dùng như tài liệu tham khảo. Khi chẩn đoán vấn đề hiệu suất, hãy dùng phụ lục này để chuyển một triệu chứng mơ hồ (“nó chậm”) thành một ràng buộc cụ thể (“bị giới hạn bởi bộ nhớ khi kích thước batch là một”), rồi chọn đúng đòn bẩy có thể tạo ra thay đổi.
Các quy ước ở đây tuân theo ký hiệu dùng chung trong toàn bộ sách (ví dụ, \(B\) đại diện cho kích thước batch và \(\text{BW}\) cho băng thông).
- Kiểm tra tính khả thi: Bắt đầu với section 1.1 để tham khảo các con số theo bậc độ lớn.
- Chẩn đoán giới hạn chi phối: Sử dụng Mô hình Roofline trong section 1.2.1 để xác định xem khối lượng công việc (workload) bị giới hạn bởi tính toán (compute-bound) hay bởi bộ nhớ (memory-bound).
- Suy luận về các giới hạn mở rộng: Sử dụng Định luật Amdahl và Gustafson trong section 1.2.3 để hiểu lý do việc thêm bộ tăng tốc có thể không làm giảm thời gian huấn luyện.
- Chọn độ chính xác phù hợp: Sử dụng section 1.4.1 để suy luận về sự đánh đổi giữa FP32, BF16/FP16 và INT8 trong một hệ thống.
- Tham khảo nội dung chi tiết của chương: Để có cái nhìn đầy đủ, hãy xem Tăng tốc phần cứng, Huấn luyện mô hình và Phục vụ mô hình.
Dù phần cứng hiện đại rất đa dạng về kiến trúc bộ tăng tốc, cấu trúc liên kết kết nối và tùy chọn đóng gói, các định luật vật lý và các mô hình điểm nghẽn trình bày tại đây vẫn chi phối tất cả.
Các con số cần biết
Tương tự như danh sách “Latency Numbers Every Programmer Should Know”1 của Jeff Dean đã định hình cả một thế hệ kỹ sư hệ thống, những con số tham chiếu này giúp hình thành trực giác theo bậc độ lớn, rất cần cho thiết kế hệ thống ML. Dù các giá trị tuyệt đối và tỷ lệ có thể thay đổi theo công nghệ và khối lượng công việc (workload), nhưng thứ bậc thì bền vững hơn. Hãy ghi nhớ các mối quan hệ; dùng các con số cụ thể để kiểm tra tính hợp lý.
1 Jeff Dean: Là Nghiên cứu viên cao cấp của Google và là một trong những kiến trúc sư của cơ sở hạ tầng hệ thống phân tán của Google, bao gồm MapReduce, BigTable và TensorFlow. Các con số độ trễ của ông, ban đầu được trình bày cùng với Peter Norvig vào khoảng năm 2010, đã trở thành tài liệu tham khảo kinh điển cho các kỹ sư hệ thống. Các con số này đã được cập nhật qua nhiều năm khi phần cứng phát triển, nhưng thứ bậc độ trễ vẫn ổn định đáng kể; trực quan hóa tương tác của Colin Scott cho thấy thứ bậc độ trễ qua các thế hệ phần cứng (Scott 2012).
Systems Perspective 1.1: Ba con số quan trọng nhất
- Tỷ lệ năng lượng: Theo tài liệu tham khảo 45 nm đã dẫn, một thao tác đọc DRAM 32-bit tiêu tốn năng lượng gấp khoảng ~581× lần so với một phép nhân FP16. Điều này cho thấy vì sao cần tăng mật độ tính toán.
- Dung lượng bộ nhớ cho trạng thái huấn luyện: Bao gồm trọng số mô hình (2 bytes FP16) + gradients (2 bytes FP16) + trọng số chính (4 bytes FP32) + trạng thái optimizer cho Adaptive Moment Estimation (Adam) với 8 bytes. Tổng cộng, mỗi tham số cần 16 bytes. Vì vậy, một mô hình 7B cần 112 GB chỉ để bắt đầu huấn luyện.
- Giới hạn truyền dẫn sợi quang: Ánh sáng truyền trong sợi quang với tốc độ khoảng 200 km/ms. Chuyến đi khứ hồi xuyên quốc gia khoảng 40 ms được nêu trong bảng có bao gồm phần chi phí phụ có thể giảm bớt, nhưng bản thân truyền dẫn thì không thể tối ưu hóa để loại bỏ.
Các mối quan hệ tham chiếu
Các mối quan hệ này kết hợp các giới hạn vật lý hoặc số học với các phép đo đặc thù công nghệ; chỉ các giới hạn là bất biến.
Chi phí do tốc độ ánh sáng
Table 1 trình bày các mốc thời gian khứ hồi xấp xỉ. Phần thời gian do truyền dẫn là không thể giảm bớt.
| Khoảng cách | Độ trễ khứ hồi | Ý nghĩa |
|---|---|---|
| Cùng trung tâm dữ liệu | ~1 ms | Huấn luyện phân tán khả thi |
| Xuyên quốc gia (US) | ~40 ms | Giảm ngân sách yêu cầu còn lại |
| Xuyên Đại Tây Dương | ~60 ms | Giảm thêm ngân sách yêu cầu |
| Xuyên Thái Bình Dương | ~100 ms | Tính cục bộ của dữ liệu là rất quan trọng |
Hệ thống phân cấp năng lượng
Table 2 định lượng chi phí năng lượng của việc di chuyển dữ liệu so với tính toán—lý do cơ bản vì sao cường độ số học chi phối tối ưu hóa hiệu suất ML.2
2 Nguồn hệ thống phân cấp năng lượng: Các giá trị DRAM và số học lấy từ Horowitz (2014) (45 nm). Tỷ lệ L1 SRAM/thanh ghi là một mốc tham chiếu minh họa cho hệ thống phân cấp, không phải số đo của Horowitz. Tỷ lệ tiêu đề so sánh một lần truy cập DRAM 32-bit với một phép nhân dấu phẩy động 16-bit. Cả giá trị tuyệt đối lẫn tỷ lệ đều thay đổi theo quy trình, mạch, công nghệ bộ nhớ và độ rộng toán hạng; độ dài dây dẫn giúp giải thích vì sao việc di chuyển dữ liệu vẫn tốn kém.
| Mối quan hệ | Tỷ lệ tham chiếu | Nguồn và Giải thích |
|---|---|---|
| Truy cập DRAM so với phép nhân FP16 | ~581× | Horowitz 45 nm; điện dung dây dẫn tỷ lệ với khoảng cách |
| Năng lượng FP32 so với INT8 | ~18× | Horowitz 45 nm; độ rộng bit xác định năng lượng chuyển mạch |
| Năng lượng FP32 so với FP16 | ~3.4× | Horowitz 45 nm; số học hẹp hơn làm giảm năng lượng chuyển mạch và đường dẫn dữ liệu |
| L1 SRAM so với register | ~5× | Điểm neo hệ thống phân cấp trên chip minh họa; khoảng cách đến đơn vị số học |
Hệ thống phân cấp bộ nhớ
Table 3 cho thấy vì sao hệ thống phân cấp bộ nhớ không đồng đều: các chặng gần trên cùng gói có thể chỉ chênh nhau vài lần, trong khi các tầng ngoài chip, lưu trữ và mạng lại tạo ra các bước nhảy chênh lệch tới hàng bậc độ lớn.
| Mối quan hệ | Tỷ lệ | Tại sao nó tồn tại |
|---|---|---|
| Bộ nhớ băng thông cao của bộ tăng tốc so với register | ~1000× chậm hơn | Trên chip so với ngoài chip |
| SSD so với register | ~300,000× chậm hơn | Điện tử so với cơ khí/flash |
| Mạng so với bộ nhớ cục bộ | ~16× chậm hơn | Tốc độ ánh sáng + chuyển mạch |
| Băng thông bộ nhớ của bộ tăng tốc so với liên kết CPU\(\leftrightarrow\)Bộ tăng tốc | ~52× nhanh hơn | Ưu tiên đầu tư kiến trúc |
Các quy luật mở rộng
Table 4 tổng hợp các mối quan hệ số học quy định yêu cầu bộ nhớ và tính toán cho huấn luyện và suy luận.3
3 Bộ nhớ huấn luyện (Adam): Quy tắc 16 byte/mỗi tham số áp dụng cho huấn luyện độ chính xác hỗn hợp với Adam. ZeRO có thể giảm bộ nhớ trên mỗi bộ tăng tốc bằng cách chia nhỏ trạng thái optimizer giữa các bộ tăng tốc, nhưng tổng bộ nhớ trên toàn bộ các bộ tăng tốc vẫn khoảng ~16\(\times\) tham số.
| Quy tắc | Công thức | Ví dụ |
|---|---|---|
| Bộ nhớ suy luận (FP16) | 2 bytes\(\times\) tham số | 7B tham số → 14 GB |
| Bộ nhớ suy luận (INT8) | 1 byte\(\times\) tham số | 7B tham số → 7 GB |
| Bộ nhớ huấn luyện (Adam) | 16 bytes\(\times\) tham số | 7B tham số → 112 GB |
| FLOPs suy luận (transformer) | ~2\(\times\) tham số trên mỗi token | mô hình 7B → ~14 GFLOPs/token |
| FLOPs huấn luyện | ~6\(\times\) tham số\(\times\) token | 7B trên 1T token → \(4 \times 10^{22}\) FLOPs |
Ngân sách độ trễ minh họa
Ngân sách độ trễ phụ thuộc vào các yêu cầu an toàn riêng của từng ứng dụng, kỳ vọng người dùng và mục tiêu mức dịch vụ. Table 5 liệt kê các mục tiêu minh họa thay vì giới hạn phổ quát.
| Ứng dụng | Ngân sách | Ràng buộc |
|---|---|---|
| Phanh tự động | <10 ms | Ở tốc độ 100 km/h, 10 ms = 28 cm quãng đường di chuyển |
| Trợ lý giọng nói | <100 ms | Nhận thức của con người về “ngay lập tức” |
| Tìm kiếm web | <200 ms | Ngưỡng kiên nhẫn của người dùng |
| Truyền phát video | <1 s | Khả năng chịu đựng bộ đệm |
| Huấn luyện theo batch | hàng giờ–hàng ngày | Thông lượng chiếm ưu thế hơn độ trễ |
Tham chiếu phần cứng hiện tại (khoảng năm 2024)
Những con số này phản ánh thế hệ phần cứng hiện tại. Hãy dùng chúng để tính toán sơ bộ và kiểm tra lại với phần cứng hiện tại.
Độ trễ và băng thông bộ nhớ
Table 6 trình bày các giá trị độ trễ và băng thông tiêu biểu ở các cấp khác nhau trong hệ thống phân cấp bộ nhớ.
| Cấp độ | Độ trễ | Băng thông |
|---|---|---|
| Thanh ghi | ~0.3 ns | — |
| L1 Cache | ~1 ns | — |
| L2 Cache | ~4 ns | — |
| GPU HBM3 | ~300 ns | 3.4 TB/s |
| PCIe Gen5 (CPU\(\leftrightarrow\)GPU) | ~1000 ns | 64 GB/s |
| CPU DRAM | ~100 ns | 50 GB/s |
| InfiniBand (mạng) | ~5000 ns | 50 GB/s |
| NVMe SSD | ~100000 ns | 7 GB/s |
Thông lượng tính toán
Table 7 so sánh thông lượng đỉnh và công suất tiêu biểu của GPU trung tâm dữ liệu và NPU di động.
| Nền tảng | FP16/BF16 | INT8/FP8-class | Công suất |
|---|---|---|---|
| GPU trung tâm dữ liệu (H100) | 989 TFLOP/s | 1979 TFLOP/s (đỉnh FP8) | 700 W |
| GPU trung tâm dữ liệu (A100) | 312 TFLOP/s | 624 TOPS | 400 W |
| NPU di động | — | 35 TOPS | 3–5 W |
Các điểm đỉnh Roofline
Table 8 định nghĩa các ngưỡng cường độ số học, giúp xác định liệu một khối lượng công việc (workload) đang bị giới hạn bởi bộ nhớ hay bởi khả năng tính toán.
| Bộ tăng tốc | Ridge Point | Ý nghĩa |
|---|---|---|
| A100 (FP16) | 153 FLOP/byte | Dưới → giới hạn bộ nhớ (memory-bound) |
| H100 (FP16) | 295 FLOP/byte | Ngưỡng cao hơn cho giới hạn tính toán (compute-bound) |
Systems Perspective 1.2: Lưu ý về thuật ngữ: GPU và bộ tăng tốc
Việc biết các con số chỉ là bước đầu. Sức mạnh thực sự đến từ các mô hình gọn, cho thấy con số nào quan trọng với nút thắt hiện tại. Mô hình Roofline mở đầu quá trình chẩn đoán bằng cách chuyển các thông số phần cứng thô thành các trần hiệu suất có thể hành động.
Vật lý của tính toán
Các thông số phần cứng thô—TFLOP/s, TB/s, công suất (watt)—là cần thiết nhưng chưa đủ để suy luận về hiệu suất. Nếu không có các mô hình phân tích gọn, kỹ sư khó phân biệt khối lượng công việc (workload) bị giới hạn bởi tính toán hay bởi bộ nhớ, hoặc dự đoán liệu tăng gấp đôi số GPU có giúp giảm một nửa thời gian huấn luyện hay không. Các mô hình trong phần này biến những khác biệt đó thành các kiểm tra định lượng.
Mô hình Roofline
Mô hình Roofline (Williams et al. 2009) đặt ra giới hạn tốc độ một khối lượng công việc (workload) có thể chạy trên một phần cứng cụ thể. Kết quả phụ thuộc vào việc khối lượng công việc (workload) cạn tính toán hay băng thông bộ nhớ trước.
Mọi phép toán đều có cường độ số học: tỷ lệ giữa số phép tính thực hiện và số byte lấy từ bộ nhớ. Phép nhân ma trận có cường độ số học cao vì mỗi phần tử nạp lên được tái sử dụng nhiều lần. Ngược lại, các phép theo phần tử như ReLU (rectified linear unit) có cường độ thấp vì mỗi phép chỉ nạp một giá trị, thực hiện một phép tính rồi ghi kết quả lại. Như figure 1 minh họa, mỗi khối lượng công việc (workload) bị giới hạn bởi băng thông bộ nhớ hoặc thông lượng tính toán, và cường độ số học quyết định trần nào chạm tới trước.
Điểm ridge (ridge point) xác định điểm cân bằng của phần cứng. Nếu cường độ số học của một khối lượng công việc (workload) thấp hơn điểm này, khối lượng công việc đó bị giới hạn bởi bộ nhớ (nằm trong vùng dốc). Ngược lại, nếu cường độ số học cao hơn, khối lượng công việc đó bị giới hạn bởi tính toán (nằm trong vùng phẳng). \[\begin{gather*} \text{Arithmetic Intensity} = \frac{\text{FLOPs}}{\text{bytes accessed}} \qquad\qquad \text{Ridge Point} = \frac{\text{Peak FLOP/s}}{\text{Memory Bandwidth}} \end{gather*}\]
Systems Perspective 1.3: Kích thước batch kiểm soát cường độ số học
- FLOPs: \(2 \times B \times d_{\text{in}} \times d_{\text{out}}\) (phép nhân-cộng)
- Bytes: Việc di chuyển \(X\), \(W\) và \(Y\) tốn khoảng \(s_{\text{elem}}(B d_{\text{in}} + d_{\text{in}}d_{\text{out}} + B d_{\text{out}})\) byte.
Khi \(B\) tăng gấp đôi, FLOPs cũng tăng gấp đôi, trong khi lưu lượng trọng số gần như không đổi (khi trọng số chiếm ưu thế), nhờ đó cường độ số học tăng lên. Đây là lý do tại sao batching thường giúp phục vụ (serving) suy luận, mặc dù việc có đạt tới trần tính toán hay không còn phụ thuộc vào lưu lượng activation, hành vi cache, hình dạng, độ chính xác và điểm ridge (ridge point).
Một ví dụ cụ thể: Phân tích A100
Hãy xem xét một GPU NVIDIA A100 với hiệu năng Tensor Core FP16 là 312 TFLOP/s và băng thông HBM2e là 2.04 TB/s. Điểm ridge (ridge point) là 312 TFLOP/s/2.04 TB/s = 153 FLOP/byte (các tiền tố Tera triệt tiêu nhau, cho ra đơn vị FLOP/byte).
Có hai phép toán phổ biến nằm ở hai phía đối diện của điểm đỉnh đó. Phép nhân ma trận tổng quát (GEMM) trên hai ma trận vuông kích thước 4096 x 4096 có cường độ số học xấp xỉ 1365 FLOP/byte, nên 1365 FLOP/byte > 153 FLOP/byte và phép toán này bị giới hạn bởi tính toán (compute bound). Một phép toán ReLU theo từng phần tử trên một tensor FP16 thực hiện 1 phép so sánh, đồng thời đọc 2 byte và ghi 2 byte (tổng 4 byte), cho cường độ số học chỉ \(1/4 =\) 0.25 FLOP/byte. Vì 0.25 FLOP/byte \(\ll\) 153 FLOP/byte, phép toán này bị giới hạn nghiêm trọng bởi bộ nhớ (memory bound), chỉ đạt khoảng 0.16 percent so với TFLOP/s đỉnh. Sự tương phản này giải thích vì sao các framework hiện đại thường hợp nhất các phép toán. Kết hợp ReLU trực tiếp với kernel MatMul ngay trước đó giúp tránh ghi kết quả trung gian ra bộ nhớ, qua đó giữ được băng thông bộ nhớ.
Phân tích thứ nguyên
Mô hình Roofline giúp xác định vị trí tắc nghẽn. Tuy nhiên, trước khi áp dụng bất kỳ phương trình hiệu năng nào, ta cần kiểm tra xem nó có ý nghĩa vật lý hay không. Phân tích thứ nguyên cung cấp phép kiểm tra “tỉnh táo” này: bất kỳ phương trình hợp lệ nào cũng phải thuần nhất về thứ nguyên—nghĩa là mọi số hạng phải có cùng đơn vị. Nếu không, phương trình đó có lỗi.
Đối với các giai đoạn xử lý tuần tự, chúng ta hãy xem xét định luật sắt của các hệ thống ML (nguyên lý 3) đã được giới thiệu trong Định luật sắt của hệ thống ML: \[ T = \frac{D_{\text{vol}}}{\text{BW}} + \frac{O}{R_{\text{peak}} \cdot \eta_{\text{hw}}} + L_{\text{lat}} \]
Để kiểm tra tính đúng đắn, ta xác nhận rằng mọi số hạng đều có đơn vị là thời gian (giây): \[ T [s] = \underbrace{ \frac{D_{\text{vol}} [\text{bytes}]}{\text{BW} [\text{bytes/s}]} }_{\text{seconds}} + \underbrace{ \frac{O [\text{FLOPs}]}{R_{\text{peak}} [\text{FLOP/s}] \cdot \eta_{\text{hw}} [1]} }_{\text{seconds}} + \underbrace{ L_{\text{lat}} [s] }_{\text{seconds}} \]
- Số hạng dữ liệu: \(\frac{\text{bytes}}{\text{bytes/s}} = \text{bytes} \times \frac{\text{s}}{\text{bytes}} = \mathbf{s}\)
- Số hạng tính toán: \(\frac{\text{FLOPs}}{\text{FLOP/s}} = \text{FLOPs} \times \frac{\text{s}}{\text{FLOP}} = \mathbf{s}\)
- Số hạng độ trễ: Đã có đơn vị là giây.
Phương trình này nhất quán về mặt vật lý. Hãy áp dụng kỹ thuật này cho bất kỳ phương trình hệ thống nào: nếu các thứ nguyên không khớp, công thức đó là sai. “FLOPs” và “băng thông” không thể hoán đổi trực tiếp vì chúng có đơn vị khác nhau. Mọi sự đánh đổi giữa chúng đều phải quy đổi qua thời gian, và đó chính xác là điều mà định luật sắt định lượng.
Khi một phương trình đã nhất quán về thứ nguyên, câu hỏi tiếp theo là các số hạng thời gian của nó sẽ mở rộng như thế nào trên các thiết bị khác nhau. Section 1.2.3 trả lời câu hỏi đó bằng hai cận bổ sung.
Định luật Amdahl và Định luật Gustafson
Song song hóa là công cụ chính để mở rộng ML, nhưng giới hạn của nó phụ thuộc vào cách khối lượng công việc (workload) được mở rộng. Hai định luật này khuôn khổ hóa mâu thuẫn căn bản trong điện toán song song. Định luật Amdahl là góc nhìn bi quan, cho biết một tác vụ cố định có thể chạy nhanh hơn bao nhiêu (tối ưu hóa độ trễ). Định luật Gustafson là góc nhìn lạc quan, cho biết có thể làm nhiều việc hơn bao nhiêu trong cùng một khoảng thời gian (tối ưu hóa thông lượng).
Mở rộng mạnh (Định luật Amdahl)
Mở rộng mạnh đo lường một bài toán có kích thước cố định có thể chạy nhanh hơn bao nhiêu khi tăng số lượng bộ xử lý.
Định luật Amdahl (Amdahl 1967) phát biểu rằng mức tăng tốc bị giới hạn bởi phần tuần tự của tác vụ.4 Nếu một phần \(s\) của tác vụ là tuần tự (không thể thực hiện song song) và phần còn lại \(p = 1-s\) có thể thực hiện song song, thì mức tăng tốc tối đa với \(n\) bộ xử lý là: \[ \text{Speedup}(n) = \frac{1}{s + \frac{1-s}{n}} \]
4 Gene Amdahl (1922–2015): Một kiến trúc sư máy tính huyền thoại tại IBM, nơi ông là kiến trúc sư trưởng của System/360. Sau đó, ông thành lập Amdahl Corporation để cạnh tranh với IBM trên thị trường máy tính lớn (mainframe).
Khi \(n \to \infty\), số hạng \(\frac{1-s}{n} \to 0\), và độ tăng tốc hội tụ về \(1/s\).
Để thấy Định luật Amdahl trong thực tế, giả sử 5 percent của một bước huấn luyện là chi phí tuần tự (ví dụ: khóa trình thông dịch toàn cục Python (GIL), độ trễ khởi chạy kernel) và 95 percent là phần tính toán ma trận có thể song song hóa:
- Với \(n=1\), độ tăng tốc là 1.
- Với \(n=\) 8, độ tăng tốc là 1/(0.05 + 0.95/8) ≈ 5.9×.
- Với \(n \to \infty\), độ tăng tốc bị giới hạn ở 1/0.05 = 20×.
Bất kể có bao nhiêu bộ tăng tốc được thêm vào, khối lượng công việc (workload) cố định này không thể chạy nhanh hơn 20×.
Mở rộng yếu (Định luật Gustafson)
Mở rộng yếu đo xem bài toán có thể tăng lên bao nhiêu trong khi vẫn giữ nguyên runtime khi thêm bộ xử lý.5
5 John Gustafson: Một nhà khoa học máy tính nổi tiếng với công trình về điện toán song song và việc giới thiệu định dạng Unum (số phổ quát). Định luật của ông là phản ứng trực tiếp trước những “giới hạn” được nhận thấy của Định luật Amdahl khi áp dụng cho quy mô lớn.
Đây là thực tế của các mô hình ngôn ngữ lớn. Thay vì dùng 1.000 bộ tăng tốc để huấn luyện một mô hình trên một tập dữ liệu nhỏ trong vài mili giây, chúng được dùng để huấn luyện trên một tập dữ liệu lớn hơn 1.000\(\times\) trong thời gian hợp lý.
Với \(n\) bộ xử lý, ký hiệu \(s\) là phần thời gian thực thi chạy tuần tự, được đo trên các bộ xử lý đó cho khối lượng công việc (workload) đã mở rộng. Định luật Gustafson (Gustafson 1988) mô hình hóa “độ tăng tốc theo tỷ lệ” này: \[ \text{Scaled Speedup}(n) = n - s(n - 1) \]
Vì phần song song tăng tuyến tính theo \(n\) trong khi \(s\) vẫn cố định, mở rộng yếu có thể giữ hiệu quả cao khi bài toán lớn dần.
Sử dụng cùng một chi phí tuần tự 5 percent (\(s\) = 0.05), Định luật Gustafson kể một câu chuyện rất khác:
- Với \(n=1\), độ tăng tốc là 1.
- Với \(n=\) 8, độ tăng tốc mở rộng là 8 − 0.05 \(\times\) (7) = 8 − 0.35 = 7.65×.
- Với \(n=\) 1000, độ tăng tốc mở rộng là 1000 − 0.05 \(\times\) (999) ≈ 950×.
Trong khả năng mở rộng yếu (weak scaling), hiệu quả vẫn cao vì khối lượng công việc hữu ích (huấn luyện mô hình) được mở rộng đủ lớn để lấn át các chi phí cố định.
Cùng một lăng kính mở rộng gom kích thước mô hình, kích thước dữ liệu, số lượng phần cứng và mức độ sử dụng thành một ước tính thời gian huấn luyện duy nhất.
Napkin Math 1.1: Phương trình thời gian huấn luyện
Công thức: \[ T \approx \frac{6 \cdot P \cdot D}{N_{\text{GPU}} \cdot R_{\text{peak}} \cdot \eta_{\text{hw}}} \]
Các biến:
- Hệ số FLOP huấn luyện: Hệ số 6 này xuất phát từ \(2P\text{ FLOP/token}\) cho quá trình truyền xuôi (forward pass) và \(4P\text{ FLOP/token}\) cho quá trình truyền ngược (backward pass) (\(2P\) cho gradient của activation và \(2P\) cho gradient của trọng số), tổng cộng là \(6PD\text{ FLOP}\) trên \(D\) token huấn luyện.
- \(P\): Số lượng tham số mô hình.
- \(D\): Số lượng token huấn luyện.
- \(N_{\text{GPU}}\): Số lượng GPU.
- \(R_{\text{peak}}\): FLOP/s đỉnh của một bộ tăng tốc.
- \(\eta_{\text{hw}}\): Mức độ sử dụng phần cứng, thường dao động từ 30%–50% trong ước tính thời gian huấn luyện này.
Ví dụ: Huấn luyện một mô hình có 1B tham số trên 20B token sử dụng 1 A100 (312 TFLOP/s) với mức độ sử dụng là 40 percent. \(\text{Total FLOPs} = 6 \times 1 \times 10^{9} \times 2 \times 10^{10} = 1.2 \times 10^{20} \text{ FLOPs}\). \(\text{Throughput} = 1 \times (3.12 \times 10^{14}) \times 0.40 \approx 1.248 \times 10^{14} \text{ FLOP/s}\). \(T = \frac{1.2 \times 10^{20}}{1.248 \times 10^{14}} \approx 961,538.5 \text{ seconds} \approx 16,025.6 \text{ minutes}\).
Thông tin chuyên sâu về hệ thống: Theo các giả định này, quá trình huấn luyện mất 961,538.5 seconds (≈ 16025.6 minutes, hoặc khoảng 11.1 days); ước tính này cho thấy rõ quy mô mô hình, quy mô dữ liệu, thông lượng hiệu quả của bộ tăng tốc và mức độ sử dụng là những đòn bẩy ảnh hưởng trực tiếp đến thời gian huấn luyện.
Định luật Little
Để lập kế hoạch dung lượng cho các hệ thống suy luận ổn định, Định luật Little (Little 1961) thiết lập mối quan hệ giữa số lượng yêu cầu đồng thời trung bình trong dài hạn (\(Q_{\text{req}}\)), tốc độ đến trung bình (\(\lambda_{\text{arr}}\)) và thời gian trung bình một yêu cầu nằm trong hệ thống (\(T_{\text{lat}}\)):6 \[ Q_{\text{req}} = \lambda_{\text{arr}} \times T_{\text{lat}} \]
6 John Little: Ông là Giáo sư tại MIT và là người tiên phong trong lĩnh vực nghiên cứu vận hành. Định luật của ông, được chứng minh năm 1961, là nền tảng của lý thuyết hàng đợi và được ứng dụng rộng rãi trong nhiều lĩnh vực, từ sản xuất đến phân tích mạng máy tính.
Để thấy điều này trong thực tế, hãy xem xét việc duy trì 1,000 QPS với độ trễ trung bình 50 ms. Định luật cho biết hệ thống phải hỗ trợ 1000 \(\times\) 0.05 s = 50 yêu cầu đồng thời.
Điều này giúp xác định kích thước các nhóm worker, nhưng với bộ nhớ, chúng ta cần thêm một giả định khác. Nếu mỗi yêu cầu đang ở trong hệ thống đồng thời giữ 1 GB trạng thái trên thiết bị, thì quy mô trung bình ngụ ý cần 50 GB bộ nhớ; các yêu cầu đang chờ có thể ở trong bộ nhớ máy chủ (host memory) hoặc chia sẻ trạng thái theo batch. Nếu 24 slot trên thiết bị mỗi slot bị chiếm trong 50 ms, thì ước lượng thông lượng của chúng là \(N_{\text{max}}/T_{\text{lat}} = 24/0.05 = 480 \text{ QPS}\). Riêng Định luật Little không đặt ra giới hạn vật lý tối đa nào.
Các mô hình dựa trên vật lý—Roofline, Amdahl, Gustafson và Little—giúp chẩn đoán nơi các nút thắt cổ chai nằm. Tuy vậy, để biến những chẩn đoán đó thành các tối ưu hóa có thể thực thi, ta cần hiểu rõ các cấu trúc phần cứng cụ thể áp đặt chúng: cache, bus bộ nhớ và các kết nối.
Những điều cốt yếu của kiến trúc máy tính
Một GPU công bố 1.000 TFLOP/s, nhưng một kernel chỉ đạt 30 TFLOP/s. Khoảng cách này có thể đến từ việc di chuyển dữ liệu, mức độ song song chưa đủ, đồng bộ hóa, chi phí khởi chạy (launch overhead), hoặc hiệu suất phần mềm kém. Vật lý đặt ra các giới hạn hiệu suất lý thuyết, còn kiến trúc máy tính định nghĩa bộ máy quyết định một khối lượng công việc (workload) thực tế có thể tiến gần đến giới hạn đó tới mức nào. Phần tiếp theo bàn về các đánh đổi giữa độ trễ, băng thông và năng lượng định hình thiết kế hệ thống.
Các độ trễ mà mọi lập trình viên nên biết
Bước đầu để có trực giác về hệ thống là hiểu chi phí của khoảng cách. Table 9 cho biết bộ xử lý phải chờ dữ liệu từ các cấp khác nhau của hệ thống phân cấp bộ nhớ trong bao lâu. Nếu truy cập một thanh ghi giống như nhặt cây bút chì ngay bên cạnh, thì lấy dữ liệu từ bộ nhớ băng thông cao (HBM) là đi bộ qua văn phòng, còn lấy từ đĩa là như bay lên mặt trăng.
| Thành phần | Độ trễ (ns) | Chu kỳ (Xấp xỉ) | “Khoảng cách” tương đối |
|---|---|---|---|
| Thanh ghi | ~0.3 ns | 1 chu kỳ | 10 seconds |
| L1 Cache | ~1 ns | 3–4 chu kỳ | 33.3 seconds |
| L2 Cache | ~4 ns | 12 chu kỳ | 2.2 minutes |
| HBM3 (Bộ nhớ GPU) | ~300 ns | 1.000 chu kỳ | 2.8 hours |
| NVLink (GPU-GPU) | ~500 ns | 1.500 chu kỳ | 4.6 hours |
| PCIe (CPU-GPU) | ~1000 ns | 3.000 chu kỳ | 9.3 hours |
| InfiniBand (Mạng) | ~5000 ns | 15.000 chu kỳ | 1.9 days |
| SSD (NVMe) | ~100000 ns | 300,000 cycles | 38.6 days |
Bảng tóm tắt phần cứng AI (tham chiếu hiện đại)
Độ trễ đo thời gian chờ byte đầu tiên; băng thông đo số lượng byte theo sau. Table 10 cung cấp các hằng số cho các phép tính “Roofline” nhanh gọn. Đây là các “đơn vị tính toán tiêu chuẩn” cho kỷ nguyên machine learning hiện nay.
| Thông số kỹ thuật | NVIDIA H100 (SXM) | Google TPU v5p | Tác động hệ thống |
|---|---|---|---|
| BF16 Đỉnh | 989 TFLOP/s | 459 TFLOP/s | Giới hạn tốc độ (\(R_{\text{peak}}\)) |
| Băng thông bộ nhớ | 3.35 TB/s | 2.76 TB/s | Độ rộng của đường ống (\(\text{BW}\)) |
| Dung lượng HBM | 80 GB | 95 GiB | Kích thước mô hình tối đa (\(P\))/Kích thước batch (\(B\)) |
| SRAM trên chip | 50 MB L2 | 128 MiB VMEM/chip | Quan trọng cho Operator Fusion |
| Kết nối liên chip | 900 GB/s (NVLink) | 1200 GB/s (Kết nối liên chip, ICI) | Xác định khả năng mở rộng song song mô hình |
Hệ thống phân cấp bộ nhớ
Các hệ thống máy tính sử dụng hệ thống phân cấp bộ nhớ vì không có công nghệ đơn lẻ nào vừa có dung lượng cao vừa có độ trễ thấp. Figure 2 minh họa sự đánh đổi này: giữ dữ liệu ở các cấp cao hơn trong kim tự tháp (thanh ghi/cache) giúp giảm độ trễ truy cập khi việc di chuyển dữ liệu nằm trên đường găng hiệu năng.
Hệ thống phân cấp bộ nhớ là ràng buộc vật lý cơ bản của các hệ thống machine learning. Table 11 tổng hợp các thuộc tính vật lý—độ trễ, băng thông và năng lượng—trên toàn bộ ngăn xếp.
| Lớp | Công nghệ | Độ trễ | Băng thông | Tham chiếu năng lượng (mỗi 32b) |
|---|---|---|---|---|
| Thanh ghi | Flip-Flop | ~0.3 ns | — | — |
| L1 Cache | SRAM | ~1 ns | — | — |
| L2 Cache | SRAM | ~4 ns | — | — |
| Bộ nhớ (Cục bộ) | HBM3 | ~300 ns | 3350 GB/s | 640 pJ |
| Kết nối liên chip | NVLink 4.0 | ~500 ns | 900 GB/s | — |
| Liên kết máy chủ | PCIe Gen5 | ~1000 ns | 64 GB/s | — |
| RAM hệ thống | DDR5 | ~100 ns | 50 GB/s | — |
| Mạng (Fabric) | InfiniBand NDR | ~5000 ns | 50 GB/s | — |
| Lưu trữ (Cục bộ) | NVMe SSD | ~100000 ns | 7 GB/s | — |
Chi phí năng lượng trong hệ thống phân cấp cho thấy vì sao việc di chuyển dữ liệu chi phối thiết kế hệ thống hiện đại.
Systems Perspective 1.4: Chi phí cao của việc di chuyển dữ liệu
Băng thông so với độ trễ
Băng thông (thông lượng) và độ trễ (độ trễ) là hai ràng buộc khác nhau. Với lượng dữ liệu \(D_{\text{vol}}\) được gửi qua băng thông hiệu dụng \(\text{BW}\) và độ trễ đường truyền cố định \(L_{\text{lat}}\), và giả sử chi phí độ trễ và chi phí tuần tự hóa không chồng chéo, tổng thời gian truyền là: \[ T = L_{\text{lat}} + \frac{D_{\text{vol}}}{\text{BW}} \]
Điểm giao nhau là kích thước truyền tải mà tại đó hai số hạng bằng nhau: \[ D_{\text{vol,cross}} = L_{\text{lat}} \times \text{BW} \]
Đối với lượng dữ liệu truyền dưới \(D_{\text{vol,cross}}\) (ví dụ: yêu cầu nhỏ hoặc thông điệp điều khiển), độ trễ sẽ chi phối. Đối với lượng dữ liệu truyền trên mức đó (ví dụ: tải trọng số), băng thông sẽ chi phối.
Hãy xem xét việc gửi dữ liệu qua một đường truyền 10 Gb/s với độ trễ cơ bản cho yêu cầu/phản hồi là 10 ms. Kích thước giao nhau là 12.5 MB, do đó, yếu tố chi phối sẽ phụ thuộc vào việc lượng dữ liệu truyền nằm ở phía nào của ngưỡng đó.
- Gói dữ liệu bị giới hạn bởi độ trễ (1 KB):
- Truyền tải: 1 KB \(\times\) 8/10 Gb/s ≈ 0.8 μs.
- Tổng thời gian ≈ 10 ms + 0.8 μs ≈ 10 ms.
- Kết quả: Độ trễ cố định từ đường đi và giao thức chiếm ưu thế; độ trễ lan truyền chỉ là một thành phần.
- checkpoint bị giới hạn bởi băng thông (1 GB):
- Truyền: \(1\text{ GB} \times 8/10\text{ Gbps} \approx 800\text{ ms}\).
- Tổng thời gian \(\approx 10\text{ ms} + 800\text{ ms} = 810\text{ ms}\).
- Kết quả: Độ trễ cơ bản không đáng kể; băng thông là nút thắt cổ chai.
Kiến trúc quyết định dữ liệu có thể di chuyển nhanh đến đâu, còn độ chính xác số kiểm soát trực tiếp lượng dữ liệu phải di chuyển. Giảm độ chính xác từ FP32 xuống FP16 còn một nửa sẽ giảm số byte trên mỗi tham số đi một nửa và có thể gần như tăng gấp đôi thông lượng hữu ích, nếu phần cứng, các kernel và độ chính xác của mô hình hỗ trợ. Để hiểu rõ các đánh đổi này, chúng ta cần xem kỹ cách các số được biểu diễn trong phần cứng.
Biểu diễn số
Thống kê mô tả các phân phối dữ liệu; còn các biểu diễn số quyết định cách hệ thống lưu trữ các giá trị đó. Trong các hệ thống ML, việc lựa chọn độ chính xác (FP32 vs. BF16 vs. INT8) là sự đánh đổi trực tiếp giữa độ trung thực thống kê và thông lượng phần cứng.
So sánh các định dạng dấu phẩy động
Các định dạng IEEE 754 như FP32 và FP16, cùng với các định dạng dành riêng cho AI như BF16 và FP8, đưa ra các đánh đổi khác nhau giữa dải động (phạm vi giá trị có thể biểu diễn) và độ chính xác (độ mịn của các giá trị trong dải đó). Table 12 tóm tắt các định dạng chính và trường hợp sử dụng của chúng, còn figure 3 minh họa cách phân bổ bit.
| Định dạng | Bits | Số mũ | Phần định trị | Dải động | Trường hợp sử dụng điển hình |
|---|---|---|---|---|---|
| FP32 | 32 | 8 | 23 | \(\sim 10^{-38}\) to \(10^{38}\) | Huấn luyện (độ chính xác đầy đủ), suy luận tham chiếu |
| FP16 | 16 | 5 | 10 | Bình thường: \(6.10 \times 10^{-5}\)–\(6.55 \times 10^{4}\) | Huấn luyện thường với loss scaling, suy luận |
| BF16 | 16 | 8 | 7 | Phạm vi số mũ bình thường của FP32 | Huấn luyện, thường không có loss scaling |
| FP8 | 8 | 4 hoặc 5 | 3 hoặc 2 | Thay đổi | Huấn luyện/suy luận trên phần cứng được hỗ trợ |
| INT8 | 8 | N/A | N/A | -128 to 127 | Suy luận sau lượng tử hoá |
Ngoài độ rộng bit, cách phân bổ số bit cho phần mũ và phần định trị sẽ quyết định dải giá trị mà mỗi định dạng có thể biểu diễn.
Trong số các định dạng này, BF167 rất đáng chú ý (Wang and Kanwar 2019; Kalamkar et al. 2019). Nó nằm trong cùng lớp 16-bit như FP16 nhưng lại hành xử khác khi huấn luyện, nên chỉ dựa vào độ rộng danh nghĩa không dự đoán được gánh nặng vận hành. Từ góc độ hệ thống, phần sau sẽ nối việc phân bổ bit với lưu lượng truy cập bộ nhớ, độ ổn định số và hiệu quả triển khai.
7 BF16 (brain floating point 16): Ban đầu được giới thiệu lần đầu cùng với Google TPUv2 và sau đó được Intel, Arm và NVIDIA sử dụng, BF16 đã trở thành một định dạng huấn luyện phổ biến trong các hệ sinh thái bộ tăng tốc. Việc áp dụng BF16 khiến việc hỗ trợ định dạng này trong phần cứng, kernel và các thư viện huấn luyện phân tán trở thành một vấn đề về khả năng di động, chứ không còn là một tính năng riêng của từng nhà cung cấp nữa.
Systems Perspective 1.5: Giới hạn dải động
Việc lựa chọn định dạng số là một ứng dụng trực tiếp của định luật sắt trong các hệ thống ML (nguyên tắc 3). Giảm độ chính xác từ FP32 xuống BF16 hoặc FP16 sẽ giảm một nửa lượng dữ liệu, từ đó có thể tăng gấp đôi thông lượng đối với các khối lượng công việc (workload) bị giới hạn bởi bộ nhớ. Tuy nhiên, loại định dạng 16-bit sẽ quyết định độ phức tạp kỹ thuật:
- Dải động (phần mũ): BF16 giữ nguyên phần mũ tám bit của FP32, do đó có cùng dải số mũ thông thường (Kalamkar et al. 2019).
- Độ chính xác (phần định trị): FP16 có phần định trị 10 bit lớn hơn BF16 (7 bit), cho độ chính xác cao hơn với các giá trị trong dải của nó. Tuy nhiên, phần mũ năm bit của nó làm tăng nguy cơ tràn dưới (underflow). Vì vậy, huấn luyện FP16 thường dùng loss scaling, một bước vận hành nhân gradient với một hằng số lớn để giữ cho nhiều giá trị vẫn biểu diễn được (Micikevicius et al. 2017).
- Hiệu quả năng lượng: Các phép toán INT8 hiệu quả hơn đáng kể so với các phép toán dấu phẩy động tương đương, vì chúng di chuyển ít dữ liệu hơn và sử dụng các đường tính toán số học số nguyên đơn giản hơn. Chuyển sang INT8 để suy luận là yếu tố then chốt để triển khai các mạng nơ-ron khi có các ràng buộc chặt chẽ về bộ nhớ, độ trễ hoặc công suất (Jacob et al. 2018; Krishnamoorthi 2018).
Lượng tử hoá số nguyên
Lượng tử hoá ánh xạ các giá trị dấu phẩy động (liên tục) sang các số nguyên rời rạc, thường là INT8. Thách thức chính là chọn cách ánh xạ khoảng giá trị dấu phẩy động sang số nguyên. Có hai cách tiếp cận chính.
Với lượng tử hoá đối xứng, đặt \(s_{\text{quant}} = \max |x|\) trên khoảng đã hiệu chỉnh và giả sử \(x\) được giới hạn trong \([-s_{\text{quant}}, s_{\text{quant}}]\). Khi đó, mã INT8 có dấu là: \[ x_{\text{int}} = \text{round}\left(\frac{x}{s_{\text{quant}}} \times 127\right) \] Ánh xạ này phù hợp với các phân bố trọng số tập trung quanh 0.
Lượng tử hoá bất đối xứng xử lý các phân bố không tập trung quanh 0 (thường gặp sau hàm ReLU, vốn chỉ tạo ra các giá trị không âm) bằng cách dịch chuyển khoảng giá trị trước khi chia tỷ lệ. Đặt \(x_{\min}\) và \(x_{\max}\) là các cận của khoảng đã hiệu chỉnh, xác định khoảng chuẩn hoá \(s_{\text{quant}} = x_{\max} - x_{\min}\), và giới hạn \(x\) trong \([x_{\min}, x_{\max}]\). Một ánh xạ 8-bit không dấu phổ biến là: \[ x_{\text{uint8}} = \text{round}\left(\frac{x - x_{\min}}{s_{\text{quant}}} \times 255\right) \]
Việc lựa chọn giữa lượng tử hoá đối xứng và bất đối xứng phụ thuộc vào phân bố của tensor và có tác động đo được tới độ chính xác.
Tóm tắt
Chẩn đoán hiệu năng hệ thống (từ góc độ phần cứng) bắt đầu từ các đơn vị, giới hạn trần và tập làm việc. Các con số tham chiếu giúp xác định bậc độ lớn; Mô hình Roofline và quy luật cơ bản (iron law) cho biết liệu phép toán, lượng dữ liệu (bytes) hay độ trễ là nút thắt; Định luật Amdahl, Định luật Gustafson và Định luật Little kiểm chứng các tuyên bố về tăng tốc, khả năng mở rộng và xử lý đồng thời; còn phân tích thứ nguyên giúp phát hiện các kết quả bất khả thi. Hệ thống phân cấp bộ nhớ và kết nối cho thấy những giới hạn đó xuất hiện dưới dạng các ràng buộc về độ trễ và băng thông, trong khi các biểu diễn số cho thấy dải động, độ chính xác và lượng tử hoá làm thay đổi việc lưu trữ, năng lượng, thông lượng và độ chính xác như thế nào.
Hãy coi các thông số đỉnh như những giới hạn trần, không phải dự đoán hiệu năng. So sánh phép đo với giới hạn trần tương ứng, rồi lần theo phần chênh lệch còn lại đến mức độ sử dụng, luân chuyển dữ liệu, chi phí runtime, kiến trúc hoặc phần mềm. Một ước tính sơ bộ hữu ích khi nó nêu rõ giả định và đơn vị, và khiến phép đo tiếp theo trở nên hiển nhiên.