Asosiy kontentga o‘tish
AI qo‘llanmalari

SGLang bilan OpenJev’ni joylashtirish va bir tokenli tasniflash uchun foydalanish

openjev-sglang’ni Modal’da joylashtirish, Noul, Choice va Score baholashlarini yuborish, xizmat holatini tekshirish, cheklovlar va autentifikatsiyani sozlash hamda API’ni mavjud SGLang backend’iga ulashni o‘rganing.

SGLang bilan OpenJev’ni joylashtirish va bir tokenli tasniflash

openjev-sglang nima?

openjev-sglang SGLang’da Qwen3.6-35B-A3B yordamida TypeSafe/Jev HTTP API’ni amalga oshiruvchi serverdir. U tasniflash savollarini uzun javoblar yaratish o‘rniga birinchi token ehtimollarini samarali o‘qishga aylantiradi.

Standart joylashtirish har bir NVIDIA B200 GPU uchun bittadan SGLang konteynerini ishga tushiradi. SGLang 0.5.19 Rust frontend’i, radix keshlashi va bo‘linadigan prefill CUDA grafiklarini taqdim etadi. Alohida Python jarayoni FastAPI, uvloop, Rust asosidagi Hugging Face tokenizer’i va localhost’dagi SGLang bilan asinxron ulanishlar havzasi yordamida ommaviy API’ni boshqaradi.

TypeSafe’ga hech qanday so‘rov yuborilmaydi. Ommaviy endpoint baholash API’ni taqdim etadi, SGLang generatsiyasi va ma’muriy yo‘llari esa localhost’da maxfiy qoladi.

Asosiy imkoniyatlar

  • Uch xil baholash turi: Noul — ha/yo‘q ehtimoli, Choice — kategorik tanlov va Score — tartiblangan darajalar uchun.
  • Bitta tokenli inferens: har bir savol generatsiya qilingan fikrlash zanjirisiz, javob yorliqlarining log ehtimollari asosida baholanadi.
  • Umumiy prefiksni keshlash: savol tarmoqlari bir vaqtda ishga tushishidan oldin umumiy prompt prefiksi qizdiriladi.
  • 64 tagacha savol: Choice va Score savollari standart bo‘yicha 2 dan 64 tagacha javobni qo‘llab-quvvatlaydi.
  • Tuzilmaviy holat: holat va ko‘rsatmalar satr, JSON obyekti yoki massiv bo‘lishi mumkin.
  • Operatsion endpointlar: health, liveness, model katalogi, cheklovlar, OpenAPI sxemasi, Swagger UI va interaktiv Scalar ma’lumotnomasi kiritilgan.
  • Modal orqali joylashtirish: taqdim etilgan dastur autoscaling, doimiy model keshlari, ishga tushirishni tiklash va scale-to-zero xatti-harakatlarini qo‘llab-quvvatlaydi.
  • Sozlanadigan himoya: so‘rov cheklovlari, bir vaqtdagi so‘rovlarni boshqarish, timeoutlar va ixtiyoriy Bearer autentifikatsiyasi mavjud.

Talablar

uv dasturini o‘rnating va taqdim etilgan bulutli joylashtirishdan foydalanmoqchi bo‘lsangiz, Modal hisobini oling. Birinchi build katta SGLang obrazini import qiladi, birinchi GPU ishga tushishida esa model og‘irliklari yuklab olinadi hamda kernel’lar kompilyatsiya qilinadi yoki yozib olinadi.

CUDA bog‘liqliklari SGLang konteynerida qoladi. Ishchi kompyuteringizda uv sync buyrug‘ini bajarish faqat API, joylashtirish utilitalari va testlarni o‘rnatadi.

Loyihani o‘rnatish

Repository’ni klonlang, uning katalogiga kiring va Python muhitini sinxronlang:

uv sync

Agar joriy kompyuterda Modal autentifikatsiyadan o‘tkazilmagan bo‘lsa, sozlamani yakunlang:

uv run modal setup

Vaqtinchalik Modal joylashtirishini ishga tushirish

To‘liq jarayonni sinash uchun vaqtinchalik serverni ishga tushiring, kiritilgan inferens tekshiruvlarini bajaring va undan keyin serverni o‘chiring:

uv run modal run modal_app.py

Bu buyruq smoke-test hisobotini smoke-result.json sifatida saqlaydi. Hisobot ishga tushishni kutish vaqti, inferens kechikishi va keshdan foydalanish haqidagi mavjud ma’lumotlarni o‘z ichiga oladi.

Barqaror endpointni joylashtirish

Ilovani doimiy Modal xizmati sifatida joylashtiring:

uv run modal deploy modal_app.py

Joylashtirish https://YOUR-SERVER.us-west.modal.direct ga o‘xshash URL’ni chiqaradi. Qulay foydalanish uchun uni muhit o‘zgaruvchisida saqlang:

export OPENJEV_URL="https://YOUR-SERVER.us-west.modal.direct"

Standart Modal endpoint ataylab autentifikatsiyasiz ishlaydi. U US West marshrutlash hududidan foydalanadi va sozlangan US hududlarida hisoblash resurslarini rejalashtirishi mumkin. Aniq konteyner cheklovi yo‘q, instansiyalar esa besh daqiqa davomida ishlatilmagach nolga miqyoslanadi.

Nolga miqyoslangan server ishga tushayotgan paytda HTTP 503 qaytaradi. Kiritilgan smoke buyrug‘i bunday ishga tushish javoblarini avtomatik ravishda qayta urinadi.

Joylashtirilgan URL orqali smoke-testni ishga tushiring:

uv run openjev smoke "$OPENJEV_URL"

Smoke-test uchala javob turini sinaydi, 64 ta javobli savolni tekshiradi, asosiy semantik tekshiruvlarni bajaradi va 65 ta javob rad etilishini tasdiqlaydi.

Birinchi baholashingizni yuborish

Asosiy yo‘l — POST /v1/systemone. Quyidagi so‘rov mijoz xabarini Noul, Choice va Score savollari yordamida tasniflaydi:

curl "$OPENJEV_URL/v1/systemone" \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "jev-latest",
    "state": [
      {"role": "system", "content": "You are a support assistant."},
      {"role": "user", "content": "I was charged twice. Please refund the duplicate."}
    ],
    "questions": {
      "refund": {
        "type": "noul",
        "instructions": "Does the user request a refund?"
      },
      "department": {
        "type": "choice",
        "instructions": "Which department should handle this?",
        "criteria": {
          "billing": "Payments and refunds",
          "technical": "Software bugs"
        }
      },
      "urgency": {
        "type": "score",
        "instructions": "How urgent is the request?",
        "criteria": ["Routine", "Urgent", "Emergency"]
      }
    }
  }'

Shuningdek, JSON’ni faylda saqlab, shell qo‘shtirnoqlaridan foydalanmasdan yuborishingiz mumkin:

curl "$OPENJEV_URL/v1/systemone" \
  -H 'Content-Type: application/json' \
  --data-binary @examples/request.json

Savol turlarini tushunish

  • Noul: yes qiymatining normallashtirilgan ehtimolini qaytaradi.
  • Choice: ehtimoli eng yuqori variantni va ehtimollarning to‘liq taqsimotini qaytaradi. Asl variant nomlari javobda saqlanadi.
  • Score: har bir daraja indeksi va uning ehtimolidan hisoblangan, noldan boshlanuvchi kutilgan darajani hamda izohni qaytaradi.

Tanlov variantlari modelga tavsiflardan keyin keladigan harf yorliqlari sifatida taqdim etiladi. Javob kalitlari odatda modeldan yashiriladi. Agar variant tavsifi null bo‘lsa, uning kaliti ma’noni anglatadi.

Holat va ko‘rsatmalarni taqdim etish

state va instructions satrlar, JSON obyektlari yoki massivlarni qabul qiladi. Chat xabarlari ro‘yxati yoki aynan {"messages": [...]} ni o‘z ichiga olgan obyekt modelning mahalliy chat shabloni yordamida ko‘rsatiladi.

Asl xabar rollari va obyektlari saqlanadi, har bir tasniflash savoli esa qo‘shimcha foydalanuvchi navbati sifatida qo‘shiladi. Boshqa tuzilmaviy qiymatlar foydalanuvchi xabariga o‘zgarmagan holda seriyalashtiriladi. messages va boshqa maydonlarni o‘z ichiga olgan obyekt ham metadata beixtiyor tushirib qoldirilmasligi uchun saqlanadi.

Chat holati faqat matnli kontentni qo‘llab-quvvatlaydi. Rasm, audio va video kontenti qo‘llab-quvvatlanmaydi.

Xizmat endpointlarini ko‘rib chiqish

  • POST /v1/systemone Noul, Choice va Score baholashlarini bajaradi.
  • GET /v1/models TypeSafe va OpenAI uslubidagi maydonlarga ega model katalogini qaytaradi.
  • GET /v1/limits qabul qilish cheklovlarini bildiradi.
  • GET /health tayyorlik holati, SGLang holati va ishga tushish davomiyligini bildiradi.
  • GET /health/live API jarayoni ishlayotganini tekshiradi.
  • GET / tahrirlanadigan so‘rov namunasi mavjud Scalar API ma’lumotnomasini ochadi.
  • GET /docs o‘rnatilgan Swagger UI oynasini ochadi.
  • GET /openapi.json yaratilgan OpenAPI sxemasini qaytaradi.

So‘rovdagi jev-latest model nomi moslik taxallusidir. Standart ommaviy model IDsi Qwen/Qwen3.6-35B-A3B, NVIDIA repozitoriyasi esa ichki ravishda og‘irliklar manbasi sifatida ishlatiladi.

Inferensiya qanday ishlaydi

  1. API sxemani, javoblar sonini, tana hajmini, kontekst uzunligini va umumiy token budjetini tekshiradi.
  2. U mahalliy chat shablonini fikrlash o‘chirilgan holda bir marta ko‘rsatadi, so‘ng umumiy prefiksni mustaqil tokenizatsiya qilingan savol suffikslaridan ajratadi.
  3. U umumiy prefiksni max_new_tokens=1 bilan SGLang’ga yuboradi. Namuna olingan token tashlab yuboriladi va prefiks keyinchalik radix-keshdan foydalanish uchun mavjud bo‘lib qoladi.
  4. U har bir savol uchun bittadan tarmoqni bir vaqtda yuboradi. Har bir tarmoq prefiks, savol suffiksi, assistant sarlavhasi va Answer: belgisidan iborat.
  5. U faqat yaroqli javob yorliqlari uchun log ehtimollarini so‘raydi va ularni barqaror softmax yordamida qayta normallashtiradi.

N ta savol uchun server bir tokenli N + 1 ta chaqiruvni amalga oshiradi: bittasi keshni qizdirish uchun va bittasi har bir savol uchun. Yaratilgan token e’tiborga olinmaydi, shuning uchun autoregressiv davom ettirish yoki yaratilgan fikrlash zanjiri mavjud emas. Spekulyativ dekodlash yoqilmagan.

Yorliqlar A dan Z gacha davom etadi, keyin AA va AB kabi tekshirilgan bir tokenli kombinatsiyalardan foydalaniladi. Barcha 64 ta yorliq ishga tushirish vaqtida faol tokenizer yordamida tekshiriladi. Bu 10 yoki 64 kabi ko‘p tokenli raqamli yorliqlardan foydalanishning oldini oladi.

Foydalanish va kesh ko‘rsatkichlarini tushunish

x-openjev-prefix-tokens javob sarlavhasi so‘ralgan umumiy prefiks hajmini bildiradi. SGLang kesh hisoblagichlarini taqdim etganda, x-openjev-cached-tokens tarmoq keshidagi mos kelishlar yig‘indisini o‘z ichiga oladi.

SGLang 0.5.19 ning Rust frontend qismi bu kesh hisoblagichlarini ochib bermaydi. Bunday konfiguratsiyada sarlavha mavjud bo‘lmaydi va smoke hisoboti nol emas, null qiymatini qayd etadi. Scheduler jurnallari haqiqiy kesh mosliklarini baribir ko‘rsatishi mumkin. Server-Timing sarlavhasi promptni tayyorlash, umumiy prefill va tarmoq inferensiyasini alohida ko‘rsatadi.

usage.input_tokens qizdirish va tarmoq chaqiruvlarida xabar qilingan to‘liq prompt hisoblagichlari yig‘indisidir, bunga keshdagi tokenlar ham kiradi. usage.output_tokens qiymati N + 1 ga teng. Bu ko‘rsatkichlar noyob hisoblangan tokenlar yoki TypeSafe billing hisob-kitoblarini emas, backend faoliyatini tavsiflaydi.

Cheklovlar va autentifikatsiyani sozlash

Standart qabul qilish cheklovlariga 64 ta savol, har bir Choice yoki Score savoli uchun 2 dan 64 tagacha javob, 2 MiB hajmdagi JSON tana, chiqish bilan birga har bir tarmoq uchun 32,768 token, jami yuboriladigan kirish uchun 262,144 token, bir vaqtda 16 ta baholash va backend’ga bir vaqtda 64 ta chaqiruv kiradi.

Yaroqsiz so‘rovlar inferensiyadan oldin HTTP 422 javobini qaytaradi. Hajm cheklovidan oshgan tanalar 413, ortiqcha yuklama Retry-After bilan 529, backend vaqt tugashi esa 504 javobini qaytaradi. Muvaffaqiyatsiz yoki bekor qilingan baholashlar qo‘shni tarmoqlarni bekor qiladi va ularni SGLang’da to‘xtatishga urinadi.

Konfiguratsiya OPENJEV_* muhit o‘zgaruvchilari orqali mavjud. Asosiy sozlamalar:

  • OPENJEV_MODEL: standart qiymati nvidia/Qwen3.6-35B-A3B-NVFP4.
  • OPENJEV_SERVED_MODEL_NAME: ommaviy model ID’sini o‘zgartiradi va SGLang’ga uzatiladi.
  • OPENJEV_REVISION: mahkamlangan checkpoint reviziyasini tanlaydi.
  • OPENJEV_FRONTEND: standart qiymati rust; python aniq ko‘rsatiladigan zaxira variantdir.
  • OPENJEV_MAX_INPUT_TOKENS: standart qiymati 32768.
  • OPENJEV_MAX_TOTAL_INPUT_TOKENS: standart qiymati 262144.
  • OPENJEV_MAX_CONCURRENT_REQUESTS: standart qiymati 16.
  • OPENJEV_MAX_CONCURRENT_BRANCHES: standart qiymati 64.
  • OPENJEV_REQUEST_TIMEOUT: standart qiymati 120 soniya.
  • OPENJEV_TEMPERATURE: standart qiymati 1.0 va yorliqlarni normallashtirishga ta’sir qiladi.
  • OPENJEV_API_KEY: ommaviy API uchun ixtiyoriy Bearer autentifikatsiyasini yoqadi.
  • OPENJEV_BACKEND_API_KEY: SGLang uchun alohida ixtiyoriy Bearer kalitini sozlaydi.

Modal ishga tushirgichi mahalliy muhitdan OPENJEV_PROFILE, OPENJEV_FRONTEND va OPENJEV_SERVED_MODEL_NAME o‘zgaruvchilarini avtomatik uzatadi. Boshqa masofaviy sozlamalarni image.env(...) ga qo‘shing yoki hisob ma’lumotlari uchun Modal Secret’dan foydalaning.

Mavjud SGLang backend bilan mahalliy ishga tushirish

Avvaldan ishga tushirilgan backend’dan foydalanish uchun API’ni uning mahalliy URL manziliga yo‘naltiring:

uv run openjev serve --connect http://127.0.0.1:30000

Backend mos model va tokenizer reviziyasidan foydalanishi kerak. Shuningdek, u tanlangan tokenlar uchun log ehtimolliklarini, radix keshlashni va yetarli kontekst uzunligini qo‘llab-quvvatlashi lozim.

SGLang 0.5.19 alohida Python muhitida o‘rnatilgan B200 xost yoki konteynerida uning interpretatorini aniq ko‘rsating:

uv run openjev serve --sglang-python /path/to/sglang/bin/python

Ishlab chiqish va tekshirish

Oflayn testlar, tokenizer integratsiyasi tekshiruvlari, linting va sxema yaratishni ishga tushirish uchun kiritilgan buyruqlardan foydalaning:

uv run pytest
uv run pytest -m integration
uv run ruff check .
uv run openjev schema

Oddiy testlar unit va API xatti-harakatlarini oflayn rejimda tekshiradi. Integratsiya testlari haqiqiy tokenizer va kichik Hugging Face yuklab olinishidan foydalanadi, ammo GPU talab qilmaydi. Sxema yaratish uchun ham GPU yoki modelni yuklab olish talab etilmaydi.

Kengaytirilgan joylashtirish bo‘yicha maslahatlar

GPU konteynerini issiq holatda saqlang

Modal besh daqiqa harakatsizlikdan so‘ng xizmatni nol nusxagacha kichraytiradi. Ishga tushish kechikishini doimiy ravishda past saqlash bekor turgan GPU sarfini kamaytirishdan muhimroq bo‘lsa, modal_app.py faylida min_containers=1 ni belgilang.

Birinchi ishga tushirishdagi boshlang‘ich sozlashni hisobga oling

Birinchi GPU ishga tushishida og‘irliklar yuklab olinadi va yadrolar kompilyatsiya qilinadi yoki yozib olinadi. Model og‘irliklari, SGLang sozlash ma’lumotlari va Triton kompilyatsiya ma’lumotlari openjev-huggingface Modal Volume’da saqlanadi. Keyingi ishga tushirishlar ushbu fayllardan qayta foydalanadi, biroq CUDA grafigini yozib olish ishga tushirish vaqtida baribir bajariladi.

Keshdan qayta foydalanishni imkoniyat sifatida ko‘ring

Radix’dan qayta foydalanish har bir so‘rovga biriktirilgan KV sessiyasi emas. Gibrid Qwen modelidagi takrorlanuvchi holat, kesh sahifalari chegaralari, kesh bosimi va bir vaqtdagi trafik kesh topilmalarini kamaytirishi mumkin. Backend --mamba-radix-cache-strategy extra_buffer dan foydalanadi.

Ishonchlilikni ehtiyotkorlik bilan talqin qiling

OpenJev ishonchlilikni 1 - H(probabilities) / log(number_of_options) sifatida belgilaydi va uni nol bilan bir oralig‘ida cheklaydi. Bir tekis taqsimlangan ehtimollar nol ishonchlilikni, bitta nuqtaga jamlangan ehtimol esa bir ishonchlilikni beradi.

Bu ehtimollar berilgan variantlarga shartlangan bo‘lib, so‘rov matni va yorliqlar tartibiga bog‘liq bo‘lishi mumkin. Ular to‘g‘rilikning kalibrlangan baholari emas.

Backend ishlamay qolishiga tayyor bo‘ling

Agar SGLang kutilmaganda to‘xtasa, API ham to‘xtaydi. Shundan so‘ng Modal ishga tushirgichi konteynerni tugatadi, natijada Modal uni almashtirishi mumkin va umumiy HTTP jarayoni ishlamaydigan inference backend’iga ulangan holda qolmaydi. Odatdagi o‘chirish jarayoni ikkala kuzatuvchini ham tartibli ravishda o‘chiradi.

Xulosa

openjev-sglang Qwen3.6’da Jev bilan mos tasniflashni bir tokenli ehtimollikni samarali o‘qish orqali ishga tushirishning maqsadga yo‘naltirilgan usulini taqdim etadi. Uning Modal konfiguratsiyasi kengaytiriladigan B200 joylashtirilishini, mahalliy buyruqlari esa testlash va mavjud SGLang xizmatiga ulanishni qo‘llab-quvvatlaydi. Smoke test’dan boshlang, limitlar va autentifikatsiya sozlamalarini tekshiring, trafik oshgani sari vaqt ko‘rsatkichlari hamda kesh sarlavhalarini kuzatib boring.