Lab 3: ต้นแบบสู่การใช้งานจริง - ทำให้เอเจนต์ ADK ใช้งานได้ใน Cloud Run ด้วย GPU

1. บทนำ

ภาพรวม

ในแล็บนี้ คุณจะได้ติดตั้งใช้งาน Agent Development Kit (ADK) Agent ที่พร้อมใช้งานจริงพร้อมแบ็กเอนด์ Gemma ที่เร่งด้วย GPU โดยจะเน้นที่รูปแบบการติดตั้งใช้งานที่สำคัญ ได้แก่ การตั้งค่าบริการ Cloud Run ที่เปิดใช้ GPU, การผสานรวมแบ็กเอนด์ของโมเดลกับตัวแทน ADK และการสังเกตพฤติกรรมการปรับขนาดอัตโนมัติภายใต้ภาระงาน

สิ่งที่คุณต้องดำเนินการ

ในแล็บนี้ คุณจะมุ่งเน้นที่แง่มุมที่สำคัญของการติดตั้งใช้งานในเวอร์ชันที่ใช้งานจริง ดังนี้

  1. ติดตั้งใช้งาน Gemma ใน Cloud Run ด้วย GPU - ตั้งค่าแบ็กเอนด์โมเดล Gemma ประสิทธิภาพสูง
  2. ผสานรวมการติดตั้งใช้งาน Gemma กับตัวแทน ADK - เชื่อมต่อตัวแทนกับโมเดลที่เร่งด้วย GPU
  3. ทดสอบด้วยอินเทอร์เฟซเว็บของ ADK - ตรวจสอบว่าเอเจนต์สนทนาทำงานได้อย่างถูกต้อง
  4. ทำการทดสอบโหลด - สังเกตว่าอินสแตนซ์ Cloud Run ทั้ง 2 รายการปรับขนาดอัตโนมัติภายใต้โหลดอย่างไร

โดยเน้นที่รูปแบบการติดตั้งใช้งานจริงมากกว่าการพัฒนาเอเจนต์อย่างกว้างขวาง

สิ่งที่คุณจะได้เรียนรู้

  • ทำให้โมเดล Gemma ที่เร่งด้วย GPU ใช้งานได้กับ Cloud Run เพื่อใช้ในการผลิต
  • ผสานรวมการทำให้โมเดลภายนอกใช้งานได้กับตัวแทน ADK
  • กำหนดค่าและทดสอบการติดตั้งใช้งานเอเจนต์ AI ที่พร้อมใช้งานจริง
  • ทำความเข้าใจลักษณะการทำงานของการปรับขนาดอัตโนมัติของ Cloud Run ภายใต้ภาระงาน
  • สังเกตวิธีที่อินสแตนซ์ Cloud Run หลายรายการประสานงานกันในช่วงที่มีการเข้าชมเพิ่มขึ้น
  • ใช้การทดสอบโหลดเพื่อตรวจสอบประสิทธิภาพและการปรับขนาดอัตโนมัติ

2. การตั้งค่าโปรเจ็กต์

  1. หากยังไม่มีบัญชี Google คุณต้องสร้างบัญชี Google
    • ใช้บัญชีส่วนตัวแทนบัญชีงานหรือบัญชีโรงเรียน บัญชีงานและบัญชีโรงเรียนอาจมีข้อจำกัดที่ทำให้คุณเปิดใช้ API ที่จำเป็นสำหรับห้องทดลองนี้ไม่ได้
  2. ลงชื่อเข้าใช้ Google Cloud Console
  3. เปิดใช้การเรียกเก็บเงินใน Cloud Console
    • การทำแล็บนี้ควรมีค่าใช้จ่ายน้อยกว่า $1 USD ในทรัพยากรระบบคลาวด์
    • คุณสามารถทำตามขั้นตอนที่ส่วนท้ายของแล็บนี้เพื่อลบทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินเพิ่มเติม
    • ผู้ใช้ใหม่มีสิทธิ์ใช้ช่วงทดลองใช้ฟรีมูลค่า$300 USD
  4. สร้างโปรเจ็กต์ใหม่หรือเลือกใช้โปรเจ็กต์ที่มีอยู่ซ้ำ

3. เปิดเครื่องมือแก้ไข Cloud Shell

  1. คลิกลิงก์นี้เพื่อไปยัง Cloud Shell Editor โดยตรง
  2. หากระบบแจ้งให้ให้สิทธิ์ในวันนี้ ให้คลิกให้สิทธิ์เพื่อดำเนินการต่อ คลิกเพื่อให้สิทธิ์ Cloud Shell
  3. หากเทอร์มินัลไม่ปรากฏที่ด้านล่างของหน้าจอ ให้เปิดโดยทำดังนี้
    • คลิกดู
    • คลิก Terminalเปิดเทอร์มินัลใหม่ใน 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 ได้ เราต้องเปิดใช้ Google Cloud API ที่จำเป็นและกำหนดค่าการตั้งค่าโปรเจ็กต์

  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. เตรียมโปรเจ็กต์ Python

มาตั้งค่าโค้ดเริ่มต้นที่มีโครงสร้างพื้นฐานสำหรับทั้งบริการแบ็กเอนด์ของ Gemma และบริการ 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. ภาพรวมสถาปัตยกรรม

มาทำความเข้าใจสถาปัตยกรรมแบบ 2 บริการกันก่อนที่จะนำไปใช้

Lab 3 สถาปัตยกรรมแบบ 2 บริการ

ข้อมูลเชิงลึกที่สำคัญ: ในระหว่างการทดสอบโหลด คุณจะเห็นว่าทั้ง 2 บริการปรับขนาดแยกกัน โดยแบ็กเอนด์ GPU (บริการที่เป็นคอขวด) จะปรับขนาดเป็น 1-3 อินสแตนซ์สำหรับโหลดการอนุมาน ในขณะที่ตัวแทน ADK จะยังคงอยู่ที่ 1 อินสแตนซ์สำหรับการจัดการคำขอ

7. ติดตั้งใช้งานแบ็กเอนด์ Gemma ใน Cloud Run ด้วย GPU

บริการ Lab 3 Gemma

ขั้นตอนแรกที่สำคัญคือการติดตั้งใช้งานโมเดล Gemma ที่เร่งด้วย GPU ซึ่งจะทำหน้าที่เป็นสมองของเอเจนต์ ADK การมี LLM ที่แยกส่วนและใช้งานได้อาจเป็นประโยชน์ในสถาปัตยกรรมที่คุณต้องการโมเดลที่ปรับแต่งแยกต่างหาก หรือต้องมีการปรับขนาดแบบแยก

  1. ไปที่ไดเรกทอรีแบ็กเอนด์ของ Ollama โดยใช้คำสั่งต่อไปนี้
    cd ollama-backend
    
  2. เปิดและใช้ Dockerfile ของ Ollama โดยทำดังนี้
    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 อย่างเป็นทางการเป็นพื้นฐาน
    • ตั้งค่า 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

หากได้รับข้อความ "การติดตั้งใช้งานจากแหล่งที่มาต้องใช้ที่เก็บ Docker ของ Artifact Registry เพื่อจัดเก็บคอนเทนเนอร์ที่สร้างขึ้น ข้อความ "ระบบจะสร้างที่เก็บชื่อ [cloud-run-source-deploy] ในภูมิภาค [europe-west1]" ให้ดำเนินการต่อ

⚙️ อธิบายการกำหนดค่าที่สำคัญ

  • GPU: NVIDIA L4 ได้รับเลือกเนื่องจากมีอัตราส่วนราคาต่อประสิทธิภาพที่ยอดเยี่ยมสำหรับปริมาณงานการอนุมาน L4 มีหน่วยความจำ GPU ขนาด 24 GB และการดำเนินการเทนเซอร์ที่เพิ่มประสิทธิภาพ จึงเหมาะสำหรับโมเดลพารามิเตอร์ 270 ล้านรายการ เช่น Gemma
  • หน่วยความจำ: หน่วยความจำระบบ 16 GB เพื่อรองรับการโหลดโมเดล การดำเนินการ 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
    
    🔧 สิ่งที่ฟีเจอร์นี้ทำ
    • เชื่อมต่อกับแบ็กเอนด์ Gemma ที่คุณติดตั้งใช้งานผ่าน LiteLlm
    • สร้างเอเจนต์สนทนาโต้ตอบที่เรียบง่าย
    • กำหนดค่าการผสานรวม 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: เครื่องมือจัดการแพ็กเกจ Python ที่ทันสมัยซึ่งเร็วกว่า pip 10-100 เท่า โดยจะใช้แคชส่วนกลางและการดาวน์โหลดแบบขนาน ซึ่งจะช่วยลดเวลาในการสร้างคอนเทนเนอร์ได้อย่างมาก
    • Python 3.13-slim: Python เวอร์ชันล่าสุดที่มีการอิงกับระบบน้อยที่สุด ซึ่งจะช่วยลดขนาดคอนเทนเนอร์และพื้นที่ในการโจมตี
    • การสร้างแบบหลายขั้นตอน: การคัดลอก uv จากอิมเมจอย่างเป็นทางการช่วยให้เราได้รับไบนารีที่ได้รับการเพิ่มประสิทธิภาพล่าสุด

9. กำหนดค่าสภาพแวดล้อมและติดตั้งใช้งาน 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 และ URL ของบริการ (เช่น แบ็กเอนด์ Ollama ของเรา)
  • การกำหนดค่าที่เปลี่ยนแปลงระหว่างสภาพแวดล้อม (dev, staging, prod)
  • ข้อมูลที่ละเอียดอ่อนซึ่งไม่ควรฮาร์ดโค้ด

ติดตั้งใช้งาน Agent ของ 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 GB สำหรับตัวแทน ADK
  • สภาพแวดล้อม: เชื่อมต่อกับแบ็กเอนด์ Gemma

🔒 หมายเหตุเกี่ยวกับความปลอดภัย: Labs นี้ใช้ --allow-unauthenticated เพื่อความสะดวก ในเวอร์ชันที่ใช้งานจริง ให้ใช้การตรวจสอบสิทธิ์ที่เหมาะสมโดยใช้สิ่งต่อไปนี้

  • การตรวจสอบสิทธิ์จากบริการหนึ่งไปยังอีกบริการหนึ่งของ Cloud Run ด้วยบัญชีบริการ
  • นโยบาย Identity and Access Management (IAM)
  • คีย์ API หรือ OAuth สำหรับการเข้าถึงภายนอก
  • พิจารณาใช้ gcloud run services add-iam-policy-binding เพื่อควบคุมการเข้าถึง

รับ URL ของบริการตัวแทนโดยทำดังนี้

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

เมื่อติดตั้งใช้งานทั้ง 2 บริการแล้ว ก็ถึงเวลาตรวจสอบว่าเอเจนต์ 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 ใน Lab 3

11. ใช้งานและทำการทดสอบการโหลด

Lab 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")
    
    🔧 สิ่งที่ฟีเจอร์นี้ทำ
    • การสร้างเซสชัน: ใช้รูปแบบ API ของ ADK ที่เหมาะสมกับ POST ไปยัง /apps/production_agent/users/{user_id}/sessions/{session_id} หลังจากสร้าง session_id และ user_id แล้ว คุณสามารถส่งคำขอไปยังตัวแทนได้
    • รูปแบบข้อความ: เป็นไปตามข้อกำหนด ADK ที่มีออบเจ็กต์ app_name, user_id, session_id และ new_message ที่มีโครงสร้าง
    • ปลายทางการสนทนา: ใช้ปลายทาง /run เพื่อรวบรวมเหตุการณ์ทั้งหมดพร้อมกัน (แนะนําสําหรับการทดสอบโหลด)
    • โหลดที่สมจริง: สร้างโหลดการสนทนาโดยมีเวลารอที่สั้นลงเพื่อทริกเกอร์การปรับขนาดอัตโนมัติ
    📚 ดูรายละเอียดเพิ่มเติมเกี่ยวกับปลายทาง API ของ ADK และรูปแบบการทดสอบได้ที่คู่มือการทดสอบ ADK
  2. ติดตั้งการอ้างอิงด้วยคำสั่งต่อไปนี้
    uv sync
    
  3. Locust เป็นเครื่องมือทดสอบโหลดแบบโอเพนซอร์สที่ใช้ Python ซึ่งออกแบบมาเพื่อทดสอบประสิทธิภาพและโหลดของเว็บแอปพลิเคชันและระบบอื่นๆ ลักษณะสำคัญของเครื่องมือนี้คือการกำหนดสถานการณ์การทดสอบและพฤติกรรมของผู้ใช้โดยใช้โค้ด Python มาตรฐาน ซึ่งมีความยืดหยุ่นและสื่อความหมายได้สูงเมื่อเทียบกับเครื่องมือที่ต้องอาศัยอินเทอร์เฟซผู้ใช้แบบกราฟิกหรือภาษาเฉพาะโดเมน เราจะใช้ 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 คนต่อวินาที
    • เป้าหมาย: เรียกใช้การปรับขนาดอัตโนมัติในทั้ง 2 บริการ

12. สังเกตพฤติกรรมการปรับขนาดอัตโนมัติ

ขณะที่การทดสอบโหลดทำงานอยู่ คุณจะสังเกตเห็นการปรับขนาดอัตโนมัติของ Cloud Run ได้ คุณจะเห็นประโยชน์ด้านสถาปัตยกรรมที่สำคัญของการแยกเอเจนต์ ADK ออกจากแบ็กเอนด์ของ GPU ได้ที่นี่

ระหว่างการทดสอบโหลด ให้ตรวจสอบวิธีที่บริการ Cloud Run ทั้ง 2 บริการปรับขนาดในคอนโซล

  1. ใน Cloud Console ให้ไปที่
    • Cloud Run → production-adk-agent → เมตริก
    • Cloud Run → ollama-gemma3-270m-gpu → เมตริก

👀 สิ่งที่คุณควรสังเกต

🤖 บริการตัวแทน ADK:

  • ควรคงที่ที่ 1 อินสแตนซ์ในขณะที่การเข้าชมเพิ่มขึ้น
  • การใช้งาน CPU และหน่วยความจำเพิ่มขึ้นอย่างรวดเร็วในช่วงที่มีการเข้าชมสูง
  • จัดการเซสชันและกำหนดเส้นทางการส่งคำขออย่างมีประสิทธิภาพ

🎮 บริการแบ็กเอนด์ของ Gemma (คอขวด):

  • ปรับขนาดจาก 1 เป็น 3 อินสแตนซ์ตามความต้องการในการอนุมาน
  • การใช้งาน GPU เพิ่มขึ้นอย่างมากภายใต้ภาระงาน
  • บริการนี้กลายเป็นคอขวดเนื่องจากการอนุมานโมเดลที่ใช้ GPU อย่างหนัก
  • เวลาการอนุมานของโมเดลยังคงสอดคล้องกันเนื่องจากการเร่งด้วย GPU

💡 ข้อมูลเชิงลึกที่สำคัญ:

  • แบ็กเอนด์ GPU เป็นคอขวดและปรับขนาดได้ดุดันกว่า (1-3 อินสแตนซ์)
  • Agent ของ ADK จะยังคงสอดคล้องกัน
  • ทั้ง 2 บริการจะปรับขนาดแยกกันตามลักษณะการโหลดของแต่ละบริการ
  • การปรับขนาดอัตโนมัติช่วยรักษาประสิทธิภาพภายใต้สภาวะโหลดที่แตกต่างกัน

13. บทสรุป

ยินดีด้วย คุณได้ติดตั้งใช้งานเอเจนต์ ADK ที่พร้อมใช้งานจริงเรียบร้อยแล้ว โดยมีแบ็กเอนด์ Gemma ที่เร่งด้วย GPU และสังเกตเห็นลักษณะการทำงานของการปรับขนาดอัตโนมัติ

✅ สิ่งที่คุณทำสำเร็จ

  • ✅ ทำให้แบ็กเอนด์โมเดล Gemma ที่เร่งด้วย GPU ใช้งานได้บน Cloud Run
  • ✅ สร้างและติดตั้งใช้งานเอเจนต์ ADK ที่ผสานรวมกับแบ็กเอนด์ของ Gemma
  • ✅ ทดสอบเอเจนต์โดยใช้อินเทอร์เฟซเว็บ ADK
  • ✅ สังเกตพฤติกรรมการปรับขนาดอัตโนมัติในบริการ Cloud Run 2 รายการที่ประสานงานกัน

💡 ข้อมูลเชิงลึกที่สำคัญจากห้องทดลองนี้

  1. 🎮 การเร่งความเร็วด้วย GPU: GPU รุ่น L4 ของ NVIDIA ช่วยปรับปรุงประสิทธิภาพการอนุมานโมเดลได้อย่างมาก
  2. 🔗 การประสานงานบริการ: บริการ Cloud Run 2 รายการทำงานร่วมกันได้อย่างราบรื่น
  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

📖 แหล่งข้อมูล