Префилл мен декодтауды бөлу
Құрылғылар арасында префилл мен декодтауды бөлу LLM инференциясын жылдамдатады және өнімділікті жақсартады
Кіріс сұраныстан шығыс токендерін жасау үшін LLM инференциясы екі кезеңге бөлінеді: префилл және декодтау. Префилл кезеңі токендерді бір-бірлеп генерациялайтын декодтау кезеңіне өтпес бұрын кіріс токендерімен жұмыс істеп, KV кэштерін толтырады. Бір декодтау қадамы әдетте ондаған миллисекундқа созылса, префилл айтарлықтай ұзағырақ уақыт алады. Егер олар бір құрылғыда орындалса, префилл мен декодтауды біріктіру декодтау өнімділігін нашарлатады. Бұл мақалада біз префилл мен декодтау өнімділігін барынша арттыру үшін оларды бөлек құрылғыларда іске қосатын, префилл мен декодтауды бөлу түріндегі қалыптасқан шешімді қарастырамыз.
Префилл және декодтау өнімділігін салыстыру
Әдеттегі LLM қызмет көрсету қозғалтқышында топтама жоспарлаушысы модельдің әрбір орындау қадамында өңделетін сұраныстарды таңдайды. Бір құрылғыда немесе түйінде жұмыс істегенде, префилл және декодтау сұраныстары бірге топтастырылады. Тізбек ұзындығы бойынша біріктіретін назар аудару құны KV кэшіндегі жазбалардың ұзындығына (kv_len) пропорционалды түрде префилл және декодтау үшін де өседі. Декодтау сұраныстары әдетте тізбек токендерінде тәуелсіз жұмыс істейтін басқа қабаттар арқылы ең аз шығынмен бір токенді (qo_len=1) жібереді. Префилл сұраныстары тығыз қабаттар арқылы айтарлықтай шығынмен мыңдаған немесе он мыңдаған токенді жібереді (үлкен qo_len).
Тікелей өтудің кідірісіне назар аудару кезінде KV кэшінен алынған токендер санына (kv_len) қарағанда, тығыз қабаттар арқылы өткізілген тәуелсіз токендер саны (qo_len) көбірек әсер етеді. Назар аудару механизмі жақсы пайдалануға қол жеткізе отырып, сұраныстар саны бойынша да, тізбек ұзындығына пропорционалды kv_len бойынша да параллельді жүре алады. Префилл есептеулермен шектеледі: qo_len жоғары болғандықтан, GEMM ядролары заманауи GPU құрылғыларының есептеу мүмкіндіктерін толығымен пайдалану үшін M өлшемі бойынша жеткілікті блоктарды бөле алады. Декодтау жадымен шектеледі: әдетте төмен топтама өлшемдеріне байланысты M бойынша кірістер саны аз болады, бұл тек бір блок үшін жеткілікті. Split-K GEMM ядролары аз токен топтамалары үшін SM пайдалануды жақсарта алғанымен, кэштер мен матрицаны көбейту бірліктері әдетте жеткіліксіз пайдаланылады.
Біріктірілген кезде, префилл сұраныстары бар топтамалар тікелей өту кезінде жоғарырақ кідірістерге ұшырайды, бұл бүкіл мысалдың декодтау өткізу қабілетіне кері әсерін тигізеді. Префилл сұраныстарын декодтау сұраныстарымен біріктіру немесе бөліктерге бөлінген префиллді қолдану декодтау өнімділігін аздап жақсарта алатынымен, декодтау өткізу қабілетін барынша арттыру үшін инстанста жеткілікті сұраныстарды өңдеуге қажетті префилл өткізу қабілетін сақтау қиын. Үлкен модельдер жағдайында, әдеттегі шығыс ұзындықтарымен, декодтау үшін үлкен топтама өлшемін сақтау үшін префилл орташа кідірісті айтарлықтай нашарлататын және шығыста кідіріс тудыратындай жиі орындалуы тиіс.
Бұл мәселелерді префилл мен декодтауды орындау үшін бөлек түйіндер жиынтығын пайдалану арқылы шешуге болады. Префиллер түйінін бірнеше декодер түйіндерімен байланыстыру арқылы өткізу қабілетін барынша арттыру үшін префиллге жеткілікті сұраныстарды жоспарлауға және декодтау өткізу қабілетін де барынша арттыру үшін декодер түйіндерінде бір мезгілдегі сұраныстардың жеткілікті санын сақтауға болады. Префиллер түйіндері декодер түйіндеріне тасымалданатын KV кэштерін толтырады. Декодерлер префилл үшін үзіліс жасауға міндетті еместіктен, белсенді сұраныстардың өсіп келе жатқан kv_len мәнінің жалпы әсері әлдеқайда аз байқалатындықтан, кідірістер әлдеқайда анық бола түседі. Желі арқылы KV кэштерін тасымалдау ондаған немесе жүздеген миллисекундты алуы мүмкін болғандықтан, мұның шығыны Бірінші токенге дейінгі уақыттың (TTFT) артуымен төленеді.
KV Messenger
Perplexity жүйесінде префилл мен декодтауды бөлуге арналған біздің іске асыруымыз желі арқылы префиллер түйіндерінен декодер түйіндеріне KV кэшін тасымалдауды үйлестіру үшін LLM қозғалтқышымен өзара әрекеттесетін KV messenger құрамында жасалған. Префиллер жағында messenger декодер түйіндерінен сұраныстарды қабылдайды, оларды топтама жоспарлаушысына тапсырады және KV кэштерін мүмкіндігінше аз кідіріспен жіберу үшін тікелей өтудің орындалуын қадағалайды. Декодер жағында жоюға келмейтін беттер бөлінгеннен кейін, messenger KV кэші мен декодер мәтімәнін тасымалдаудың аяқталғаны туралы хабарланғанша сұраныстың декодтауға жоспарлануына бөгет жасайды.
Prefill-ді бөлу жоғары өткізу қабілеті бар, кідірісі төмен байланыстарды талап етеді, сондықтан біздің іске асыруымыз RDMA-ға бейімделген және EFA мен ConnectX Network Interface Controllers (NICs) екеуін де қолдайды. KV Messenger libfabric негізінде құрылған және жоғары деңгейлі, кідірісі төмен Remote Direct Memory Access (RDMA) абстракцияларын қамтамасыз ету үшін біздің fabric-lib қаптамаларымызды пайдаланады; ол беттер мен метадеректерді тиімді тасымалдауды, сондай-ақ кідірісі төмен сигнал беруді іске асырады. Фонда fabric-lib деректерді prefiller түйінінен decoder түйініне көшіру үшін GPU мен оған тікелей қосылған NIC-терді үйлестіреді.
Алынғаннан кейін префиллер түйіні бастапқы KV беттерінің сәйкес жиынтығын бөледі және өзінің жергілікті қозғалтқышын пайдаланып префилл үшін сұранысты жоспарлайды. Кідірісті азайту үшін тасымалдаулар тікелей өтуді күтпейді: оның орнына KV беттерінің көшірмелері модель жеке қабаттар үшін KV кэшіне KV кэш жазбаларын қосуды аяқтасымен бірден басталады. Префилл сұраныстарын бөліктерге бөлуге болатындықтан, топтама жоспарлаушысы орындау алдында KV messenger модуліне ағымдағы жоспарланған бөліктер туралы хабарлайды. Қабаттарды бақылай отырып CUDA графиктерді қолдау үшін messenger назар аударудың шығыс проекциясынан кейін өсетін санауышты сұрайтын арнайы тредті сақтайды. Санауыш тек шардталған ортадағы негізгі түйінде сақталады: KV кэш жазбалары қосылғаннан кейін және назар аудару алдында жарамды болса да, шығыс проекциясы оларды жанама түрде синхрондай отырып, рангтар бойынша азайтылады. Санауыштағы өзгеріс байқалғаннан кейін, messenger хабардар етіледі және ол қабатты тасымалдауды бастау үшін fabric-lib шақырады.
Соңғы бөлікті тасымалдау аяқталғаннан кейін кез келген қосымша метадеректер де көшіріледі: спекулятивті декодтау немесе MTP логиттер мен жасырын күйлердің декодерге жылжытылуын талап етеді. Бұл көшірмелер де алдын ала бөлінген буферлерге және буферлерден RDMA арқылы орындалады.
Соңғы бөліктің барлық күтілетін тасымалдаулары аяқталғаннан кейін префиллер түйіні KV беттерін бөлуден босатады және сұранысты орындайды. Декодер түйініне бұл туралы нақты хабарланбайды: оның орнына ол аяқталған операциялар санын қадағалау үшін дереу санауыштарды пайдаланады. Префиллер жағындағы RDMA операцияларының саны тасымалданатын беттер санына пропорционалды. Беттер мен мәтінмәнді көшірудің белгілі саны аяқталғаннан кейін fabric-lib сұраныстың декодтауға дайын екенін көрсету үшін KV messenger модулін шақырады. Messenger кез келген мәтімәнді бөлуден босатады және сұранысты LLM қозғалтқышына береді.
Шардталған KV кэшін тасымалдау
Егер префиллер мен декодер тензорлық параллелизмге (TP) сүйенсе және KV кэштерін бірдей шардтаса немесе көшірсе, бір тасымалдау қозғалтқышы барлық көшірмелердің беттерін жіберу және қабылдау үшін бірнеше құрылғыны үйлестіреді. Модельді орындаушы бірнеше құрылғы мен процесс бойынша көшірілгеніне қарамастан, жалғыз messenger пен тасымалдау қозғалтқышын пайдалана алу үшін KV кэштерін қолдайтын құрылғы жадын бөлу және оны негізгі процесске картаға түсіру үшін cuMem және cuMemImportFromShareableHandle пайдаланылады. Тасымалдау қозғалтқышы әрбір KV кэш кесіндісін тасымалдау үшін пайдаланылатын ең жақын NUMA түйініндегі NIC және CPU құрылғыларын табу үшін түйіннің топологиясын тексереді.
Егер бастапқы және мақсатты шардтар бірдей болса, бастапқы және мақсатты құрылғылар мен беттер арасында бірден-бірге картаға түсіру болғандықтан, тасымалдаулар қарапайым болады. Бұл жағдайда шардтау тасымалдау кідірістеріне жанама түрде көмектеседі: көбірек GPU пайдалану арқылы толық өткізу қабілетін пайдалануға жақындай отырып, көбірек байланыстырылған NIC пайдалануға болады. Дегенмен, сәйкессіздік болса, тасымалдау қозғалтқышы бастапқы және мақсатты кесінділер арасындағы қатынасқа байланысты беттерді бөлуі немесе қайта құруы тиіс.
Егер префиллер KV кэшін көбірек құрылғылар арасында бөлсе, декодерде префиллер құрылғыларынан сәйкес жартыларын жіберу арқылы толық беттер қайта құрылады. Егер декодерде көбірек шардтар болса, ол бірнеше көзден беттерді алады. Декодер алуы керек RDMA жазулар санын есептей алу үшін префиллердің шардтау схемасын білуі керек. Егер көшіру қатысса, префиллер құрылғыларды өз ішінде толық KV кэшін көшіретін көшірме жиындарына топтастырады. Барлық қолжетімді құрылғыларды RDMA жазуларын бастау үшін пайдалану мақсатында мақсатты көшірме жиындарына бастапқы жиындардың бірі кездейсоқ тағайындалады.
Шардталған тасымалдаулар KV кэштеріне шамалы түзетуді қажет етеді. Әдепкі бойынша, FlashInfer бет ішіндегі токендерді бас бөлімдерінде реттейтін NHD орналасуына сүйенеді. Кэштер көбінесе назар аудару бас бөлімдерінің саны бойынша шардталатындықтан, бұл бас бөлімінде үзіліс тудырады. RDMA тасымалдаулары қадамдық жазуларды жанама түрде қолдамайды, бұл тасымалдауды орындау үшін бас бөліміне бір операцияны талап етеді. Оның орнына libfabric құралымен өзара әрекеттесу санын азайту үшін біз бас өлшемін токендер санының алдына қоятын HND орналасуын пайдаланып KV кэштерін ұйымдастырамыз. Бұл бетті бір рет жазу арқылы көшіруге мүмкіндік беретін үздіксіздікті қамтамасыз етеді.
Спекулятивті декодтау
Спекулятивті декодтау бөлінген префилл-декодтауға шамалы түзетулерді талап етеді. Біздің іске асыруымыз бойынша префиллер түйіндеріне токендерді іріктеуге рұқсат етілмейді. Perplexity компаниясының Sonar модельдері құрылымдық шығысты қолдайтындықтан, біз префиллерлер мен декодерлер арасында схема процессорын іске асыруды синхрондаудың күрделілігіне тап болғымыз келмейді. MTP және спекулятивті декодтау механизмдерінде жобалық модельді соңғы токенге дейін префиллдеу мақсатты модельден токендерді іріктеуді қамтиды.
Бұл мәселелерді шешу үшін префилл кіріс тізбегінің соңғы токенін қамтымайды. Оның орнынан соңғы токенге дейінгі префиллден алынған жасырын күйлер немесе логиттер тасымалданады және ол декодердегі келесі қадамда декодтау токені ретінде қарастырылады. Бұл кідірістерді аздап арттырғанымен (өйткені бірінші токенді шығару үшін префиллден кейін толық декодтау қадамы орындалуы тиіс), іске асырудың күрделілігі едәуір азаяды.
Бөлінген орналастырулар
Біз өндірістік трафикті немесе меншікті бағалау жұмыс жүктемелерін қолдау үшін әртүрлі модельдері бар бірнеше бөлінген конфигурацияларды орналастырдық немесе тәжірибе жасадық. Модельдердің өлшемі мен назар аудару механизмі негізінде біз GPU ресурстарын ең жақсы пайдалану үшін префиллер және декодер түйіндеріне арналған қолайлы шардтау схемаларын таңдадық.
DeepSeek-R1
DeepSeek көмегімен біз тензорлық-параллельді (TP) және деректер-параллельді (DP) орналастыруларды қарастырдық. Предыдущий блог посттарында талқыланғандай, TP орналастырулары жақсырақ кідірісті қамтамасыз етеді және төмен өткізу қабілетінің құнына ие болып, ауыр трафиске қызмет көрсету үшін көбірек GPU қажет етеді. DP орналастырулары жүктемемен әлдеқайда жақсы масштабталады, бірақ олардың ең жоғары өткізу қабілеті құрылғыаралық немесе түйінаралық байланыс құнына байланысты төменірек болады.
DeepSeek KV кэштерін сыға отырып, көп басты жасырын назар аудару механизміне сүйенеді. Барлық KV бас бөліктері жалғыз жасырын векторға сығылғандықтан, TP KV кэштерін шардтай алмайды, өйткені ол барлық рангтарда жасырын векторларды көшіруі тиіс. Шардтау декомпрессиядан кейін орын алады, өйткені әрбір ранг бірдей жасырын көріністен әртүрлі бас бөліктерін шығара алады. Демек, барлық KV кэш шардтары префиллер және декодер шардтары бойынша бірдей болады.
Түйінішілік TP орнатуымен префиллерлер де, декодерлер де бірдей шардталған. Барлық қолжетімді NIC құрылғыларын толығымен пайдалану үшін тасымалдаулар барлық рангтардан жіберіледі. Дегенмен, TP ранг өлшемі кішірек болатын немесе әрбір DP рангі жалғыз GPU құрылғысына тағайындалатын DP орналастыруымен KV кэшінің көшірілген көшірмесін сақтайтын кез келген префиллер құрылғысы оны жібере алады. Барлық қолжетімді NIC құрылғылары бойынша сұраныстарды теңестіру үшін біз префиллерден декодерге KV кэшін жіберу үшін GPU және NIC құрылғыларын кездейсоқ таңдаймыз.
Аралас префилл-декодтау кезінде жүздеген миллисекунд шамасындағы жиі префилл үзілістеріне байланысты біздің R1 орналастыруымыз 50 TPS көрсеткішінен тұрақты түрде асып түсу үшін қиналды. Керісінше, префиллді бөлу арқылы біз әрбір сұраныс үшін TTFT көрсеткішіне шамамен 100 мс айыппұл шектік, бірақ бір префиллер түйіні 3 декодер түйінінде тұрақты топтама өлшемдерін сақтай алады және әр декодер түйініне шамамен 1 QPS жүктемені өңдей отырып, 90 TPS көрсеткішінен асатын өткізу қабілетін жеткізеді. Деректерді параллель орналастырулармен TPS шамамен 50 деңгейінде сәл төмен болды, бірақ инстанстар бір түйінге 8 рангпен әр рангке 1 QPS жүктемені өңдей алатын еді.
Qwen3-Coder
Бұл 480B моделі топтастырылған сұрау назар аударуын (GQA) пайдаланады, сондықтан назар аудару оңай шардталуы мүмкін және KV кэштері үшін жадыны құрбан етпей тензорлық параллелизмнен пайда көре алады. Демек, біз префилл және декодтау үшін модельді 8 GPU арасында шардтай алдық, шамамен 3 декодер түйінін жалғыз префиллер түйінімен жұптастырдық. Назар аудару шардталғандықтан, біз префиллер мен декодер KV кэштерін шардтау, префиллер рангтерін декодер рангтерімен жұптастыру және кесінділерді параллель тасымалдау үшін барлық NIC құрылғыларын толығымен пайдалану үшін HND KV кэш орналасуына сүйенеміз.
Дәйексөз
@online{perplexity2025DisaggregatedPrefillAndDecode,
author = {{Perplexity} and Nandor Licker and Lequn Chen and Kevin Hu and Erin McKnight and Phi Hoang},
title = {{Disaggregated prefill and decode}},
date = {2025-08-01},
url = {https://perplexity.coolkeypoint.com/hub/blog/disaggregated-prefill-and-decode}
}