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

1. مقدمه

نمای کلی

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

امروزه، پردازنده‌های گرافیکی که ما در دسترس قرار می‌دهیم، پردازنده‌های گرافیکی Nvidia L4 با 24 گیگابایت VRAM هستند. هر نمونه Cloud Run یک GPU وجود دارد و مقیاس خودکار Cloud Run همچنان اعمال می‌شود. این شامل کاهش تا 5 نمونه (با افزایش سهمیه در دسترس)، و همچنین کاهش مقیاس به صفر در صورت عدم وجود درخواست است.

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

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

چیزی که یاد خواهید گرفت

  • نحوه استفاده از GPU در Cloud Run
  • نحوه استفاده از Hugging Face برای بازیابی مدل
  • نحوه استقرار مدل تنظیم شده دستورالعمل Gemma 2 2b Google در Cloud Run با استفاده از vLLM به عنوان موتور استنتاج.
  • نحوه فراخوانی سرویس Backend برای تکمیل جمله.

2. راه اندازی و الزامات

پیش نیازها

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

Cloud Shell را فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell کلیک کنید d1264ca30785e435.png .

cb81e7c8e34bc8d.png

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

d95252b003979716.png

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

7833d5e1c5d18f54.png

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه می‌کند و در Google Cloud اجرا می‌شود، که عملکرد و احراز هویت شبکه را بسیار افزایش می‌دهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.

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

  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].

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

API ها را فعال کنید

قبل از اینکه بتوانید از این کد لبه استفاده کنید، چندین API وجود دارد که باید آنها را فعال کنید. این آزمایشگاه کد نیاز به استفاده از 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=us-central1
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

4. یک حساب کاربری ایجاد کنید

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

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

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run vllm SA to access secrete 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 بدهید.

gcloud secrets add-iam-policy-binding HF_TOKEN \
    --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
    --role='roles/secretmanager.secretAccessor'

5. تصویر را در Artifact Registry ایجاد کنید

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

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

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

FROM vllm/vllm-openai:latest

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} \
    ${MAX_MODEL_LEN:+--max-model-len "$MAX_MODEL_LEN"}

حالا یک فایل 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: 'us-central1-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

ساخت می تواند تقریبا 8 دقیقه باشد.

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

اکنون آماده استقرار تصویر در Cloud Run هستید.

gcloud beta run deploy $SERVICE_NAME \
--image=us-central1-docker.pkg.dev/$PROJECT_ID/$AR_REPO_NAME/$SERVICE_NAME \
--service-account $SERVICE_ACCOUNT_ADDRESS \
--cpu=8 \
--memory=32Gi \
--gpu=1 --gpu-type=nvidia-l4 \
--region us-central1 \
--no-allow-unauthenticated \
--max-instances 5 \
--no-cpu-throttling

استقرار می تواند تا 5 دقیقه طول بکشد.

7. سرویس را تست کنید

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

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

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

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

gcloud run services proxy $SERVICE_NAME --region us-central1

بعد، سرویس را حلقه کنید

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 سرویس

ابتدا 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}}

8. تبریک می گویم!

برای تکمیل کد لبه تبریک می گویم!

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

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

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

9. پاکسازی کنید

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

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

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