
openjev-sglang کیا ہے؟
openjev-sglang ایک ایسا سرور ہے جو SGLang پر Qwen3.6-35B-A3B استعمال کرتے ہوئے TypeSafe/Jev HTTP API نافذ کرتا ہے۔ یہ درجہ بندی کے سوالات کو طویل جوابات تیار کرنے کے بجائے پہلے ٹوکن کے امکانات کی مؤثر ریڈ آؤٹ میں تبدیل کرتا ہے۔
پہلے سے طے شدہ تعیناتی ہر NVIDIA B200 GPU کے لیے ایک SGLang کنٹینر چلاتی ہے۔ SGLang 0.5.19 اپنا Rust فرنٹ اینڈ، radix کیشنگ، اور breakable prefill CUDA گرافس فراہم کرتا ہے۔ ایک الگ Python عمل FastAPI، uvloop، Rust پر مبنی Hugging Face ٹوکنائزر، اور localhost پر SGLang سے pooled غیر متزامن کنکشنز کے ذریعے عوامی API سنبھالتا ہے۔
TypeSafe کو کوئی درخواست نہیں بھیجی جاتی۔ عوامی endpoint تشخیصی API فراہم کرتا ہے، جبکہ SGLang کی generation اور انتظامی routes localhost پر نجی رہتی ہیں۔
اہم خصوصیات
- تین تشخیصی اقسام: Noul ہاں/نہیں کے امکان کے لیے، Choice زمرہ جاتی انتخاب کے لیے، اور Score مرتب شدہ سطحوں کے لیے۔
- ایک ٹوکن inference: ہر سوال کا جائزہ تیار کردہ chain of thought کے بغیر جواب کے لیبل کے log probabilities سے لیا جاتا ہے۔
- مشترکہ prefix کیشنگ: سوال کی شاخوں کو بیک وقت چلانے سے پہلے ایک مشترکہ prompt prefix کو گرم کیا جاتا ہے۔
- 64 سوالات تک: Choice اور Score سوالات پہلے سے طے شدہ طور پر 2 سے 64 جوابات تک سپورٹ کرتے ہیں۔
- ساخت یافتہ state: state اور instructions strings، JSON objects، یا arrays ہو سکتے ہیں۔
- آپریشنل endpoints: health، liveness، model catalogue، limits، OpenAPI schema، Swagger UI، اور interactive Scalar reference شامل ہیں۔
- Modal تعیناتی: فراہم کردہ application autoscaling، مستقل model caches، startup recovery، اور scale-to-zero رویے کو سپورٹ کرتی ہے۔
- قابلِ تشکیل تحفظ: request limits، concurrency controls، timeouts، اور اختیاری Bearer authentication دستیاب ہیں۔
ضروریات
uv انسٹال کریں اور اگر آپ فراہم کردہ cloud deployment استعمال کرنا چاہتے ہیں تو Modal account حاصل کریں۔ پہلی build ایک بڑی SGLang image درآمد کرتی ہے، جبکہ پہلی GPU شروعات model weights ڈاؤن لوڈ کرتی ہے اور kernels کو compile یا capture کرتی ہے۔
CUDA dependencies SGLang container میں رہتی ہیں۔ اپنے workstation پر uv sync چلانے سے صرف API، deployment utilities، اور tests انسٹال ہوتے ہیں۔
پروجیکٹ انسٹال کریں
repository clone کریں، اس کی directory میں داخل ہوں، اور Python environment کو synchronize کریں:
uv sync
اگر موجودہ machine پر Modal کی authentication نہیں ہوئی تو اس کی setup مکمل کریں:
uv run modal setup
عارضی Modal deployment چلائیں
end-to-end test کے لیے عارضی server شروع کریں، شامل شدہ inference checks چلائیں، اور اس کے بعد server بند کر دیں:
uv run modal run modal_app.py
یہ command smoke-test report کو smoke-result.json کے طور پر محفوظ کرتی ہے۔ report میں startup wait time، inference latency، اور دستیاب cache-usage information شامل ہوتی ہے۔
مستحکم endpoint deploy کریں
application کو persistent Modal service کے طور پر deploy کریں:
uv run modal deploy modal_app.py
deployment ایک ایسی URL دکھاتی ہے جو https://YOUR-SERVER.us-west.modal.direct سے ملتی جلتی ہے۔ آسان رسائی کے لیے اسے environment variable میں محفوظ کریں:
export OPENJEV_URL="https://YOUR-SERVER.us-west.modal.direct"
پہلے سے طے شدہ Modal endpoint جان بوجھ کر غیر مصدقہ ہے۔ یہ US West routing region استعمال کرتا ہے اور configured US regions میں compute schedule کر سکتا ہے۔ کوئی explicit container cap نہیں ہے، اور instances پانچ idle minutes کے بعد scale to zero ہو جاتے ہیں۔
جو server scale to zero ہو چکا ہو، اس کے شروع ہونے کے دوران HTTP 503 واپس کرتا ہے۔ شامل شدہ smoke command ان startup responses کو خودکار طور پر دوبارہ آزمانے کی کوشش کرتی ہے۔
deployed URL کے خلاف smoke test چلائیں:
uv run openjev smoke "$OPENJEV_URL"
smoke test تینوں answer types کو آزماتا ہے، 64-answer question چیک کرتا ہے، بنیادی semantic checks انجام دیتا ہے، اور تصدیق کرتا ہے کہ 65 answers مسترد کیے جاتے ہیں۔
اپنی پہلی evaluation جمع کریں
بنیادی route POST /v1/systemone ہے۔ درج ذیل request ایک customer message کو Noul، Choice، اور Score سوالات کے ذریعے classify کرتی ہے:
curl "$OPENJEV_URL/v1/systemone" \
-H 'Content-Type: application/json' \
-d '{
"model": "jev-latest",
"state": [
{"role": "system", "content": "آپ ایک support assistant ہیں۔"},
{"role": "user", "content": "مجھ سے دو بار رقم لی گئی ہے۔ براہِ کرم اضافی رقم واپس کریں۔"}
],
"questions": {
"refund": {
"type": "noul",
"instructions": "کیا صارف رقم کی واپسی کی درخواست کر رہا ہے؟"
},
"department": {
"type": "choice",
"instructions": "اسے کون سا department سنبھالے؟",
"criteria": {
"billing": "Payments and refunds",
"technical": "Software bugs"
}
},
"urgency": {
"type": "score",
"instructions": "یہ درخواست کتنی فوری ہے؟",
"criteria": ["Routine", "Urgent", "Emergency"]
}
}
}'
آپ JSON کو file میں بھی رکھ سکتے ہیں اور shell quoting کے بغیر جمع کرا سکتے ہیں:
curl "$OPENJEV_URL/v1/systemone" \
-H 'Content-Type: application/json' \
--data-binary @examples/request.json
سوال کی اقسام کو سمجھنا
- Noul:
yesکا normalized probability واپس کرتا ہے۔ - Choice: سب سے زیادہ امکان رکھنے والا option اور مکمل probability distribution واپس کرتا ہے۔ اصل option names response میں محفوظ رہتے ہیں۔
- Score: zero-based متوقع level واپس کرتا ہے، جو ہر level index اور اس کے probability سے calculate کیا جاتا ہے، اور اس کے ساتھ legend بھی شامل ہوتا ہے۔
انتخاب کے اختیارات ماڈل کے سامنے وضاحتوں کے بعد حروفی لیبلز کی صورت میں پیش کیے جاتے ہیں۔ جواب کی کلیدیں عموماً ماڈل سے پوشیدہ رہتی ہیں۔ اگر کسی اختیار کی وضاحت null ہو تو اس کے بجائے اس کی کلید ہی معنی فراہم کرتی ہے۔
حالت اور ہدایات فراہم کرنا
state اور instructions دونوں strings، JSON objects یا arrays قبول کرتے ہیں۔ چیٹ پیغامات کی فہرست، یا بالکل {"messages": [...]} پر مشتمل object، ماڈل کے native chat template کے ساتھ render کیا جاتا ہے۔
اصل پیغام کے roles اور objects برقرار رہتے ہیں، اور ہر classification سوال کو ایک اور user turn کے طور پر شامل کیا جاتا ہے۔ دیگر structured values کو ایک user message میں intact serialize کیا جاتا ہے۔ messages کے ساتھ دیگر fields رکھنے والا object بھی برقرار رکھا جاتا ہے تاکہ metadata خاموشی سے ضائع نہ ہو۔
چیٹ state صرف متنی content کو support کرتی ہے۔ Image، audio اور video content supported نہیں ہیں۔
سروس کے endpoints کا جائزہ
POST /v1/systemone، Noul، Choice اور Score evaluation انجام دیتا ہے۔GET /v1/models، TypeSafe اور OpenAI-style fields کے ساتھ model catalogue واپس کرتا ہے۔GET /v1/limits، admission limits کی رپورٹ دیتا ہے۔GET /health، readiness، SGLang health اور startup duration کی رپورٹ دیتا ہے۔GET /health/live، جانچتا ہے کہ آیا API process فعال ہے۔GET /، editable request example کے ساتھ Scalar API reference کھولتا ہے۔GET /docs، built-in Swagger UI کھولتا ہے۔GET /openapi.json، generated OpenAPI schema واپس کرتا ہے۔
درخواست میں model name jev-latest ایک compatibility alias ہے۔ default public model ID Qwen/Qwen3.6-35B-A3B ہے، جبکہ NVIDIA کا repository اندرونی طور پر weights source کے طور پر استعمال ہوتا ہے۔
Inference کیسے کام کرتی ہے
- API schema، answer count، body size، context length اور aggregate token budget کی توثیق کرتی ہے۔
- یہ thinking disabled کے ساتھ native chat template کو ایک بار render کرتی ہے، پھر shared prefix کو independently tokenized question suffixes سے الگ کرتی ہے۔
- یہ common prefix کو
max_new_tokens=1کے ساتھ SGLang کو بھیجتی ہے۔ sampled token ضائع کر دیا جاتا ہے، جس سے prefix کو opportunistic radix-cache reuse کے لیے دستیاب رکھا جاتا ہے۔ - یہ ہر سوال کے لیے ایک branch بیک وقت submit کرتی ہے۔ ہر branch میں prefix، question suffix، assistant header اور
Answer:marker شامل ہوتے ہیں۔ - یہ صرف valid answer labels کے لیے log probabilities طلب کرتی ہے اور stable softmax کے ذریعے انہیں دوبارہ normalize کرتی ہے۔
N سوالات کے لیے server ایک token والی N + 1 calls کرتا ہے: ایک cache-warming call اور ہر سوال کے لیے ایک call۔ generated token کو نظرانداز کیا جاتا ہے، اس لیے نہ autoregressive continuation ہوتی ہے اور نہ generated chain of thought۔ Speculative decoding فعال نہیں ہے۔
Labels A سے Z تک ہوتے ہیں، پھر verified single-token combinations جیسے AA اور AB استعمال کیے جاتے ہیں۔ تمام 64 labels کو startup کے دوران active tokenizer کے ساتھ چیک کیا جاتا ہے۔ اس طرح 10 یا 64 جیسے multi-token numeric labels استعمال کرنے سے بچا جاتا ہے۔
Usage اور cache metrics کو سمجھنا
response header x-openjev-prefix-tokens مطلوبہ common-prefix size کی اطلاع دیتا ہے۔ جب SGLang cache counts فراہم کرے تو x-openjev-cached-tokens میں branch cache hits کا مجموعہ ہوتا ہے۔
SGLang 0.5.19 کا Rust frontend یہ cache counts ظاہر نہیں کرتا۔ اس configuration میں header موجود نہیں ہوتا اور smoke report میں صفر کے بجائے null درج ہوتا ہے۔ Scheduler logs اب بھی حقیقی cache hits دکھا سکتے ہیں۔ Server-Timing header prompt preparation، shared prefill اور branch inference کو الگ الگ دکھاتا ہے۔
usage.input_tokens warm-up اور branch calls میں رپورٹ کیے گئے مکمل prompt counts کا مجموعہ ہے، جس میں cached tokens بھی شامل ہیں۔ usage.output_tokens N + 1 ہے۔ یہ اعداد backend activity بیان کرتے ہیں، نہ کہ unique computed tokens یا TypeSafe billing estimates۔
Limits اور authentication کو configure کرنا
Default admission limits میں 64 سوالات، ہر Choice یا Score سوال کے لیے 2 سے 64 جوابات، 2 MiB کا JSON body، output سمیت ہر branch کے لیے 32,768 tokens، کل submitted input tokens کے لیے 262,144، 16 concurrent evaluations اور 64 concurrent backend calls شامل ہیں۔
Invalid requests inference سے پہلے HTTP 422 واپس کرتی ہیں۔ size limit سے بڑی bodies 413 واپس کرتی ہیں، overload Retry-After کے ساتھ 529 واپس کرتا ہے، اور backend timeouts 504 واپس کرتے ہیں۔ Failed یا cancelled evaluations sibling branches کو cancel کرتی ہیں اور SGLang میں انہیں abort کرنے کی کوشش کرتی ہیں۔
Configuration OPENJEV_* environment variables کے ذریعے دستیاب ہے۔ عام settings میں شامل ہیں:
OPENJEV_MODEL: defaultnvidia/Qwen3.6-35B-A3B-NVFP4ہے۔OPENJEV_SERVED_MODEL_NAME: public model ID کو override کرتا ہے اور SGLang کو بھیجا جاتا ہے۔OPENJEV_REVISION: pinned checkpoint revision منتخب کرتا ہے۔OPENJEV_FRONTEND: defaultrustہے؛pythonواضح fallback ہے۔OPENJEV_MAX_INPUT_TOKENS: default32768ہے۔OPENJEV_MAX_TOTAL_INPUT_TOKENS: default262144ہے۔OPENJEV_MAX_CONCURRENT_REQUESTS: default16ہے۔OPENJEV_MAX_CONCURRENT_BRANCHES: default64ہے۔OPENJEV_REQUEST_TIMEOUT: default120seconds ہے۔OPENJEV_TEMPERATURE: default1.0ہے اور label normalization کو متاثر کرتا ہے۔OPENJEV_API_KEY: public API کے لیے optional Bearer authentication فعال کرتا ہے۔OPENJEV_BACKEND_API_KEY: SGLang کے لیے الگ optional Bearer key configure کرتا ہے۔
Modal لانچر مقامی ماحول سے خودکار طور پر OPENJEV_PROFILE، OPENJEV_FRONTEND، اور OPENJEV_SERVED_MODEL_NAME آگے منتقل کرتا ہے۔ دیگر ریموٹ ترتیبات image.env(...) میں شامل کریں، یا اسناد کے لیے Modal Secret استعمال کریں۔
موجودہ SGLang بیک اینڈ کے ساتھ مقامی طور پر چلائیں
پہلے سے چل رہے بیک اینڈ کو استعمال کرنے کے لیے API کو اس کے مقامی URL کی طرف متوجہ کریں:
uv run openjev serve --connect http://127.0.0.1:30000
بیک اینڈ میں مطابقت رکھنے والا ماڈل اور ٹوکنائزر ریویژن استعمال ہونا چاہیے۔ اسے منتخب ٹوکن لاگ احتمالات، ریڈکس کیشنگ، اور کافی سیاقی لمبائی کی بھی معاونت کرنا ہوگی۔
ایسے B200 میزبان یا کنٹینر پر جہاں SGLang 0.5.19 الگ Python ماحول میں نصب ہو، اس کا انٹرپریٹر واضح طور پر فراہم کریں:
uv run openjev serve --sglang-python /path/to/sglang/bin/python
ترقی اور توثیق
آف لائن ٹیسٹ، ٹوکنائزر انٹیگریشن چیکس، linting، اور schema generation چلانے کے لیے شامل کمانڈز استعمال کریں:
uv run pytest
uv run pytest -m integration
uv run ruff check .
uv run openjev schema
عام ٹیسٹ آف لائن یونٹ اور API رویے کا احاطہ کرتے ہیں۔ انٹیگریشن ٹیسٹ حقیقی ٹوکنائزر اور ایک چھوٹا Hugging Face ڈاؤن لوڈ استعمال کرتے ہیں، لیکن GPU درکار نہیں ہوتا۔ Schema generation کے لیے بھی GPU یا ماڈل ڈاؤن لوڈ درکار نہیں ہوتا۔
اعلیٰ درجے کی تعیناتی کی تجاویز
GPU کنٹینر کو گرم رکھیں
Modal پانچ منٹ کی غیر فعالی کے بعد سروس کو صفر تک اسکیل کر دیتا ہے۔ جب مسلسل کم startup latency، غیر فعال GPU استعمال سے بچنے کی نسبت زیادہ اہم ہو، تو modal_app.py میں min_containers=1 مقرر کریں۔
پہلے آغاز کی initialization کو مدنظر رکھیں
پہلا GPU آغاز weights ڈاؤن لوڈ کرتا ہے اور kernels کو compile یا capture کرتا ہے۔ ماڈل weights، SGLang tuning data، اور Triton compilation data openjev-huggingface Modal Volume میں برقرار رہتے ہیں۔ بعد کے آغاز میں یہی فائلیں دوبارہ استعمال ہوتی ہیں، اگرچہ CUDA graph capture اب بھی startup کے وقت ہوتا ہے۔
کیش کے دوبارہ استعمال کو موقع پر مبنی سمجھیں
Radix reuse ہر درخواست کے لیے مقفل KV session نہیں ہے۔ ہائبرڈ Qwen ماڈل کی recurrent state، cache-page boundaries، cache pressure، اور بیک وقت ٹریفک hit rate کم کر سکتی ہے۔ بیک اینڈ --mamba-radix-cache-strategy extra_buffer استعمال کرتا ہے۔
اعتماد کی محتاط تشریح کریں
OpenJev اعتماد کو 1 - H(probabilities) / log(number_of_options) کے طور پر متعین کرتا ہے، جسے صفر اور ایک کے درمیان محدود کیا جاتا ہے۔ یکساں احتمالات سے اعتماد صفر پیدا ہوتا ہے، جبکہ point mass سے ایک۔
یہ احتمالات فراہم کردہ اختیارات سے مشروط ہوتے ہیں اور prompt کی عبارت اور labels کی ترتیب پر منحصر ہو سکتے ہیں۔ یہ درستگی کے calibrated تخمینے نہیں ہیں۔
بیک اینڈ کی ناکامی کے لیے منصوبہ بنائیں
اگر SGLang غیر متوقع طور پر بند ہو جائے تو API بھی بند ہو جاتی ہے۔ Modal launcher پھر کنٹینر ختم کر دیتا ہے تاکہ Modal اسے تبدیل کر سکے، بجائے اس کے کہ کسی مردہ inference backend سے منسلک عوامی HTTP process باقی رہ جائے۔ معمول کی بندش دونوں watchers کو صاف طور پر غیر فعال کر دیتی ہے۔
نتیجہ
openjev-sglang، Qwen3.6 پر Jev سے مطابقت رکھنے والی classification چلانے کا ایک مرکوز طریقہ فراہم کرتا ہے، جس میں one-token probability readout مؤثر ہے۔ اس کی Modal configuration قابلِ توسیع B200 deployment پیش کرتی ہے، جبکہ اس کی مقامی کمانڈز ٹیسٹنگ اور موجودہ SGLang سروس سے کنکشن کی معاونت کرتی ہیں۔ smoke test سے آغاز کریں، اپنی limits اور authentication settings کی توثیق کریں، اور ٹریفک بڑھنے کے ساتھ timing اور cache headers کی نگرانی کریں۔
