کلیدواژهٔ اصلی این مقاله kubectl patch است و در طول مقاله به توضیح بوتی و نحوهٔ استفاده از آن در مدیریت خوشه پرداخته می‌شود.

به گزارش از وبسایت redhat

برای سنجش واقعی ظرفیت یک LLM در محیط عملیاتی، باید عملکرد سرویس‌دهی آن را اندازه‌گیری کنید. هسته‌ٔ فناوری استنتاج با کارایی بالا در Red Hat AI بر پایهٔ پروژهٔ متن‌باز vLLM قرار دارد و تکنیک‌های بهینه‌سازی آن، کلید دستیابی به سرعت و توان عملیاتی در مقیاس است. در این راهنما یک روش گام‌به‌گام برای استقرار دستی و آزمایش قابلیت‌های استنتاج vLLM در Kubernetes (با تمرکز بر OpenShift) ارائه می‌شود. در این سناریو، ما نسخهٔ community یک سرور vLLM کانتینری را در OpenShift مستقر می‌کنیم، از GPUهای NVIDIA استفاده می‌کنیم و با بهره‌گیری از ابزار سنجش عملکرد GuideLLM معیارهای مورد نیاز برای اعتبارسنجی را جمع‌آوری می‌کنیم. 🚀

GuideLLM برای اجرای معیارهای عملکرد در برابر سرورهای استنتاج LLM طراحی شده است. این ابزار می‌تواند چندین کاربر همزمان را شبیه‌سازی کند و با ارسال درخواست‌های همزمان و با نرخ‌های مختلف، رفتار سرور تحت بار را بررسی نماید. با استفاده از آن می‌توان شاخص‌هایی مانند throughput درخواست‌ها، latency و tokens/sec را اندازه‌گیری کرد تا ارزیابی درستی از مناسب بودن سرور برای بارهای کاری تولیدی به دست آید. برای اطلاعات بیشتر دربارهٔ GuideLLM می‌توانید به منابع مستندات و ویدیوهای مرتبط مراجعه کنید. 🔍

پیش‌نیازها: قبل از شروع مطمئن شوید که موارد زیر مهیا هستند: یک خوشهٔ OpenShift یا Kubernetes (در این راهنما از OpenShift 4.17.15 استفاده شده است)، یک گره با GPUهای NVIDIA (مثلاً NVIDIA A100DIA)، اپراتوری که بین GPUها و زمان‌بندی OpenShift پل می‌زند (مدیریت درایورها و نمایش منبع GPU برای پادها)، و ابزار خط فرمان oc برای دسترسی به خوشه پیکربندی شده باشد. نکته برای کاربران Kubernetes: دستورات متن راهنما با oc نوشته شده‌اند، اما با جایگزینی oc با kubectl می‌توان همین مراحل را در Kubernetes اجرا کرد؛ معادل‌های ویژگی‌های خاص OpenShift مانند Routes در راهنما ذکر شده‌اند. 🔧

مرحله 1: استقرار vLLM در OpenShift/Kubernetes — نکتهٔ مهم: این راهنما برای سادگی، استقرار vLLM را نشان می‌دهد اما برای استقرار سازمانی Red Hat پیشنهاد می‌کند از Red Hat AI Inference Server استفاده کنید که نسخه‌ای سازمانی و پشتیبانی‌شده از vLLM ارائه می‌دهد. همچنین قابلیت‌های AI Inference Server را می‌توان با OpenShift AI در یک پلتفرم AI/MLOps گسترده‌تر ترکیب کرد. روش محک‌زنی که در مراحل بعدی توضیح داده می‌شود برای هر دو نوع استقرار قابل استفاده است. ✅

ابتدا باید یک پروژه و یک ServiceAccount برای استقرار سرور vLLM ایجاد کنیم:

oc new-project vllm-inference
oc create serviceaccount vllm-sa -n vllm-inference

2. یک PersistentVolumeClaim (PVC) برای ذخیرهٔ مدل‌ها ایجاد کنید. vLLM وزن‌های مدل را از Hugging Face دانلود می‌کند؛ بنابراین بهتر است مدل‌ها را روی یک PVC پایدار نگه دارید:

vllm-pvc.yaml:
apiVersion: v1
نوع: PersistentVolumeClaim
فراداده:
  نام: vllm-models-pvc
  فضای نام: vllm-inference
مشخصات:
  حالت های دسترسی:
    - ReadWriteOnce
  منابع:
    درخواست ها:
      فضای ذخیره سازی: 50Gi
  storageClassName:

توجه: storageClassName را با یک StorageClass موجود در کلاستر خود جایگزین کنید (با oc get sc یا kubectl get sc). اگر خروجی خالی است، ابتدا باید یک StorageClass ایجاد کنید. از آنجا که در مثال از ReadWriteOnce استفاده شده است، StorageClassهای محلی یا بلاک معمولاً مناسب‌اند. اگر نیاز به دسترسی همزمان از چند نود دارید، از ReadWriteMany و StorageClass سازگار با RWX استفاده کنید. مثال‌هایی از StorageClassها در محیط‌های مختلف وجود دارند (Local, OpenShift Data Foundation, cloud providers و غیره).

3. ایجاد یک Secret برای Hugging Face — بسیاری از مدل‌ها (از جمله Llama 3.1) نیاز به توکن Hugging Face دارند. یک Secret بسازید:

oc create secret generic huggingface-secret --from-literal=hf_token= -n vllm-inference

4. حالا مانیفست Deployment برای vLLM را تعریف و اجرا کنید؛ این مانیفست تصویر کانتینری vLLM را می‌کشد، PVC و Secret را متصل می‌کند و سرویس را راه‌اندازی می‌کند:

vllm-deployment.yaml:
apiVersion: apps/v1
نوع: استقرار
فراداده:
  نام: vllm-llama-8b
  فضای نام: vllm-inference
مشخصات:
  کپی: 1
  انتخابگر:
    matchLabels:
      برنامه: vllm-llama-8b
  الگو:
    فراداده:
      برچسب ها:
        برنامه: vllm-llama-8b
    مشخصات:
      ServiceAccountName: vllm-sa
      ظروف:
      - نام: vllm
        تصویر: vllm/vllm-openai:v0.11.2
        env:
        - نام: HF_TOKEN
          ارزش از:
            SecretKeyRef:
              نام: huggingface-secret
              کلید: hf_token
        - نام: HOME
          مقدار: /models
        - نام: HF_HOME
          مقدار: /models/.cache
        - نام: FLASHINFER_WORKSPACE_DIR
          مقدار: /models/.cache/flashinfer
        دستور: ["/bin/sh", "-c"]
        args:
        - "python3 -m vllm.entrypoints.openai.api_server --model meta-llama/Llama-3.1-8B-Instruct --download-dir /models --tensor-parallel-size 1 max-model-len 2048"
        پورت ها:
        - containerPort: 8000
        منابع:
          محدودیت ها:
            nvidia.com/gpu: 1
        ولوم مانت:
        - نام: dshm
          mountPath: /dev/shm
        - نام: model-storage
          mountPath: /models
      حجم ها:
      - نام: dshm
        emptyDir:
          medium: Memory
      - نام: model-storage
        persistentVolumeClaim:
          claimName: vllm-models-pvc

استقرار سرور vLLM:

oc apply -f vllm-deployment.yaml

5. یک Service برای دسترسی از داخل خوشه ایجاد کنید تا برنامه‌های دیگر (مثل GuideLLM) بتوانند به سرور متصل شوند:

oc expose deployment vllm-llama-8b --port=8000 --name=vllm-service

6. (اختیاری) ایجاد مسیر یا نوع دسترسی خارجی برای آزمایش بیرونی — می‌توانید از یکی از گزینه‌های زیر استفاده کنید: LoadBalancer (در صورت پشتیبانی خوشه)، NodePort (برای آزمایش محلی) یا Ingress با controller نصب‌شده. به‌عنوان مثال:

# تبدیل Service به LoadBalancer (در صورت نیاز)
kubectl patch svc vllm-service -p '{"spec":{"type":"LoadBalancer"}}'
# یا NodePort برای آزمایش
kubectl patch svc vllm-service -p '{"spec":{"type":"NodePort"}}'

نکتهٔ مهم برای محک‌زنی: وقتی معیارها را اجرا می‌کنیم، بهتر است از نقطهٔ پایانی داخلی سرویس (http://vllm-service.vllm-inference.svc.cluster.local:8000) استفاده شود تا از تأخیر شبکهٔ خارجی و سربار ورودی جلوگیری گردد؛ این کار اندازه‌گیری‌های واقعی‌تری از عملکرد سرور ارائه می‌دهد.

برای اطمینان از در دسترس بودن مدل می‌توانید یک درخواست ساده با curl ارسال کنید:

curl http://vllm-service.vllm-inference.svc.cluster.local:8000/v1/chat/completions 
  -H "Content-Type: application/json" 
  -d '{ "model": "meta-llama/Llama-3.1-8B-Instruct", "messages": [ {"role": "user", "content": "Red Hat چیست؟"} ], "temperature": 0.1 }'

مرحله 2: اجرای GuideLLM به‌عنوان یک Job در Kubernetes — در حالی که نمونهٔ vLLM در حال اجرا است، مراحل زیر را برای راه‌اندازی job مربوط به GuideLLM دنبال کنید.

1. یک PVC جداگانه برای ذخیرهٔ نتایج معیار ایجاد کنید؛ از آنجا که job موقتی است و پس از پایان حذف می‌شود، برای نگهداری گزارش JSON خروجی باید PVC داشته باشیم:

guidellm-pvc.yaml:
apiVersion: v1
نوع: PersistentVolumeClaim
فراداده:
  نام: guidellm-results-pvc
  فضای نام: vllm-inference
مشخصات:
  حالت های دسترسی:
    - ReadWriteOnce
  منابع:
    درخواست ها:
      فضای ذخیره سازی: 10Gi
  storageClassName:

مانیفست را اعمال کنید:

oc apply -f guidellm-pvc.yaml

2. حالا کار GuideLLM را تعریف و اجرا کنید. پیش از نشان دادن مانیفست، پرچم‌های مهم GuideLLM که استفاده می‌کنیم را توضیح می‌دهیم:

– –target: آدرس نقطهٔ پایانی سرور استنتاج که باید محک زده شود (در داخل خوشه از نام DNS سرویس استفاده می‌کنیم).
– –model: شناسهٔ مدل برای محک‌زنی؛ باید با مدل مستقر در سرور vLLM مطابقت داشته باشد.
– –tokenizer: توکنایزر برای محاسبهٔ تعداد توکن‌ها و تولید دادهٔ مصنوعی (معمولاً مشابه model id).
– –data: قالب درخواست معیار؛ در مثال از یک JSON استفاده می‌کنیم که دادهٔ مصنوعی با 1000 توکن prompt و 1000 توکن خروجی را مشخص می‌کند.
– –rate-type: حالت نرخ (مثلاً “concurrency” برای تعداد ثابت همزمان، “poisson” برای نرخ در ثانیه و غیره).
– –rate: برای حالت concurrency، تعداد درخواست‌های همزمان را مشخص می‌کند (مثلاً “1,2,4” یعنی سه اجرا با 1، 2 و 4 همزمان).
– –max-seconds: حداکثر زمان برای هر تکرار معیار (مثلاً 300 ثانیه).

یک مانیفست نمونه برای job:

guidellm-job.yaml:
apiVersion: batch/v1
نوع: شغل
فراداده:
  نام: guidellm-benchmark-job
  فضای نام: vllm-inference
مشخصات:
  الگو:
    مشخصات:
      ظروف:
      - نام: guidellm
        تصویر: ghcr.io/vllm-project/guidellm:v0.5.0
        env:
        - نام: HF_TOKEN
          ارزش از:
            SecretKeyRef:
              نام: huggingface-secret
              کلید: hf_token
        - نام: HOME
          مقدار: /results

این مانیفست کار معیار را تعریف می‌کند؛ پس از اجرای job، گزارش‌های JSON خروجی را در PVC ذخیره کنید و می‌توانید نتایج را برای بررسی دقیق‌تر بازیابی نمایید.

در پایان، با اجرای این مراحل می‌توانید یک سرور vLLM را روی OpenShift/Kubernetes مستقر کنید و با GuideLLM آن را تحت بار واقعی محک بزنید. اگر به کمک بیشتری در تنظیم StorageClassها، پیکربندی GPU یا سفارشی کردن تنظیمات GuideLLM نیاز داشتید، خوشحال می‌شوم راهنمایی بیشتری ارائه دهم. 🙂