← Мақалаларға оралу
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} — сауда контекстіндегі қарабайырдың өзі Көп көкжиек портфолиосының болжауына арналған уақытша біріктіру трансформаторлары. Бүкіл мәселе оның бір сызығы: аралық балл матрицасы 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 төлеген кезде.

Алгоритм пайдаланатын жад иерархиясы

Жад деңгейі Өлшем Өткізу жолағы Кідіріс
HBM (Жоғары өткізу қабілеттілігінің жады) 40-80 ГБ 2,0 ТБ/с ~400 нс
SRAM (чипте, ортақ жад) 20 МБ 19 ТБ/с ~4 нс

SRAM шамамен 10x өткізу қабілеттілігі және 100x төмен кідіріс, сыйымдылықтың мыңнан бір бөлігінде. Flash Attention әрекетінің бәрі осы саудадан шығады: сыйымдылықтан бас тартыңыз, өткізу қабілеттілігін және кідіріс уақытын сатып алыңыз. Дәл сол «аппараттық құралдарды сатып алудан гөрі алгоритмді қайта құрылымдау» процессорының кері тестінде өлшенген қадамы backtest жылдамдық сатысы.

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. Аңғал 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)}} — жаңа макс басынан белгілі болғандай. Нәтиже алгебралық тұрғыдан екі жолды жұмсақ макспен бірдей. Дәл арифметикада бұл жуықтау емес; бұл қайта ассоциация. (Ақырғы дәлдікте бұл әртүрлі дөңгелектеу жолы, ол маңызды — төмендегі дәлдікті тексеруді қараңыз.)

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 КБ, бұл қатынас Flash Attention қолданбасын шамамен 5-10 есе аз кіру арқылы қолдайды.

Кері өту: дүкеннің орнына қайта есептеңіз

Зейін арқылы кері таралу әдетте қажет 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. Матмул емес FLOP азырақ. FA1 нақты уақытты масштабтау, максимум табу және экспоненциацияға жұмсады — тензор өзектерінде емес, CUDA өзектерінде орындалатын операциялар. FA2 масштабтауды ішкі циклдің соңына дейін кейінге қалдырады.
  2. Разымдылық ұзындығы бойынша параллелизм. FA1 тек топтама мен бастар бойынша параллельді. FA2 сонымен қатар сұрау блоктары бойынша параллельді. Бұл сауда жағдайы үшін маңызды, мұнда сізде жиі бір актив үшін өте ұзақ реттілік және 1-4 пакет өлшемі бар — дәл осы режимде партия мен басты параллелизм GPU аштыққа ұшырайды.
  3. Бөлу жұмысын бөлу. Әрбір бұрмалау ұпайды есептеуді бөлуге және қиылысуларды азайтуды жоюға емес, сұрау блоктарының басқа жиынын алады.

Мәлімделген нәтиже: A100 бойынша теориялық ең жоғары FLOP мәндерінің ~70% және FA1 үшін ~35%.

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

Flash Attention 3 (Dao, Shah, 2024) H100 үшін архитектураға тән:

  1. Асинхронды бұрмалау мамандануы. Хоппердің тензорлық жад үдеткіші (TMA) HBM→SRAM асинхронды түрде жылжытады. FA3 бұрмаларды келесі КВ блогы үшін TMA жүктемелерін шығаратын өндірушілерге және ағымдағы блоктағы тұтынушыларға бөледі, осылайша деректер қозғалысы арифметиканың артына жасырылады.
  2. Араластырылған матмуль және софтмакс. QiKj\mathbf{Q}_i\mathbf{K}_j^\top бір блок үшін тензор өзектерінде жұмыс істейді, ал алдыңғы блок үшін softmax CUDA өзектерінде жұмыс істейді — екі түрлі аппараттық бірлік, уақыт бойынша кесілген емес, шын мәнінде бір мезгілде.
  3. Когерентсіз өңдеуі бар FP8. H100 2x FP16 өткізу қабілеттілігінде FP8 жасайды. Аңғал FP8 назарын шектен тыс көрсеткіштер бұзады; FA3 координаттар бойынша шектен тыс шаманы тарату үшін блок бойынша кванттау алдында векторларды кездейсоқ айналдырады.
Нұсқа GPU Пайдалану Speedup стандартқа қарсы
FA1 A100 ~35% 2-4x
FA2 A100 ~70% 5-7x
FA3 (FP16) H100 ~75% 3-5x қарсы FA2
FA3 (FP8) H100 ~75% 1,6x қарсы 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 және толық оқыту құбырын Temporal Fusion Transformers/en/blog/post/temporal-fusion-transformer-trading). Бұл тіректердің төртінші көшірмесін осында салу ештеңеге үйретпейді.

Талаптар: есептеу мүмкіндігі >= 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, бұл бүкіл ұзақ мәтінмәндік бағдарламаны негіздейді. Егер ол бірнеше мың қадаммен үстіртке түссе немесе нашарласа, бұл күшті бөлік — [адал теріс] серігі./en/blog/post/honest-negative-no-robust-edge) — және бұл жад қабырғасы ешқашан сауда трансформаторлары үшін міндетті шектеу болмағанын білдіреді.

Көбірек контекст сыйымдылығы жоғарырақ, демек, артық сәйкес келетін бет

Тегіс немесе теріс нәтиже күтудің нақты себебі бар. Уақытша синтез трансформаторлары ванильді трансформаторлардың қаржылық қатарларды шамадан тыс орнатуға аңғал түрде қолданылғанын қазірдің өзінде құжаттайды — оларда уақытша индуктивті ауытқулар жоқ, ал қысқа мерзімді қайталанатын модельдер жоғары жиілікте бәсекеге қабілетті болып қалады. Мәтінмәнді 512 қадамнан 32 768 қадамға дейін ұзарту ұзындыққа пропорционалды ақпаратты қоспайды; тиімді баға қатарының шекті 32 000-шы лагы өте аз. Ол сенімді түрде қосатын нәрсе - сәйкес келетін параметрлердің құны.

Сонымен, сыпыру NN ол қандай болса, сол сияқты қарастырылуы керек: үлгі таңдауы бойынша іздеу, бұл блог кез келген басқа іздеуге қатысты бірдей механизммен. Үш реттік ұзындықтағы басқа неше өзгерсе де, сынақ саны болып табылады және жеңімпаз көршілерін ұрып қана қоймай, сол сынақ санына қарсы есептелген Deflated Sharpe Ratio мен PBO қақпасын тазалауы керек. Әйтпесе, «ұзақ контекст жеңісі» үш шулы жүгірістің ең жақсысын таңдаудан айырмашылығы жоқ.

Дәлдік тексеру, өйткені "дәл" көп жұмыс жасайды

Flash Attention дәл дәл арифметикада. Оған қоса берілген ұсыныс — fp16 немесе bf16 нұсқаларында орындаңыз, ал H100-де FP8-ді қарастырыңыз — жоқ. Бұл жеке талаптар, ал екіншісі іс жүзінде басым: қосындыны қайта байланыстыру және дәлдіктің жартысына дейін төмендету - бұл алаңдаушылық, ал тапсырыс кепілдігін енгізген мақала дәлдікке қол тигізбеуі керек.

Блогта дұрыс құрал әлдеқашан бар. GPU Precision Trap стандартты белгілейді: төмен дәлдік сізді ескертпейді, ол мүмкін болатын қоқысты қайтарады және сіз дұрыстығын паритеттік оракул арқылы төмен ағындағы дискретті санда — сауда сандарында — қисық сызықтармен дәлелдейсіз. Мұнда қолданылған:

  • bf16 жүйесінде SDPA-Flash көмегімен және бірдей кірістерде fp64 анықтамалық іске асыру арқылы зейінді есептеңіз; шығыс тензорындағы максималды салыстырмалы қателік есебі.
  • Шешімге дейін жеткізіңіз: жоғары/жалпақ/төмен белгіні шығаратын модель үшін жалпы шешімдердің бір бөлігі ретінде екі жолдың арасында қанша жапсырма ауысатынын есептеңіз.

Шағын, шектелген, түсіндірілетін келіспеушілік - бұл дұрыс жылдам жолдың қолтаңбасы. Шексіз нұсқа FP8 ұсынысы бұл модель үшін ешқашан қауіпсіз болмағанын білдіреді. Ешқайсысы да орындалмайынша белгісіз.

Оған қашан жету керек

[GPU шешім нұсқаулығы] сияқты пішіні бар шешімге қысылған/en/blog/post/when-gpu-pays-off-sweep-roofline):

  • CUDA графикалық процессорында ~2K уақыт қадамынан жоғары: иә, сөзсіз. Бұл нақты нәтиже беретін бір жолды өзгерту және ұтыс өседі NN. Сіз іске асырғыңыз келетін сценарий жоқ N×NN \times N орнына жол.
  • ~512 уақыт қадамынан төмен, CPU немесе назар аудармайтын архитектурасы бар (CNN, Mamba сияқты SSM): маңызды емес. Жотаның сол жағында бекітілген үстеме шығындар бүкіл шығындар болып табылады және назар аудару ешқашан сізге кедергі болған емес.
  • Жоғарыдағы табалдырықтар өлшем емес, фольклор — олар жалпы әдебиеттерден алынған, ал сіздің жеке үлгідегі және картаңыздағы кроссовер он жолдық эталон болып табылады. Дөңгелек сандарға сенбей, оны іске қосыңыз.

Қорытынды

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

Ол жоқпайды - бұл жоғарғы жағындағы сұраққа жауап беру. Ол «толық күндік контекст мүмкін емес» сөзін «толық күндік контекст арзан» түріне түрлендіреді, бұл эксперименттің нәтижесі емес, құнының өзгеруі. Төмен түсетін жад қабырғасы өлшеуге шақыру болып табылады, ал өлшеу оны қағаздан қорытындыға айналдырады.

Анықтамалар

  1. Дао, Т., Фу, Д.Ю., Эрмон, С., Рудра, А., Ре, С. 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. Милаков, М., Гимельшейн, Н. «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 сауда талдаулары, нарық аналитикасы және платформа жаңалықтары үшін біздің ақпараттық бюллетеньге жазылыңыз.

Біз сіздің жекелігіңізді құрметтейміз. Кез келген уақытта жазылымнан шығуға болады.