Asosiy kontentga o‘tish
AI qo‘llanmalari

DeepSeek-V4.1-Flash-1017 ni TensorFold bilan ikkita DGX Spark’da ishga tushirish

TensorFold, ConnectX-7 tarmog‘i, Engram xotirasi, spekulyativ dekodlash va OpenAI bilan mos API yordamida 2.9-bitli EXL3 DeepSeek-V4.1-Flash-1017 checkpoint’ini ikkita NVIDIA DGX Spark qurilmasida qanday joylashtirishni o‘rganing.

DeepSeek-V4.1-Flash-1017 ni TensorFold bilan ikkita DGX Spark’da ishga tushirish

Bu loyiha nima qiladi

Ushbu joylashtirish retsepti DeepSeek-V4.1-Flash-1017 modelini har birida 128 GB birlashtirilgan xotira bo‘lgan ikkita NVIDIA DGX Spark qurilmasidan ishga tushiradi. Unda TensorFold’ning tensor parallelizmi qo‘llab-quvvatlangan mahalliy Zig dvigateli ishlatiladi: har bir Spark uchun bittadan rank va 8888-portda OpenAI bilan mos API taqdim etiladi.

Sozlama eksperimental 2.9-bitli EXL3 checkpoint’idan foydalanadi: Mia-AiLab/DeepSeek-V4.1-Flash-1017-EXL3-EAQ-v1-2.9-bpw. U modelning katta kontekst oynasi, rasm kiritish, vositalarni chaqirish, ixtiyoriy fikrlash va checkpoint’dagi qoralama bloklaridan DSpark spekulyativ dekodlashini qo‘llab-quvvatlaydi.

Repository tayyorlash, Docker image’ini yaratish, checkpoint’larni yuklab olish, rank keshi yaratish, worker’ni sozlash, serverni ishga tushirish, smoke-testlar va o‘chirish jarayonlarini avtomatlashtiradi. Birinchi Spark head sifatida ishlaydi: u API’ni ishga tushiradi, sozlashni muvofiqlashtiradi va 0-rank’ni boshlaydi. Ikkinchi Spark 1-rank’ni ishga tushiradi.

Arxitektura va muhim cheklovlar

TensorFold BertholomusAI dsv41 oilasini ikkita tensor parallelizmi bilan ishga tushiradi. Ikki rank to‘g‘ridan-to‘g‘ri ConnectX-7 ulanishi orqali muloqot qiladi. Head API trafigini qabul qiladi, ikkala Spark esa taxminan 98 GiB model og‘irliklarini xotirada saqlaydi.

Checkpoint taxminan 196 GiB bo‘lib, 39 ta shard’ga bo‘lingan. Joylashtirish uchun Engram’ning kvantlanmagan ikkita jadvali ham kerak; ular taxminan 203 GB joy egallaydi. Engram jadvallarini ikkala Spark’da ham mahalliy diskka ko‘chirish kerak. Ularni NFS orqali o‘qish prefill va decode unumdorligini sezilarli darajada pasaytirishi mumkin, chunki dekodlash jarayonida ko‘plab tasodifiy 4 KiB o‘qishlar bajariladi.

Model texnik jihatdan 1,048,576 tokenli oynadan foydalanishi mumkin, ammo head’dagi mavjud xotira amaliy cheklov hisoblanadi. Boshqa desktop va ishlab chiqish xizmatlari ishlayotgan head’da README qo‘shimcha xotira bo‘shatilmaguncha CONTEXT qiymatini 524288 yoki undan past darajada saqlashni tavsiya qiladi.

Uskuna va dasturiy ta’minot talablari

  • Har birida 128 GB birlashtirilgan xotira bo‘lgan ikkita NVIDIA DGX Spark yoki unga teng GB10 tizimi.
  • ConnectX-7 portlari orasida to‘g‘ridan-to‘g‘ri QSFP ulanishi.
  • To‘g‘ridan-to‘g‘ri ulanishda IPv4 manzillari, ishlaydigan aloqa va RoCE v2 GID.
  • Ikkala tizimda ham bir xil GPU clock chegarasi. README clock’larni nvidia-smi -q -d CLOCK bilan tekshirishni va kerak bo‘lganda nvidia-smi -lgc 0,2200 buyrug‘idan foydalanishni tavsiya qiladi.
  • Head’dan worker’ga kalit asosidagi SSH ulanishi.
  • Ikkala tizimda NVIDIA container runtime bilan Docker va foydalanuvchingizning docker guruhida bo‘lishi.
  • Head’da git, python3 va Hugging Face CLI.
  • Checkpoint, Engram jadvallari, rank weight fayllari, Docker image’i va keshlar uchun yetarli xotira. Standart joylashuvda head uchun taxminan 505 GB, worker uchun esa taxminan 310 GB kerak.

To‘g‘ridan-to‘g‘ri ulanish har bir Spark’da ikkita tarmoq qurilmasi va ikkita RoCE qurilmasi sifatida ko‘rinishi mumkin. Ikkala rail’ni ulanishdagi manzillar bilan sozlang va ikkala tizimda ham bir xil MTU’dan foydalaning.

Tarmoq va SSH ulanishini tayyorlash

ConnectX-7 interfeyslariga xususiy subnet manzillarini belgilang. Masalan, README 192.0.2.1/24 va 192.0.2.2/24 kabi manzillardan foydalanadi. Ikki tizim mo‘ljallangan ulanish orqali bir-biriga ping yubora olishini tasdiqlang.

Head’da worker uchun SSH kalitini o‘rnating va interaktiv bo‘lmagan ulanishni tekshiring:

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

Mahalliy konfiguratsiya faylida worker SSH manzili va fabric manzilini belgilang. Worker’ga ushbu repository nusxasi kerak emas.

NFS yoki mahalliy xotirani sozlash

Odatiy holatda worker head’ning Hugging Face keshini NFS orqali faqat o‘qish rejimida ulaydi. Head’da NFS serverini o‘rnating va keshni eksport qiling:

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

Worker’ga host’ning NFS client yordamchisi, masalan Ubuntu’dagi nfs-common, kerak bo‘lishi mumkin. Tayyorlash skripti faqat o‘qish uchun Docker NFS volume’ini yaratadi va worker kerakli fayllarni ko‘ra olishini tekshiradi.

Yaxshiroq izolyatsiya uchun yoki NFS mos kelmaganda, kerakli keshning mahalliy nusxasini har bir Spark’ka joylashtiring. HF_CACHE ni mahalliy tree’ga, NFS_VOLUME ni mos host yo‘liga o‘rnating, HEAD_NFS_SERVER ni bo‘sh qoldiring va PREPARE=0 ni belgilang. Mahalliy kesh checkpoint’ning kichik fayllari, model-00039-of-00039 vision shard’i, xizmat ko‘rsatiladigan model/ papkasi, kit, token map va tegishli rank weight faylini o‘z ichiga olishi kerak.

Repository’ni klonlash va sozlash

Repository’ni head’da klonlang va mahalliy konfiguratsiya faylini yarating:

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

scripts/local.sh faylini tahrirlang va kamida WORKER qiymatini worker’ning SSH manziliga o‘rnating. Agar worker’ning SSH yo‘li to‘g‘ridan-to‘g‘ri fabric yo‘lidan farq qilsa, FABRIC_PEER ni worker’ning ConnectX-7 manziliga o‘rnating.

Ko‘pgina sozlamalar scripts/config.sh faylida belgilanadi. Keng tarqalgan qiymatlar:

  • Pinlangan EXL3 checkpoint’i uchun MODEL_ID va MODEL_REVISION.
  • Odatiy qiymati 1048576 bo‘lgan CONTEXT.
  • Odatiy qiymati bir vaqtdagi to‘rtta so‘rov bo‘lgan PARALLEL.
  • Agar Hugging Face autentifikatsiyasi kerak bo‘lsa, HF_TOKEN.
  • Standart yoki abliteratsiya qilingan rejimni tanlaydigan ABLIT.

Ishga tushirishdan oldin quruq tekshiruvni bajaring

O‘zgarishlar kiritmasdan aniqlangan ulanish va Docker buyruqlarini ko‘rish uchun dry-run rejimidan foydalaning:

DRY_RUN=1 ./start.sh

Repository tayyorgarlik vaqtida shell sintaksisi tekshiruvlarini ham bajaradi va kutilgan tarmoq, Docker, GPU, SSH hamda xotira shartlarini tasdiqlaydi. Sozlangan mavjud minimal xotira miqdori, MIN_AVAIL_GIB, ikkala Spark’da ham mavjud bo‘lmasa, ishga tushirish davom etmaydi.

Ikki rankli serverni ishga tushirish

To‘liq joylashtirishni bosh qurilmadan ishga tushiring:

./start.sh

Birinchi ishga tushirishda skript TensorFold image’ini yaratadi, checkpoint va Engram jadvallarini yuklab oladi, RoPE jadvallari hamda image-routing ma’lumotlarini tayyorlaydi, token va rank fayllarini yaratadi, worker xotirasini sozlaydi va ikkala rankni ishga tushiradi. Zig image’ini yaratish Spark’da taxminan olti daqiqa davom etadi va hajmi qariyb 24.9 GB bo‘lgan image hosil qiladi.

Ishga tushirilgandan so‘ng skript API’ni kutadi va smoke testni bajaradi. Muvaffaqiyatli ishga tushirish DeepSeek-V4.1-Flash-1017 modeli 8888-portda ishlayotganini bildiradi.

Foydali lifecycle buyruqlari:

./start.sh restart
./stop.sh

Serving sozlamalarini o‘zgartirgandan so‘ng restart buyrug‘idan foydalaning. To‘xtatish skripti container’larni o‘chirishdan oldin siqilgan loglarni saqlaydi va LOG_KEEP bo‘yicha eng yangi loglarni qoldiradi.

OpenAI’ga mos API’ni chaqirish

Mijozlar bosh qurilmaning manzilidan /v1 yo‘li bilan va aynan DeepSeek-V4.1-Flash-1017 model identifikatori bilan foydalanishi kerak. Masalan, OpenAI’ga mos Python mijozini quyidagicha sozlash mumkin:

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)

So‘rov orqali fikrlash o‘chirilmasa, model javob berishdan oldin fikrlaydi. Fikrlash va yakuniy javob uchun yetarli max_tokens ajrating yoki muhitdagi tegishli fikrlash va reasoning sozlamalarini belgilang.

Matn, vositalar, rasmlar va uzun promptlarni tekshirish

Repository ishlayotgan endpoint’ni tekshirish uchun validation utilitalarini o‘z ichiga oladi:

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

Validation to‘plami matn, fikrlash, vositalar, rasm kiritish va uzun promptlarni qamrab oladi. README’da rasm kiritish va validation vositasi ko‘rsatilgan hardware juftligida to‘liq tekshirilmagani qayd etilgan; shuning uchun bu testlarni kafolat emas, balki joylashtirish tekshiruvlari sifatida ko‘ring.

Qo‘shimcha diagnostika uchun rank loglarini ko‘ring:

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

Abliterated rejimdan foydalanish

Standart konfiguratsiyada original Mia EAQ 2.9-bit checkpoint ishlatiladi. ABLIT=1 ni belgilash shu checkpoint’ni saqlab qoladi va drowzeys/keys-DeepSeek-V4.1-Flash-1017-Abliterated manzilidagi mos Keys overlay’ni qo‘llaydi.

Bu cheklangan Hugging Face repository’sidir. Tayyorgarlikdan oldin repository shartlarini qabul qiling va kirish huquqiga ega hisob bilan autentifikatsiyadan o‘ting:

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

Muqobil ravishda tokenni shell tarixiga yozmasdan taqdim eting:

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

Overlay ABLIT_REVISION orqali aniq versiyaga biriktirilgan. Tayyorgarlik alohida cache yo‘llari va rank cache’larini yaratadi, shuning uchun original va abliterated ma’lumotlar tasodifan aralashib ketmaydi. Qayta yozilgan shardlar overlay va rank fayllariga qo‘shimcha ravishda yana bir checkpoint’ga teng hajmdagi bo‘sh joy talab qilishi mumkin. Original rejimga quyidagicha qayting:

ABLIT=0 ./start.sh restart

README’da original rejimning unumdorlik va to‘g‘rilik natijalari ushbu engine’da abliterated rejimni tasdiqlamasligi aniq aytilgan. Shuningdek, tayyorgarlik va ishga tushirishda bir xil ABLIT sozlamasidan foydalaning.

Unumdorlik va sozlash bo‘yicha yo‘riqnoma

Haqiqiy nasriy va kod promptlari bilan o‘tkazilgan o‘lchovlarda bitta nasriy oqim uchun taxminan sekundiga 74.9 token, bitta kod oqimi uchun esa sekundiga 109.9 token natijaga erishilgan. To‘rtta oqimda umumiy o‘tkazuvchanlik nasr uchun taxminan sekundiga 130.0 token, kod uchun esa sekundiga 155.5 token bo‘lgan. Prefill 8K dan 256K token gacha bo‘lgan promptlarda taxminan sekundiga 2,000 dan 2,180 token gacha o‘lchangan.

Natijalar prompt tarkibi, GPU chastotalari, bir vaqtdagi yuklamalar, xotira va xotira bosimiga bog‘liq. Tasodifiy so‘zlar asosidagi benchmarklar odatiy nasr yoki kodga qaraganda kamroq samarali draft qiladi, shuning uchun ularning past decode ko‘rsatkichlari umumiy engine cheklovi sifatida qaralmasligi kerak.

  • Engram jadvallarini ikkala Spark’da ham lokal diskda saqlang.
  • GPU chastotasi yuqori chegaralarini mos holda belgilang, chunki tensor-parallel ranklar qayta-qayta sinxronlanadi.
  • CONTEXT qiymatini bosh qurilmaning xotira sig‘imi doirasida saqlang, ayniqsa u boshqa dasturlarni ham ishlatsa.
  • Uzun promptlar yoki bir nechta bir vaqtdagi foydalanuvchilarga xizmat ko‘rsatishda PARALLEL qiymatidan ehtiyotkorlik bilan foydalaning.
  • Tarmoq yoki joylashtirish sozlamalarini o‘zgartirishdan oldin DRY_RUN=1 dan foydalaning.

Ixtiyoriy engine kalitlari va patchlar

Repository zig/patches/ ichida engine patchlarini o‘z ichiga oladi. Ular sukut bo‘yicha o‘chirilgan va start.sh orqali ikkala rankka uzatiladi. README’da standart image turli prompt va bir vaqtdagi yuklama holatlarida bir xil token hash’lari uchun sinovdan o‘tkazilgani xabar qilingan.

TF_DS_ENGRAM_LANES=2 Engram o‘qishlari uchun ikkinchi I/O halqasini yoqadi, biroq o‘lchovlar sinovdan o‘tkazilgan xotira qurilmasida bu sekinroq ekanini ko‘rsatdi. TF_DS_IDX_SPLIT=1 prefill indeksatori qatorlarini ranklar o‘rtasida taqsimlaydi, biroq sinovdan o‘tkazilgan juftlikda o‘lchanadigan foyda bermadi. Agar ranklar bu sozlama bo‘yicha kelishmasa, juftlik osilib qolishi mumkin, shuning uchun u sukut bo‘yicha o‘chirilgan.

0005-patch prompt-pass interleaving’ini yaxshilaydi: boshqa uzun prompt uchun prefetch bajarilayotgan vaqtda mavjud oqimlar decode raundlarini oladi. Uning xatti-harakatini PREFILL_INTERLEAVE_MS orqali sozlash mumkin. 0006-patch TF_DS_IMAGE_CACHE=0 orqali bu xatti-harakat o‘chirilmaganida, rasm kiritmalari uchun prompt holatlarini saqlab qoladi.

Xotirani kuzating va xavfli kontekst o‘lchamlaridan saqlaning

Xotira asosiy operatsion cheklovdir. README ma’lumotlariga ko‘ra, boshqa dasturlar taxminan 6 GiB xotirani egallagan head’da 512K kontekstdan amaliy foydalanish mumkin bo‘lgan, 655K konfiguratsiyasi esa suhbat kengaygani sari xotira himoya chegarasidan pastga tushishi mumkin. Og‘ir va bir vaqtdagi uzun promptlar paytida xotira chegarasiga yetilganda Spark qotib qolishi mumkinligi sababli watchdog kiritilgan.

Sukut bo‘yicha yoki ehtiyotkor CONTEXT qiymatidan boshlang, haqiqiy ish yuklamangiz bilan sinab ko‘ring va uzoq suhbatlar davomida bo‘sh xotirani kuzating. Model muvaffaqiyatli yuklangan bo‘lsa ham, keshlangan suhbat kengaygani sari bo‘sh xotira kamayishi mumkin.

Xulosa

Bu repository DeepSeek-V4.1-Flash-1017 modelini to‘g‘ridan-to‘g‘ri ulangan ikkita DGX Spark o‘rtasida taqsimlashning avtomatlashtirilgan usulini taqdim etadi. Uskuna, RoCE tarmog‘i, SSH, Docker, xotira qurilmasi va Hugging Face’ga kirish tayyor bo‘lgach, start.sh ko‘p bosqichli sozlashni bajaradi va OpenAI bilan mos tanish endpoint’ni taqdim etadi.

Ishonchli deploy uchun lokal Engram xotirasiga, mos GPU takt chastotalariga, ehtiyotkor kontekst o‘lchamlariga hamda rasm, vosita va uzun kontekstli ish yuklamalarini sinchiklab tekshirishga ustuvor ahamiyat bering. Abliteratsiya qilingan overlay va engine kalitlari tajriba uchun mavjud, biroq hujjatlashtirilgan unumdorlik va to‘g‘rilik o‘lchovlari asosan standart checkpoint hamda engine’ning sukut bo‘yicha konfiguratsiyasiga taalluqlidir.