220 tok/s: Qwen апавядае пра два 3090 — што трэба пераканаліць
Падкісна групаванне, квантызацыя і запісы памерэння дапамагаюць падтвердзіць тверджэння пра працёздатнасць спяльноты.
Існавайце гэта як пераклад ідэй з “Community reports 220 tokens/second Qwen3.8–27B on two RTX 3090s. I tried it — and figured out why most people can’t reach it” для аператараў: чыткія этапы, арранжаваныя слоты для коду і прыміткі па вяснаванню, якія застаюцца пасля перадачы. Адзагальны відглед работае лепш, калі яго спрыяваць як мерыемую структуру. Запісаўце адну ідеальную транскрыпцыю, адзін прыклад неудачы і прыміткі па адвярнуццю, перш чым расширваць масштаб. Спрыяйце гэты этап як кантракт між вхіднымі дадзеннямі і паўнастацэннымі выходамі. Дайце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад тыхняга частковага завершэння без паведамлення.
Запуск SGLang (гэта значна важлівей, чым llama.cpp)
Ёнколі хочаце запусціць SGLang (што ў дзiesятыя разы складней, чым llama.cpp), перш чым зменяць код, неабходна задаць вхідныя даны, адпаведальнага за кожны крок і критэрыя завершэння. Аперацыі должны магчымае перзапускаты крок з вядомай точкі контролю, не прабуючы здагадвацца пра схованы стан. Запісвайце час выконання і вартасць токеноў або запытак праза разам з функцыйнальнымі рэзултатамі. Відразувыя даны пра вартасці запобегаюць неспакоўным рахункам, калі працэс пераходзіць з дэмавайнага режыма ў спяльныя сераўеры. Калі наступны крок — гэта код або вызов інструмента, лепш выкарыстоўваць структураваныя выходны даны з перакананнем ў правільнасці схемы, чым вольныя тэкстовыя описы.
git clone https://github.com/sgl-project/sglang.git
cd sglang
python3.12 -m venv .venv
source .venv/bin/activate
RuntimeError: cargo is required to discover the Rust extension modules
SGLANG_BUILD_RUST_EXTS=none pip install -e "./python[all]"
CUDA_VISIBLE_DEVICES=1,2 python -m sglang.launch_server \
--model-path /mnt/models/Qwen3.8-27B-AWQ-INT4 \
--tp 2 \
--speculative-algorithm DFLASH \
--speculative-draft-model-path /mnt/models/Qwen3.8-27B-DFlash2 \
--speculative-num-draft-tokens 8 \
--mamba-radix-cache-strategy extra_buffer \
--disable-prefill-cuda-graph \
--cuda-graph-max-bs-decode 16 \
--mem-fraction-static 0.85 \
--context-length 65536 \
--reasoning-parser qwen3 \
--host 0.0.0.0 --port 30000
Рэзултаты: тэхнічна працюе, але духоўна разачараваны
Для адаптавання рэзультатаў: тэхнічна — жывы, духоўна — разачараваны; перад змянай коду неабходна адзначыць вхідныя даны, власніка крока і критэрыя завершэння. Аперацыяныя працавнікі должны магчыма ўвайсці крок з вядомай точкі перапытку без адгадванняя схованага стану. Конфігурацыю трэба залічыць параду ад коду прыемлівання. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое працавнікі можуць пераглядаць, не чытаючы весь граф. Калі наступны крок — це код або вызов інструмента, лепш выкарыстоўваць структураваныя выходныя даны з перакананнем схэмы, чым вольныя тэкстовыя апісанні.
| Metric | Min | Max | Average |
|-------------------------|----------|-----------|-----------|
| Decode speed | 47 t/s | ~100 t/s | ~55 t/s |
| Prompt prefill | 342 t/s | 466 t/s | ~428 t/s |
| Accept length (DFlash) | 3.2 | 6.8 | ~4 |
| Capability | Advertised limit | Reality |
|-------------------------|---------------------------|-----------------------|
| Max context per request | 65,536 (I set it) | fits, one at a time |
| Total KV pool | ~131K tokens max | 103K at default flags |
| Parallel slots | 48 concurrent requests | 3–6 with real prompts |
Чаму рэальнасць заставіла тэорыю ў пылу
Для проекту «Чаму рэальнасць застала тэорыю ў пылі» неабходна перад змянай коду адзначыць вхідныя даны, адпаведальнага за выкананне крока і критэрыя завершэння. Аператары должны магчымае перадзягнуць крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Неабходна адзначыць як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія перакрыцця і обробка некоректных паведамленняў є частью продукту, а не дадатковым элементам пасляднейшай оптымаізацыі. Калі наступны крок — це код або вызов інструмента, лепш выкарыстоўваць структураваныя выходныя даны з перакрычэнням схемы, чым вольныя тэкстовыя апісанні. Для проекту «Чаму рэальнасць застала тэорыю ў пылі» неабходна перад змянай коду адзначыць вхідныя даны, адпаведальнага за выкананне крока і критэрыя завершэння. Аператары должны магчымае перадзягнуць крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Спрыяйце цэму этапу як даговору між вхіднымі данымі і перакрытымі выходнымі рэзультатамі. Дайце назвы артыфактам, адзначыце критэрыі успеху і не падтрымайце безсловеснае частковае завершэння задання.
Setup Custom allreduce failed with CUDART error: peer access is not
supported between these two devices.
/sys/bus/pci/devices/05:00.0/current_link_width → 4 (max 16)
/sys/bus/pci/devices/09:00.0/current_link_width → 4 (max 16)
Жыццё на максімальных скорасцях: ліміты контэксту і адна «темная» перезагрузка
Калі працуеце над проектам «Жыццё на максімальных скорасцях: ліміты контэксту і адна «темная» перезагрузка», спачатку запісайце умовы: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковай нявыполненасці. Такі список контроля дапамагае залічваць змяны ў кодзе чыста. Запісвайце час выканання і вартасць токеноў або запытак пад функцыйнальнымі рэзултатамі. Відразы вартасці з самага пачатку запобегае неспакою, калі процес пераходзіць з дэмаверсіі ў спяльныя среды. Зберагаеце у кэшы стабільныя інструкцыі системы і схемы інструментаў. Перадача тых самых прамэры ёсць частым выклікам затрат энергіі.
Вывад: SGLang ўскрытлівы, і гэта не ваша програма
Калі працуеце над Proектам «Verdict: SGLang» — ён дужа выбаглівы, і гэта не ваша програма — спачатку запісайце умовы кантракту: неабяжлівыя данні, сигнал успеху і тое, што выканаецца пад частым нявыполненнем. Такі список контроля дапамагае заліцьварыць пасляэйшныя змены ў кодзе.
Чэк-ліст для эксплуатацыі
Калі працуеце над Чэк-лістам для эксплуатацыі, спачатку запісайце умовы кантракту: неабяжлівыя данні, сигнал успеху і тое, што выканаецца пад частым нявыполненнем. Такі список контроля дапамагае заліцьварыць пасляэйшныя змены ў кодзе.
Лепшыя маленькія, тэставаныя елементы чым велікія скрыпты. Калі якісь крок не выйшае, адказка за гэта паталогія должна быць спрямована на адзін конкрэтны элемент, а не на заплутаны ланцюг задач.
Зберагаеце у кэшы стабільныя інструкцыі системы та схемы інструментаў. Перадзял упораменавання ідэнтычных прамаравых дадзеных — частая прычына працоўных спроб.
Фіксуйце версіі залежнасцяў та запішыце хэш адпрацаванага зображэння. Возможнасць павтарэння роботы важлівейшая за традыцыйныя знання.
Спрыятлівае ставленне да гэтага этапу — як да кантракту межа вхіднымі дадзеннямі та перакананымі выходнымі рэзультатамі. Даўайце назвы кожным элементам, задаць критэрыя успеху та адмовіцца ад мовчанкавага частковага завершэння роботы.
Зберагаеце у кэшы стабільныя інструкцыі системы та схемы інструментаў. Перадзял упораменавання ідэнтычных прамаравых дадзеных — частая прычына працоўных спроб.
Перш чым запускать стак, заморозьце версіі, зафіксавце «золаты» транскрыпты для критычнага шляху і паказвце спосабы абяроны. У спільных средах неабходны ліміты частоты запуска, пераконтроль стану абонента і чысткі власнік для змены секрэтных даных. Лепшая ўзаемна надзея, чым хітрыя разовыя дэманстрацыі.
Прыметка для пакета 0dcc1bedc39e: не кладзіце ключы прадаўцаў у репазітарый, задаце верхнюю межу токенав на сесію і зберагачыце транскрыпты празаўсёды з фікстурамі для ацэнкі, каб пазнейшыя замены моделяў заставаліся порównаннімі.
Для прыметкі па забезпечэнню надзея 0, перш чым зменіць код, адгукніцеся да вхідных дадзеных, власніка крока і крэтарыяў завершэння. Аперацыйныя працавнікі павінны магчымае перзапускаць крок з вядомай точкі контролю, не падозрываючы схованы стан. Запісвайце часы выконання і косты токенав або запытак празаўсёды з функцыйнаімі рэзультатамі. Відкрытыя даныя пра косцы запобегаюць неспадзеваным рачункам, калі шлях пераходзіць з дэманстрацыі ў спільныя среды.
Дзеянне паўжасткі 0/1002: звярніце увагу на час выканання, клас памылкі і колькасць викорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе паказаных пытанняў, а не на індывідуальных прыкладах, выявіце, чы хацяце застаўіць гэтыя змены.
Працюючы над запісам паўжасткі 1, спачатку запішыце шаблон контракта: неабходныя даны, сігнал успеху і тое, што выканаецца у разе частковай памылкі. Такі список контроля дапамагае заставаць пасляэтапныя змены ў кодзе адпаведнымі правілам.
Дзеянне паўжасткі 1/1002: звярніце увагу на час выканання, клас памылкі і колькасць викорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе паказаных пытанняў, а не на індывідуальных прыкладах, выявіце, чы хацяце застаўіць гэтыя змены.
Пры захоўце працэсу ўзмocнення 2 яго лепш заўважваць як мерымую паверхню. Зберагчыце адна «золатая» копія, адны прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Спрыяйце цэму этапу як даговору межа вхіднымі дадзеннямі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаць критэрыя успеху і адмовіцеся ад тыхнявага частковага завершэння.
Дзеянне ўзмocнення 2/1002: замерыце час выканання, класію каштоўкаў і витраты токенаў для гэтага запісу, а пасля, на аднойчынных крэтэрыях, а не на асоціяцыях, вынікніце, чы робіцца змяна.
Для захоўкі працэсу ўзмocнення 3, перш чым зменіць код, задаць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыёныя працавнікі павінны магчымаць перзапуск крока з вядомай точкі контролю, не спадзяючыся на схованы стан. Захоўвайце конфігурацыю праз аддзел ад коду прыкладнага програмнага забезпечэння. Файлы сяродавішча, хранільнікі секрэтных дадзенняў і флагі функций павінны знаходзіцца ў адном месцы, якое працавнікі можуць аудытаваць, не чытаючы весь структураны ляс.
Дэталі зміцнення 3/1002: звярніце увагу на час працы стэны, клас паклічання і колькасць токенавытрачання для гэтага запісу, а пасля, на аднойчынку з фіксаваным наборам пытанняў, а не на анекдотах, выявіце, чы хацяце застаўіць гэтыя змяны.