To'liq kunlik kontekst o'n daqiqani uradimi? Diqqat va ketma-ketlik bo'yicha savol
Ushbu maqolada javob beradigan savol bor: agar transformator butun savdo kunida o'n daqiqalik oyna o'rniga bir soniyalik ruxsatda qatnasha olsa, u yaxshiroq bashorat qiladimi?
Yaqin vaqtgacha siz so'rashingiz ham mumkin emas edi. Standart e'tibor talablari xotira, shuning uchun float16-da 12 boshli 23,400 bosqichli kun faqat ball matritsasi uchun taxminan 12,9 GB talab qiladi - bu model parametrlaridan ko'proq va ko'pchilik kartalar sizga beradiganidan ko'proq. Hech kim uni sinab ko'rishdan oldin savol arifmetika bilan yopildi.
Flash Diqqat (Dao va boshq., 2022) uni ochadi. Diqqatni taxminiy hisoblash bilan emas, balki aniq bir xil natijani hisoblaydi — lekin hisoblashni IO-xabardor bo'lishi uchun qayta tuzilgan va GPU xotira darajalari orasidagi trafikni minimallashtirish orqali. Bu erda chinakam qiziqarli kontent bor va ushbu maqolaning aksariyati uning qanday ishlashiga sarflanadi: plitka qo'yish, onlayn-softmax takrorlanishi, IO bog'langan va orqaga o'tish qayta hisoblash.
Ammo mexanizm da'vo emas, balki faollashtiruvchidir. “Uzoqroq kontekst yaxshiroq” – bu bozorlar haqidagi empirik bayonot va bu blogning barqaror pozitsiyasi — Temporal Fusion Transformers, moliyaviy seriyalardagi vanil transformatorlari haddan tashqari mos va qisqa muddatli takrorlanuvchi modellar yuqori chastotada raqobatbardosh bo'lib qolishini aniqladi - bu boshqa yo'lni qisqartiradi. Shunday qilib, maqola mexanizm emas, balki o'lchov bo'yicha yopiladi.
Nima uchun diqqat xotiraga bog'langan?
Diqqat hisoblaydi — ibtidoiyning oʻzi, savdo kontekstida Koʻp ufqli portfelni prognozlash uchun vaqtinchalik termoyadroviy transformatorlar. Butun muammo shundan iboratki, oraliq ball matritsasi hisoblanadi , u xotiraga yoziladi, softmax uchun qayta o'qiladi, yana yoziladi va yakuniy matmul uchun yana o'qiladi - va u orqaga tarqalish uchun saqlanishi kerak.
Diqqatning arifmetik intensivligi , shuning uchun taxminan 64 FLOP/bayt da — A100 tizma nuqtasidan yaxshi chapda. U tekis hisoblash shiftida emas, balki eğimli tarmoqli kengligi shiftida o'tiradi: GPU harakatga ko'proq vaqt sarflaydi har qanday narsani ko'paytirishdan ko'ra atrofida. Bunda foydalaniladigan tom chizig'i ramkasi - tizma nuqtasi, qiyalik va tekis shift va nima uchun GPU umuman sotib olishga arziydimi yoki yo'qligini xuddi shu mulohaza hal qiladi - When the GPU Pays Off.
Algoritm foydalanadigan xotira ierarxiyasi
| Xotira darajasi | Hajmi | Tarmoqli kengligi | Kechikish |
|---|---|---|---|
| HBM (Yuqori tarmoqli kengligi xotirasi) | 40-80 GB | 2,0 TB/s | ~400 ns |
| SRAM (chipda, umumiy xotira) | 20 MB | 19 TB/s | ~4 ns |
SRAM taxminan 10x tarmoqli kengligi va 100x past kechikish, sig'imning mingdan birida. Flash Diqqat qiladigan hamma narsa bu savdodan kelib chiqadi: imkoniyatlardan voz keching, tarmoqli kengligi va kechikishni sotib oling. Xuddi shu "apparat sotib olishdan ko'ra algoritmni qayta qurish" harakati protsessorning orqa sinovida o'lchanadi, bu testdan oldingi tezlik narvonidir.
Flash Diqqat algoritmi
Flash Diqqat e'tiborni SRAMga mos keladigan o'lchamdagi kafellarda qayta ishlaydi va hech qachon to'liq amalga oshmaydi umuman HBMdagi matritsa.
Bo'lim ichiga qator bloklari va ichiga ustun bloklari, bilan plitka va uning akkumulyatorlari chipga mos keladigan tarzda tanlangan. Har bir so'rov bloki uchun barcha kalit-qiymat bloklari ustida takrorlang:
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
Onlayn softmax takrorlanishi
Plitka qo'yish imkonini beruvchi hiyla - bu onlayn softmax. Sodda softmaxga qator boʻylab ikkita oʻtish kerak boʻladi: biri maksimalni topish (raqamli barqarorlik uchun), ikkinchisi eksponentatsiya va normallashtirish uchun. Saqlashdan bosh tortgan ketma-ket ikkita o'tish - bu qarama-qarshilik - shuning uchun Flash Diqqat statistik ma'lumotlarni davom ettiradi va davom etayotganda o'lchamini o'zgartiradi.
Bloklardan keyin :
va chiqish akkumulyatori bir xil omil bilan tuzatiladi:
Har safar yangi blok ishlaydigan maksimal qiymatni oshirganida, ilgari to'plangan mahsulot retroaktiv ravishda o'zgartiriladi. — go'yo yangi maks boshidan ma'lum bo'lgandek. Natija algebraik jihatdan ikki pasli softmax bilan bir xil. Aniq arifmetikada bu taxminiy emas; bu qayta assotsiatsiyadir. (Cheklangan aniqlikda bu boshqa yaxlitlash yoʻli, bu muhim — quyidagi aniqlik tekshiruviga qarang.)
IO murakkabligi
Bu g'alabaning rasmiy bayonoti. Flash Diqqat bajaradi
HBM kirishlari, qaerda SRAM hajmi, qarshi standartni amalga oshirish uchun. Shu esta tutilsinki maxrajda paydo bo'ladi: chipdagi skretch-pad qanchalik katta bo'lsa, aylanishlar shunchalik kamroq bo'ladi, shuning uchun algoritm FLOP soni emas, balki xotira ierarxiyasi nuqtai nazaridan ifodalanadi. Oddiy uchun va KB, bu nisbat taxminan 5-10 baravar kamroq kirish orqali Flash Diqqatini qo'llab-quvvatlaydi.
Orqaga o'tish: do'kon o'rniga qayta hisoblash
Diqqat orqali orqaga tarqalish odatda kerak oldinga o'tish faqat saqlab qolishdan bosh tortgan matritsa. Flash Diqqat plitkalarni qayta hisoblaydi orqaga o'tish paytida, faqat chiqishni saqlash va softmax statistikasi - ikkalasi ham , emas . U butun muammo bo'lgan xotira muddati uchun kam miqdordagi ortiqcha arifmetikani sotadi. Bu bitta operator ichidagi plitkalarning granularligida qo'llaniladigan gradient tekshiruvi bilan bir xil savdodir.
FA2: parallellik
Flash Attention 2 (Dao, 2023) algoritmni saqlab qoldi va rejalashtirishni tuzatdi:
- Matmul bo‘lmagan FLOPlar kamroq bo‘ldi. FA1 real vaqtni o‘lchamini o‘zgartirish, maksimal topish va eksponentsiyaga sarfladi — bu operatsiyalar tenzor yadrolarida emas, CUDA yadrolarida ishlaydi. FA2 o'lchamini o'zgartirishni ichki pastadir oxirigacha kechiktiradi.
- Sekans uzunligi bo'yicha parallellik. FA1 faqat to'plam va boshlar bo'yicha parallellashadi. FA2 shuningdek, so'rov bloklari ustida parallellashadi. Bu, ayniqsa, har bir aktiv uchun bitta juda uzun ketma-ketlik* va 1-4 partiya hajmiga ega bo'lgan savdo holati uchun juda muhimdir - aynan partiya va bosh parallelizmi GPUni ochadigan rejim.
- Bugʻilish ishini boʻlimga ajratish. Har bir oʻzgartirish ballni hisoblashni boʻlish oʻrniga soʻrov bloklarining boshqa kichik toʻplamini oladi va burmalar boʻylab qisqarishni olib tashlaydi.
Hisobot qilingan natija: A100 da nazariy eng yuqori FLOPlarning ~70%, FA1 uchun ~35%.
FA3: Hopper mexanikasi
Flash Attention 3 (Dao, Shah, 2024) H100 uchun arxitekturaga xosdir:
- Asinxron burilish ixtisoslashuvi. Hopperning Tensor xotira tezlatgichi (TMA) HBM→SRAMni asinxron tarzda harakatga keltiradi. FA3 oʻzgarishlarni keyingi KV bloki uchun TMA yuklarini chiqaradigan ishlab chiqaruvchilarga va joriy blokda isteʼmolchilarga ajratadi, shuning uchun maʼlumotlar harakati arifmetika ortida yashirinadi.
- Interleaved matmul va softmax. bitta blok tenzor yadrolarida ishlaydi, oldingi blok uchun softmax esa CUDA yadrolarida ishlaydi - ikki xil apparat birligi, vaqt bo'yicha emas, balki haqiqiy bir vaqtda.
- Kogerent ishlov berish bilan FP8. H100 FP8 ni 2x FP16 o‘tkazish qobiliyatida bajaradi. Sodda FP8 e'tibor chet tomonidan vayron qilingan; FA3 koordinatalar boʻylab chekka kattalikni yoyish uchun bloklar boʻyicha kvantlashdan oldin vektorlarni tasodifiy aylantiradi, bu sodda FP8ga qaraganda 2,6 baravar kam sonli xatolik haqida xabar berilgan.
| Versiya | GPU | Foydalanish | Tezlashtirish standartga qarshi |
|---|---|---|---|
| FA1 | A100 | ~35% | 2-4x |
| FA2 | A100 | ~70% | 5-7x |
| FA3 (FP16) | H100 | ~75% | 3-5x va FA2 |
| FA3 (FP8) | H100 | ~75% | FA3 FP16 ga nisbatan 1,6x |
Savdo chegirmaga ega bo'lgan sabablarni niqoblash
Vaqt seriyalari uchun sabablarni niqoblash majburiydir - model kelajakka e'tibor bermasligi kerak - va plitka qo'yish paytida bu qo'shimcha xarajat emas, balki tejalgan. So'rovlariga nisbatan kalitlari butunlay kelajakda bo'lgan har qanday plitka * to'g'ridan-to'g'ri o'tkazib yuboriladi *, hech qachon yuklanmaydi va hech qachon hisoblanmaydi, ishning yarmini qisqartiradi. PyTorch-da bu is_causal=True; boshqa hech narsa talab qilinmaydi.
Integrasiya sakkiz qatordan iborat
Sizga kerak bo'lgan kodlarning deyarli hech biri Flash Diqqat haqida emas. Birlashtirilgan yadro uchun aniq ball-matritsa yo'lini almashtiring:
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,
)
Bu butun o'zgarish. q, k, v shakllanadi (batch, heads, seq, head_dim); sababiy niqob yo'qoladi, chunki yadro uni yaratadi. To'liq izohlangan PyTorch savdo modelini kiritish uchun - kiritish proyeksiyasi, bloklar va 3-sinf yuqoriga/tekis/pastga - [DeepLOB]( dan foydalaning./en/blog/post/deeplob-deep-learning-order-book) va toʻliq oʻquv quvuri uchun Temporal Fusion Transformers. Bu iskala to'rtinchi nusxasini bu erda qurish hech narsani o'rgatmaydi.
Talablar: hisoblash qobiliyati >= 8.0 (A100, H100, RTX 3090+), yarim aniqlikdagi kirishlar, PyTorch >= 2.0. Haqiqatan ham bog'langan tezkor yo'lni tekshiring torch.backends.cuda.sdp_kernel diagnostika va torch.cuda.max_memory_allocated() — Agar biron-bir shart bajarilmasa, SDPA indamay matematik yadroga qaytadi va jimgina qaytarilish xuddi sekin ishlaydigan modelga o‘xshaydi.
O'lchov: uzoqroq kontekst to'laydimi?
Yuqorida aytilishicha, 32K yoki 128K kontekst endi hamyonbop. Bu * foydali* ekanligi haqida hech narsa aytilmagan. Halol tajriba:
Xuddi shu arxitekturani o'rgating Ushbu seriyaning boshqa joylarida ishlatiladigan BTC seriyasidagi SDPA-Flash bilan, ushlab turish parametrlari, optimallashtiruvchi va maqsad sobit, shuning uchun ketma-ketlik uzunligi yagona o'zgaruvchidir. Ikki narsa haqida xabar bering:
- Xarajat. Har bir davr uchun o'lchangan devor soati va
torch.cuda.max_memory_allocated()har birida . - Foyda. Namunadan tashqari bashoratli ishlash , yurish-oldinga bo'linishda.
Ushbu maqolaning oldingi loyihasida analitik tarzda olingan ketma-ketlik uzunligi bo'yicha xotira raqamlari jadvali mavjud edi faollashtirish formulasi. Bu qatorlar olib tashlandi: ular hech qachon o'lchanmagan va maqolaning o'z xotira byudjeti arifmetikasiga rozi bo'lmagan. Natijalar jadvalida keltirilgan olingan raqam uydirma natijadir va bu blog ularni yubormaydi.
Ushbu eksperimentning qiziqarli xususiyati shundaki, u ikkala yo'nalishda ham nashr etilishi mumkin. Agar namunadan tashqari ishlash bilan monoton ko'tariladi , bu butun uzoq kontekstli dasturni oqlaydi. Agar u bir necha ming qadamda platoga tushsa yoki yomonlashsa, bu kuchliroq bo'lak - [halol salbiy] uchun hamroh./en/blog/post/honest-negative-no-robust-edge) - va bu xotira devori hech qachon transformatorlar savdosi uchun majburiy cheklov bo'lmaganligini anglatadi.
Ko'proq kontekst ko'proq sig'imga ega, shuning uchun ko'proq mos keladigan sirt
Yassi yoki salbiy natijani kutishning o'ziga xos sababi bor. Vaqtinchalik termoyadroviy transformatorlar allaqachon vanil transformatorlarining moliyaviy seriyalarga nisbatan sodda tarzda qo'llanilishini tasdiqlaydi - ularda vaqtinchalik induktiv moyillik yo'q va qisqa muddatli takrorlanuvchi modellar yuqori chastotada raqobatbardosh bo'lib qoladi. Kontekstni 512 dan 32 768 bosqichgacha kengaytirish uzunlikka proportsional ma'lumotni qo'shmaydi; samaradorlikka yaqin narx qatorining marginal 32 000-chi kechikishi juda kam ta'sir qiladi. Ishonchli ravishda qo'shadigan narsa - bu mos keladigan narsalarning parametrlari.
Shunday qilib, supurish Bu qanday bo'lgani kabi ko'rib chiqilishi kerak: model tanlash qidiruvi, xuddi shu mexanizm bilan bu blog boshqa har bir qidiruv uchun qo'llaniladi. Uch ketma-ketlik uzunligi, boshqa nima bo'lishidan qat'i nazar, sinov hisobi hisoblanadi va g'olib qo'shnilarini mag'lub etibgina qolmasdan, ushbu sinov soniga nisbatan hisoblangan Deflated Sharpe Ratio va PBO darvozasini tozalashi kerak. Aks holda, "uzoq kontekstdagi g'alabalar" uchta shovqinli yugurishdan eng yaxshisini tanlashdan farq qilmaydi.
Aniqlikni tekshirish, chunki "aniq" juda ko'p ish qiladi
Flash Diqqat aniq aniq arifmetikada. Unga biriktirilgan tavsiya - fp16 yoki bf16 da ishga tushiring va H100 da FP8ni ko'rib chiqing - yo'q. Bular alohida da'volar va ikkinchisi amalda ustunlik qiladi: yig'indini qayta bog'lash va aniqlikni yarmiga tushirish ikkalasi ham bezovtalikdir va buyurtma kafolatini kiritgan maqola aniqlikni qo'l bilan silkitmasligi kerak.
Blogda allaqachon kerakli vosita mavjud. GPU Precision Trap standartni o'rnatadi: past aniqlik sizni ogohlantirmaydi, u aql bovar qilmaydigan axlatni qaytaradi va siz to'g'rilikni egri chiziqlar bilan emas, balki quyi oqimdagi diskret miqdor - savdo hisoblari bo'yicha paritet oracle bilan isbotlaysiz. Bu erda qo'llaniladi:
- bf16 da SDPA-Flash va bir xil kirishlar bo'yicha fp64 mos yozuvlar ilovasi bilan e'tiborni hisoblash; chiqish tensoridagi maksimal nisbiy xatolik haqida xabar bering.
- Qarorga o'ting: yuqoriga/tekis/pastga yorlig'ini chiqaradigan model uchun umumiy qarorlarning bir qismi sifatida ikkita yo'l o'rtasida qancha yorliq aylanayotgani haqida hisobot bering.
Kichik, cheklangan, tushuntirish mumkin bo'lgan kelishmovchilik - bu to'g'ri tezkor yo'lning imzosi. Cheklanmagani FP8 tavsiyasi ushbu model uchun hech qachon xavfsiz bo'lmaganligini anglatadi. Hech bir raqam ishga tushirilmaguncha ma'lum emas.
Unga qachon erishish kerak
[GPU qarorlar qoʻllanmasi] bilan bir xil shaklga ega boʻlgan qarorga siqilgan/en/blog/post/when-gpu-pays-off-sweep-roofline):
- CUDA GPU-da ~2K dan ortiq vaqt qadamlari: ha, so'zsiz. Bu bir qatorli o'zgarish bo'lib, aniq natija beradi va yutuq ortib boradi. . Siz amalga oshirmoqchi bo'lgan stsenariy yo'q o'rniga yo'l.
- 512 vaqt qadamidan pastda, protsessorda yoki e'tiborga olinmaydigan arxitekturada (CNN, Mamba kabi SSM'lar): ahamiyatsiz. To'g'ridan-to'g'ri to'g'ridan-to'g'ri chap tomonda, qo'shimcha xarajatlar butun xarajatdir va e'tibor sizga hech qachon qiyinchilik tug'dirmagan.
- Yuqoridagi chegaralar o'lchov emas, folklordir — ular umumiy adabiyotlardan olingan va sizning modelingiz va kartangizdagi krossover o'n qatorli mezondir. Dumaloq raqamlarga ishonishdan ko'ra, uni boshqaring.
Xulosa
Flash Diqqat toza va chinakam muhim natijadir: xotira ierarxiyasini hurmat qilish va softmaxni qayta bog'lash orqali u aniq e'tiborni hisoblab chiqadi. o'rniga xotira , va IO bound nima uchun ekanligini aniq tushuntiradi. Savdo transformatorida uni qabul qilish - bu aniq arifmetikada aniqlik narxi va katta xotira g'alabasi bilan bir qatorli o'zgarish.
U nima qilmasa, yuqoridagi savolga javob beradi. U "to'liq kunlik kontekst mumkin emas" ni "to'liq kunlik kontekst arzon" ga aylantiradi, bu tajribaning natijasi emas, balki narxining o'zgarishi. Pastga tushadigan xotira devori o'lchash uchun taklifdir va o'lchov buni qog'oz xulosasidan topilmaga aylantiradi.
Ma'lumotnomalar
- Dao, T., Fu, D.Y., Ermon, S., Rudra, A., Re, C. "FlashAttention: IO-ogohlik bilan tez va xotira samarali aniq e'tibor." NeurIPS (2022). arXiv:2205.14135
- Dao, T. "FlashAttention-2: Yaxshiroq parallellik va ishni qismlarga ajratish bilan tezroq e'tibor". ICLR (2024). arXiv:2307.08691
- Dao, T., Shah, J. "FlashAttention-3: Asinxroniya va past aniqlik bilan tez va aniq e'tibor". NeurIPS (2024). arXiv:2407.08608
- Vaswani, A. va boshqalar. "Sizga faqat diqqat kerak." NeurIPS (2017).
- Milakov, M., Gimelshein, N. "Softmax uchun onlayn normalizatorni hisoblash." arXiv:1805.02867 (2018).
Authors
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.