Ruka hadi maudhui makuu
Mafunzo ya AI

Endesha DeepSeek-V4.1-Flash-1017 kwenye DGX Sparks Mbili kwa TensorFold

Jifunze jinsi ya kupeleka checkpoint ya DeepSeek-V4.1-Flash-1017 ya 2.9-bit EXL3 kwenye NVIDIA DGX Sparks mbili ukitumia TensorFold, mtandao wa ConnectX-7, hifadhi ya Engram, usimbaji wa kubashiri, na API inayooana na OpenAI.

Endesha DeepSeek-V4.1-Flash-1017 kwenye DGX Sparks Mbili kwa TensorFold

Kile mradi huu unachofanya

Mapishi haya ya uendeshaji yanaendesha DeepSeek-V4.1-Flash-1017 kutoka kwenye NVIDIA DGX Sparks mbili, kila moja ikiwa na GB 128 za kumbukumbu iliyounganishwa. Inatumia injini asilia ya Zig ya TensorFold ikiwa na usambamba wa tenzori kwenye ranki moja kwa kila Spark, na hutoa API inayooana na OpenAI kwenye porti 8888.

Mia-AiLab/DeepSeek-V4.1-Flash-1017-EXL3-EAQ-v1-2.9-bpw. Inaauni dirisha kubwa la muktadha la modeli, ingizo la picha, kuita zana, kufikiri kwa hiari, na usimbuaji wa kubashiri wa DSpark kutoka kwenye vizuizi rasimu vya checkpoint.

Hifadhi hii hujiendesha kiotomatiki katika maandalizi, ujenzi wa picha ya Docker, upakuaji wa checkpoint, uundaji wa akiba za ranki, usanidi wa wafanyakazi, uanzishaji wa seva, majaribio ya msingi, na kuzima. Spark ya kwanza hufanya kazi kama kichwa: inaendesha API, huratibu usanidi, na kuanzisha ranki 0. Spark ya pili inaendesha ranki 1.

Usanifu na vikwazo muhimu

TensorFold huendesha familia ya BertholomusAI dsv41 ikiwa na usambamba wa tenzori uliowekwa kuwa mbili. Ranka hizo mbili huwasiliana kupitia kiungo cha moja kwa moja cha ConnectX-7. Kichwa hupokea trafiki ya API, huku Sparks zote mbili zikihifadhi takriban GiB 98 za uzani wa modeli kwenye kumbukumbu.

Checkpoint ina takriban GiB 196 na imegawanywa katika vipande 39. Uendeshaji pia unahitaji majedwali mawili yasiyopunguzwa ya Engram, yanayochukua takriban GB 203. Majedwali ya Engram yanapaswa kunakiliwa kwenye diski ya ndani ya kila Spark. Kuyasoma kupitia NFS kunaweza kupunguza kwa kiasi kikubwa utendaji wa ujazaji wa awali na usimbuaji kwa sababu usimbuaji hufanya usomaji mwingi wa nasibu wa 4 KiB.

Modeli inaweza kitaalamu kutumia dirisha la tokeni 1,048,576, lakini kumbukumbu inayopatikana kwenye kichwa ndiyo kikomo cha kiutendaji. Kwenye kichwa kinachoendesha huduma nyingine za eneo-kazi na usanidi, README inapendekeza kuweka CONTEXT kuwa 524288 au chini, isipokuwa kumbukumbu zaidi iachiliwe.

Mahitaji ya maunzi na programu

  • NVIDIA DGX Sparks mbili au mifumo sawa ya GB10 yenye GB 128 za kumbukumbu iliyounganishwa kila mmoja.
  • Muunganisho wa moja kwa moja wa QSFP kati ya porti za ConnectX-7.
  • Anwani za IPv4 kwenye kiungo cha moja kwa moja, zikiwa na muunganisho unaofanya kazi na GID ya RoCE v2.
  • Kikomo sawa cha saa ya GPU kwenye mifumo yote miwili. README inapendekeza kuangalia saa kwa nvidia-smi -q -d CLOCK na kutumia nvidia-smi -lgc 0,2200 inapofaa.
  • SSH inayotumia funguo kutoka kichwani kwenda kwa mfanyakazi.
  • Docker yenye runtime ya NVIDIA kwenye mifumo yote miwili, na mtumiaji wako akiwa katika kikundi cha docker.
  • git, python3, na CLI ya Hugging Face kwenye kichwa.
  • Nafasi ya kutosha kwa checkpoint, majedwali ya Engram, faili za uzani wa ranki, picha ya Docker, na akiba. Kichwa kinahitaji takriban GB 505 na mfanyakazi takriban GB 310 kwa mpangilio wa kawaida.

Kiungo cha moja kwa moja kinaweza kuonekana kama vifaa viwili vya mtandao na vifaa viwili vya RoCE kwenye kila Spark. Sanidi reli zote mbili kwa anwani kwenye kiungo na tumia MTU sawa kwenye mifumo yote miwili.

Andaa mtandao na muunganisho wa SSH

Weka anwani za subnet binafsi kwenye violesura vya ConnectX-7. Kwa mfano, README hutumia anwani kama 192.0.2.1/24 na 192.0.2.2/24. Thibitisha kuwa mifumo hiyo miwili inaweza kupeana ping kupitia kiungo kilichokusudiwa.

Kwenye kichwa, sakinisha ufunguo wa SSH kwa mfanyakazi na thibitisha ufikiaji usiohitaji mwingiliano:

ssh-copy-id user@<worker>
ssh -o BatchMode=yes user@<worker> true

Weka lengwa la SSH la mfanyakazi na anwani ya kitambaa kwenye faili ya usanidi ya ndani. Mfanyakazi hahitaji nakala ya hifadhi hii.

Sanidi NFS au hifadhi ya ndani

Kwa chaguo-msingi, mfanyakazi huweka akiba ya Hugging Face ya kichwa ikiwa ya kusoma tu kupitia NFS. Kwenye kichwa, sakinisha seva ya NFS na uhamishe akiba:

sudo apt install nfs-kernel-server
echo "$HOME/.cache/huggingface <worker-CX7-address>(ro,no_subtree_check)" | sudo tee -a /etc/exports
sudo exportfs -ra

Mfanyakazi anaweza kuhitaji msaidizi wa mteja wa NFS wa mfumo, kama vile nfs-common kwenye Ubuntu. Skripti ya maandalizi huunda ujazo wa Docker wa NFS wa kusoma tu na hukagua kuwa mfanyakazi anaweza kuona faili zinazohitajika.

Kwa utenganishaji bora au wakati NFS haifai, weka nakala ya ndani ya akiba inayohitajika kwenye kila Spark. Weka HF_CACHE kwenye mti wa ndani, weka NFS_VOLUME kwenye njia ya mwenyeji inayolingana, acha HEAD_NFS_SERVER ikiwa tupu, na weka PREPARE=0. Akiba ya ndani lazima iwe na faili ndogo za checkpoint, shard ya vision model-00039-of-00039, folda ya model/ inayotolewa, kit, ramani ya tokeni, na faili ya uzani wa ranki inayofaa.

Clone na sanidi hifadhi

Clone hifadhi kwenye kichwa na uunde faili ya usanidi ya ndani:

git clone https://github.com/MiaAI-Lab/DeepSeek-v4.1-Flash-1017-2x-DGX-Sparks.git
cd DeepSeek-v4.1-Flash-1017-2x-DGX-Sparks
cp scripts/local.sh.example scripts/local.sh

Hariri scripts/local.sh na uweke angalau WORKER kuwa lengwa la SSH la mfanyakazi. Ikiwa njia ya SSH ya mfanyakazi inatofautiana na njia ya kitambaa cha moja kwa moja, weka FABRIC_PEER kuwa anwani ya ConnectX-7 ya mfanyakazi.

Mipangilio mingi imefafanuliwa kwenye scripts/config.sh. Thamani za kawaida ni pamoja na:

  • MODEL_ID na MODEL_REVISION kwa checkpoint ya EXL3 iliyobandikwa.
  • CONTEXT, ambayo kwa chaguo-msingi ni 1048576.
  • PARALLEL, ambayo kwa chaguo-msingi ni maombi manne kwa wakati mmoja.
  • HF_TOKEN, ikiwa uthibitishaji wa Hugging Face unahitajika.
  • ABLIT, inayochagua hali ya kawaida au iliyopunguzwa.

Endesha ukaguzi wa majaribio kabla ya kuanza

Tumia hali ya majaribio kukagua kiungo kilichotambuliwa na amri za Docker bila kufanya mabadiliko:

DRY_RUN=1 ./start.sh

Hifadhi pia hufanya ukaguzi wa sintaksia ya shell na kuthibitisha masharti yanayotarajiwa ya mtandao, Docker, GPU, SSH na kumbukumbu wakati wa maandalizi. Uanzishaji hukataa kuendelea isipokuwa kiwango cha chini cha kumbukumbu inayopatikana kilichosanidiwa, MIN_AVAIL_GIB, kipatikane kwenye Sparks zote mbili.

Anzisha seva yenye rank mbili

Anzisha uwekaji kamili kutoka kwenye head:

./start.sh

Wakati wa uendeshaji wa kwanza, hati huunda picha ya TensorFold, hupakua checkpoint na jedwali za Engram, huandaa jedwali za RoPE na data ya uelekezaji wa picha, huunda faili za token na rank, husanidi hifadhi ya worker, na kuanzisha rank zote mbili. Kuunda picha ya Zig huchukua takriban dakika sita kwenye Spark na hutengeneza picha yenye ukubwa wa takriban GB 24.9.

Baada ya uanzishaji, hati husubiri API kisha huendesha jaribio la smoke. Uanzishaji uliofanikiwa huripoti kuwa DeepSeek-V4.1-Flash-1017 inapatikana kwenye porti 8888.

Amri muhimu za mzunguko wa maisha ni pamoja na:

./start.sh restart
./stop.sh

Tumia restart baada ya kubadilisha mipangilio ya utoaji huduma. Hati ya kusimamisha huhifadhi kumbukumbu zilizobanwa, ikibakiza kumbukumbu mpya zaidi kulingana na LOG_KEEP, kabla ya kuondoa kontena.

Piga API inayooana na OpenAI

Wateja wanapaswa kutumia anwani ya head pamoja na njia ya /v1 na kitambulisho kamili cha modeli DeepSeek-V4.1-Flash-1017. Kwa mfano, mteja wa Python anayooana na OpenAI anaweza kusanidiwa hivi:

from openai import OpenAI

client = OpenAI(
    base_url="http://<head-address>:8888/v1",
    api_key="unused"
)

response = client.chat.completions.create(
    model="DeepSeek-V4.1-Flash-1017",
    messages=[
        {"role": "user", "content": "Explain tensor parallelism briefly."}
    ],
    max_tokens=512
)

print(response.choices[0].message.content)

Modeli hufikiri kabla ya kujibu isipokuwa kufikiri kuzimwe na ombi. Tenga max_tokens ya kutosha kwa hoja na jibu la mwisho, au sanidi mipangilio husika ya kufikiri na hoja katika mazingira.

Thibitisha maandishi, zana, picha na vidokezo virefu

Hifadhi inajumuisha zana za uthibitishaji za kukagua endpoint inayofanya kazi:

python3 tools/validate.py http://<head-address>:8888 --model DeepSeek-V4.1-Flash-1017
API_URL=http://<head-address>:8888 python3 tools/toolcheck.py

Seti ya uthibitishaji inahusu maandishi, kufikiri, zana, ingizo la picha na vidokezo virefu. README inabainisha kuwa ingizo la picha na zana ya uthibitishaji havikukaguliwa kikamilifu kwenye jozi ya maunzi iliyoripotiwa, kwa hiyo chukulia majaribio hayo kama ukaguzi wa uwekaji badala ya dhamana.

Kwa uchunguzi wa ziada, kagua kumbukumbu za rank:

docker logs -f dsv41-1017-exl3-tf
ssh <worker> docker logs -f dsv41-1017-exl3-tf

Tumia hali ya abliterated

Usanidi chaguo-msingi hutumia checkpoint ya kawaida ya Mia EAQ yenye biti 2.9. Kuweka ABLIT=1 huhifadhi checkpoint hiyo na kutumia overlay inayolingana ya Keys kutoka drowzeys/keys-DeepSeek-V4.1-Flash-1017-Abliterated.

Hii ni hifadhi yenye ufikiaji maalum ya Hugging Face. Kabla ya maandalizi, kubali masharti ya hifadhi na uthibitishe kwa akaunti yenye ufikiaji:

hf auth login
ABLIT=1 ./scripts/prepare.sh
ABLIT=1 ./start.sh restart

Vinginevyo, toa tokeni bila kuiweka katika historia ya shell:

read -rsp 'Hugging Face read token: ' HF_TOKEN; echo
export HF_TOKEN
ABLIT=1 ./start.sh restart
unset HF_TOKEN

Overlay imefungwa kwa ABLIT_REVISION. Maandalizi huunda njia tofauti za akiba na akiba za rank ili data ya kawaida na ya abliterated isichanganywe kwa bahati mbaya. Shards zilizoandikwa upya zinaweza kuhitaji nafasi inayolingana na checkpoint nyingine, pamoja na overlay na faili za rank. Rudi kwenye hali ya kawaida kwa:

ABLIT=0 ./start.sh restart

README inasema wazi kuwa matokeo ya utendaji na usahihi ya hali ya kawaida hayathibitishi hali ya abliterated kwenye injini hii. Pia tumia mpangilio uleule wa ABLIT wakati wa maandalizi na uanzishaji.

Maelekezo ya utendaji na urekebishaji

Vipimo vilivyoripotiwa kwa vidokezo vya kawaida vya maandishi na msimbo vilifikia takriban tokeni 74.9 kwa sekunde kwa mkondo mmoja wa maandishi na tokeni 109.9 kwa sekunde kwa mkondo mmoja wa msimbo. Kwa mikondo minne, jumla ya upitishaji ilifikia takriban tokeni 130.0 kwa sekunde kwa maandishi na 155.5 kwa sekunde kwa msimbo. Prefill ilipimwa kwa takriban tokeni 2,000 hadi 2,180 kwa sekunde katika vidokezo vya tokeni 8K hadi 256K.

Matokeo hutegemea maudhui ya kidokezo, masafa ya saa ya GPU, mizigo sambamba ya kazi, hifadhi na shinikizo la kumbukumbu. Vigezo vya maneno nasibu huandaa rasimu kwa ufanisi mdogo kuliko maandishi au msimbo wa kawaida, kwa hiyo takwimu zao za chini za decode hazipaswi kuchukuliwa kama kikomo cha jumla cha injini.

  • Hifadhi jedwali za Engram kwenye diski ya ndani ya Sparks zote mbili.
  • Tumia viwango vinavyolingana vya juu vya saa za GPU kwa sababu rank za tensor-parallel husawazisha mara kwa mara.
  • Weka CONTEXT ndani ya uwezo wa kumbukumbu wa head, hasa inapokuwa inaendesha programu nyingine.
  • Tumia PARALLEL kwa tahadhari unapotoa huduma kwa vidokezo virefu au watumiaji kadhaa kwa wakati mmoja.
  • Tumia DRY_RUN=1 kabla ya kubadilisha mipangilio ya mtandao au uwekaji.

Swichi na viraka vya hiari vya injini

Hifadhi inajumuisha viraka vya injini chini ya zig/patches/. Vimezimwa kwa chaguo-msingi na hupitishwa kwa rank zote mbili kupitia start.sh. README inaripoti kuwa picha chaguo-msingi ilijaribiwa kwa heshi za tokeni zinazofanana katika anuwai ya hali za vidokezo na wakati mmoja.

TF_DS_ENGRAM_LANES=2 huwezesha pete ya pili ya I/O kwa usomaji wa Engram, lakini vipimo vilionyesha kuwa ilikuwa polepole zaidi kwenye hifadhi iliyojaribiwa. TF_DS_IDX_SPLIT=1 hugawanya safu za kiashiria cha prefill kati ya ranks, lakini haikuonyesha ongezeko lolote linalopimika kwenye jozi iliyojaribiwa. Ikiwa ranks hazikubaliani kuhusu mpangilio huu, jozi inaweza kuganda, hivyo hubaki ikiwa imezimwa kwa chaguo-msingi.

Patch 0005 huboresha uinganishaji wa prompt-pass ili mitiririko iliyopo ipokee raundi za decode wakati prompt nyingine ndefu inapofanyiwa prefetch. Tabia yake inaweza kurekebishwa kwa PREFILL_INTERLEAVE_MS. Patch 0006 huhifadhi hali za prompt kwa ingizo la picha wakati TF_DS_IMAGE_CACHE=0 haitumiki kuzima tabia hiyo.

Fuatilia kumbukumbu na epuka ukubwa usio salama wa muktadha

Kumbukumbu ndiyo kikwazo kikuu cha uendeshaji. README inaripoti kuwa muktadha wa 512K ulikuwa wa kutekelezeka kwenye mashine yenye takriban GiB 6 zilizokuwa zimetumiwa na programu nyingine, huku usanidi wa 655K ukiweza kushuka chini ya kikomo cha ulinzi wa kumbukumbu mazungumzo yalipokuwa yakikua. Watchdog imejumuishwa kwa sababu Spark inaweza kuganda sakafu ya kumbukumbu inapofikiwa wakati wa prompt ndefu nyingi zinazoendeshwa kwa pamoja.

Anza na thamani chaguo-msingi au ya tahadhari ya CONTEXT, jaribu kwa mzigo wako halisi wa kazi, na ufuatilie kumbukumbu iliyo huru wakati wa historia ndefu. Kumbukumbu iliyo huru inaweza kupungua kadiri mazungumzo yaliyohifadhiwa kwenye akiba yanavyokua, hata wakati modeli ilipakiwa kwa mafanikio.

Hitimisho

Hifadhi hii inatoa njia ya kiotomatiki ya kusambaza DeepSeek-V4.1-Flash-1017 kwenye DGX Sparks mbili zilizounganishwa moja kwa moja. Baada ya maunzi, mtandao wa RoCE, SSH, Docker, hifadhi, na ufikiaji wa Hugging Face kuwa tayari, start.sh hushughulikia usanidi wa hatua nyingi na kutoa sehemu ya mwisho inayooana na OpenAI na iliyozoeleka.

Kwa usambazaji unaotegemeka, tanguliza hifadhi ya ndani ya Engram, saa zinazolingana za GPU, ukubwa wa muktadha wa tahadhari, na uthibitishaji makini wa mizigo ya picha, zana, na muktadha mrefu. Overlay ya abliterated na swichi za injini zinapatikana kwa majaribio, lakini vipimo vilivyoandikwa vya utendaji na usahihi vinahusu hasa checkpoint ya kawaida na usanidi chaguo-msingi wa injini.