آزمایشگاه 3: نمونه اولیه برای تولید - عامل ADK خود را در Cloud Run با GPU مستقر کنید

1. مقدمه

نمای کلی

در این آزمایشگاه، یک عامل آماده تولید Agent Development Kit (ADK) با Gemma backend با شتاب GPU را مستقر خواهید کرد. تمرکز روی الگوهای استقرار حیاتی است: راه‌اندازی سرویس‌های Cloud Run مجهز به GPU، ادغام مدل‌های پشتیبان با عوامل ADK، و مشاهده رفتار مقیاس خودکار تحت بار.

کاری که خواهی کرد

در این آزمایشگاه، شما بر جنبه های حیاتی استقرار تولید تمرکز خواهید کرد:

  1. استقرار Gemma در Cloud Run با GPU - راه‌اندازی یک باطن مدل Gemma با کارایی بالا
  2. استقرار Gemma را با یک عامل ADK ادغام کنید - عامل خود را به مدل شتاب دهنده GPU متصل کنید
  3. تست با رابط وب ADK - اعتبارسنجی کنید که عامل مکالمه شما به درستی کار می کند
  4. آزمایش بار را انجام دهید - مشاهده کنید که چگونه هر دو نمونه Cloud Run تحت بارگذاری به صورت خودکار مقیاس می شوند

تاکید بر الگوهای استقرار تولید به جای توسعه گسترده عامل است.

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

  • برای استفاده در تولید، مدل‌های GPU شتاب‌دهنده را در Cloud Run اجرا کنید
  • استقرار مدل های خارجی را با عوامل ADK ادغام کنید
  • پیکربندی و آزمایش استقرار عامل هوش مصنوعی آماده تولید
  • رفتار مقیاس خودکار Cloud Run تحت بار را درک کنید
  • مشاهده کنید که چگونه چندین نمونه Cloud Run در هنگام افزایش ترافیک هماهنگ می شوند
  • برای تأیید عملکرد و مقیاس خودکار، آزمایش بار را اعمال کنید

2. راه اندازی پروژه

  1. اگر قبلاً یک حساب Google ندارید، باید یک حساب Google ایجاد کنید .
    • از حساب شخصی به جای حساب کاری یا مدرسه استفاده کنید. حساب‌های محل کار و مدرسه ممکن است محدودیت‌هایی داشته باشند که شما را از فعال کردن APIهای مورد نیاز برای این آزمایشگاه باز می‌دارد.
  2. به Google Cloud Console وارد شوید.
  3. صورتحساب را در کنسول Cloud فعال کنید .
    • تکمیل این آزمایشگاه باید کمتر از 1 دلار آمریکا در منابع Cloud هزینه داشته باشد.
    • برای جلوگیری از هزینه های بیشتر، می توانید مراحل انتهای این آزمایشگاه را برای حذف منابع دنبال کنید.
    • کاربران جدید واجد شرایط استفاده از نسخه آزمایشی رایگان 300 دلاری هستند.
  4. یک پروژه جدید ایجاد کنید یا استفاده مجدد از یک پروژه موجود را انتخاب کنید.

3. Cloud Shell Editor را باز کنید

  1. برای رفتن مستقیم به Cloud Shell Editor روی این پیوند کلیک کنید
  2. اگر امروز در هر نقطه‌ای از شما خواسته شد مجوز دهید، برای ادامه روی تأیید کلیک کنید. برای تأیید Cloud Shell کلیک کنید
  3. اگر ترمینال در پایین صفحه ظاهر نشد، آن را باز کنید:
    • روی View کلیک کنید
    • روی ترمینال کلیک کنید ترمینال جدید را در Cloud Shell Editor باز کنید
  4. در ترمینال، پروژه خود را با این دستور تنظیم کنید:
    • قالب:
      gcloud config set project [PROJECT_ID]
      
    • مثال:
      gcloud config set project lab-project-id-example
      
    • اگر نمی توانید شناسه پروژه خود را به خاطر بسپارید:
      • می توانید تمام شناسه های پروژه خود را با موارد زیر فهرست کنید:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      شناسه پروژه را در ترمینال Cloud Shell Editor تنظیم کنید
  5. شما باید این پیام را ببینید:
    Updated property [core/project].
    
    اگر یک WARNING مشاهده کردید و از Do you want to continue (Y/n)? ، پس احتمالاً شناسه پروژه را اشتباه وارد کرده اید. n را فشار دهید، Enter را فشار دهید و دوباره دستور gcloud config set project اجرا کنید.

4. API ها را فعال کنید و منطقه پیش فرض را تنظیم کنید

قبل از اینکه بتوانیم خدمات Cloud Run را با پشتیبانی GPU اجرا کنیم، باید APIهای Google Cloud مورد نیاز را فعال کرده و تنظیمات پروژه شما را پیکربندی کنیم.

  1. در ترمینال، API ها را فعال کنید:
gcloud services enable \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  aiplatform.googleapis.com

اگر از شما خواسته شد که مجوز دهید، برای ادامه روی تأیید کلیک کنید. برای تأیید Cloud Shell کلیک کنید

تکمیل این دستور ممکن است چند دقیقه طول بکشد، اما در نهایت باید یک پیام موفقیت آمیز مشابه این پیام تولید کند:

Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.
  1. منطقه Cloud Run پیش فرض خود را تنظیم کنید.
gcloud config set run/region europe-west1

5. پروژه پایتون خود را آماده کنید

بیایید کد شروعی را تنظیم کنیم که شامل ساختار اصلی برای هر دو سرویس Gemma Backend و Agent ADK ما باشد.

  1. کلون کردن مخزن استارت:
    cd ~
    git clone https://github.com/amitkmaraj/accelerate-ai-lab3-starter.git
    cd accelerate-ai-lab3-starter
    
  2. بررسی ساختار پروژه:
    ls -R
    
    شما باید ساختار شروع زیر را ببینید:
    accelerate-ai-lab3-starter/
    ├── README.md                    # Project overview
    ├── ollama-backend/              # Ollama backend (separate deployment)
    │   └── Dockerfile               # Backend container (🚧 to implement)
    └── adk-agent/                   # ADK agent (separate deployment)
        ├── pyproject.toml           # Python dependencies (✅ completed)
        ├── server.py                # FastAPI server (🚧 to implement)
        ├── Dockerfile               # Container config (🚧 to implement)
        ├── load_test.py             # Load testing (🚧 to implement)
        └── production_agent/        # Agent implementation
            ├── __init__.py         # Package init (✅ completed)
            └── agent.py            # Agent logic (🚧 to implement)
    

6. نمای کلی معماری

قبل از پیاده سازی، بیایید معماری دو سرویس را درک کنیم:

Lab 3 Two Service Architecture

بینش کلیدی : در طول آزمایش بار، مقیاس هر دو سرویس را به طور مستقل مشاهده خواهید کرد - باطن GPU (سرویس گلوگاه) برای بار استنتاج به 1-3 نمونه مقیاس می‌شود، در حالی که عامل ADK برای رسیدگی به درخواست در 1 نمونه باقی می‌ماند.

7. Gemma Backend را در Cloud Run با GPU اجرا کنید

Lab 3 Gemma Service

اولین مرحله حیاتی، استقرار یک مدل Gemma با شتاب GPU است که به عنوان مغز عامل ADK شما عمل خواهد کرد. داشتن یک LLM جدا شده و مستقر ممکن است در معماری هایی که به یک مدل دقیق تنظیم شده جداگانه نیاز دارید یا به مقیاس بندی جدا شده نیاز دارید، مطلوب باشد.

  1. به دایرکتوری Ollama Backend بروید:
    cd ollama-backend
    
  2. Ollama Dockerfile را باز و اجرا کنید:
    cloudshell edit Dockerfile
    
    کامنت TODO را با:
    FROM ollama/ollama:latest
    
    # Listen on all interfaces, port 8080
    ENV OLLAMA_HOST 0.0.0.0:8080
    
    # 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
    
    # Store the model weights in the container image
    ENV MODEL gemma3:270m
    RUN ollama serve & sleep 5 && ollama pull $MODEL
    
    # Start Ollama
    ENTRYPOINT ["ollama", "serve"]
    
    🔧 این چه کاری انجام می دهد:
    • از تصویر رسمی اولاما به عنوان پایه استفاده می کند
    • OLLAMA_HOST برای پذیرش اتصالات از هر آدرس IP تنظیم می کند
    • پورت 8080 را در معرض دید قرار می دهد
  3. استقرار باطن Gemma با پشتیبانی GPU:
gcloud run deploy ollama-gemma3-270m-gpu \
  --source . \
  --region europe-west1 \
  --concurrency 4 \
  --cpu 8 \
  --set-env-vars OLLAMA_NUM_PARALLEL=4 \
  --gpu 1 \
  --gpu-type nvidia-l4 \
  --max-instances 3 \
  --memory 16Gi \
  --allow-unauthenticated \
  --no-cpu-throttling \
  --no-gpu-zonal-redundancy \
  --timeout 600 \
  --labels dev-tutorial=codelab-agent-gpu

اگر شما یک "استقرار از منبع نیاز به یک مخزن Artifact Registry Docker برای ذخیره کانتینرهای ساخته شده دارد. یک مخزن به نام [cloud-run-source-deploy] در منطقه [europe-west1] ایجاد می شود." پیام، ادامه

⚙️ پیکربندی کلید توضیح داده شده است:

  • پردازنده گرافیکی : NVIDIA L4 به دلیل نسبت قیمت به عملکرد عالی برای بارهای کاری استنتاج انتخاب شده است. L4 حافظه 24 گیگابایتی GPU و عملیات تانسور بهینه را ارائه می دهد که آن را برای مدل های پارامتری 270 میلیونی مانند Gemma ایده آل می کند.
  • حافظه : 16 گیگابایت حافظه سیستم برای کنترل بارگذاری مدل، عملیات CUDA و مدیریت حافظه Ollama
  • CPU : 8 هسته برای مدیریت بهینه I/O و وظایف پیش پردازش
  • همزمانی : 4 درخواست در هر نمونه، توان عملیاتی را با استفاده از حافظه GPU متعادل می کند
  • مهلت زمانی : 600 ثانیه برای بارگیری مدل اولیه و راه اندازی کانتینر مناسب است

💰 در نظر گرفتن هزینه : نمونه های GPU به طور قابل توجهی گران تر از نمونه های فقط CPU هستند (~ 2-4 دلار در ساعت در مقابل ~ 0.10 دلار در ساعت). تنظیم --max-instances 1 با جلوگیری از مقیاس‌گذاری غیرضروری نمونه GPU به کنترل هزینه‌ها کمک می‌کند.

  1. منتظر بمانید تا استقرار کامل شود و URL سرویس را یادداشت کنید:
    export OLLAMA_URL=$(gcloud run services describe ollama-gemma3-270m-gpu \
        --region=europe-west1 \
        --format='value(status.url)')
    
    echo "🎉 Gemma backend deployed at: $OLLAMA_URL"
    

8. یکپارچه سازی عامل ADK را پیاده سازی کنید

حال بیایید یک عامل ADK حداقل ایجاد کنیم که به باطن Gemma مستقر شما متصل می شود.

  1. به دایرکتوری عامل ADK بروید:
    cd ../adk-agent
    
  2. پیکربندی عامل را باز کرده و اجرا کنید:
    cloudshell edit production_agent/agent.py
    
    همه نظرات TODO را با این حداقل پیاده سازی جایگزین کنید:
    import os
    from pathlib import Path
    
    from dotenv import load_dotenv
    from google.adk.agents import Agent
    from google.adk.models.lite_llm import LiteLlm
    import google.auth
    
    # Load environment variables
    root_dir = Path(__file__).parent.parent
    dotenv_path = root_dir / ".env"
    load_dotenv(dotenv_path=dotenv_path)
    
    # Configure Google Cloud
    try:
        _, project_id = google.auth.default()
        os.environ.setdefault("GOOGLE_CLOUD_PROJECT", project_id)
    except Exception:
        pass
    
    os.environ.setdefault("GOOGLE_CLOUD_LOCATION", "europe-west1")
    
    # Configure model connection
    gemma_model_name = os.getenv("GEMMA_MODEL_NAME", "gemma3:270m")
    
    # Production Gemma Agent - GPU-accelerated conversational assistant
    gemma_agent = Agent(
       model=LiteLlm(model=f"ollama_chat/{gemma_model_name}"),
       name="gemma_agent",
       description="A production-ready conversational assistant powered by GPU-accelerated Gemma.",
       instruction="""You are 'Gem', a friendly, knowledgeable, and enthusiastic zoo tour guide.
       Your main goal is to make a zoo visit more fun and educational for guests by answering their questions.
    
       You can provide general information and interesting facts about different animal species, such as:
       - Their natural habitats and diet. 🌲🍓
       - Typical lifespan and behaviors.
       - Conservation status and unique characteristics.
    
       IMPORTANT: You do NOT have access to any tools. This means you cannot look up real-time, specific information about THIS zoo. You cannot provide:
       - The names or ages of specific animals currently at the zoo.
       - The exact location or enclosure for an animal.
       - The daily schedule for feedings or shows.
    
       Always answer based on your general knowledge about the animal kingdom. Keep your tone cheerful, engaging, and welcoming for visitors of all ages. 🦁✨""",
       tools=[],  # Gemma focuses on conversational capabilities
    )
    
    # Set as root agent
    root_agent = gemma_agent
    
    🔧 این چه کاری انجام می دهد:
    • از طریق LiteLlm به باطن Gemma مستقر شما متصل می شود
    • یک عامل مکالمه ساده ایجاد می کند
    • ادغام Google Cloud را پیکربندی می کند
  3. سرور FastAPI را باز و اجرا کنید:
    cloudshell edit server.py
    
    جایگزین همه نظرات TODO با:
    import os
    from dotenv import load_dotenv
    from fastapi import FastAPI
    from google.adk.cli.fast_api import get_fast_api_app
    
    # Load environment variables
    load_dotenv()
    
    AGENT_DIR = os.path.dirname(os.path.abspath(__file__))
    app_args = {"agents_dir": AGENT_DIR, "web": True}
    
    # Create FastAPI app with ADK integration
    app: FastAPI = get_fast_api_app(**app_args)
    
    # Update app metadata
    app.title = "Production ADK Agent - Lab 3"
    app.description = "Gemma agent with GPU-accelerated backend"
    app.version = "1.0.0"
    
    @app.get("/health")
    def health_check():
        return {"status": "healthy", "service": "production-adk-agent"}
    
    @app.get("/")
    def root():
        return {
            "service": "Production ADK Agent - Lab 3",
            "description": "GPU-accelerated Gemma agent",
            "docs": "/docs",
            "health": "/health"
        }
    
    if __name__ == "__main__":
        import uvicorn
        uvicorn.run(app, host="0.0.0.0", port=8080, log_level="info")
    
    🔧 این چه کاری انجام می دهد:
    • یک سرور FastAPI با ادغام ADK ایجاد می کند
    • رابط وب را برای آزمایش فعال می کند
    • نقاط پایانی بررسی سلامت را ارائه می دهد
  4. Dockerfile را باز کرده و اجرا کنید:
    cloudshell edit Dockerfile
    
    جایگزین همه نظرات TODO با:
    FROM python:3.13-slim
    
    # Copy uv from the official image
    COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
    
    # Install system dependencies
    RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
    
    # Set working directory
    WORKDIR /app
    
    # Copy all files
    COPY . .
    
    # Install Python dependencies
    RUN uv sync
    
    # Expose port
    EXPOSE 8080
    
    # Run the application
    CMD ["uv", "run", "uvicorn", "server:app", "--host", "0.0.0.0", "--port", "8080"]
    
    انتخاب های فناوری توضیح داد:
    • uv : مدیر بسته مدرن پایتون که 10-100 برابر سریعتر از pip است. از یک کش جهانی و دانلودهای موازی استفاده می کند که زمان ساخت کانتینر را به میزان قابل توجهی کاهش می دهد
    • Python 3.13-slim : آخرین نسخه پایتون با حداقل وابستگی به سیستم، کاهش اندازه کانتینر و سطح حمله
    • ساخت چند مرحله ای : کپی کردن uv از تصویر رسمی آن تضمین می کند که جدیدترین باینری بهینه شده را دریافت کنیم

9. Environment و Deploy Agent را پیکربندی کنید

اکنون ما عامل ADK را پیکربندی می کنیم تا به باطن Gemma مستقر شما متصل شود و آن را به عنوان یک سرویس Cloud Run استقرار دهد. این شامل تنظیم متغیرهای محیطی و استقرار عامل با پیکربندی مناسب است.

  1. پیکربندی محیط خود را تنظیم کنید:
    cat << EOF > .env
    GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
    GOOGLE_CLOUD_LOCATION=europe-west1
    GEMMA_MODEL_NAME=gemma3:270m
    OLLAMA_API_BASE=$OLLAMA_URL
    EOF
    

درک متغیرهای محیطی در Cloud Run

متغیرهای محیطی جفت های کلید-مقدار هستند که برنامه شما را در زمان اجرا پیکربندی می کنند. آنها به ویژه برای موارد زیر مفید هستند:

  • نقاط پایانی API و نشانی‌های وب سرویس (مانند باطن Ollama ما)
  • پیکربندی که بین محیط‌ها تغییر می‌کند (dev, staging, prod)
  • داده های حساسی که نباید کدگذاری شوند

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

export PROJECT_ID=$(gcloud config get-value project)

gcloud run deploy production-adk-agent \
   --source . \
   --region europe-west1 \
   --allow-unauthenticated \
   --memory 4Gi \
   --cpu 2 \
   --max-instances 1 \
   --concurrency 10 \
   --timeout 300 \
   --set-env-vars GOOGLE_CLOUD_PROJECT=$PROJECT_ID \
   --set-env-vars GOOGLE_CLOUD_LOCATION=europe-west1 \
   --set-env-vars GEMMA_MODEL_NAME=gemma3:270m \
   --set-env-vars OLLAMA_API_BASE=$OLLAMA_URL \
   --labels dev-tutorial=codelab-agent-gpu

⚙️ پیکربندی کلید:

  • مقیاس‌بندی خودکار : در 1 نمونه ثابت شد (بررسی درخواست‌های سبک وزن)
  • همزمانی : 10 درخواست در هر نمونه
  • حافظه : 4 گیگابایت برای عامل ADK
  • محیط : به باطن Gemma شما متصل می شود

🔒 نکته امنیتی : این آزمایشگاه --allow-unauthenticated برای سادگی استفاده می کند. در تولید، احراز هویت مناسب را با استفاده از:

  • Cloud احراز هویت سرویس به سرویس را با حساب‌های سرویس اجرا کنید
  • سیاست های مدیریت هویت و دسترسی (IAM).
  • کلیدهای API یا OAuth برای دسترسی خارجی
  • استفاده از gcloud run services add-iam-policy-binding برای کنترل دسترسی در نظر بگیرید

نشانی وب سرویس نماینده خود را دریافت کنید:

export AGENT_URL=$(gcloud run services describe production-adk-agent \
    --region=europe-west1 \
    --format='value(status.url)')

echo "🎉 ADK Agent deployed at: $AGENT_URL"

✅ بهترین شیوه های متغیرهای محیطی بر اساس مستندات متغیرهای محیطی Cloud Run :

  1. اجتناب از متغیرهای رزرو شده : PORT تنظیم نکنید (Cloud Run این را به طور خودکار تنظیم می کند) یا متغیرهایی که با X_GOOGLE_ شروع می شوند
  2. از نام‌های توصیفی استفاده کنید : برای جلوگیری از تداخل، متغیرهای خود را پیشوند قرار دهید (مثلاً GEMMA_MODEL_NAME به جای MODEL )
  3. کاماهای فرار : اگر مقادیر شما حاوی کاما هستند، از یک جداکننده متفاوت استفاده کنید: --set-env-vars "^@^KEY1=value1,value2@KEY2=..."
  4. به‌روزرسانی در مقابل جایگزینی : از --update-env-vars برای افزودن/تغییر متغیرهای خاص بدون تأثیرگذاری بر دیگران استفاده کنید.

نحوه تنظیم متغیرها در Cloud Run :

  • از فایل : gcloud run deploy SERVICE_NAME --env-vars-file .env --labels dev-tutorial codelab-adk (چند متغیر را از یک فایل بارگیری می کند)
  • چند پرچم : تکرار --set-env-vars برای مقادیر پیچیده ای که نمی توانند با کاما از هم جدا شوند.

10. تست با رابط وب ADK

با استقرار هر دو سرویس، وقت آن رسیده است که تأیید کنید که عامل ADK شما می‌تواند با موفقیت با پشتیبانی Gemma با شتاب GPU ارتباط برقرار کند و به سؤالات کاربر پاسخ دهد.

  1. تست نقطه پایانی سلامتی:
    curl $AGENT_URL/health
    
    باید ببینید:
    { "status": "healthy", "service": "production-adk-agent" }
    
  2. با وارد کردن URL مربوط به production-adk-agent خود در یک برگه مرورگر جدید، با نماینده خود تعامل کنید. شما باید رابط وب ADK را ببینید.
  3. نماینده خود را با این مکالمات نمونه آزمایش کنید:
    • پانداهای قرمز معمولاً در طبیعت چه می خورند؟
    • "می توانید یک واقعیت جالب در مورد پلنگ برفی به من بگویید؟"
    • "چرا قورباغه های دارت سمی اینقدر رنگارنگ هستند؟"
    • "از کجا می توانم بچه کانگورو جدید را در باغ وحش پیدا کنم؟"
    👀 آنچه باید رعایت شود:
    • عامل با استفاده از مدل Gemma مستقر شده شما پاسخ می دهد. می‌توانید این موضوع را با مشاهده گزارش‌های سرویس Gemma مستقر خود تأیید کنید. در بخش بعدی این کار را انجام خواهیم داد
    • پاسخ ها توسط باطن با شتاب GPU تولید می شوند
    • رابط وب یک تجربه چت تمیز را فراهم می کند

آزمایش ADK آزمایشگاه 3

11. تست بار را اجرا و اجرا کنید

آزمایش بارگذاری آزمایشگاه 3

برای درک اینکه چگونه استقرار تولید شما ترافیک دنیای واقعی را مدیریت می کند، آزمایش بار جامعی را اجرا می کنیم که مقیاس خودکار را در هر دو عامل ADK و خدمات باطن GPU آغاز می کند.

  1. اسکریپت تست بار را باز و اجرا کنید:
    cloudshell edit load_test.py
    
    کامنت TODO را با:
    import random
    import uuid
    from locust import HttpUser, task, between
    
    class ProductionAgentUser(HttpUser):
        """Load test user for the Production ADK Agent."""
    
        wait_time = between(1, 3)  # Faster requests to trigger scaling
    
        def on_start(self):
            """Set up user session when starting."""
            self.user_id = f"user_{uuid.uuid4()}"
            self.session_id = f"session_{uuid.uuid4()}"
    
            # Create session for the Gemma agent using proper ADK API format
            session_data = {"state": {"user_type": "load_test_user"}}
    
            self.client.post(
                f"/apps/production_agent/users/{self.user_id}/sessions/{self.session_id}",
                headers={"Content-Type": "application/json"},
                json=session_data,
            )
    
        @task(4)
        def test_conversations(self):
            """Test conversational capabilities - high frequency to trigger scaling."""
            topics = [
                "What do red pandas typically eat in the wild?",
                "Can you tell me an interesting fact about snow leopards?",
                "Why are poison dart frogs so brightly colored?",
                "Where can I find the new baby kangaroo in the zoo?",
                "What is the name of your oldest gorilla?",
                "What time is the penguin feeding today?"
            ]
    
            # Use proper ADK API format for sending messages
            message_data = {
                "app_name": "production_agent",
                "user_id": self.user_id,
                "session_id": self.session_id,
                "new_message": {
                    "role": "user",
                    "parts": [{
                        "text": random.choice(topics)
                    }]
                }
            }
    
            self.client.post(
                "/run",
                headers={"Content-Type": "application/json"},
                json=message_data,
            )
    
        @task(1)
        def health_check(self):
            """Test the health endpoint."""
            self.client.get("/health")
    
    🔧 این چه کاری انجام می دهد:
    • ایجاد جلسه : از قالب مناسب ADK API با POST به /apps/production_agent/users/{user_id}/sessions/{session_id} استفاده می‌کند. پس از ایجاد session_id و user_id ، می‌توان درخواستی را به نماینده ارسال کرد.
    • فرمت پیام : از مشخصات ADK با app_name ، user_id ، session_id و شیء ساختار یافته new_message پیروی می کند.
    • نقطه پایان مکالمه : از نقطه پایانی /run برای جمع آوری همه رویدادها به طور همزمان استفاده می کند (برای آزمایش بار توصیه می شود)
    • بار واقعی : بار مکالمه را با زمان انتظار کوتاه‌تر ایجاد می‌کند تا مقیاس خودکار را فعال کند
    📚 برای جزئیات بیشتر در مورد نقاط پایانی ADK API و الگوهای آزمایش، به راهنمای تست ADK مراجعه کنید .
  2. نصب وابستگی ها:
    uv sync
    
  3. Locust یک ابزار تست بار منبع باز و مبتنی بر پایتون است که برای آزمایش عملکرد و بارگذاری برنامه های کاربردی وب و سایر سیستم ها طراحی شده است. ویژگی کلیدی آن این است که سناریوهای آزمایشی و رفتار کاربر با استفاده از کد استاندارد پایتون تعریف می‌شوند و در مقایسه با ابزارهایی که به رابط‌های کاربری گرافیکی یا زبان‌های دامنه خاص متکی هستند، انعطاف‌پذیری و بیان بالایی را ارائه می‌دهند. ما از Locust برای شبیه سازی ترافیک کاربر به خدمات خود استفاده خواهیم کرد. تست بارگذاری را اجرا کنید.
    # Run a load test to trigger autoscaling
    uv run locust -f load_test.py \
       -H $AGENT_URL \
       --headless \
       -t 50s \
       -u 3 \
       -r 1
    
    سعی کنید پارامترهای تست را تغییر دهید و خروجی را مشاهده کنید. متوجه افزایش ollama-gemma3-270m-gpu به 2-3 مورد خواهید شد. 📊 پارامترهای تست بار:
    • مدت زمان : 50 ثانیه
    • کاربران : 3 کاربر همزمان
    • نرخ تخم ریزی : 1 کاربر در ثانیه
    • هدف : مقیاس خودکار را در هر دو سرویس فعال کنید

12. رفتار مقیاس بندی خودکار را مشاهده کنید

همانطور که تست بار اجرا می شود، می توانید مقیاس خودکار Cloud Run را در عمل مشاهده کنید. اینجاست که مزایای اصلی معماری جداسازی عامل ADK از باطن GPU را خواهید دید.

در طول تست بارگذاری، بر میزان مقیاس هر دو سرویس Cloud Run در کنسول خود نظارت کنید.

  1. در Cloud Console به مسیر زیر بروید:
    • Cloud Run → production-adk-agent → Metrics
    • Cloud Run → olama-gemma3-270m-gpu → Metrics

👀 آنچه باید رعایت کنید:

🤖 خدمات نمایندگی ADK:

  • زمانی که ترافیک افزایش می‌یابد، باید در ۱ مورد ثابت بماند
  • مصرف CPU و حافظه در هنگام ترافیک بالا افزایش می یابد
  • مدیریت جلسه و مسیریابی درخواست را به طور موثر مدیریت می کند

🎮 Gemma Backend Service (گلوگاه):

  • بر اساس تقاضای استنتاج از 1 تا 3 نمونه مقیاس می‌کند
  • استفاده از GPU تحت بارگذاری به طور قابل توجهی افزایش می یابد
  • این سرویس به دلیل استنتاج مدل فشرده GPU به گلوگاه تبدیل می شود
  • زمان استنتاج مدل به دلیل شتاب GPU ثابت می ماند

💡 بینش های کلیدی:

  • باطن GPU یک گلوگاه است و با شدت بیشتری مقیاس می شود (1-3 نمونه)
  • عامل ADK ثابت می ماند
  • هر دو سرویس به طور مستقل بر اساس ویژگی های بار فردی خود مقیاس می شوند
  • مقیاس خودکار به حفظ عملکرد در شرایط بار مختلف کمک می کند

13. نتیجه گیری

تبریک می گویم! شما با موفقیت یک عامل ADK آماده تولید را با باطن Gemma تسریع شده توسط GPU مستقر کرده اید و رفتار مقیاس پذیری خودکار را مشاهده کرده اید.

✅ آنچه را که انجام دادید

  • ✅ یک باطن مدل Gemma با شتاب GPU در Cloud Run مستقر شده است
  • ✅ یک عامل ADK ایجاد و مستقر کرد که با باطن Gemma ادغام می شود
  • ✅ عامل را با استفاده از رابط وب ADK تست کرد
  • ✅ رفتار مقیاس خودکار را در دو سرویس هماهنگ Cloud Run مشاهده کرد

💡 بینش های کلیدی از این آزمایشگاه

  1. 🎮 شتاب پردازنده گرافیکی : GPU NVIDIA L4 به طور قابل توجهی عملکرد استنتاج مدل را بهبود می بخشد
  2. 🔗 هماهنگی سرویس : دو سرویس Cloud Run می توانند به طور یکپارچه با هم کار کنند
  3. 📈 مقیاس بندی مستقل : هر سرویس بر اساس ویژگی های بار فردی خود مقیاس می گیرد
  4. 🚀 آمادگی تولید : معماری الگوهای ترافیک دنیای واقعی را به طور موثر مدیریت می کند

🔄 مراحل بعدی

  • الگوهای بار مختلف را آزمایش کنید و رفتار مقیاس بندی را مشاهده کنید
  • اندازه های مختلف مدل Gemma را امتحان کنید (حافظه و GPU را بر اساس آن تنظیم کنید)
  • اجرای نظارت و هشدار برای استقرار تولید
  • استقرار چند منطقه ای را برای در دسترس بودن جهانی کاوش کنید

🧹 پاکسازی کنید

برای جلوگیری از تحمیل هزینه، پس از اتمام کار، منابع را حذف کنید:

gcloud run services delete production-adk-agent --region=europe-west1
gcloud run services delete ollama-gemma3-270m-gpu --region=europe-west1

📖 منابع