Apakah Konteks Sehari Penuh Mengalahkan Konteks Sepuluh Menit? Perhatian Kilat dan Pertanyaan Panjang Urutan
Inilah pertanyaan yang harus dijawab oleh artikel ini: jika sebuah transformator dapat menangani seluruh hari perdagangan dengan resolusi satu detik, bukan dalam jangka waktu sepuluh menit, apakah ia akan menghasilkan prediksi yang lebih baik?
Sampai saat ini Anda bahkan tidak bisa bertanya. Kebutuhan perhatian standar memori, jadi 23.400 langkah sehari dengan 12 kepala di float16 membutuhkan sekitar 12,9 GB untuk matriks skor saja — lebih dari parameter model, dan lebih dari yang diberikan kebanyakan kartu kepada Anda. Soal ditutup dengan aritmatika sebelum ada yang mengujinya.
Flash Attention (Dao et al., 2022) membukanya. Bukan dengan memperkirakan perhatian — ini menghitung hasil yang persis sama — tetapi dengan merestrukturisasi komputasi menjadi IO-aware, meminimalkan lalu lintas antar level memori GPU. Itu adalah konten yang benar-benar menarik di sini, dan sebagian besar artikel ini dihabiskan untuk membahas cara kerjanya: ubin, pengulangan online-softmax, IO terikat, dan perhitungan ulang backward-pass.
Namun mekanismelah yang menjadi penggeraknya, bukan klaimnya. "Konteks yang lebih panjang lebih baik" adalah pernyataan empiris tentang pasar, dan posisi berdiri blog ini — dari Temporal Fusion Transformers, yang menemukan bahwa trafo vanilla pada model overfit seri keuangan dan model berulang short-lookback tetap kompetitif pada frekuensi tinggi — justru sebaliknya. Jadi artikelnya ditutup pada pengukurannya, bukan mekanismenya.
Mengapa perhatian terikat pada memori
Perhatian menghitung — yang primitif itu sendiri, dalam konteks perdagangan, tercakup dalam Temporal Fusion Transformers untuk Multi-Horizon Portfolio Forecasting. Seluruh masalahnya ada pada satu baris saja: matriks skor menengah adalah , itu ditulis ke memori, dibaca kembali untuk softmax, ditulis lagi, dan dibaca lagi untuk matmul akhir — dan harus disimpan untuk propagasi mundur.
Intensitas aritmatika perhatian adalah , jadi sekitar 64 FLOP/byte di — di sebelah kiri titik punggungan A100. Itu berada di batas atas bandwidth yang miring, bukan batas atas komputasi yang datar: GPU menghabiskan lebih banyak waktu untuk bergerak sekitar daripada mengalikan apa pun. Kerangka garis atap yang digunakan — titik punggungan, kemiringan versus langit-langit datar, dan alasan alasan yang sama menentukan apakah sebuah GPU layak dibeli — dibuat dengan angka terukur dalam Saat GPU Terbayar.
Hierarki memori yang dieksploitasi algoritma
| Tingkat Memori | Ukuran | Bandwidth | Latensi |
|---|---|---|---|
| HBM (Memori Bandwidth Tinggi) | 40-80 GB | 2,0 TB/dtk | ~400 ns |
| SRAM (On-chip, memori bersama) | 20MB | 19 TB/dtk | ~4 ns |
SRAM kira-kira 10x bandwidth dan latensi 100x lebih rendah, dengan kapasitas seperseribu. Segala sesuatu yang dilakukan Flash Attention mengikuti perdagangan itu: menyerahkan kapasitas, membeli bandwidth dan latensi. Langkah "merestrukturisasi algoritme daripada membeli perangkat keras" yang sama, diukur pada backtest CPU, adalah tangga kecepatan backtest.
Algoritma Flash Attention
Flash Attention memproses perhatian dalam ubin yang berukuran sesuai dengan SRAM, dan tidak pernah diwujudkan secara penuh matriks dalam HBM sama sekali.
Partisi ke dalam blok baris dan ke dalam blok kolom, dengan dipilih agar ubin ditambah akumulatornya sesuai dengan chip. Untuk setiap blok kueri, ulangi semua blok nilai kunci:
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
Pengulangan softmax online
Trik yang memungkinkan pembuatan ubin adalah softmax online. Softmax yang naif memerlukan dua lintasan pada baris: satu untuk menemukan nilai maksimal (untuk stabilitas numerik), satu lagi untuk eksponensial dan normalisasi. Dua lintasan dalam satu baris yang Anda tolak untuk disimpan adalah sebuah kontradiksi — jadi Flash Attention terus menjalankan statistik dan menskala ulang seiring berjalannya waktu.
Setelah blok :
dan akumulator keluaran dikoreksi dengan faktor yang sama:
Setiap kali blok baru menaikkan maksimum yang berjalan, output yang terakumulasi sebelumnya akan diubah skalanya secara retroaktif — seolah-olah max baru sudah diketahui sejak awal. Hasilnya secara aljabar identik dengan softmax dua lintasan. Dalam aritmatika eksak, hal ini bukanlah perkiraan; itu adalah reassosiasi. (Dalam presisi terbatas, ini adalah jalur pembulatan yang berbeda, yang penting — lihat pemeriksaan ketepatannya di bawah.)
Kompleksitas IO
Ini adalah pernyataan resmi kemenangan. Flash Perhatian berfungsi
HBM mengakses, di mana adalah ukuran SRAM, melawan untuk implementasi standar. Perhatikan itu muncul di penyebut: semakin besar scratchpad pada chip, semakin sedikit bolak-balik, itulah sebabnya algoritme dinyatakan dalam hierarki memori, bukan jumlah FLOP. Untuk tipikal Dan KB, rasionya lebih menyukai Flash Attention dengan akses sekitar 5-10x lebih sedikit.
Backward pass: menghitung ulang, bukan menyimpan
Propagasi mundur melalui perhatian biasanya membutuhkan matriks yang tidak bisa dipertahankan oleh umpan ke depan. Flash Attention menghitung ulang ubin dari selama backward pass, hanya menyimpan outputnya dan statistik softmax - keduanya , bukan . Ini memperdagangkan sejumlah kecil aritmatika berlebihan untuk istilah memori yang merupakan keseluruhan masalah. Ini adalah tawaran yang sama dengan pos pemeriksaan gradien, yang diterapkan pada perincian petak di dalam satu operator.
FA2: paralelisme
Flash Attention 2 (Dao, 2023) mempertahankan algoritma dan memperbaiki penjadwalan:
- Lebih sedikit FLOP non-matmul. FA1 menghabiskan waktu nyata untuk penskalaan ulang, pencarian maksimal, dan eksponensial — operasi yang berjalan pada inti CUDA, bukan inti tensor. FA2 menunda penskalaan ulang hingga akhir loop dalam.
- Paralelisme pada panjang urutan. FA1 memparalelkan pada batch dan head saja. FA2 juga melakukan paralelisasi pada blok kueri. Hal ini penting khususnya untuk kasus perdagangan, di mana Anda sering kali memiliki satu urutan yang sangat panjang per aset dan ukuran batch 1-4 — persis seperti rezim di mana paralelisme batch-and-head membuat GPU kelaparan.
- Partisi pekerjaan warp. Setiap warp mengambil subset blok kueri yang berbeda, bukan membagi penghitungan skor dan mengurangi antar warp, sehingga menghilangkan pengurangan lintas warp.
Hasil yang dilaporkan: ~70% dari puncak FLOP teoritis pada A100 versus ~35% untuk FA1.
FA3: Mekanika hopper
Flash Attention 3 (Dao, Shah, 2024) adalah arsitektur khusus untuk H100:
- Spesialisasi warp asinkron. Tensor Memory Accelerator (TMA) Hopper menggerakkan HBM→SRAM secara asinkron. FA3 membagi warp menjadi produsen yang mengeluarkan beban TMA untuk blok KV berikutnya dan konsumen yang melakukan komputasi pada blok saat ini, sehingga pergerakan data bersembunyi di balik aritmatika.
- Matmul dan softmax disisipkan. untuk satu blok berjalan pada inti tensor sedangkan softmax untuk blok sebelumnya berjalan pada inti CUDA — dua unit perangkat keras yang berbeda, benar-benar bersamaan, bukan pada irisan waktu.
- FP8 dengan pemrosesan yang tidak koheren. H100 melakukan FP8 pada 2x throughput FP16. Perhatian FP8 yang naif dirusak oleh outlier; FA3 memutar vektor secara acak sebelum kuantisasi blok untuk menyebarkan besaran outlier di seluruh koordinat, dilaporkan dengan kesalahan numerik 2,6x lebih rendah daripada FP8 yang naif.
| Versi | GPU | Pemanfaatan | Percepatan vs Standar |
|---|---|---|---|
| FA1 | A100 | ~35% | 2-4x |
| FA2 | A100 | ~70% | 5-7x |
| FA3 (FP16) | H100 | ~75% | 3-5x vs FA2 |
| FA3 (FP8) | H100 | ~75% | 1,6x vs FA3 FP16 |
Causal masking adalah tempat perdagangan mendapat diskon
Penyembunyian kausal adalah wajib untuk deret waktu — model tidak boleh memperhatikan masa depan — dan dalam penerapan ubin, hal ini bukanlah biaya tambahan melainkan penghematan. Petak apa pun yang kuncinya sepenuhnya berada di masa depan sehubungan dengan kuerinya dilewati langsung, tidak pernah dimuat dan tidak pernah dihitung, sehingga memotong kira-kira separuh pekerjaan. Di PyTorch ini adalah is_causal=True; tidak ada lagi yang diperlukan.
Integrasinya delapan baris
Hampir tidak ada kode yang Anda perlukan tentang Flash Attention. Tukar jalur matriks skor eksplisit dengan kernel yang menyatu:
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,
)
Itulah keseluruhan perubahannya. q, k, v berbentuk (batch, heads, seq, head_dim); topeng penyebab hilang karena kernel yang membuatnya. Agar model perdagangan PyTorch beranotasi lengkap memasukkan ini ke dalam — proyeksi input, blok, dan head 3 kelas atas/datar/bawah — gunakan DeepLOB, dan untuk alur pelatihan lengkap, lihat Temporal Fusion Transformers. Membangun salinan perancah keempat di sini tidak akan mengajarkan apa pun.
Persyaratan: kemampuan komputasi >= 8.0 (A100, H100, RTX 3090+), input setengah presisi, PyTorch >= 2.0. Verifikasi jalur cepat yang benar-benar digunakan torch.backends.cuda.sdp_kernel diagnostik dan torch.cuda.max_memory_allocated() — SDPA diam-diam melakukan fallback ke kernel matematika jika ada prasyarat yang gagal, dan fallback diam terlihat persis seperti model kerja yang lambat.
Pengukurannya: apakah konteks yang lebih panjang membuahkan hasil?
Semua hal di atas menunjukkan bahwa konteks 32K atau 128K kini terjangkau. Ia tidak mengatakan apa pun tentang apakah itu berguna. Eksperimen yang jujur:
Latih arsitektur yang sama di dengan SDPA-Flash pada seri BTC yang digunakan di tempat lain dalam seri ini, menahan parameter, pengoptimal, dan target tetap sehingga panjang urutan adalah satu-satunya variabel. Laporkan dua hal:
- Biaya. Jam dinding yang diukur per zaman dan
torch.cuda.max_memory_allocated()di setiap . - Manfaat. Performa prediktif di luar sampel versus , dalam perpecahan berjalan ke depan.
Draf awal artikel ini memuat tabel angka memori per panjang urutan yang diperoleh secara analitis dari rumus aktivasi. Baris-baris tersebut dihapus: baris-baris tersebut tidak pernah diukur, dan baris-baris tersebut tidak sesuai dengan aritmatika anggaran memori artikel itu sendiri. Angka turunan yang disajikan dalam tabel hasil adalah hasil palsu, dan blog ini tidak mengirimkannya.
Properti yang menarik dari eksperimen ini adalah dapat dipublikasikan ke segala arah. Jika kinerja di luar sampel meningkat secara monoton dengan , yang membenarkan keseluruhan program konteks panjang. Jika ia berhenti pada beberapa ribu langkah, atau menurun, itu adalah bagian yang lebih kuat — pendamping dari yang benar-benar negatif — dan ini berarti dinding memori tidak pernah menjadi batasan yang mengikat pada trafo perdagangan.
Lebih banyak konteks berarti lebih banyak kapasitas, sehingga lebih banyak permukaan yang overfitting
Ada alasan khusus untuk mengharapkan hasil yang datar atau negatif. Transformator Fusi Duniawi sudah mendokumentasikan bahwa transformator vanilla diterapkan secara naif pada rangkaian keuangan yang berlebihan — mereka tidak memiliki bias induktif temporal, dan model berulang short-lookback tetap kompetitif pada frekuensi tinggi. Memperluas konteks dari 512 menjadi 32.768 langkah tidak menambah informasi sebanding dengan panjangnya; ketertinggalan marjinal ke-32.000 dalam rangkaian harga yang hampir efisien hanya membawa dampak yang sangat kecil. Apa yang ditambahkan secara andal adalah nilai parameter yang sesuai.
Jadi penyisirannya selesai harus diperlakukan apa adanya: pencarian pemilihan model, dengan mesin yang sama blog ini berlaku untuk setiap pencarian lainnya. Tiga kali durasi urutan, apa pun variasinya, adalah penghitungan uji coba, dan pemenang harus menyelesaikan Rasio Sharpe yang Dikempiskan yang dihitung berdasarkan penghitungan uji coba tersebut dan gerbang PBO, bukan hanya mengalahkan tetangganya. Jika tidak, "kemenangan konteks panjang" tidak dapat dibedakan dengan memilih yang terbaik dari tiga proses yang berisik.
Pemeriksaan ketepatan, karena "tepat" melakukan banyak pekerjaan
Flash Attention tepat dalam aritmatika eksak. Rekomendasi yang menyertainya — dijalankan pada fp16 atau bf16, dan pada H100 pertimbangkan FP8 — tidak. Itu adalah klaim yang terpisah dan yang kedua mendominasi dalam praktiknya: mengasosiasikan ulang suatu jumlah dan menurunkan presisi menjadi setengah keduanya merupakan gangguan, dan artikel yang memperkenalkan jaminan pemesanan tidak boleh mengabaikan yang presisi.
Blog sudah memiliki instrumen yang tepat. Perangkap Presisi GPU menetapkan standar: presisi rendah tidak memperingatkan Anda, ia mengembalikan sampah yang masuk akal, dan Anda membuktikan kebenaran dengan parity oracle pada kuantitas diskrit hilir — jumlah perdagangan — bukan dengan kurva yang mengamati. Diterapkan di sini:
- Hitung perhatian dengan SDPA-Flash di bf16 dan dengan implementasi referensi fp64 pada input yang identik; laporkan kesalahan relatif maks pada tensor keluaran.
- Dorong hingga pengambilan keputusan: untuk model yang mengeluarkan label atas/datar/bawah, laporkan berapa banyak label yang berpindah di antara kedua jalur, sebagai sebagian kecil dari total keputusan.
Ketidaksepakatan kecil, terbatas, dan dapat dijelaskan adalah tanda dari jalan cepat yang benar. Jika tidak ada batasan, rekomendasi FP8 tidak pernah aman untuk model ini. Tidak ada nomor yang diketahui sampai dijalankan.
Kapan harus meraihnya
Dikompresi menjadi keputusan, yang bentuknya sama dengan panduan keputusan GPU:
- Langkah waktu di atas ~2K pada GPU CUDA: ya, tanpa syarat. Ini adalah perubahan satu baris yang menghasilkan keluaran tepat, dan kemenangan bertambah seiring . Tidak ada skenario di mana Anda ingin hal itu terwujud jalan sebagai gantinya.
- Di bawah ~512 langkah waktu, pada CPU, atau dengan arsitektur non-perhatian (CNN, SSM seperti Mamba): tidak relevan. Di sebelah kiri, overhead tetap adalah keseluruhan biaya dan perhatian tidak pernah menjadi hambatan Anda.
- Ambang batas di atas adalah cerita rakyat, bukan pengukuran — ambang batas tersebut berasal dari literatur umum, dan persilangan pada model dan kartu Anda sendiri adalah tolok ukur sepuluh baris. Jalankan daripada mempercayai angka bulat.
Kesimpulan
Flash Attention adalah hasil yang bersih dan benar-benar penting: dengan menghormati hierarki memori dan mengasosiasikan kembali softmax, ia menghitung perhatian yang tepat dengan memori, bukannya , dan itu IO terikat menjelaskan alasannya dengan tepat. Mengadopsinya dalam transformator perdagangan adalah perubahan satu baris tanpa biaya akurasi dalam aritmatika yang tepat dan kemenangan memori yang besar.
Yang tidak dilakukannya adalah menjawab pertanyaan di atas. Hal ini mengubah "konteks sehari penuh tidak mungkin" menjadi "konteks sehari penuh itu murah", yang merupakan perubahan dalam biaya eksperimen, bukan hasilnya. Dinding memori yang runtuh adalah ajakan untuk mengukur, dan pengukuran itulah yang mengubah ringkasan kertas menjadi sebuah temuan.
Referensi
- Dao, T., Fu, D.Y., Ermon, S., Rudra, A., Re, C. "FlashAttention: Perhatian Tepat yang Cepat dan Hemat Memori dengan IO-Awareness." NeurIPS (2022). arXiv:2205.14135
- Dao, T. "FlashAttention-2: Perhatian Lebih Cepat dengan Paralelisme dan Partisi Kerja yang Lebih Baik." ICLR (2024). arXiv:2307.08691
- Dao, T., Shah, J. "FlashAttention-3: Perhatian Cepat dan Akurat dengan Asinkroni dan Presisi Rendah." NeurIPS (2024). arXiv:2407.08608
- Vaswani, A., dkk. "Perhatian Adalah Yang Anda Butuhkan." NeurIPS (2017).
- Milakov, M., Gimelshein, N. "Perhitungan normalizer online untuk softmax." arXiv:1805.02867 (2018).
Penulis
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.