اولین API مدل زبانی بزرگ (LLM) شما روی Kubernetes

اجرای یک LLM روی Kubernetes با اجرای یک اپلیکیشن وب استاندارد متفاوت است. شما فقط بر اساس تعداد درخواست‌ها مقیاس‌بندی (scale) نمی‌کنید؛ بلکه بر اساس ظرفیت GPU و وزن‌های مدل مقیاس‌بندی می‌کنید.

در این راهنما، شما یک مدل را روی یک نود (node) دارای GPU مستقر می‌کنید، آن را به عنوان یک API در دسترس قرار می‌دهید و با یک درخواست curl آن را فراخوانی می‌کنید.

ما از این ابزارها استفاده می‌کنیم:

  • مدل: Qwen/Qwen2.5-1.5B-Instruct
  • موتور: vLLM
  • زیرساخت: Kubernetes با پشتیبانی از NVIDIA GPU

مرحله ۱: ظرفیت GPU خود را بررسی کنید قبل از شروع، مطمئن شوید که Kubernetes سخت‌افزار شما را می‌بیند. این دستور را اجرا کنید: kubectl get nodes -o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu

اگر ستون GPU خالی است، متوقف شوید. ابتدا باید مشکل NVIDIA device plugin خود را برطرف کنید.

مرحله ۲: دسترسی به مدل خود را ایمن کنید حتی برای مدل‌های عمومی، از یک توکن Hugging Face استفاده کنید. این کار باعث می‌شود در آینده تعویض مدل به مدل‌های خصوصی آسان‌تر شود.

  • ایجاد یک namespace: kubectl create namespace llm-demo
  • ایجاد یک Secret برای توکن خود: kubectl create secret generic hf-token -n llm-demo --from-literal=HF_TOKEN="your_token_here"

مرحله ۳: سرور مدل را مستقر کنید ما از vLLM استفاده می‌کنیم زیرا کارهای سنگین را مدیریت می‌کند. این ابزار وظایف batching، tokenization و ارائه API سازگار با OpenAI را بر عهده دارد.

یک فایل deployment با این الزامات کلیدی ایجاد کنید:

  • درخواست ۱ عدد GPU: nvidia.com/gpu: 1
  • مونت کردن /dev/shm: سرورهای مدل برای جلوگیری از کرش کردن به حافظه مشترک (shared memory) نیاز دارند.
  • استفاده از Secrets: توکن HF_TOKEN خود را به کانتینر پاس دهید.

پیکربندی خود را اعمال کنید: kubectl apply -f qwen-vllm.yaml

مرحله ۴: API را تأیید کنید به وضعیت "Running" اعتماد نکنید. یک pod در حالی که هنوز در حال دانلود فایل‌های حجیم مدل است، می‌تواند در وضعیت "Running" باشد. لاگ‌های خود را زیر نظر بگیرید: kubectl logs -n llm-demo -f deployment/qwen-vllm

منتظر بمانید تا ببینید سرور در پورت 8000 در حال گوش دادن (listening) است.

آن را با port-forwarding تست کنید: kubectl port-forward -n llm-demo svc/qwen-vllm 8000:8000

درخواست curl خود را اجرا کنید:

curl http://127.0.0.1:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
  "model": "Qwen/Qwen2.5-1.5B-Instruct",
  "messages": [{"role": "user", "content": "Explain Kubernetes in two sentences."}],
  "max_tokens": 120
}'

هدف نهایی: شما از ظرفیت خام GPU به یک API عملی رسیده‌اید. شما ثابت کردید که:

  • Kubernetes وظایف GPU را زمان‌بندی (schedule) می‌کند.
  • کانتینر می‌تواند به سخت‌افزار دسترسی داشته باشد.
  • سرور مدل، وزن‌ها را در حافظه بارگذاری می‌کند.
  • API به درخواست‌های استاندارد پاسخ می‌دهد.

اگر این چرخه با شکست مواجه شود، مقیاس‌بندی و مسیریابی (routing) شما را نجات نخواهد داد. ابتدا زیربنا را اصلاح کنید.

منبع: https://dev.to/the-persistent-engineer/your-first-llm-api-on-kubernetes-from-model-to-curl-request-4l1j

انجمن یادگیری اختیاری: https://t.me/GyaanSetuAi