یہ پروجیکٹ کیا کرتا ہے
یہ پروجیکٹ GLM-5.3-Flash کو دو NVIDIA DGX Spark سسٹمز پر TensorFold v0.5.0 استعمال کرتے ہوئے چلاتا ہے۔ ہر Spark ایک distributed rank چلاتا ہے، جبکہ پہلا Spark OpenAI-compatible HTTP API بھی فراہم کرتا ہے۔
ڈیفالٹ کنفیگریشن چار بیک وقت درخواستوں، ہر درخواست کے لیے زیادہ سے زیادہ 1,048,576 ٹوکنز کی context window، تصویر اور ویڈیو ان پٹ، tool calling، structured output، tokenization endpoints، اور Prometheus metrics کو سپورٹ کرتی ہے۔ دونوں سسٹمز کے درمیان رابطہ براہِ راست ConnectX-7 RoCE لنک کے ذریعے ہوتا ہے۔
یہ deployment Mia-AiLab GLM-5.3-Flash EXL3 checkpoint استعمال کرتی ہے۔ Routed experts تقریباً چار bits فی weight پر محفوظ کیے جاتے ہیں، جبکہ checkpoint کے دیگر weights BF16 ہوتے ہیں۔ مکمل checkpoint تقریباً 176 GB ہے۔
اہم خصوصیات
- OpenAI-compatible API: chat completions، completions، responses، اور model-listing endpoints استعمال کریں۔
- طویل context: ڈیفالٹ FP8 KV configuration کے تحت ایک درخواست کے لیے prompt اور reply کے مجموعی طور پر 1,048,576 ٹوکنز تک۔
- بیک وقت inference: ڈیفالٹ DFlash2 drafter کے ساتھ بیک وقت زیادہ سے زیادہ چار درخواستیں decode کریں۔
- مشترکہ cache pool: بیک وقت گفتگوئیں ایک FP8 KV pool استعمال کرتی ہیں جس میں دستیاب memory کے لحاظ سے تقریباً 2.1 سے 2.7 ملین ٹوکنز شامل ہوتے ہیں۔
- Multimodal requests: JPEG، PNG، WebP، MP4، WebM، MOV، MKV، اور FFmpeg کے ذریعے decode ہونے والے دیگر ویڈیو inputs بھیجیں۔
- Reasoning controls: درخواست کے لیے کم، زیادہ، یا maximum reasoning effort منتخب کریں، یا thinking کو غیر فعال کریں۔
- Agent features: xgrammar کے ذریعے tool calling اور schema-constrained structured outputs استعمال کریں۔
- Operational endpoints: health چیک کریں، input کو tokenize یا detokenize کریں، اور Prometheus metrics جمع کریں۔
- خودکار deployment: ایک کمانڈ دونوں مشینیں تیار کرتی ہے، دونوں ranks شروع کرتی ہے، smoke test چلاتی ہے، اور API address بتاتی ہے۔
ہارڈویئر اور سافٹ ویئر کی ضروریات
آپ کو دو DGX Sparks، یا دو GB10 سسٹمز درکار ہیں، جن میں سے ہر ایک کے پاس 128 GB unified memory ہو۔ server شروع ہوتے وقت ہر GPU پر تقریباً 110 GiB خالی ہونا ضروری ہے، اس لیے پہلے دیگر بڑے GPU workloads بند کریں۔
نیٹ ورک کی ضروریات
ConnectX-7 ports کو QSFP cable سے جوڑیں اور ہر endpoint کو اسی private subnet میں IPv4 address دیں۔ مثال کے طور پر head کے لیے 192.0.2.1/24 اور worker کے لیے 192.0.2.2/24 استعمال کیا جا سکتا ہے۔ addresses کو ping کے ذریعے قابلِ رسائی ہونا چاہیے، اور RoCE v2 GID دستیاب ہونا چاہیے۔
اگر دونوں CX7 ports connected اور addressed ہوں تو پروجیکٹ دونوں rails استعمال کر سکتا ہے۔ README کی پیمائش کے مطابق، دو rails کے ساتھ prompt chunk کا all-gather تقریباً 1.8 گنا تیز ہوتا ہے۔
SSH اور سسٹم کی ضروریات
- head Spark سے worker تک key-based SSH access۔
- دونوں سسٹمز پر NVIDIA container runtime کے ساتھ Docker۔
- دونوں سسٹمز پر آپ کا account
dockergroup میں شامل ہو۔ - دونوں سسٹمز پر
rsyncانسٹال ہو۔ - ہر Spark پر تقریباً 205 GB disk space۔
- اختیاری طور پر head پر Hugging Face
hfCLI اور Hugging Face token۔
اگر ضروری ہو تو SSH key بنائیں، اسے worker پر copy کریں، اور noninteractive access کی تصدیق کریں:
ssh-keygen -t ed25519
ssh-copy-id user@192.0.2.2
ssh -o BatchMode=yes user@192.0.2.2 trueDFlash2 drafter CC BY-NC-ND 4.0 کے تحت licensed ہے اور صرف غیر تجارتی استعمال کے لیے ہے۔ اگر آپ DFlash2 کو download یا استعمال کرنے سے بچنا چاہتے ہیں تو پہلی setup سے پہلے checkpoint کا MTP drafter منتخب کریں۔
پروجیکٹ انسٹال اور کنفیگر کریں
1. head پر repository clone کریں
git clone https://github.com/MiaAI-Lab/GLM-5.3-Flash-EXL3-2x-DGX-Sparks-TensorFold.git
cd GLM-5.3-Flash-EXL3-2x-DGX-Sparks-TensorFold
cp scripts/local.sh.example scripts/local.shworker کو اپنی الگ checkout کی ضرورت نہیں۔ setup scripts مطلوبہ container image اور model files کو head سے منتقل کرتی ہیں۔
2. worker address مقرر کریں
scripts/local.sh میں ترمیم کریں اور WORKER کو worker کے SSH target پر set کریں:
WORKER=user@192.0.2.2distributed ranks اس route کے ذریعے رابطہ کرتے ہیں جو worker تک پہنچنے کے لیے استعمال ہوتا ہے۔ اگر WORKER کسی دوسرے network کے address کی طرف اشارہ کرتا ہو تو FABRIC_PEER کو worker کے private CX7 address پر set کریں:
WORKER=user@worker-hostname
FABRIC_PEER=192.0.2.23. ضرورت ہو تو drafter منتخب کریں
ڈیفالٹ DRAFTER=dflash2 ہے، جو زیادہ سے زیادہ چار بیک وقت درخواستوں کی اجازت دیتا ہے اور تقریباً 5 سے 10 فیصد decode improvement فراہم کرتا ہے۔ اس کے بجائے checkpoint کا MTP head استعمال کرنے کے لیے پہلی start سے پہلے اسے configure کریں:
DRAFTER=mtpMTP، DFlash2 license اور download سے بچاتا ہے، لیکن ڈیفالٹ طور پر ایک وقت میں ایک ہی درخواست serve کرتا ہے۔
4. دونوں ranks شروع کریں
./start.shپہلی بار script دونوں سسٹمز کو چیک کرتی ہے، تقریباً 25 GB کی container image حاصل یا build کرتی ہے، head پر checkpoint اور drafter download کرتی ہے، انہیں worker پر copy کرتی ہے، اور CUDA kernels کو ~/.cache/tensorfold-glm53 میں compile کرتی ہے۔
بعد کی starts میں عموماً ہر Spark پر تقریباً 80 GiB weights load کرنے میں دو سے چھ منٹ لگتے ہیں۔ launcher rank 0 کے log کو follow کرتا ہے، loading progress دکھاتا ہے، distributed smoke test چلاتا ہے، اور port 8888 پر live endpoint دکھاتا ہے۔
API شروع کیے بغیر دونوں سسٹمز تیار کرنے کے لیے چلائیں:
scripts/prepare.shصاف image rebuild زبردستی کرنے کے لیے استعمال کریں:
scripts/prepare.sh --rebuildاپنی پہلی API درخواست کریں
پہلے سے طے شدہ ماڈل شناخت کنندہ GLM-5.3-Flash-EXL3 ہے، اور بنیادی URL http://<head-address>:8888/v1 ہے۔
دستیاب ماڈلز کی فہرست دیکھیں
curl -s http://<head-address>:8888/v1/modelsچیٹ تکمیل بھیجیں
curl -s http://<head-address>:8888/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "GLM-5.3-Flash-EXL3",
"messages": [
{"role": "user", "content": "Write a Python fibonacci function."}
],
"max_tokens": 2000
}'ماڈل پہلے سے جواب دینے سے قبل غور کرتا ہے۔ استدلال reasoning_content میں واپس کیا جاتا ہے، جبکہ حتمی جواب content میں ظاہر ہوتا ہے۔ دونوں مراحل کے لیے کافی آؤٹ پٹ ٹوکن مختص کریں۔ اگر content خالی ہو تو غالباً ماڈل نے غور کرتے ہوئے آؤٹ پٹ کی پوری گنجائش استعمال کر لی ہے۔
استدلال اور سیمپلنگ کو کنٹرول کریں
reasoning_effort کو low، high، یا max پر سیٹ کریں۔ بغیر غور کیے براہِ راست جواب طلب کرنے کے لیے none استعمال کریں:
curl -s http://<head-address>:8888/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "GLM-5.3-Flash-EXL3",
"messages": [{"role": "user", "content": "Summarize TCP in two sentences."}],
"reasoning_effort": "low",
"temperature": 0,
"max_tokens": 1000
}'API temperature، top_p، top_k، min_p، اور seed بھی قبول کرتی ہے۔ واضح seed کے بغیر سیمپلر اپنی کلید پرامپٹ سے اخذ کرتا ہے، اس لیے یکساں درخواستیں ایک ہی جواب پیدا کرتی ہیں۔
تصاویر اور ویڈیوز بھیجیں
GLM وژن ٹاور پہلے سے rank 0 پر چلتا ہے۔ تصاویر اور ویڈیوز کو صارف کے پیغام میں OpenAI طرز کے مواد کے حصوں کے طور پر پیش کیا جاتا ہے۔
مقامی تصویر کا تجزیہ کریں
IMG=$(base64 -w0 photo.jpg)
curl -s http://<head-address>:8888/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "GLM-5.3-Flash-EXL3",
"messages": [{
"role": "user",
"content": [
{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,'"$IMG"'"}},
{"type": "text", "text": "What is in this picture?"}
]
}],
"max_tokens": 2000
}'پہلے سے سرور میڈیا کو data URLs کے ذریعے قبول کرتا ہے۔ اگر سرور کو عوامی HTTPS URLs بھی حاصل کرنے چاہییں تو VISION_URLS=1 سیٹ کریں۔
معاون میڈیا کی حدود
- ہر درخواست میں زیادہ سے زیادہ 50 تصاویر، ہر تصویر کے لیے 10 MB اور تمام تصویری ڈیٹا کے لیے 64 MB کی حد۔
- ہر درخواست میں زیادہ سے زیادہ 4 ویڈیوز، ہر ویڈیو کے لیے 64 MB اور تمام ویڈیو ڈیٹا کے لیے 96 MB کی حد۔
- ہر ویڈیو میں زیادہ سے زیادہ ایک گھنٹے کی فوٹیج ہو سکتی ہے۔
- درخواست کا باڈی زیادہ سے زیادہ 96 MiB ہو سکتا ہے، جس میں base64-encoded میڈیا کے لیے تقریباً 70 MB باقی رہتا ہے۔
- ہر تصویر کو زیادہ سے زیادہ 2,048 ٹوکن ملتے ہیں، جبکہ ایک درخواست کی تمام تصاویر 16,384 ٹوکن کے پہلے سے طے شدہ مشترکہ بجٹ میں شامل ہوتی ہیں۔
- ویڈیو سیمپلنگ پہلے سے فی سیکنڈ دو فریم اور پورے کلپ میں زیادہ سے زیادہ 128 فریم پر سیٹ ہے۔
ویڈیو کے لیے image content part کو video_url حصے سے تبدیل کریں، جس میں data:video/mp4;base64,... جیسا data URL ہو۔
اگر آپ کو صرف متن درکار ہے تو VISION=0 سیٹ کریں۔ اس سے وژن ٹاور لوڈ نہیں ہوتا اور rank 0 پر کیش کے لیے تقریباً 1.8 GiB مزید میموری دستیاب رہتی ہے۔
سرور چلائیں اور نگرانی کریں
دوبارہ شروع اور بند کریں
./start.sh restart
./stop.shمستقل ترتیبات تبدیل کرنے کے بعد دوبارہ شروع کرنا ضروری ہے۔ سروس بند کرنے سے دونوں مشینوں پر GPU میموری آزاد ہو جاتی ہے۔
لاگز دیکھیں
docker logs -f glm53-flash-tf
ssh <worker> docker logs -f glm53-flash-tfپہلی کمانڈ head پر rank 0 کے لاگ کی پیروی کرتی ہے۔ دوسری rank 1 کی پیروی کرتی ہے اور خاص طور پر اس وقت مفید ہے جب worker غیر متوقع طور پر بند ہو جائے۔
صحت اور میٹرکس چیک کریں
curl -s http://<head-address>:8888/health
curl -s http://<head-address>:8888/metricsصحت کا جواب مصروف حالت، فعال اسٹریمز، اور مشترکہ پول کی گنجائش، بشمول pool_tokens اور pool_free_tokens، کی اطلاع دیتا ہے۔ میٹرکس اینڈ پوائنٹ Prometheus کی درخواست، تاخیر، پہلے ٹوکن تک وقت، اور صحت سے متعلق اعداد و شمار فراہم کرتا ہے۔
کانٹیکسٹ اور مشترکہ KV میموری سمجھیں
پہلے سے طے شدہ ترتیب FP8 KV کیش استعمال کرتی ہے اور ہر درخواست کو زیادہ سے زیادہ 1,048,576 ٹوکن کی ونڈو دیتی ہے۔ ایک دستاویزی آغاز کے وقت چار درخواستیں 2,684,928 ٹوکن کے پول میں شریک ہوتی ہیں، اگرچہ درست گنجائش دستیاب خالی میموری پر منحصر ہے۔
ایک درخواست مکمل ونڈو استعمال کر سکتی ہے، لیکن تمام فعال اور محفوظ گفتگوؤں کو مشترکہ پول میں سمانا ضروری ہے۔ مثال کے طور پر، دو گفتگوئیں تقریباً دس لاکھ ٹوکن تک پہنچ سکتی ہیں، جبکہ بیک وقت چلنے والی مختصر گفتگوئیں باقی گنجائش میں شریک ہو سکتی ہیں۔ جو درخواست فی الحال جگہ حاصل نہ کر سکے، وہ دوسری درخواستوں کے مکمل ہونے تک انتظار کرتی ہے۔
سب سے بڑی موزوں ونڈو کا حساب لگانے کے لیے CONTEXT=0 استعمال کریں، لیکن یاد رکھیں کہ اس سے دوسری گفتگوؤں کی پرامپٹ حالت محفوظ رکھنے کے لیے کوئی میموری باقی نہیں رہتی۔ عین BF16 KV اسٹوریج پر منتقل ہونے سے دستیاب ونڈو نمایاں طور پر کم ہو جاتی ہے۔
یکجا میموری ختم ہونے سے Spark صاف allocation failure دینے کے بجائے منجمد ہو سکتا ہے۔ جب تک آپ میموری کے تبادلے کو اچھی طرح نہ سمجھتے ہوں، پہلے سے طے شدہ reserve برقرار رکھیں، اور جب دوسری workloads بھی مشینیں استعمال کر رہی ہوں تو
MEMORY_RESERVE_GIBبڑھا دیں۔
اعلیٰ درجے کی ترتیب
ترتیبات ماحول، scripts/local.sh، یا start.sh کے ساتھ موجود .env فائل کے ذریعے فراہم کی جا سکتی ہیں۔ ترجیح کی ترتیب ماحول، پھر scripts/local.sh، پھر .env، اور آخر میں repository کی ڈیفالٹ ترتیبات ہے۔
ایک رن کے لیے concurrency تبدیل کریں
PARALLEL=2 ./start.sh restartجب DFlash2 فعال ہو تو PARALLEL کو ایک سے چار تک سیٹ کیا جا سکتا ہے۔ MTP ڈیفالٹ طور پر ایک وقت میں ایک درخواست چلاتا ہے۔
کانٹیکسٹ ونڈو تبدیل کریں
CONTEXT=524288 ./start.sh restartجب مکمل دس لاکھ ٹوکن کی ونڈو ضروری نہ ہو تو چھوٹا کانٹیکسٹ کیش پر دباؤ کم کر سکتا ہے۔
ڈیفالٹ آؤٹ پٹ کی اجازت بڑھائیں
./start.sh restart --max-tokens 16384اضافی کمانڈ لائن دلائل، تشکیل شدہ ڈیفالٹس کے بعد tensorfold serve کو بھیجے جاتے ہیں، اس لیے انہیں ترجیح حاصل ہوتی ہے۔ معاون دلائل دیکھنے کے لیے ./start.sh --help چلائیں۔
تیاری لازمی کریں یا چھوڑ دیں
PREPARE=1 ./start.sh restart
PREPARE=0 ./start.sh restartپہلی کمانڈ سیٹ اپ کی جانچ اور تیاری کے عمل کو لازمی کرتی ہے۔ دوسری اسے چھوڑ دیتی ہے۔
پرامپٹ کا مؤثر دوبارہ استعمال
مشترکہ سابقہ کا دوبارہ استعمال بطور ڈیفالٹ SHARED_PREFIX=1 کے ساتھ فعال ہے۔ دہرائے گئے سسٹم پرامپٹس اور یکساں محفوظ شدہ پرامپٹس دوبارہ پری فیچ کیے جانے کے بجائے کیش شدہ حالت سے جاری ہو سکتے ہیں۔ دستاویزی پیمائش میں، 64K ٹوکن کے دہرائے گئے پرامپٹ کا وقت 34 سیکنڈ سے کم ہو کر 0.07 سیکنڈ رہ گیا، جبکہ 7.9K ٹوکن کے سسٹم پرامپٹ کے دوبارہ استعمال سے اسٹارٹ اپ کا وقت 4.24 سیکنڈ سے کم ہو کر 0.13 سیکنڈ ہو گیا۔
کیش اور وزن کی پریسیژن منتخب کریں
KV=fp8ڈیفالٹ ہے اور سب سے بڑی کانٹیکسٹ ونڈو فعال کرتا ہے۔KV=bf16کیش اسٹوریج میں مکمل درستگی استعمال کرتا ہے، لیکن دستیاب ونڈو کو نمایاں طور پر مختصر کر دیتا ہے۔DENSE=q4ڈینس چیک پوائنٹ اجزا کے لیے ڈیفالٹ ہے۔DENSE=fp8اورDENSE=bf16متبادل کے طور پر دستیاب ہیں، جن کے میموری پر اثرات مختلف ہیں۔
اضافی API صلاحیتیں
چیٹ کمپلیشنز کے علاوہ، سرور /v1/completions، /v1/responses، /v1/models، /tokenize، /detokenize، /health، اور /metrics فراہم کرتا ہے۔ ٹوکنائزیشن روٹس /v1/ کے تحت بھی دستیاب ہیں۔ سرور Anthropic کے موافق /v1/messages اینڈ پوائنٹ فراہم نہیں کرتا۔
ٹول کالنگ tools اور اسٹریم شدہ tool_calls کو سپورٹ کرتی ہے، جبکہ دلائل فراہم کردہ اسکیما کے مطابق ٹائپ کیے جاتے ہیں۔ ساختی جنریشن json_object، json_schema، گائیڈڈ JSON، ریگولر ایکسپریشنز، انتخاب، گرامرز، اور دیگر ساختی آؤٹ پٹ فیلڈز کو سپورٹ کرتی ہے، جنہیں ریزننگ مکمل ہونے کے بعد xgrammar کے ذریعے نافذ کیا جاتا ہے۔
اگر پرامپٹ اور max_tokens کا مجموعہ تشکیل شدہ ونڈو سے تجاوز کرے تو API HTTP 400 کے ساتھ OpenAI طرز کا خرابی کوڈ context_length_exceeded واپس کرتی ہے۔
اسٹارٹ اپ کے عام مسائل کا ازالہ
- ناکافی میموری: اگر اسٹارٹ اپ رپورٹ کرے کہ صرف محدود تعداد میں GiB دستیاب ہیں تو
docker psدیکھیں اور دونوں Sparks پر دیگر GPU ورک لوڈز روک دیں۔ - RoCE ڈیوائس یا روٹ موجود نہیں:
ip -4 addrسے تصدیق کریں کہ CX7 انٹرفیسز کے پاس IPv4 پتے موجود ہیں۔ اگر SSH کسی دوسرے نیٹ ورک کو استعمال کرتا ہے توFABRIC_PEERکو ورکر کے CX7 پتے کے ساتھ تشکیل دیں۔ - ورکر کیش قابل تحریر نہیں: اگر کسی سابقہ کنٹینر نے اسے root کی ملکیت میں چھوڑ دیا ہو تو ورکر کے Hugging Face کیش کی ملکیت درست کریں۔
- ایک رینک بند ہو جاتا ہے: دونوں مشینوں کے لاگز چیک کریں۔ اگر کسی ایک طرف خرابی ہو تو لانچر عموماً باقی رینک کو بھی روک دیتا ہے۔
- سیٹ اپ تبدیل ہو گیا: پیچز میں ترمیم یا TensorFold، بیس امیج، یا متعلقہ build inputs تبدیل کرنے کے بعد
scripts/prepare.sh --rebuildچلائیں۔
کارکردگی کی توقعات
README کی ڈیفالٹ دو-Spark پیمائشوں میں، نثری ڈیکوڈنگ ایک درخواست کے لیے 60.4 ٹوکن فی سیکنڈ سے لے کر چار بیک وقت درخواستوں کے لیے مجموعی 108.8 ٹوکن فی سیکنڈ تک رہی۔ ساختی جنریشن کی رفتار مجموعی طور پر 114.7 سے 227.9 ٹوکن فی سیکنڈ تک رہی۔ پری فل کی رفتار 8,219 ٹوکن کے پرامپٹ کے لیے تقریباً 1,952 ٹوکن فی سیکنڈ اور 981,841 ٹوکن کے needle-in-a-haystack پرامپٹ کے لیے 1,015 ٹوکن فی سیکنڈ تھی، جس میں needle مل گئی۔
یہ اعداد و شمار چار اسٹریمز، FP8 KV کیش، چار بِٹ ڈینس وزن، DFlash2 اور copy drafts، فعال vision، اور 2,200 MHz پر محدود GPU کلاک کے ساتھ ناپے گئے تھے۔ انہیں ہر ماحول کی ضمانت کے بجائے اسی تشکیل کے لیے حوالہ جاتی نتائج سمجھیں۔
نتیجہ
یہ ڈپلائمنٹ پیچیدہ دو نوڈ TensorFold تشکیل کو ایک عملی اسٹارٹ اپ ورک فلو اور OpenAI سے مطابقت رکھنے والی API کے پیچھے پیک کرتی ہے۔ CX7 لنک، SSH رسائی، Docker رن ٹائم، اسٹوریج، اور ورکر کا پتہ تیار ہونے کے بعد ./start.sh تیاری، تقسیم شدہ لانچ، توثیق، اور سروسنگ سنبھال لیتا ہے۔ اس کے بعد آپ معیاری API کلائنٹس استعمال کرتے ہوئے اپنے ورک لوڈ کے لیے ہم وقتی درخواستوں، کانٹیکسٹ، ریزننگ، ملٹی موڈل حدود، اور میموری کے رویے کو بہتر بنا سکتے ہیں۔
