Ruka hadi maudhui makuu
Mafunzo ya AI

Endesha Qwen3.8 Flash Next 176B Kwenye DGX Spark Mbili

Mafunzo haya yanaonyesha jinsi ya kutumia kichocheo cha faili moja cha hazina kupakua, kurekebisha na kuendesha Qwen3.8-Flash-Next-NVFP4 kwenye nodi mbili za NVIDIA DGX Spark, huku ukizingatia mipaka ya kumbukumbu iliyounganishwa ya GB10 na mahitaji ya sparse attention ya SM121 ya modeli.

Endesha Qwen3.8 Flash Next 176B Kwenye DGX Spark Mbili

Muhtasari

Mradi huu ni mwongozo wa utumiaji unaolenga mazingira ya uzalishaji kwa kuendesha RadixArk/Qwen3.8-Flash-Next-NVFP4 kwa kutumia SGLang. Modeli hii ina takribani vigezo bilioni 176, ukubwa wa GB 135, na ni modeli ya wataalamu wengi iliyopunguzwa kwa NVFP4.

Hati ya start.sh iliyotolewa inasambaza modeli kwenye mifumo miwili ya NVIDIA DGX Spark kwa kutumia usambamba wa tenzori na TP=2. Nodi hizi huwasiliana kupitia kiunganishi cha moja kwa moja cha ConnectX-7 200 Gb RoCEv2. Baada ya kuanza, nodi kuu hutoa API inayooana na OpenAI kwenye 0.0.0.0:8888.

Mapishi haya si kizindua pekee. Hupakua na kuthibitisha uzani, husawazisha uzani huo na nodi ya kufanya kazi, hujenga picha ya kontena iliyorekebishwa kwenye nodi zote mbili, huanzisha klasta, na husubiri API iwe tayari. Yameundwa kuwa salama kuendeshwa tena, hivyo kuyaendesha upya kunaweza kuendelea na upakuaji uliokatizwa, kutumia tena akiba, na kubadilisha makontena yaliyopitwa na wakati.

Mapishi Haya Yanatoa Nini

  • Utoaji wa huduma kwa usambamba wa tenzori kwenye nodi mbili: DGX Spark moja huendesha rank 0 na rauta ya SGLang, huku nyingine ikiendesha rank 1.
  • Vituo vya mwisho vinavyoendana na OpenAI: API inaauni mazungumzo, ukamilishaji, matokeo ya hoja, uchanganuzi wa miito ya zana, na ingizo la maandishi pamoja na picha.
  • Muktadha mrefu: Urefu wa msingi wa muktadha ni tokeni 900000, kwa kutumia upanuzi wa YaRN kutoka muktadha asilia wa modeli wa tokeni 262,144.
  • Usimbaji wa kubashiri wa NEXTN: Mipangilio ya msingi ya kubashiri ni 3/1/4, ikiwa na usimbaji wa grafu ya CUDA kwenye nodi zote mbili.
  • Uoani wa SM121: Ujenzi huu hutumia mbadala wa Triton kwa njia ya Qwen Sparse Attention ambayo vinginevyo hushindwa kutungwa kwenye DGX Spark.
  • Amri za kiutendaji: Hati hii inajumuisha ukaguzi wa awali, upakuaji, uanzishaji, usitishaji, hali, kumbukumbu, na majaribio mepesi.

README inaripoti tokeni 64.4 kwa sekunde kwa mkondo mmoja wa usimbaji na jumla ya tokeni 116.8 kwa sekunde kwa mikondo miwili kwenye klasta ya nodi mbili iliyojaribiwa. Kwa mikondo minne, kasi ya jumla ilikuwa tokeni 114.1 kwa sekunde.

Kwa Nini Kiraka cha Kernel ya SM121 Ni Muhimu

Usanifu wa Qwen4Exp hupitisha umakini kupitia mfumo wa Qwen Sparse Attention. Kitatuzi chake cha flash-attention hupendelea FA2 ya kawaida na vinginevyo hutumia kiolesura cha flash-attn-4 CuTe DSL. Kwenye usanifu wa SM121 wa DGX Spark, mbadala huo hushindwa wakati wa utungaji kwa hitilafu ya MLIR ya ulinganifu wa mpangilio.

Hifadhi hii hutatua kizuizi hicho cha uanzishaji kwa kujenga picha ya SGLang inayotokana nayo na iliyo na mbadala wa umakini wa Triton unaooana na SM121.

Muktadha wa ujenzi wa .patch/ unaozalishwa unajumuisha qsa_fa_fallback.py, kernel ya urefu unaobadilika ya mtindo wa FlashDecoding iliyolengwa kwa mkataba wa mwito wa QSA wa modeli. Inaauni umakini wa maswali yaliyopangwa katika vikundi, vipimo vya vichwa hadi 256, na softmax ya mtandaoni. Pia husoma cu_seqlens kwenye kifaa, jambo linalodumisha uhalali wa marudio ya grafu ya CUDA wakati mfumo wa nyuma unapoandika upya jedwali lake la mfuatano.

Wakati wa ujenzi wa Docker, mapishi haya hurekebisha qwen_sparse_attn_backend.py ili mbadala wa Triton uchaguliwe wakati wowote is_sm100_supported() ikiwa si kweli. Kwa hiyo, njia ya kawaida hubaki bila mabadiliko kwenye GPU za kituo cha data za B100 na B200 zinazoungwa mkono.

Vifaa na Programu Zinazohitajika

Vifaa vya klasta

  • Mifumo miwili ya NVIDIA DGX Spark yenye GPU za GB10, usanifu wa SM121, na kumbukumbu iliyounganishwa ya GB 128 kila mmoja.
  • Milango ya ConnectX-7 iliyounganishwa moja kwa moja kati ya mashine hizo mbili bila swichi.
  • Kiolesura husika cha RoCE kiwe hai kwenye nodi zote mbili, kama vile rocep1s0f1/enp1s0f1np1 kwenye nodi moja na rocep1s0f0/enp1s0f0np0 kwenye nyingine.
  • Hifadhi ya kutosha kwa checkpoint ya takribani GB 135, picha za makontena, akiba, na data ya muda ya ujenzi.

Programu ya nodi kuu

  • Docker.
  • CLI ya Hugging Face hf.
  • Tokeni ya Hugging Face katika mazingira ya gamba ikiwa ufikiaji wa checkpoint unahitaji uthibitishaji.
  • Ufikiaji wa SSH usiohitaji nenosiri kutoka nodi kuu hadi nodi ya kufanya kazi.

Sakinisha CLI ya Hugging Face kwenye nodi kuu kwa:

pip install hf

Kwa msingi, nodi ya kufanya kazi hufikiwa kupitia lakabu ya SSH iitwayo spark2. Kuingia kwa mtumiaji wa nodi ya kufanya kazi kwa msingi hutumia jina lilelile la mtumiaji linalotumika kuendesha start.sh kwenye nodi kuu. Dhana hizi zinaweza kubadilishwa kwenye .env.

Sanidi Klasta ya Nodi Mbili

Clone hifadhi kwenye nodi kuu, ingia kwenye saraka yake, na unda faili lako la usanidi wa ndani:

git clone <this-repo>
cd <this-repo>
cp .env.example .env

Hariri .env na uthibitishe angalau IP ya RoCE ya nodi kuu, IP ya RoCE ya nodi ya kufanya kazi, na lengwa la SSH. Misingi inatarajia anwani zifuatazo za mtandao wa faragha:

HEAD_CX7_IP=10.0.22.1
WORKER_CX7_IP=10.0.22.2
WORKER_HOST=spark2

Ikiwa nodi ya kufanya kazi inatumia akaunti tofauti, weka WORKER_USER. Kwa udhibiti kamili wa lengwa la SSH, weka WORKER_SSH kwa thamani kama user@host. Vigezo vya mazingira vya gamba vina kipaumbele kuliko thamani zilizo kwenye .env.

Topolojia inayotarajiwa

Wateja huunganishwa na API ya nodi kuu kupitia mlango 8888. Nodi kuu huendesha rank 0, seva ya SGLang, na rauta. Rank 1 huendeshwa kwenye nodi ya kufanya kazi. Trafiki ya NCCL imeelekezwa kwenye muunganisho wa moja kwa moja wa ConnectX-7 RoCEv2 kati ya mifumo hiyo miwili.

Mapishi haya hutumia NCCL_NET=IB, huwezesha usafirishaji wa RoCE unaooana na InfiniBand, na huzima NVLS na CUMEM kwa usanidi huu. Pia yanaweza kupakia mapema ujenzi wa NCCL 2.30.7 uliowekwa kwenye mwenyeji. Tabia hii imewezeshwa kwa msingi kupitia USE_HOST_NCCL=1.

Thibitisha Mazingira

Endesha ukaguzi wa awali uliojengwa ndani kabla ya kupakua modeli:

./start.sh doctor

Amri ya doctor hukagua fabric, GPU, RAM, nafasi ya diski, muunganisho wa SSH, porti, na masharti ya deployment. Rekebisha matatizo yoyote ya mtandao, uthibitishaji, hifadhi, au rasilimali yaliyoripotiwa kabla ya kuanza upakuaji mkubwa na ujenzi wa image.

Pakua na Landanisha Modeli

Pakua checkpoint kwenye nodi kuu, ithibitishe, kisha ilandanishe na worker:

./start.sh download

Thamani chaguo-msingi ya DOWNLOAD_MODE=rsync hufanya nodi kuu ipakue faili kisha izinakili kwenye worker. Operesheni inaweza kuendelea baada ya kukatizwa. Ikiwa unapendelea kila mashine ijipakilie moja kwa moja kutoka Hugging Face, weka:

DOWNLOAD_MODE=direct

Usijaribu modeli hii kwa chaguo la SGLang --load-format dummy kwenye GB10. Kulingana na uchanganuzi wa kuanguka wa repository, kianzilishi dummy hubadilisha kwa muda vigezo vya fp8 kuwa fp16. Jedwali la modeli la PLE n-gram la fp8 lenye GB 51.2 linaweza hivyo kusababisha mahitaji ya muda ya kumbukumbu yanayozidi GB 150 na kugandisha kabisa mfumo wenye takriban GB 121.7 za DRAM unified inayoweza kutumika.

Jenga Image Iliyorekebishwa na Anza Kuhudumia

Anzisha deployment ya nodi mbili kwa:

./start.sh serve

Amri hii huendesha ukaguzi wa awali, huthibitisha kuwa weights na images zinapatikana, hujenga image iliyorekebishwa kwa SM121 kwenye nodi zote mbili, huanzisha cluster ya TP2, na kusubiri API iwe tayari. Image ya ndani inayozalishwa huitwa qwen38-flashnext-dspark:local.

Uanzishaji wa kwanza huchukua takriban dakika kumi kwa sababu unajumuisha kupakia GB 135 za weights, uundaji wa JIT, na kunasa CUDA graph. Kwa chaguo-msingi, script huruhusu hadi WAIT_TIMEOUT_MIN=90.

Kwa uendeshaji wa kwanza uliojiendesha kikamilifu, tumia:

./start.sh

Bila subcommand, script hutekeleza doctor, download, na serve kwa mpangilio huo.

Tuma Ombi Rahisi la Chat

Baada ya seva kuwa tayari, ita endpoint yake ya chat inayooana na OpenAI:

curl http://127.0.0.1:8888/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "Qwen3.8-Flash-Next-NVFP4",
    "messages": [
      {
        "role": "user",
        "content": "Explain RoCEv2 in one paragraph."
      }
    ]
  }'

Uwezo wa reasoning huwashwa kwa chaguo-msingi, na maudhui ya reasoning hutumwa kando. Ili kuzima thinking kwa ombi moja, ongeza chat_template_kwargs kwenye mwili wa JSON:

{
  "model": "Qwen3.8-Flash-Next-NVFP4",
  "messages": [
    {"role": "user", "content": "Summarize tensor parallelism."}
  ],
  "chat_template_kwargs": {
    "enable_thinking": false
  }
}

Ingizo la picha linaungwa mkono kupitia sehemu ya kawaida ya maudhui ya OpenAI-compatible image_url. README inathibitisha kuwa ingizo linalochanganya maandishi na picha linafanya kazi, ingawa haitoi mfano kamili wa ombi la picha.

Unganisha Mteja Anayeendana na OpenAI

Programu zinazotumia endpoint maalum za OpenAI zinaweza kutumia base URL ifuatayo:

http://127.0.0.1:8888/v1

Kitambulisho cha modeli ni:

Qwen3.8-Flash-Next-NVFP4

Ikiwa mteja anahitaji sehemu ya API key hata wakati endpoint ya ndani haithibitishi maombi, mfano wa repository hutumia dummy na kuzima kichwa cha uthibitishaji. Uwezo unaohusika wa modeli na mipangilio ya uoanifu ni pamoja na:

  • Reasoning imewashwa.
  • Ingizo la maandishi na picha.
  • Dirisha la muktadha la tokeni 900000.
  • Hadi tokeni 32768 za matokeo katika usanidi wa mfano wa mteja.
  • max_tokens kama sehemu ya tokeni za matokeo.
  • Hakuna usaidizi wa developer-role katika usanidi wa mfano wa uoanifu.
  • Hakuna usaidizi wa kigezo cha reasoning-effort.

Endesha Seva

Kizindua kimoja kinatoa amri kuu za kiutawala:

  • ./start.sh serve hufanya ukaguzi wa awali, huhakikisha images na weights zinapatikana, huanzisha TP2, na kusubiri utayari.
  • ./start.sh download hupakua, kuthibitisha, na kulandanisha weights bila kuanzisha seva.
  • ./start.sh stop huondoa kontena zote mbili na kusitisha vifuatiliaji vya logi.
  • ./start.sh status huripoti hali ya kontena kwenye nodi zote mbili.
  • ./start.sh logs [N] huonyesha mistari N ya mwisho kutoka kwenye logi za nodi kuu na worker.
  • ./start.sh smoke hutuma completion ya haraka ya greedy kwenye API inayoendesha.
  • ./start.sh doctor huendesha tena ukaguzi kamili wa awali wa mazingira na recipe.

Unapochunguza matatizo ya uanzishaji, kagua .serve.log, .sglang.log, na .sglang-worker.log. Ya kwanza huhifadhi matokeo ya kizindua, huku mbili za mwisho zikiwa na logi za kontena kuu na worker.

Elewa Bajeti ya Kumbukumbu ya GB10

Kila DGX Spark hutoa pool ya kumbukumbu halisi iliyounganishwa inayoshirikiwa na mgao wa CUDA, kumbukumbu ya host iliyobandikwa, Docker, na mfumo wa uendeshaji. Kwa hiyo recipe hutumia sehemu tuli ya kumbukumbu iliyo ya tahadhari badala ya kuchukulia kumbukumbu ya host na GPU kuwa rasilimali zinazojitegemea.

Muundo wa kila nodi ulioripotiwa unajumuisha takriban GB 62.5 kwa weights za NVFP4 expert, dense, MTP, na vision; karibu GB 11 za kumbukumbu ya host iliyobandikwa kwa jedwali la PLE la fp8; cache ya KV ya bf16 ya GB 9 inayohifadhi takriban tokeni 956,800; karibu GB 3.6 kwa hali ya Mamba/GDN; na takriban GB 8 kwa CUDA graphs na workspaces za NCCL au cuBLAS.

Mgao unaoonekana kwa CUDA ni takriban GB 95.6, huku karibu GB 17.5 zikiwa zinapatikana kwa kazi za ziada. Jedwali la PLE lililowekwa kwenye kumbukumbu (pinned) halionekani kama mgao wa kifaa kwa kila mchakato katika nvidia-smi, lakini bado linatumia DRAM ileile ya kimwili. Fuatilia thamani ya kumbukumbu ya available_gpu_mem kwenye logi ya SGLang au safu wima ya available kutoka free -h unapokadiria nafasi halisi iliyobaki.

Washa uhamishaji wa PLE

Usiongeze --no-ple-offload-embedding kwenye GB10. Kanuni ya kiotomatiki ya SGLang huweka jedwali la uwekaji la PLE kwenye CPU. Kuibatilisha kunaweza kuweka takriban GB 26 kwa kila rank ya kumbukumbu ya mwenyeji iliyobandikwa (pinned) upande wa GPU na kusababisha mashine kutumia kumbukumbu kupita kiasi.

Hifadhi nafasi ya muda ya prefill

Kiweka faharasa cha QSA huunda eneo la kazi la logits la fp32 ambalo ukubwa wake huongezeka kulingana na chunk × history. Kwa ukubwa wa kipande wa 4096 na historia ya tokeni 300,000, eneo hili la muda linaweza kuhitaji takriban GB 8 hadi 10 baada ya kuzingatia nakala zinazohusiana za gather na top-k.

Thamani zilizotolewa zimewekwa kwa tahadhari kimakusudi:

MEM_FRACTION_STATIC=0.82
CHUNKED_PREFILL_SIZE=1024
MAMBA_FULL_MEMORY_RATIO=0.3

Usiongeze CHUNKED_PREFILL_SIZE zaidi ya 1024 kwa muktadha wa tokeni 900,000 bila kupima kilele cha kumbukumbu ya muda dhidi ya bajeti inayopatikana ya kumbukumbu iliyounganishwa. Hazina inaripoti kwamba ukubwa wa kipande wa 4096 ukiunganishwa na MEM_FRACTION_STATIC=0.85 ulitosha kuzifanya mashine zigande.

Epuka majaribio ya allocator

Maelekezo yanashauri wazi dhidi ya kuweka PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True. Mipangilio hii haijathibitishwa kwa utumiaji huu na haikuwepo katika mapishi yanayojulikana kuwa mazuri ya DGX Spark yaliyotumiwa na waandishi.

Rekebisha Vigezo Muhimu

Weka vigezo katika .env au vitue kwenye shell. Thamani za shell ndizo hutumika. Mipangilio inayoweza kuhitaji kurekebishwa zaidi ni:

  • PORT: Chaguo-msingi ni 8888 na hufunga API kwenye violesura vyote.
  • CONTEXT_LENGTH: Chaguo-msingi ni 900000.
  • MAX_RUNNING_REQUESTS: Chaguo-msingi ni 16, ingawa usanidi wa Mamba huweka ukomo wa kiutendaji wa nafasi 14 za wakati mmoja kwa uwiano wa chaguo-msingi.
  • SPEC_STEPS, SPEC_TOPK, na SPEC_DRAFT: Chaguo-msingi ni 3, 1, na 4 kwa usimbuaji wa kubashiri wa NEXTN.
  • KERNEL_PATCH: Chaguo-msingi ni 1 ili picha ya akiba ya SM121 ijengwe na kutumiwa.
  • IMAGE: Hutumia picha iliyobainishwa moja kwa moja na kuruka uwekaji wa patch.
  • CPUSET: Chaguo-msingi ni 5-9,15-19 kwa core kubwa za CPU za GB10. Weka thamani tupu ili kuzima upangaji wa core.
  • EXTRA_ARGS: Huongeza hoja za ziada za SGLang mwishoni, hivyo kuruhusu thamani ya mwisho kushinda.

Dhibiti Mizunguko ya Thinking na Miito ya Zana

Hitilafu inayojulikana ya SGLang inaweza kuathiri vipindi vinavyounganisha thinking ya chaguo-msingi na zana za OpenAI pamoja na kichanganuzi cha miito ya zana cha qwen3_coder. Seva inaweza kutoa tena na tena tokeni yenye kitambulisho 0, ambayo tokenizer hii huonyesha kama !, hadi max_tokens ifikiwe.

Njia inayopendelewa ya muda ni kuzima thinking kwa maombi yanayotuma zana pekee:

"chat_template_kwargs": {"enable_thinking": false}

Ili kuzima thinking kwenye seva nzima unapotumia kichanganuzi cha zana, simamisha utumiaji kisha uanzishe tena kwa ubatilishaji:

./start.sh stop
EXTRA_ARGS='--tool-call-parser qwen3_coder --default-chat-template-kwargs {"enable_thinking":false}' ./start.sh serve

Ikiwa EXTRA_ARGS tayari imesanidiwa katika .env, unganisha chaguo hizo kwenye mpangilio uliopo. Usiwashe tena thinking katika ombi lilelile linalotoa zana. Bila kichanganuzi, thinking inaweza kufanya kazi, lakini miito ya zana huonekana kama XML ya <tool_call> katika maudhui ya kawaida badala ya message.tool_calls yenye muundo. README pia inashauri kuweka joto la wakala kuwa 0.7 au chini unapotumia njia hii ya muda.

Vidokezo vya Juu vya Kutegemewa na Utendaji

Tumia usimbuaji wa kubashiri kwa upitishaji

Usimbuaji wa kubashiri wa NEXTN ndio kichocheo kikuu cha upitishaji katika usanidi uliopimwa. Kwa mnyororo chaguo-msingi wa 3/1/4, kila hatua ya usimbuaji huthibitisha tokeni nne za rasimu katika upitishaji mmoja wa mbele. Kundi lililopimwa lilifikia kilele cha karibu tokeni 117 kwa sekunde kwa jumla likiwa na mitiririko miwili, kisha likafikia kiwango cha juu huku mitiririko zaidi ikishindania kumbukumbu iliyobaki.

Chagua uamuzi wa moja kwa moja inapohitajika

Usimbuaji wa greedy hauwezi kutoa matokeo yanayozalishwa tena kwa biti kwa biti katika usanidi chaguo-msingi. Tokeni zilizo karibu kufungana zinaweza kubadilika mara kwa mara kati ya uendeshaji, huenda kutokana na tofauti za upunguzaji wa namba za floating-point katika GEMM za NVFP4 MoE kwenye SM121. Kwa tabia ya polepole lakini inayoweza kubainishwa, anzisha upya kwa:

EXTRA_ARGS="--moe-runner-backend triton" ./start.sh serve

Tafsiri onyo la TileLang kwa usahihi

Wakati wa ukusanyaji wa JIT, TileLang inaweza kuripoti kwamba Logits(bx, position) inaandikwa na nyuzi nyingi. Hazina inatambua hili kama taarifa chanya isiyo sahihi kwa sababu nafasi zilizokokotolewa hazipishani, ingawa kikagua hakiwezi kuthibitisha sifa hiyo wakati group ni thamani ya wakati wa utekelezaji. Linaweza kunyamazishwa kwa PassKey.TL_DISABLE_DATA_RACE_CHECK inapohitajika.

Linda ufikiaji wa nje

API hufunga kwenye 0.0.0.0, hivyo kuifanya ipatikane kupitia kiolesura chochote kinachoruhusiwa. README inaeleza ufikiaji kutoka kwa wateja wa LAN au Tailscale lakini haiongezi safu ya uthibitishaji. Tumia vidhibiti vinavyofaa vya ngome ya mwenyeji, mtandao binafsi au proksi wakati endpoint haipaswi kufikiwa kwa ujumla.

Hitimisho

Hifadhi hii inabadilisha uwekaji wa nodi mbili ulio mgumu kuwa mchakato unaoweza kurudiwa. Mchango wake mkuu ni kuunganisha njia mbadala ya Qwen Sparse Attention inayooana na SM121, mipangilio iliyowekewa vikwazo kwa ujenzi wa kumbukumbu iliyounganishwa ya GB10, usambazaji wa tensor wa moja kwa moja kupitia RoCEv2, na hati moja ya uendeshaji isiyotekeleza mabadiliko yasiyo ya lazima inapokimbizwa tena.

Anza na chaguo-msingi zilizotolewa, endesha ./start.sh doctor kabla ya uwekaji, na epuka uzani wa kubuni, kuzimwa kwa uhamishaji wa PLE, vipande vikubwa kupita kiasi vya kujaza awali, na mipangilio ya majaribio ya mgao wa kumbukumbu. Baada ya klasta kuwa tayari, programu zinaweza kutumia seva ya ndani kupitia violesura vya kawaida vya mazungumzo na ukamilishaji vinavyooana na OpenAI.