نحوه اجرای استنتاج LLM بر روی پردازنده‌های گرافیکی Cloud Run با vLLM و OpenAI Python SDK

۱. مقدمه

نمای کلی

Cloud Run یک پلتفرم کانتینر در Google Cloud است که اجرای کد شما را در یک کانتینر، بدون نیاز به مدیریت یک کلاستر، ساده می‌کند. Cloud Run اخیراً پشتیبانی از GPU را نیز اضافه کرده است.

امروزه، پردازنده‌های گرافیکی که ما ارائه می‌دهیم، پردازنده‌های گرافیکی Nvidia L4 با ۲۴ گیگابایت حافظه مجازی هستند. به ازای هر نمونه Cloud Run یک پردازنده گرافیکی وجود دارد و مقیاس‌بندی خودکار Cloud Run همچنان اعمال می‌شود. این شامل مقیاس‌بندی تا ۵ نمونه (با امکان افزایش سهمیه) و همچنین کاهش مقیاس به صفر نمونه در صورت عدم درخواست می‌شود.

یکی از کاربردهای GPUها، اجرای مدل‌های زبان بزرگ (LLM) متن‌باز خودتان است. این آموزش شما را در پیاده‌سازی سرویسی که یک LLM را اجرا می‌کند، راهنمایی می‌کند.

این سرویس یک سرویس بک‌اند است که vLLM ، یک موتور استنتاج برای سیستم‌های تولیدی، را اجرا می‌کند. این آزمایشگاه کد از مدل Gemma 2 گوگل با ۲ میلیارد پارامتر و تنظیم‌شده توسط دستورالعمل استفاده می‌کند.

آنچه یاد خواهید گرفت

  • نحوه استفاده از پردازنده‌های گرافیکی (GPU) در Cloud Run
  • نحوه استفاده از Hugging Face برای بازیابی یک مدل.
  • چگونه مدل تنظیم‌شده با دستورالعمل Gemma 2 2b گوگل را با استفاده از vLLM به عنوان موتور استنتاج، روی Cloud Run مستقر کنیم.
  • نحوه فراخوانی سرویس backend برای تکمیل جمله.

۲. تنظیمات و الزامات

پیش‌نیازها

  • شما وارد کنسول ابری شده‌اید.
  • شما قبلاً یک سرویس Cloud Run را مستقر کرده‌اید. برای مثال، می‌توانید برای شروع ، راهنمای استقرار یک سرویس وب از کد منبع را دنبال کنید.
  • شما یک حساب کاربری در Hugging Face دارید و مجوز Gemma 2 2b را در https://huggingface.co/google/gemma-2-2b-it تأیید کرده‌اید؛ در غیر این صورت، نمی‌توانید مدل را دانلود کنید.
  • شما یک توکن دسترسی ایجاد کرده‌اید که به مدل google/gemma-2-2b-it دسترسی دارد.

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید d1264ca30785e435.png .

cb81e7c8e34bc8d.png

اگر این اولین باری است که Cloud Shell را اجرا می‌کنید، یک صفحه میانی برای توضیح آن به شما نمایش داده می‌شود. اگر با یک صفحه میانی مواجه شدید، روی ادامه کلیک کنید.

d95252b003979716.png

آماده‌سازی و اتصال به Cloud Shell فقط چند لحظه طول می‌کشد.

7833d5e1c5d18f54.png

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز است. این ماشین یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی افزایش می‌دهد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان با یک مرورگر انجام داد.

پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده‌اید و پروژه روی شناسه پروژه شما تنظیم شده است.

  1. برای تأیید احراز هویت، دستور زیر را در Cloud Shell اجرا کنید:
gcloud auth list

خروجی دستور

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد:
gcloud config list project

خروجی دستور

[core]
project = <PROJECT_ID>

اگر اینطور نیست، می‌توانید با این دستور آن را تنظیم کنید:

gcloud config set project <PROJECT_ID>

خروجی دستور

Updated property [core/project].

۳. فعال کردن APIها و تنظیم متغیرهای محیطی

فعال کردن APIها

قبل از اینکه بتوانید از این codelab استفاده کنید، باید چندین API را فعال کنید. این codelab به استفاده از APIهای زیر نیاز دارد. می‌توانید با اجرای دستور زیر این APIها را فعال کنید:

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    secretmanager.googleapis.com \
    artifactregistry.googleapis.com

متغیرهای محیطی را تنظیم کنید

شما می‌توانید متغیرهای محیطی که در سراسر این آزمایشگاه کد استفاده خواهند شد را تنظیم کنید.

HF_TOKEN=<YOUR_HUGGING_FACE_TOKEN>
PROJECT_ID=<YOUR_PROJECT_ID>

REGION=europe-west1
SERVICE_NAME=vllm-gemma-2-2b-it
AR_REPO_NAME=vllm-gemma-2-2b-it-repo
SERVICE_ACCOUNT=vllm-gemma-2-2b-it
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

۴. یک حساب کاربری سرویس ایجاد کنید

این حساب سرویس برای ساخت سرویس Cloud Run و دسترسی به یک راز از Secret Manager استفاده می‌شود.

ابتدا، با اجرای این دستور، حساب کاربری سرویس را ایجاد کنید:

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run vllm SA to access secret manager"

دوم، نقش Vertex AI User را به حساب سرویس اعطا کنید.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/secretmanager.secretAccessor

حالا، در Secret Manager یک راز به نام HF_TOKEN برای توکن دسترسی به چهره در آغوش گرفته خود ایجاد کنید. Cloud Build از حساب سرویس برای دسترسی به این راز در زمان ساخت استفاده می‌کند تا مدل Gemma 2 (2B) را از Hugging Face استخراج کند. می‌توانید اطلاعات بیشتر در مورد رازها و Cloud Build را اینجا کسب کنید.

printf $HF_TOKEN | gcloud secrets create HF_TOKEN --data-file=-

و هنگام ساخت ایمیج، به حساب کاربری پیش‌فرض سرویس محاسباتی، دسترسی به رمز HF_TOKEN در Secret Manager را اعطا کنید.

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

۵. تصویر را در رجیستری مصنوعات ایجاد کنید

ابتدا، یک مخزن در Artifact Registry ایجاد کنید.

gcloud artifacts repositories create $AR_REPO_NAME \
  --repository-format docker \
  --location $REGION

در مرحله بعد، یک Dockerfile ایجاد کنید که راز را از Secret Manager در خود جای دهد. می‌توانید اطلاعات بیشتر در مورد پرچم Docker buildx –secrets را اینجا بیابید.

FROM vllm/vllm-openai:v0.11.0

ENV HF_HOME=/model-cache
RUN --mount=type=secret,id=HF_TOKEN HF_TOKEN=$(cat /run/secrets/HF_TOKEN) \
    huggingface-cli download google/gemma-2-2b-it

ENV HF_HUB_OFFLINE=1

ENTRYPOINT python3 -m vllm.entrypoints.openai.api_server \
    --port ${PORT:-8000} \
    --model ${MODEL_NAME:-google/gemma-2-2b-it} \
    --gpu-memory-utilization 0.85 \
    --max-num-seqs 256 \
    --max-model-len 4096

حالا یک فایل cloudbuild.yaml ایجاد کنید

steps:
- name: 'gcr.io/cloud-builders/docker'
  id: build
  entrypoint: 'bash'
  secretEnv: ['HF_TOKEN']
  args: 
    - -c
    - |
        SECRET_TOKEN="$$HF_TOKEN" docker buildx build --tag=${_IMAGE} --secret id=HF_TOKEN .

availableSecrets:
  secretManager:
  - versionName: 'projects/${PROJECT_ID}/secrets/HF_TOKEN/versions/latest'
    env: 'HF_TOKEN'

images: ["${_IMAGE}"]

substitutions:  
  _IMAGE: '${_LOCATION}-docker.pkg.dev/${PROJECT_ID}/vllm-gemma-2-2b-it-repo/vllm-gemma-2-2b-it'

options:
  dynamicSubstitutions: true
  machineType: "E2_HIGHCPU_32"

در نهایت، یک طرح توجیهی ارائه دهید.

gcloud builds submit --config=cloudbuild.yaml --substitutions=_LOCATION=$REGION

ساخت آن تقریباً ۸ دقیقه طول می‌کشد.

۶. سرویس را مستقر کنید

اکنون آماده‌اید تا ایمیج را در Cloud Run مستقر کنید. استقرار حدود ۵ دقیقه طول خواهد کشید. برای اینکه ایمیج زمان بیشتری برای بارگذاری داشته باشد، باید تأخیر اولیه برای بررسی سلامت را چند دقیقه افزایش دهید. در غیر این صورت، هنگام بررسی سلامت، خطای «تجاوز از مهلت مقرر» را دریافت خواهید کرد.

gcloud beta run deploy $SERVICE_NAME \
--image=$REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO_NAME/$SERVICE_NAME \
--service-account $SERVICE_ACCOUNT_ADDRESS \
--cpu=8 \
--memory=32Gi \
--gpu=1 \
--port=8000 \
--gpu-type=nvidia-l4 \
--region $REGION \
--no-allow-unauthenticated \
--max-instances 3 \
--no-cpu-throttling \
--no-gpu-zonal-redundancy \
--startup-probe tcpSocket.port=8000,initialDelaySeconds=240,failureThreshold=1,timeoutSeconds=240,periodSeconds=240

۷. سرویس را آزمایش کنید

پس از استقرار، می‌توانید از سرویس پروکسی توسعه‌دهندگان Cloud Run استفاده کنید که به طور خودکار یک شناسه توکن برای شما اضافه می‌کند یا آدرس اینترنتی سرویس را مستقیماً curl کنید.

استفاده از سرویس پروکسی Cloud Run dev

برای استفاده از سرویس پروکسی Cloud Run dev، می‌توانید از این مراحل استفاده کنید:

ابتدا دستور زیر را اجرا کنید

gcloud run services proxy $SERVICE_NAME --region $REGION

بعد، سرویس را فر کنید

curl -X POST http://localhost:8080/v1/completions \
-H "Content-Type: application/json" \
-d '{
  "model": "google/gemma-2-2b-it",
  "prompt": "Cloud Run is a",
  "max_tokens": 128,
  "temperature": 0.90
}'

استفاده مستقیم از آدرس اینترنتی سرویس

ابتدا، URL مربوط به سرویس مستقر شده را بازیابی کنید.

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region $REGION --format 'value(status.url)')

سرویس را خم کنید

curl -X POST $SERVICE_URL/v1/completions \
-H "Authorization: bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json" \
-d '{
  "model": "google/gemma-2-2b-it",
  "prompt": "Cloud Run is a",
  "max_tokens": 128,
  "temperature": 0.90
}'

نتایج

شما باید نتایجی مشابه موارد زیر را ببینید:

{"id":"cmpl-e0e6924d4bfd4d918383c87cba5e25ac","object":"text_completion","created":1723853023,"model":"google/gemma-2-2b","choices":[{"index":0,"text":" serverless compute platform that lets you write your backend code in standard languages, such as Java, Go, PHP and Python.\n\nYou can deploy your function as a REST API that scales on demand and allows you to add additional security features such as HTTPS.\n\nTo write code for an Android app with Cloud Run, you need to use the GraalVM. This is because while Node.js is a more commonly known node-based platform, GraalVM is a virtual machine (VM) to run native code in the Cloud Run environment.\n\nNow you need graal.vm/java-11-jre.jar, the","logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":5,"total_tokens":133,"completion_tokens":128}}

۸. تبریک می‌گویم!

تبریک می‌گویم که آزمایشگاه کد را تمام کردید!

توصیه می‌کنیم مستندات Cloud Run را بررسی کنید

آنچه ما پوشش داده‌ایم

  • نحوه استفاده از پردازنده‌های گرافیکی (GPU) در Cloud Run
  • نحوه استفاده از Hugging Face برای بازیابی یک مدل.
  • چگونه مدل Gemma 2 (2B) گوگل را با استفاده از vLLM به عنوان موتور استنتاج، روی Cloud Run مستقر کنیم.
  • نحوه فراخوانی سرویس backend برای تکمیل جمله.

۹. تمیز کردن

برای جلوگیری از هزینه‌های ناخواسته، (برای مثال، اگر سرویس‌های Cloud Run سهواً بیشتر از تخصیص فراخوانی ماهانه Cloud Run شما در سطح رایگان فراخوانی شوند)، می‌توانید Cloud Run یا پروژه‌ای را که در مرحله 2 ایجاد کرده‌اید، حذف کنید.

برای حذف سرویس Cloud Run، به کنسول ابری Cloud Run در آدرس https://console.cloud.google.com/run بروید و سرویس vllm-gemma-2-2b را حذف کنید. همچنین ممکن است بخواهید حساب کاربری سرویس vllm-gemma-2-2b را حذف کنید.

اگر تصمیم به حذف کل پروژه دارید، می‌توانید به آدرس https://console.cloud.google.com/cloud-resource-manager بروید، پروژه‌ای را که در مرحله ۲ ایجاد کرده‌اید انتخاب کنید و گزینه Delete را انتخاب کنید. اگر پروژه را حذف کنید، باید پروژه‌ها را در Cloud SDK خود تغییر دهید. می‌توانید با اجرای gcloud projects list لیست تمام پروژه‌های موجود را مشاهده کنید.