Bối cảnh cả ngày có đánh bại được bối cảnh mười phút không? Sự chú ý chớp nhoáng và câu hỏi về độ dài trình tự
Đây là câu hỏi mà bài viết này tồn tại để trả lời: nếu một máy biến áp có thể tham gia cả ngày giao dịch ở độ phân giải một giây thay vì khoảng thời gian mười phút, liệu nó có dự đoán tốt hơn không?
Cho đến gần đây bạn thậm chí không thể hỏi. Nhu cầu chú ý tiêu chuẩn bộ nhớ, do đó, một ngày 23.400 bước ở 12 đầu trong float16 cần khoảng 12,9 GB cho riêng ma trận điểm — nhiều hơn các tham số mô hình và nhiều hơn hầu hết các thẻ sẽ cung cấp cho bạn. Câu hỏi đã được kết thúc bằng số học trước khi có người kiểm tra nó.
Chú ý chớp nhoáng (Dao và cộng sự, 2022) sẽ mở nó ra. Không phải bằng cách thu hút sự chú ý gần đúng — nó tính toán chính xác kết quả tương tự — mà bằng cách cơ cấu lại tính toán để nhận biết IO, giảm thiểu lưu lượng giữa các cấp bộ nhớ GPU. Đó là nội dung thực sự thú vị ở đây và hầu hết bài viết này được dành cho cách thức hoạt động của nó: xếp lớp, phép truy toán trực tuyến-softmax, IO bị ràng buộc và tính toán lại thông qua ngược.
Nhưng cơ chế là yếu tố thúc đẩy chứ không phải là yêu cầu. "Bối cảnh dài hơn thì tốt hơn" là một tuyên bố thực nghiệm về thị trường và vị thế đứng vững của blog này - từ Temporal Fusion Transformers, phát hiện ra rằng các máy biến áp vani trên các mô hình định kỳ quá phù hợp và nhìn lại ngắn hạn của chuỗi tài chính vẫn duy trì khả năng cạnh tranh ở tần suất cao - cắt giảm theo cách khác. Vậy là bài viết khép lại ở phần đo lường chứ không phải cơ chế.
Tại sao sự chú ý lại bị ràng buộc bởi trí nhớ
Sự chú ý tính toán — bản thân tính nguyên thủy, trong bối cảnh giao dịch, được đề cập trong Biến áp hợp nhất tạm thời cho dự báo danh mục đầu tư đa chiều. Toàn bộ vấn đề là một dòng như vậy: ma trận điểm trung gian là , nó được ghi vào bộ nhớ, đọc lại cho softmax, viết lại và đọc lại cho matmul cuối cùng - và nó phải được giữ lại để truyền ngược.
Cường độ số học của sự chú ý là , vậy là khoảng 64 FLOP/byte tại - ngay bên trái điểm sườn núi A100. Nó nằm trên trần băng thông dốc, không phải trần điện toán phẳng: GPU dành nhiều thời gian hơn để di chuyển xung quanh hơn là nhân bất cứ thứ gì. Khung đường mái này sử dụng — điểm sườn núi, trần dốc so với trần phẳng và lý do tại sao cùng một lý do quyết định liệu GPU có đáng mua hay không — được xây dựng bằng các con số đo được trong Khi GPU thành công.
Hệ thống phân cấp bộ nhớ mà thuật toán khai thác
| Cấp độ bộ nhớ | Kích thước | Băng thông | Độ trễ |
|---|---|---|---|
| HBM (Bộ nhớ băng thông cao) | 40-80GB | 2,0 TB/giây | ~400 ns |
| SRAM (Trên chip, bộ nhớ dùng chung) | 20 MB | 19 TB/giây | ~4 giây |
SRAM có băng thông xấp xỉ 10 lần và độ trễ thấp hơn 100 lần, ở mức một phần nghìn dung lượng. Mọi thứ Flash Chú ý thực hiện đều diễn ra từ giao dịch đó: từ bỏ dung lượng, mua băng thông và độ trễ. Động thái "cơ cấu lại thuật toán thay vì mua phần cứng" tương tự, được đo bằng backtest CPU, là thang tốc độ backtest.
Thuật toán Flash Chú ý
Chú ý Flash xử lý sự chú ý trong ô có kích thước phù hợp với SRAM và không bao giờ hiện thực hóa toàn bộ ma trận trong HBM.
Phân vùng vào trong khối hàng và vào trong khối cột, với được chọn sao cho ô cộng với bộ tích lũy của nó vừa với chip. Đối với mỗi khối truy vấn, lặp lại tất cả các khối khóa-giá trị:
For each query block Q_i:
Initialize: O_i = 0, m_i = -inf, l_i = 0 # output, running max, running sum
For each KV block (K_j, V_j):
1. Load Q_i, K_j, V_j from HBM to SRAM
2. Compute S_ij = Q_i @ K_j^T / sqrt(d) # in SRAM
3. Compute local max: m_ij = rowmax(S_ij)
4. Compute P_ij = exp(S_ij - m_ij) # in SRAM
5. Compute local sum: l_ij = rowsum(P_ij)
6. Update running statistics:
m_new = max(m_i, m_ij)
l_new = l_i * exp(m_i - m_new) + l_ij * exp(m_ij - m_new)
O_i = O_i * (l_i * exp(m_i - m_new) / l_new)
+ P_ij @ V_j * (exp(m_ij - m_new) / l_new)
m_i = m_new, l_i = l_new
Write O_i to HBM
Sự lặp lại softmax trực tuyến
Bí quyết giúp bạn có thể xếp gạch là softmax trực tuyến. Một softmax đơn giản cần hai lần chuyển qua hàng: một để tìm mức tối đa (để ổn định số), một để lũy thừa và chuẩn hóa. Hai lần chuyển qua một hàng mà bạn từ chối lưu trữ là một sự mâu thuẫn — vì vậy Flash Chú ý tiếp tục chạy số liệu thống kê và thay đổi tỷ lệ khi nó tiếp tục.
Sau khối :
và bộ tích lũy đầu ra được điều chỉnh theo cùng một hệ số:
Mỗi khi một khối mới tăng mức tối đa đang chạy, sản lượng tích lũy trước đó sẽ được điều chỉnh lại theo - như thể mức tối đa mới đã được biết ngay từ đầu. Kết quả về mặt đại số giống hệt với softmax hai lượt. Trong số học chính xác đây không phải là một phép tính gần đúng; nó là một sự tái liên kết. (Với độ chính xác hữu hạn, đó là một đường làm tròn khác, rất quan trọng - hãy xem phần kiểm tra độ chính xác bên dưới.)
Độ phức tạp của IO
Đây là tuyên bố chính thức của chiến thắng. Flash Chú ý thực hiện
Truy cập HBM, ở đâu là kích thước SRAM, so với cho việc thực hiện tiêu chuẩn. Lưu ý rằng xuất hiện trong mẫu số: bảng ghi nhớ trên chip càng lớn thì số lần quay vòng càng ít, đó là lý do tại sao thuật toán được trình bày dưới dạng phân cấp bộ nhớ thay vì số FLOP. Đối với điển hình Và KB, tỷ lệ này thiên về Chú ý chớp nhoáng với số lượt truy cập ít hơn khoảng 5-10 lần.
Lùi lại: tính toán lại thay vì lưu trữ
Tuyên truyền ngược thông qua sự chú ý thường cần ma trận mà đường chuyển tiếp vừa từ chối giữ lại. Flash Chú ý tính toán lại các ô từ trong quá trình truyền ngược, chỉ lưu trữ đầu ra và số liệu thống kê softmax - cả hai , không . Nó trao đổi một lượng khiêm tốn số học dư thừa cho thuật ngữ bộ nhớ vốn là toàn bộ vấn đề. Đây là lợi ích tương tự như điểm kiểm tra độ dốc, được áp dụng ở mức độ chi tiết của ô bên trong một toán tử duy nhất.
FA2: song song
Flash Chú ý 2 (Dao, 2023) giữ nguyên thuật toán và sửa lịch trình:
- Ít FLOP không matmul hơn. FA1 dành thời gian thực cho việc thay đổi tỷ lệ, tìm giá trị tối đa và lũy thừa — các hoạt động chạy trên lõi CUDA, không phải lõi tensor. FA2 trì hoãn việc thay đổi tỷ lệ đến cuối vòng lặp bên trong.
- Tính song song theo độ dài chuỗi. FA1 chỉ song song theo lô và đầu. FA2 cũng song song trên các khối truy vấn. Điều này đặc biệt quan trọng đối với trường hợp giao dịch, trong đó bạn thường có một chuỗi rất dài cho mỗi nội dung và kích thước lô từ 1 đến 4 - chính xác là chế độ mà tính song song của lô và đầu làm GPU chết đói.
- Phân vùng công việc dọc. Mỗi sợi dọc lấy một tập hợp con các khối truy vấn khác nhau thay vì chia nhỏ tính toán điểm và giảm theo các sợi dọc, loại bỏ việc giảm bớt sợi dọc.
Kết quả được báo cáo: ~70% FLOP đỉnh theo lý thuyết trên A100 so với ~35% đối với FA1.
FA3: Cơ học phễu
Flash Chú ý 3 (Dao, Shah, 2024) là kiến trúc dành riêng cho H100:
- Chuyên môn hóa sợi dọc không đồng bộ. Bộ tăng tốc bộ nhớ Tensor (TMA) của Hopper di chuyển HBM→SRAM không đồng bộ. FA3 chia các nhóm thành nhà sản xuất phát hành tải TMA cho khối KV tiếp theo và người tiêu dùng tính toán trên khối hiện tại, do đó chuyển động dữ liệu ẩn sau số học.
- Matmul xen kẽ và softmax. đối với một khối chạy trên lõi tensor trong khi softmax cho khối trước đó chạy trên lõi CUDA — hai đơn vị phần cứng khác nhau, thực sự đồng thời thay vì được chia theo thời gian.
- FP8 với quá trình xử lý không mạch lạc. H100 thực hiện FP8 với thông lượng gấp 2 lần FP16. Sự chú ý của FP8 ngây thơ bị phá hủy bởi những ngoại lệ; FA3 xoay ngẫu nhiên các vectơ trước khi lượng tử hóa theo khối để phân tán cường độ ngoại lệ trên các tọa độ, được báo cáo với sai số số thấp hơn 2,6 lần so với FP8 ngây thơ.
| Phiên bản | GPU | Sử dụng | Tăng tốc so với tiêu chuẩn |
|---|---|---|---|
| FA1 | A100 | ~35% | 2-4x |
| FA2 | A100 | ~70% | 5-7x |
| FA3 (FP16) | H100 | ~75% | 3-5x vs FA2 |
| FA3 (FP8) | H100 | ~75% | 1.6x so với FA3 FP16 |
Che giấu nhân quả là nơi giao dịch được giảm giá
Việc che giấu nhân quả là bắt buộc đối với chuỗi thời gian - mô hình không được tham dự vào tương lai - và theo cách xếp lớp, đó không phải là chi phí tăng thêm mà là chi phí tiết kiệm được. Bất kỳ ô nào có khóa hoàn toàn trong tương lai liên quan đến các truy vấn của nó đều bị bỏ qua hoàn toàn, không bao giờ được tải và không bao giờ được tính toán, cắt giảm gần một nửa công việc. Trong PyTorch đây là is_causal=True; không có gì khác được yêu cầu.
Tích hợp là tám dòng
Hầu như không có mã nào bạn cần là về Flash Chú ý. Hoán đổi đường dẫn ma trận điểm rõ ràng cho hạt nhân hợp nhất:
scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(d_head)
scores = scores.masked_fill(causal_mask, float("-inf"))
out = torch.matmul(torch.softmax(scores, dim=-1), v)
out = torch.nn.functional.scaled_dot_product_attention(
q, k, v,
dropout_p=self.dropout if self.training else 0.0,
is_causal=True,
)
Đó là toàn bộ sự thay đổi. q, k, v có hình dạng (batch, heads, seq, head_dim); mặt nạ nhân quả đã biến mất vì hạt nhân xây dựng nó. Để đưa mô hình giao dịch PyTorch được chú thích hoàn chỉnh vào - hình chiếu đầu vào, khối và đầu lên/phẳng/xuống 3 lớp - hãy sử dụng DeepLOB và để biết quy trình đào tạo đầy đủ, hãy xem Máy biến áp hợp nhất tạm thời. Xây dựng bản sao thứ tư của giàn giáo đó ở đây sẽ chẳng dạy được gì cả.
Yêu cầu: khả năng tính toán >= 8.0 (A100, H100, RTX 3090+), đầu vào bán chính xác, PyTorch >= 2.0. Xác minh đường dẫn nhanh thực sự được tương tác với torch.backends.cuda.sdp_kernel chẩn đoán và torch.cuda.max_memory_allocated() — SDPA âm thầm quay trở lại lõi toán học nếu bất kỳ điều kiện tiên quyết nào không thành công và dự phòng im lặng trông giống hệt như một mô hình hoạt động chỉ đơn thuần là chậm.
Phép đo: ngữ cảnh dài hơn có hiệu quả không?
Mọi thứ ở trên đều cho biết bối cảnh 32K hoặc 128K hiện có giá cả phải chăng. Nó không nói gì về việc liệu nó có hữu ích hay không. Thí nghiệm trung thực:
Đào tạo kiến trúc tương tự tại với SDPA-Flash trên chuỗi BTC được sử dụng ở nơi khác trong chuỗi này, giữ cố định các tham số, trình tối ưu hóa và mục tiêu nên độ dài chuỗi là biến duy nhất. Báo cáo hai điều:
- Chi phí. Đồng hồ treo tường được đo theo từng kỷ nguyên và
torch.cuda.max_memory_allocated()tại mỗi . - Lợi ích. Hiệu suất dự đoán ngoài mẫu so với , trên đường phân chia tiến về phía trước.
Bản thảo trước đó của bài viết này chứa một bảng các số liệu bộ nhớ theo độ dài chuỗi được rút ra từ phương pháp phân tích công thức kích hoạt Những hàng đó đã bị xóa: chúng không bao giờ được đo và chúng không đồng ý với số học về ngân sách bộ nhớ của chính bài báo. Số dẫn xuất được trình bày trong bảng kết quả là kết quả bịa đặt và blog này không cung cấp những số đó.
Đặc tính thú vị của thử nghiệm này là nó có thể được xuất bản theo một trong hai hướng. Nếu hiệu suất ngoài mẫu tăng đơn điệu với , điều đó biện minh cho toàn bộ chương trình ngữ cảnh dài. Nếu nó ổn định ở vài nghìn bước hoặc xuống cấp, thì đó là phần mạnh hơn - bạn đồng hành với tiêu cực trung thực — và điều đó có nghĩa là bức tường bộ nhớ chưa bao giờ là hạn chế ràng buộc đối với máy biến áp giao dịch.
Càng nhiều ngữ cảnh thì càng có nhiều dung lượng, do đó bề mặt vừa khít hơn
Có một lý do cụ thể để mong đợi một kết quả ổn định hoặc tiêu cực. Máy biến áp hợp nhất tạm thời đã ghi lại rằng các máy biến áp vani được áp dụng một cách ngây thơ cho chuỗi tài chính quá phù hợp - chúng thiếu các thành kiến quy nạp theo thời gian và các mô hình lặp lại nhìn lại ngắn hạn vẫn có tính cạnh tranh ở tần suất cao. Mở rộng bối cảnh từ 512 lên 32.768 bước không thêm thông tin tỷ lệ thuận với độ dài; độ trễ cận biên thứ 32.000 của chuỗi giá gần hiệu quả mang lại rất ít ý nghĩa. Những gì nó bổ sung một cách đáng tin cậy là giá trị của những thứ phù hợp với thông số.
Vì vậy việc quét qua phải được coi như bản chất của nó: một tìm kiếm lựa chọn mô hình, với cùng một cơ chế mà blog này áp dụng cho mọi tìm kiếm khác. Ba độ dài chuỗi nhân với bất kỳ thứ gì khác thay đổi là số lần thử và người chiến thắng phải vượt qua Tỷ lệ Sharpe giảm phát được tính toán dựa trên số lần thử đó và một cổng PBO, chứ không chỉ đơn thuần là đánh bại những người hàng xóm của nó. Nếu không thì "chiến thắng bối cảnh dài" không thể phân biệt được với việc chọn cái tốt nhất trong ba lần chạy ồn ào.
Kiểm tra độ chính xác, vì "chính xác" thực hiện rất nhiều việc
Flash Chú ý là chính xác theo số học chính xác. Khuyến nghị kèm theo nó - chạy trong fp16 hoặc bf16, và trên H100, hãy xem xét FP8 - thì không. Đó là những tuyên bố riêng biệt và tuyên bố thứ hai chiếm ưu thế trong thực tế: liên kết lại một tổng và giảm độ chính xác xuống một nửa đều là những điều đáng lo ngại và sau đó bài báo giới thiệu bảo đảm đặt hàng không nên đưa ra tuyên bố chính xác bằng tay.
Blog đã có công cụ phù hợp. Bẫy chính xác GPU thiết lập tiêu chuẩn: độ chính xác thấp không cảnh báo bạn, nó trả về rác hợp lý và bạn chứng minh tính đúng đắn bằng tiên đoán chẵn lẻ về số lượng riêng biệt xuôi dòng — số lượng giao dịch — không phải bằng đường cong nhãn cầu. Áp dụng ở đây:
- Tính toán sự chú ý với SDPA-Flash trong bf16 và triển khai tham chiếu fp64 trên các đầu vào giống hệt nhau; báo cáo lỗi tương đối tối đa trên tensor đầu ra.
- Đưa đến quyết định: đối với mô hình phát ra nhãn lên/phẳng/xuống, hãy báo cáo có bao nhiêu nhãn lật giữa hai đường dẫn, dưới dạng một phần của tổng số quyết định.
Những bất đồng nhỏ, có giới hạn và có thể giải thích được là dấu hiệu của một con đường nhanh chóng đúng đắn. Giá trị không giới hạn có nghĩa là khuyến nghị FP8 không bao giờ an toàn cho mô hình này. Không có số nào được biết cho đến khi nó được chạy.
Khi nào cần đạt được nó
Được nén theo quyết định, có hình dạng giống như hướng dẫn quyết định GPU:
- Trên ~2K dấu thời gian trên GPU CUDA: có, vô điều kiện. Đó là thay đổi một dòng tạo ra kết quả chính xác và chiến thắng sẽ tăng dần theo . Không có kịch bản nào mà bạn muốn hiện thực hóa thay vào đó là đường dẫn.
- Dưới ~512 dấu thời gian, trên CPU hoặc với kiến trúc không chú ý (CNN, SSM như Mamba): không liên quan. Bên trái sườn núi, chi phí cố định là toàn bộ chi phí và sự chú ý không bao giờ là nút thắt cổ chai của bạn.
- Các ngưỡng trên là quan niệm dân gian, không phải đo lường — chúng đến từ tài liệu nói chung và sự giao nhau trên mô hình và thẻ của riêng bạn là điểm chuẩn mười dòng. Hãy chạy nó thay vì tin vào những con số tròn trịa.
Kết luận
Flash Chú ý là một kết quả rõ ràng và thực sự quan trọng: bằng cách tôn trọng thứ bậc bộ nhớ và liên kết lại softmax, nó tính toán sự chú ý chính xác với bộ nhớ thay vì , và IO ràng buộc giải thích chính xác lý do tại sao. Việc áp dụng nó trong máy biến áp giao dịch là một thay đổi một dòng mà không mất độ chính xác về số học chính xác và giành được bộ nhớ lớn.
Những gì nó không làm là trả lời câu hỏi ở trên cùng. Nó chuyển đổi "bối cảnh cả ngày là không thể" thành "bối cảnh cả ngày thì rẻ", đó là sự thay đổi về chi phí của thử nghiệm chứ không phải kết quả của nó. Bức tường ký ức hạ xuống là một lời mời gọi đo lường, và phép đo chính là thứ biến điều này từ một bản tóm tắt trên giấy thành một phát hiện.
Tài liệu tham khảo
- Dao, T., Fu, D.Y., Ermon, S., Rudra, A., Re, C. "FlashAttention: Chú ý chính xác nhanh và hiệu quả về trí nhớ với nhận thức IO." NeurIPS (2022). arXiv:2205.14135
- Dao, T. "FlashAttention-2: Chú ý nhanh hơn nhờ khả năng song song và phân chia công việc tốt hơn." ICLR (2024). arXiv:2307.08691
- Dao, T., Shah, J. "FlashAttention-3: Chú ý nhanh và chính xác với sự không đồng bộ và độ chính xác thấp." NeurIPS (2024). arXiv:2407.08608
- Vaswani, A., và cộng sự. "Sự chú ý là tất cả những gì bạn cần." NeurIPS (2017).
- Milkov, M., Gimelshein, N. "Tính toán chuẩn hóa trực tuyến cho softmax." arXiv:1805.02867 (2018).
Tác Giả
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.