اجرای استنتاج با استفاده از مدل Gemma در Cloud Run با پردازنده گرافیکی RTX 6000 Pro

۱. مقدمه

نمای کلی

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

  • نحوه استقرار مدل Gemma روی پردازنده گرافیکی Cloud Run RTX 6000 Pro
  • نحوه دانلود همزمان یک مدل از فضای ذخیره‌سازی ابری در هنگام راه‌اندازی کانتینر

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

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

export PROJECT_ID=<YOUR_PROJECT_ID>

export REGION=europe-west4
export SERVICE_NAME=gemma-rtx-codelab

# set the project
gcloud config set project $PROJECT_ID

فعال کردن API های مورد نیاز برای این Codelab

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

یک پوشه برای codelab ایجاد کنید

mkdir codelab-rtx
cd codelab-rtx

برای بهینه‌سازی بارگذاری مدل یادگیری ماشین از فضای ذخیره‌سازی ابری، دسترسی خصوصی گوگل را به زیرشبکه خود فعال کنید. می‌توانید در بخش مستندات بهترین شیوه‌های GPU در مورد بارگذاری مدل‌ها از فضای ذخیره‌سازی ابری، اطلاعات بیشتری کسب کنید.

gcloud compute networks subnets update default \
  --region=europe-west4 \
  --enable-private-ip-google-access

۳. راه‌اندازی فضای ذخیره‌سازی ابری

ابتدا، یک فضای ذخیره‌سازی ابری برای ذخیره وزن‌های مدل ایجاد کنید.

یک سطل منحصر به فرد ایجاد کنید

# Generate a unique bucket name
export MODEL_BUCKET="${PROJECT_ID}-rtx-codelab-$(python3 -c 'import uuid; print(str(uuid.uuid4())[:8])')"
echo "Bucket name: $MODEL_BUCKET"

# Create the regional bucket
gcloud storage buckets create gs://$MODEL_BUCKET \
    --location=$REGION \
    --uniform-bucket-level-access

۴. بازیابی وزن‌های مدل

در مرحله بعد، مدل Gemma 3 را در یک دایرکتوری محلی دانلود کرده و سپس آن را در فضای ذخیره‌سازی ابری خود آپلود کنید.

نصب اولاما

برای نصب Ollama می‌توانید این دستور را اجرا کنید:

curl -fsSL https://ollama.com/install.sh | sh

دانلود مدل

یک دایرکتوری برای مدل دانلود شده ایجاد کنید.

mkdir model-weights

برای این فرآیند از دو تب ترمینال استفاده خواهید کرد: یکی برای اجرای سرور Ollama و دیگری برای بازیابی مدل.

ترمینال ۱ (سرور):

سرور را با ارسال محل مدل دانلود شده شروع کنید. این دستور به اجرا ادامه خواهد داد.

OLLAMA_MODELS=$(pwd)/model-weights ollama serve

ترمینال ۲ (کلاینت): یک تب ترمینال جدید باز کنید و مدل را دانلود کنید. کلاینت به طور خودکار با سرور در حال اجرا ارتباط برقرار می‌کند.

# note if you wish to use a larger model, you can change this to gemma3:27b
ollama pull gemma3:1b

بازگشت به ترمینال ۱: پس از اتمام دانلود در ترمینال ۲، به ترمینال ۱ برگردید و Ctrl+C را فشار دهید تا سرور متوقف شود.

آپلود در فضای ذخیره‌سازی ابری

حالا وزن‌ها را روی سطل خود آپلود کنید. gcloud storage به طور خودکار آپلودهای موازی را برای سرعت بیشتر مدیریت می‌کند.

gcloud storage cp -r ./model-weights/* gs://$MODEL_BUCKET/

(اختیاری) پاکسازی وزن‌های محلی

از آنجایی که مدل اکنون در فضای ذخیره‌سازی ابری قرار دارد، نسخه محلی را حذف کنید.

rm -rf model-weights

۵. سرویس را ایجاد کنید

ابتدا یک پوشه برای سرویس ایجاد کنید.

mkdir rtx-service
cd rtx-service

یک Dockerfile با محتوای زیر ایجاد کنید

FROM ollama/ollama:latest

# Install Google Cloud CLI
RUN apt-get update && apt-get install -y curl gnupg && \
    echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - && \
    apt-get update && apt-get install -y google-cloud-cli && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

# Listen on all interfaces, port 11434
ENV OLLAMA_HOST 0.0.0.0:11434

# Store model weight files in /models
ENV OLLAMA_MODELS /models

# Reduce logging verbosity
ENV OLLAMA_DEBUG false

# Never unload model weights from the GPU
ENV OLLAMA_KEEP_ALIVE -1

# Copy and set up the startup script
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# Start using the entrypoint script
ENTRYPOINT ["/entrypoint.sh"]

فایلی به نام entrypoint.sh با محتوای زیر ایجاد کنید:

#!/bin/bash
set -e

# Ensure OLLAMA_MODELS directory exists
mkdir -p $OLLAMA_MODELS

# Download model weights from GCS if MODEL_BUCKET is set
if [ -n "$MODEL_BUCKET" ]; then
  echo "Downloading model weights from gs://$MODEL_BUCKET..."
  # gcloud storage handles concurrent downloads automatically
  gcloud storage cp -r "gs://$MODEL_BUCKET/*" "$OLLAMA_MODELS/"
else
  echo "MODEL_BUCKET not set. Skipping download."
fi

# Start Ollama
exec ollama serve

۶. استقرار در Cloud Run

در این بخش، شما سرویس را با استفاده از gcloud run deploy مستقر خواهید کرد. این دستور کانتینر شما را از منبع می‌سازد و آن را به همراه GPU و پیکربندی‌های شبکه لازم، در Cloud Run مستقر می‌کند.

ایجاد حساب کاربری سرویس

یک حساب کاربری سرویس اختصاصی برای این برنامه ایجاد کنید و فقط مجوزهای لازم را به آن اعطا کنید.

# Create a dedicated service account
gcloud iam service-accounts create rtx-codelab-identity \
    --display-name="RTX Codelab Identity"

# Grant permission to read from the model bucket
gcloud storage buckets add-iam-policy-binding gs://$MODEL_BUCKET \
    --member="serviceAccount:rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/storage.objectViewer"

# Grant access to the Compute Engine network for the Cloud Run service identity
gcloud projects add-iam-policy-binding $PROJECT_ID \
     --member="serviceAccount:rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com" \
     --role="roles/compute.networkUser"

# Grant access to the Compute Engine network for the default service account
gcloud projects add-iam-policy-binding $PROJECT_ID \
 --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')@serverless-robot-prod.iam.gserviceaccount.com" \
 --role="roles/compute.networkUser"

پیکربندی شبکه

برای عملکرد بهینه هنگام دانلود مدل‌های بزرگ، از Direct VPC Egress استفاده کنید. این به کانتینر اجازه می‌دهد تا از طریق شبکه خصوصی گوگل و با دور زدن اینترنت عمومی و دروازه‌های NAT به فضای ذخیره‌سازی ابری دسترسی پیدا کند. پرچم‌های زیر در دستور gcloud run deploy استفاده می‌شوند:

  • --network : به VPC default متصل می‌شود (مطمئن شوید که این شبکه وجود دارد و یک زیرشبکه در منطقه شما با دسترسی خصوصی گوگل فعال دارد).
  • --subnet : زیرشبکه خاص در منطقه شما (معمولاً در صورت استفاده از شبکه پیش‌فرض، default ).
  • --vpc-egress : برای عبور اجباری تمام ترافیک خروجی از VPC، روی all-traffic تنظیم می‌شود.

فرماندهی استقرار

gcloud beta run deploy $SERVICE_NAME \
    --source . \
    --region $REGION \
    --project $PROJECT_ID \
    --no-allow-unauthenticated \
    --port 11434 \
    --service-account rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com \
    --cpu 20 --memory 80Gi \
    --gpu 1 \
    --gpu-type nvidia-rtx-pro-6000 \
    --set-env-vars MODEL_BUCKET=$MODEL_BUCKET \
    --network default \
    --subnet default \
    --vpc-egress all-traffic \
    --no-gpu-zonal-redundancy

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

پس از استقرار، می‌توانید با استفاده از رابط برنامه‌نویسی کاربردی Ollama با مدل Gemma 3 خود تعامل داشته باشید.

دریافت آدرس اینترنتی سرویس

آدرس اینترنتی سرویس Cloud Run مستقر شده خود را بازیابی کنید.

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region $REGION --format 'value(status.url)')
echo "Service URL: $SERVICE_URL"

اجرای استنتاج

با استفاده از curl یک اعلان به مدل ارسال کنید. می‌توانید "stream": false تنظیم کنید تا پاسخ کامل را در یک شیء JSON دریافت کنید و jq برای استخراج فقط متن استفاده کنید.

توجه: اگر از مدل بزرگتری استفاده می‌کنید، مثلاً gemma3:27b، باید نام مدل را در json زیر تغییر دهید.

curl -s "$SERVICE_URL/api/generate" \
  -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "gemma3:1b",
  "prompt": "Why is the sky blue?",
  "stream": false
}' | jq -r '.response'

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

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

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

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

  • نحوه استقرار مدل Gemma روی پردازنده گرافیکی Cloud Run RTX 6000 Pro
  • نحوه دانلود همزمان یک مدل از فضای ذخیره‌سازی ابری در هنگام راه‌اندازی کانتینر

۹. تمیز کردن

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

گزینه ۱: حذف منابع

سرویس Cloud Run را حذف کنید

gcloud run services delete $SERVICE_NAME \
      --region $REGION \
      --quiet

حساب سرویس را حذف کنید

gcloud iam service-accounts delete \
      rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com \
      --quiet

سطل ذخیره‌سازی ابری را حذف کنید

gcloud storage rm --recursive gs://$MODEL_BUCKET

تصویر کانتینر را حذف کنید

این بیلد یک تصویر کانتینر در رجیستری مصنوعات ایجاد کرد. می‌توانید نام تصویر را پیدا کرده و آن را حذف کنید.

تصاویر را فهرست کنید تا نام دقیق آنها را پیدا کنید (معمولاً gcr.io/PROJECT_ID/SERVICE_NAME)

gcloud container images list --filter="name:$SERVICE_NAME"

تصویر را حذف کنید (به جای IMAGE_NAME نتیجه‌ی بالا را قرار دهید)

gcloud container images delete <IMAGE_NAME> --force-delete-tags

گزینه ۲: حذف پروژه

برای حذف کل پروژه، به مدیریت منابع بروید، پروژه‌ای را که در مرحله ۲ ایجاد کرده‌اید انتخاب کنید و حذف را انتخاب کنید. اگر پروژه را حذف کنید، باید پروژه‌ها را در Cloud SDK خود تغییر دهید. می‌توانید با اجرای gcloud projects list لیست تمام پروژه‌های موجود را مشاهده کنید.