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

1. บทนำ

ภาพรวม

ในแล็บนี้ คุณจะได้ติดตั้งใช้งานเอเจนต์ชุดเครื่องมือพัฒนาเอเจนต์ (ADK) ที่พร้อมใช้งานจริงพร้อมแบ็กเอนด์ 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 ของบริการ (เช่น Backend ของ 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
    pip install locust
    
  3. Locust เป็นเครื่องมือทดสอบโหลดแบบโอเพนซอร์สที่ใช้ Python ซึ่งออกแบบมาเพื่อทดสอบประสิทธิภาพและโหลดของเว็บแอปพลิเคชันและระบบอื่นๆ ลักษณะสำคัญของเครื่องมือนี้คือการกำหนดสถานการณ์การทดสอบและพฤติกรรมของผู้ใช้โดยใช้โค้ด Python มาตรฐาน ซึ่งมีความยืดหยุ่นและสื่อความหมายได้สูงเมื่อเทียบกับเครื่องมือที่ต้องอาศัยอินเทอร์เฟซผู้ใช้แบบกราฟิกหรือภาษาเฉพาะโดเมน เราจะใช้ Locust เพื่อจำลองการเข้าชมของผู้ใช้ในบริการของเรา เรียกใช้การทดสอบโหลด
    # Run a load test to trigger autoscaling
    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. สังเกตพฤติกรรม AutoScaling

ขณะที่การทดสอบโหลดทำงานอยู่ คุณจะสังเกตเห็นการปรับขนาดอัตโนมัติของ 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

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