← Макалаларга кайтуу
August 4, 2026
5 мүн окуу

Толук күндүк контекст он мүнөттү жеңеби? Көңүл буруу жана ырааттуулук боюнча суроо

Толук күндүк контекст он мүнөттү жеңеби? Көңүл буруу жана ырааттуулук боюнча суроо
#deep-learning
#attention
#Flash-Attention
#GPU
#optimization

Бул макалада төмөнкү суроого жооп берүү керек: эгер трансформатор он мүнөттүк терезенин ордуна бир секундалык резолюцияда бүтүндөй бир соода күнүнө катыша алса, анда ал жакшыраак алдын ала айтууга болобу?

Акыркы убакка чейин сурай да алган жоксуң. Стандарттык көңүл буруу керек O(N2)\mathcal{O}(N^2) эстутум, ошондуктан float16да ​​12 баштык 23,400 кадамдык күн упайлар матрицасы үчүн гана болжол менен 12,9 ГБ керектелет — бул моделдин параметрлеринен көп жана көпчүлүк карталар бере тургандан да көп. Суроо эч ким сынай электе эле арифметика менен жабылган.

Flash Attention (Dao et al., 2022) аны ачат. Көңүл буруу менен эмес, так бир эле натыйжаны эсептейт — бирок GPU эс тутумунун деңгээлдеринин ортосундагы трафикти азайтып, IO-маанилүү болуу үчүн эсептөөнү реструктуризациялоо менен. Бул жерде чындап эле кызыктуу мазмун болуп саналат жана бул макаланын көбү анын кантип иштешине жумшалат: плитка коюу, онлайн-softmax кайталануу, Θ(N2d2/M)\Theta(N^2 d^2 / M) IO байланган жана артка кайра эсептөө.

Бирок механизм доомат эмес, түрткү берүүчү болуп саналат. "Узун контекст жакшыраак" бул базарлар жөнүндө эмпирикалык билдирүү жана бул блогдун туруктуу позициясы — Temporal Fusion Transformers, каржылык сериялардагы ваниль трансформаторлору ашыкча жана кыска кайталануучу моделдер жогорку жыштыкта ​​атаандаштыкка туруштук берерин аныктаган - башка жолду кыскартат. Ошентип, макала механизм боюнча эмес, өлчөө боюнча жабылат.

Эмне үчүн көңүл эс тутумга байланган

Көңүл эсептейт softmax(QK/dk)V\text{softmax}(\mathbf{Q}\mathbf{K}^\top / \sqrt{d_k})\mathbf{V} — примитивдин өзү, соода контекстинде Көп горизонттук портфолиону болжолдоо үчүн убактылуу Fusion Transformers. Бүткүл маселе мунун бир сызыгы: орто балл матрицасы S=QK/dk\mathbf{S} = \mathbf{Q}\mathbf{K}^\top/\sqrt{d_k} болуп саналат N×NN \times N, ал эс-тутумга жазылат, softmax үчүн кайра окулат, кайра жазылат жана акыркы матмуль үчүн кайра окулат - жана аны кайра жайылтуу үчүн сактоо керек.

Көңүл буруунун арифметикалык интенсивдүүлүгү min(d,N)\approx \min(d, N), ошондуктан болжол менен 64 FLOP/байт боюнча d=64d = 64 — A100 кырка точкасынын сол жагында. Ал жалпак эсептөө шыпында эмес, жантайыңкы өткөрмө шыпта отурат: GPU кыймылга көбүрөөк убакыт коротот S\mathbf{S} айланасында эч нерсе көбөйтүүгө караганда. Бул колдонулган чатыр сызыгынын негизи - кырка чекит, эңкейиш жана жалпак шып жана эмне үчүн ошол эле жүйөө GPU сатып алууга татыктуубу деп чечет - GPU төлөп бергенде.

Алгоритм иштеткен эс тутум иерархиясы

Memory Level Size өткөрүү жөндөмдүүлүгү Latency
HBM (Жогорку өткөрүү жөндөмдүүлүгүнүн эс тутуму) 40-80 ГБ 2,0 ТБ/с ~400 ns
SRAM (чипте, жалпы эс тутум) 20 MB 19 ТБ/с ~4 ns

SRAM болжол менен 10x өткөрүү жөндөмдүүлүгү жана 100x төмөн күтүү мөөнөтү, кубаттуулуктун миңден биринде. Flash Attention жасагандын баары ошол соодадан келип чыгат: кубаттуулуктан баш тартуу, өткөрүү жөндөмдүүлүгүн жана күтүү мөөнөтүн сатып алуу. Ошол эле "аппараттык каражаттарды сатып алуунун ордуна, алгоритмди реструктуризациялоо" кыймылы, CPU бэк-тестинде өлчөнөт, арткы ылдамдык тепкичтери.

Flash Attention алгоритми

Flash Attention көңүлдү SRAMга туура келген плиткаларда иштетет жана эч качан толугу менен ишке ашпайт N×NN \times N дегеле HBMдеги матрица.

Бөлүм Q\mathbf{Q} ичине Tr=N/BrT_r = \lceil N/B_r \rceil катар блоктору жана K,V\mathbf{K}, \mathbf{V} ичине Tc=N/BcT_c = \lceil N/B_c \rceil мамыча блоктору, менен Br,BcB_r, B_c плитка плюс анын аккумуляторлору чипке туура келгени үчүн тандалган. Ар бир суроо блогу үчүн бардык ачкыч-маани блокторун кайталаңыз:

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

онлайн softmax кайталанышы

Плиткаларды жабууну мүмкүн кылган амал - бул онлайн softmax. Наив софтмакс саптын үстүнөн эки өтүүнү талап кылат: бири максты табуу (сандык туруктуулук үчүн), экинчиси экспонентациялоо жана нормалдаштыруу. Сиз сактоодон баш тарткан бир катардан эки өтүү карама-каршылык болуп саналат — андыктан Flash Attention статистиканы иштетип, масштабын өзгөртөт.

Блоктардан кийин 1,,j1, \ldots, j:

m(j)=max(m(j1),max(Sij))m^{(j)} = \max(m^{(j-1)}, \max(\mathbf{S}_{ij})) (j)=(j1)em(j1)m(j)+keSijkm(j)\ell^{(j)} = \ell^{(j-1)} \cdot e^{m^{(j-1)} - m^{(j)}} + \sum_k e^{S_{ijk} - m^{(j)}}

жана чыгаруучу аккумулятор ошол эле фактор менен коррекцияланат:

Oi(j)=(j1)(j)em(j1)m(j)Oi(j1)+1(j)emijm(j)PijVj\mathbf{O}_i^{(j)} = \frac{\ell^{(j-1)}}{\ell^{(j)}} \cdot e^{m^{(j-1)} - m^{(j)}} \cdot \mathbf{O}_i^{(j-1)} + \frac{1}{\ell^{(j)}} \cdot e^{m_{ij} - m^{(j)}} \cdot \mathbf{P}_{ij}\mathbf{V}_j

Жаңы блок иштеп жаткан максумду көтөргөн сайын, мурда топтолгон өндүрүш ретроактивдүү түрдө em(j1)m(j)e^{m^{(j-1)} - m^{(j)}} — жаңы макс башынан эле белгилүү болгондой. Жыйынтык алгебралык жактан эки өтүү softmax менен бирдей. Так арифметикада бул болжолдоо эмес; бул кайра ассоциация болуп саналат. (Чектүү тактыкта бул башка тегеректөө жолу, бул маанилүү — төмөндөгү тактыкты текшерүүнү караңыз.)

IO татаалдыгы

Бул жеңиштин расмий билдирүүсү. Flash Attention аткарат

Θ(N2d2M)\Theta\left(\frac{N^2 d^2}{M}\right)

HBM кире алат, кайда MM каршы SRAM өлчөмү болуп саналат Θ(Nd+N2)\Theta(Nd + N^2) стандартты ишке ашыруу үчүн. Белгилей кетчү нерсе MM деноминатордо пайда болот: чиптеги скретчпад канчалык чоң болсо, айлануу азыраак, ошондуктан алгоритм FLOP санына эмес, эстутум иерархиясына карата айтылат. типтүү үчүн d=64d = 64 жана M100M \approx 100 KB, бул катыш болжол менен 5-10x азыраак мүмкүндүк алуу менен Flash Attention жактырат.

Артка өтүү: дүкөндүн ордуна кайра эсептөө

Көңүл буруу аркылуу артка таралуу, адатта, керек P\mathbf{P} алдыга өтүү жөн эле сактоодон баш тарткан матрица. Flash Attention плиткаларды кайра эсептейт Q,K\mathbf{Q}, \mathbf{K} артка өтүү учурунда, чыгарууну гана сактоо O\mathbf{O} жана softmax статистикасы (m,)(m, \ell) — экөө тең O(N)\mathcal{O}(N), жок O(N2)\mathcal{O}(N^2). Бул бүтүндөй көйгөй болгон эстутум термини үчүн бир аз ашыкча арифметиканы соодалайт. Бул бир оператордун ичиндеги плитканын гранулярдуулугунда колдонулган градиентти текшерүү менен бирдей эле соодалашуу.

FA2: параллелизм

Flash Attention 2 (Dao, 2023) алгоритмди сактап, графикти бекитти:

  1. Матмул эмес FLOPs азыраак. FA1 масштабын өзгөртүү, максимум табуу жана экспоненциациялоо боюнча реалдуу убакыт коротту — тензор өзөктөрүндө эмес, CUDA өзөктөрүндө иштеген операциялар. FA2 масштабын өзгөртүүнү ички циклдин аягына чейин жылдырат.
  2. Издиктүүлүк узундугу боюнча параллелдүүлүк. FA1 партия жана баштар боюнча гана параллелдешет. FA2 ошондой эле суроо блокторуна параллелдешет. Бул соода иши үчүн өзгөчө мааниге ээ, анда сизде көп учурда * бир активге бир өтө узун ырааттуулук* жана 1-4 партия өлчөмү бар - так режимде партия жана баш параллелизм GPU ачка калтырат.
  3. Эгерде иштөөнү бөлүү. Ар бир бурмалоо упайларды эсептөөнү бөлүүнүн ордуна суроо блокторунун ар кандай топтомун алат жана кайчылаш бурмаларды кыскартууну алып салат.

Кабарланган натыйжа: A100 боюнча теориялык эң жогорку FLOPs ~70%, FA1 үчүн ~35%.

FA3: Бункер механикасы

Flash Attention 3 (Dao, Shah, 2024) H100 үчүн архитектурага мүнөздүү:

  1. Асинхрондук бурмалоо адистештирилген. Hopper's Tensor Memory Accelerator (TMA) HBM→SRAM асинхрондуу кыймылдайт. FA3 катаалмаларды кийинки КВ блогу үчүн TMA жүктөмдөрүн чыгарган продюсерлерге жана учурдагы блоктогу керектөөчүлөргө бөлөт, андыктан берилиштер кыймылы арифметиканын артына жашырылат.
  2. Аралашкан матмул жана софтмакс. QiKj\mathbf{Q}_i\mathbf{K}_j^\top бир блок үчүн тензордук өзөктөр менен иштейт, ал эми мурунку блок үчүн softmax CUDA өзөктөрүндө иштейт — эки башка аппараттык бирдик, убакыт боюнча кесилген эмес, чындап эле бир убакта.
  3. Когерентсиз иштетүү менен FP8. H100 FP8ди 2x FP16 өткөрүмдүүлүктө аткарат. Naive FP8 көңүл сырттан келгендер тарабынан талкаланат; FA3 координаттар боюнча четтөө чоңдугун жайылтуу үчүн блок боюнча кванттоо алдында векторлорду туш келди айлантат, бул жөнөкөй FP8ге караганда 2,6 эсе аз сандык ката менен билдирилди.
Version GPU Utilization Speedup vs Standard
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

Себептик маскалоо - бул соода арзандатуу

Себептик маскалар убакыт сериялары үчүн милдеттүү болуп саналат - модель келечекке көңүл бурбашы керек - жана плиткаларды жабуу үчүн бул кошумча чыгым эмес, үнөмдөлгөн каражат. Ачкычтары толугу менен келечектеги суроо-талаптарына карата болгон ар бир плитка түз өткөрүп жиберилет, эч качан жүктөлбөйт жана эч качан эсептелбейт, жумуштун жарымына жакынын кыскартат. PyTorchте бул is_causal=True; башка эч нерсе талап кылынбайт.

Интеграция сегиз саптан турат

Сизге керектүү коддордун дээрлик эч бири Flash Attention жөнүндө эмес. Жалгаштырылган ядро ​​үчүн ачык упай-матрицалык жолду алмаштырыңыз:

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,
)

Бул бүт өзгөрүү болуп саналат. q, k, v формада болушат (batch, heads, seq, head_dim); себептүү маска жок, анткени ядро ​​аны курат. Аны түшүрүү үчүн толук аннотацияланган PyTorch соода модели үчүн - киргизүү проекциясы, блоктор жана 3-класстагы өйдө/жалпак/төмөн баш - DeepLOB жана толук окуу түтүгү үчүн караңыз Убактылуу Fusion Transformers. Бул жерде ошол складдын төртүнчү нускасын куруу эч нерсеге үйрөтпөйт.

Талаптар: эсептөө жөндөмдүүлүгү >= 8.0 (A100, H100, RTX 3090+), жарым тактык киргизүүлөр, PyTorch >= 2.0. Ыкчам жолду текшериңиз torch.backends.cuda.sdp_kernel диагностика жана torch.cuda.max_memory_allocated() — Кандайдыр бир алдын ала шарттар аткарылбай калса, SDPA унчукпай кайра математикалык ядрого түшөт жана унчукпай кайра иштетүү жай иштеген моделге окшош.

Өлчөө: узак контекст төлөйбү?

Жогоруда айтылгандардын баары 32K же 128K контекст азыр * жеткиликтүү * деп айтылат. Бул пайдалуу деген эч нерсе айтылбайт. Чынчыл эксперимент:

Ошол эле архитектура боюнча N{512,4096,32768}N \in \{512, 4096, 32768\} Бул сериянын башка жеринде колдонулган BTC сериясындагы SDPA-Flash менен, кармап турган параметрлер, оптимизатор жана максат туруктуу, андыктан ырааттуулуктун узундугу жалгыз өзгөрмө болуп саналат. Эки нерсени кабарлаңыз:

  1. Баасы. Ар бир доорго ченелген дубал сааты жана torch.cuda.max_memory_allocated() ар биринде NN.
  2. Пайда. Үлгүдөн тышкаркы болжолдуу көрсөткүчтөргө каршы NN, алдыга басуу боюнча.

Бул макаланын мурунку долбоорунда аналитикалык жактан алынган ырааттуулуктун узундугу боюнча эстутум цифраларынын таблицасы камтылган O(N)\mathcal{O}(N) активдештирүү формуласы. Ал катарлар алынып салынат: алар эч качан өлчөнгөн эмес жана макаланын өз эс-бюджеттик арифметикасына макул эмес. Натыйжалар таблицасында берилген сан ойдон чыгарылган жыйынтык жана бул блог аларды жеткирбейт.

Бул эксперименттин кызыктуу касиети ал эки тарапта тең жарыяланышы мүмкүн. Эгерде үлгүдөн тышкары аткаруу менен монотондуу көтөрүлөт NN, бул буткул узак контексттик программаны актайт. Эгерде ал бир нече миң тепкичке көтөрүлсө же начарлап кетсе, анда бул күчтүүрөөк — чынчыл терс - жана бул эстутум дубалы эч качан трансформаторлорду соодалоого милдеттүү чектөө болбогонун билдирет.

Көбүрөөк контекст - көбүрөөк сыйымдуулук, андыктан ашыкча бет

Жалпак же терс натыйжаны күтүүгө белгилүү бир себеп бар. Убактылуу Fusion Transformers мурунтан эле ваниль трансформаторлорунун каржылык серияларга жаңылыштык менен колдонулгандыгын тастыктаган - аларда убактылуу индуктивдүү тенденциялар жок, ал эми кыска кайталануучу моделдер жогорку жыштыкта ​​атаандаштыкка жөндөмдүү бойдон калууда. Контекстти 512ден 32,768 кадамга чейин узартуу узундукка пропорционалдуу маалыматты кошпойт; жакын эффективдүү баа сериясынын маргиналдуу 32 000 артта калуусу өтө аз. Ал ишенимдүү түрдө кошо турган нерсе - бул туура келүүчү нерселердин параметрлери.

Ошентип, шыпыруу NN Бул кандай болсо, ошондой каралышы керек: моделди издөө, ушул эле техника менен бул блог башка бардык издөөлөргө тиешелүү. Үч ырааттуулуктун узундугу, башкасы кандай болсо дагы, сыноо эсеби болуп саналат жана жеңүүчү кошуналарын гана жеңбестен, ошол сыноо эсебине каршы эсептелген Deflated Sharpe Ratio жана PBO дарбазасын тазалашы керек. Болбосо, "узак контекстте жеңиш" үч ызы-чуулуу чуркоодон эң жакшысын тандоодон айырмаланбайт.

Тактыгын текшерүү, анткени "так" көп жумуш жасап жатат

Flash Attention так так арифметикада. Ага тиркелген сунуш - fp16 же bf16-да иштетиңиз, ал эми H100-де FP8ди эске алыңыз - андай эмес. Булар өзүнчө дооматтар жана экинчиси иш жүзүндө үстөмдүк кылат: сумманы кайра бириктирүү жана тактыктын жарымына чейин төмөндөтүү - бул эки эсе бузукулук, ал эми буйрутма кепилдикти киргизген макала тактыкка кол көтөрбөшү керек.

Блогдо мурунтан эле туура курал бар. GPU Precision Trap стандартты орнотот: төмөн тактык сизге эскертпейт, ал акылга сыярлык таштандыны кайтарып берет жана сиз тууралыгын паритет оракулу менен төмөнкү агымдагы дискреттик санда далилдейсиз — соода саноолору — ийри сызыктар менен эмес. Бул жерде колдонулат:

  • SDPA-Flash менен bf16 жана окшош киргизүүлөр боюнча fp64 маалымдама ишке ашыруу менен көңүл бурууну эсептеңиз; чыгуу тензорундагы **максималдуу салыштырмалуу ката ** отчету.
  • Чечимге чейин түртүңүз: өйдө/жалпак/төмөн энбелгисин чыгарган модель үчүн жалпы чечимдердин бир бөлүгү катары эки жолдун ортосунда канча энбелги айланганын кабарлаңыз.

Кичинекей, чектелген, түшүндүрүүгө мүмкүн болгон келишпестик - бул туура тез жолдун белгиси. Чексиз бир FP8 сунушу бул модель үчүн эч качан коопсуз болбогонун билдирет. Бир дагы номер иштетилмейинче белгисиз.

Ага качан жетиш керек

[GPU чечим жетектөөчүсү] сыяктуу формадагы чечимге кысылган/en/blog/post/when-gpu-pays-off-sweep-roofline):

  • CUDA GPUдеги ~2K убакыт кадамдарынан жогору: ооба, эч кандай шартсыз. Бул бир саптан турган өзгөртүү, так жыйынтык чыгарат жана утуш менен өсөт NN. Сиз ишке ашырууну каалаган сценарий жок N×NN \times N ордуна жол.
  • Төмөндө ~512 убакыт кадамы, CPU же көңүл бурулбаган архитектуралар (CNNs, Mamba сыяктуу SSMs): тиешеси жок. Тоонун сол жагында белгиленген үстөк чыгымдар бүтүндөй чыгым болуп саналат жана көңүл буруу сизге эч качан тоскоолдук кылган эмес.
  • Жогорудагы босоголор өлчөө эмес, фольклор — алар жалпы адабияттан келип чыккан, өзүңүздүн моделиңиз жана картаңыз боюнча кроссовер он сызык көрсөткүч болуп саналат. Тегерек сандарга ишенбей, аны иштетиңиз.

Корутунду

Flash Attention – бул таза жана чындап маанилүү натыйжа: эс тутумдун иерархиясын урматтоо жана softmaxту кайра байланыштыруу менен, ал так көңүл буруу менен эсептейт. O(N)\mathcal{O}(N) ордуна эс O(N2)\mathcal{O}(N^2), жана Θ(N2d2/M)\Theta(N^2 d^2 / M) IO bound эмне үчүн экенин так түшүндүрөт. Аны соода трансформаторунда кабыл алуу - бул так арифметикада тактык баасы жок жана чоң эстутум утушу менен бир саптык өзгөртүү.

Ал эмне кылбайт * жогорудагы суроого жооп берет. Ал "толук күндүк контекст мүмкүн эмес" дегенди "толук күндүк контекст арзан" дегенге айландырат, бул эксперименттин жыйынтыгы эмес, баасынын өзгөрүшү. Эстутум дубалы түшүп келе жаткан өлчөө үчүн чакыруу болуп саналат жана өлчөө муну кагаздагы кыскача жыйынтыкка айландырган нерсе.

Шилтемелер

  1. Dao, T., Fu, D.Y., Ermon, S., Rudra, A., Re, C. "FlashAttention: IO-маалымат менен Fast жана Memory-натыйжалуу так көңүл." NeurIPS (2022). arXiv:2205.14135
  2. Дао, Т. "FlashAttention-2: Жакшыраак параллелизм жана ишти бөлүү менен тез көңүл буруу." ICLR (2024). arXiv:2307.08691
  3. Дао, Т., Шах, Дж. "FlashAttention-3: асинхрония жана төмөн тактык менен тез жана так көңүл буруу." NeurIPS (2024). arXiv:2407.08608
  4. Васвани, А., жана башкалар. "Көңүл буруу керек." NeurIPS (2017).
  5. Milakov, M., Gimelshein, N. "Softmax үчүн онлайн нормализатор эсептөө." arXiv:1805.02867 (2018).
blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

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.

Newsletter

Рынктан бир кадам алдыда болуңуз

AI соода аналитикасы, рынок талдоолору жана платформа жаңылыктары үчүн биздин жаңылыктар бюллетенине жазылыңыз.

Биз сиздин купуялыгыңызды урматтайбыз. Каалаган убакта жазылымдан чыга аласыз.