Phòng thí nghiệm 3: Từ nguyên mẫu đến sản xuất – Triển khai tác nhân ADK lên Cloud Run bằng GPU

1. Giới thiệu

Tổng quan

Trong phòng thí nghiệm này, bạn sẽ triển khai một tác nhân Agent Development Kit (ADK) sẵn sàng cho hoạt động sản xuất với phần phụ trợ Gemma được tăng tốc bằng GPU. Trọng tâm là các mẫu triển khai quan trọng: thiết lập các dịch vụ Cloud Run có hỗ trợ GPU, tích hợp các phần phụ trợ mô hình với các tác nhân ADK và quan sát hành vi tự động mở rộng quy mô khi tải.

Bạn sẽ thực hiện

Trong lớp học lập trình này, bạn sẽ tập trung vào các khía cạnh quan trọng của việc triển khai sản xuất:

  1. Triển khai Gemma lên Cloud Run bằng GPU – Thiết lập một phần phụ trợ mô hình Gemma hiệu suất cao
  2. Tích hợp việc triển khai Gemma với một tác nhân ADK – Kết nối tác nhân của bạn với mô hình được tăng tốc bằng GPU
  3. Kiểm thử bằng giao diện web ADK – Xác thực rằng tác nhân đàm thoại của bạn hoạt động chính xác
  4. Thực hiện kiểm thử tải – Quan sát cách cả hai phiên bản Cloud Run tự động mở rộng quy mô khi chịu tải

Trọng tâm là các mẫu triển khai sản xuất thay vì phát triển tác nhân trên diện rộng.

Kiến thức bạn sẽ học được

  • Triển khai các mô hình Gemma được tăng tốc bằng GPU vào Cloud Run để sử dụng trong thực tế
  • Tích hợp việc triển khai mô hình bên ngoài với các tác nhân ADK
  • Định cấu hình và kiểm thử việc triển khai tác nhân AI sẵn sàng cho sản xuất
  • Tìm hiểu hành vi tự động mở rộng quy mô của Cloud Run khi chịu tải
  • Quan sát cách nhiều phiên bản Cloud Run phối hợp trong thời gian lưu lượng truy cập tăng đột biến
  • Áp dụng kiểm thử tải để xác thực hiệu suất và tính năng tự động mở rộng quy mô

2. Thiết lập dự án

  1. Nếu chưa có Tài khoản Google, bạn phải tạo một Tài khoản Google.
    • Sử dụng tài khoản cá nhân thay vì tài khoản do nơi làm việc hoặc trường học cấp. Tài khoản do nơi làm việc và trường học cấp có thể có các hạn chế khiến bạn không thể bật những API cần thiết cho lớp học này.
  2. Đăng nhập vào Google Cloud Console.
  3. Bật tính năng thanh toán trong Cloud Console.
    • Việc hoàn thành bài thực hành này sẽ tốn ít hơn 1 USD cho các tài nguyên trên đám mây.
    • Bạn có thể làm theo các bước ở cuối bài thực hành này để xoá tài nguyên nhằm tránh bị tính thêm phí.
    • Người dùng mới sẽ đủ điều kiện dùng thử miễn phí 300 USD.
  4. Tạo một dự án mới hoặc chọn sử dụng lại một dự án hiện có.

3. Mở Trình chỉnh sửa Cloud Shell

  1. Nhấp vào đường liên kết này để chuyển trực tiếp đến Cloud Shell Editor
  2. Nếu được nhắc uỷ quyền vào bất kỳ thời điểm nào trong ngày hôm nay, hãy nhấp vào Uỷ quyền để tiếp tục. Nhấp để uỷ quyền cho Cloud Shell
  3. Nếu thiết bị đầu cuối không xuất hiện ở cuối màn hình, hãy mở thiết bị đầu cuối:
    • Nhấp vào Xem
    • Nhấp vào Terminal (Thiết bị đầu cuối)Mở cửa sổ dòng lệnh mới trong Trình chỉnh sửa Cloud Shell
  4. Trong thiết bị đầu cuối, hãy thiết lập dự án bằng lệnh sau:
    • Định dạng:
      gcloud config set project [PROJECT_ID]
      
    • Ví dụ:
      gcloud config set project lab-project-id-example
      
    • Nếu bạn không nhớ mã dự án của mình, hãy làm như sau:
      • Bạn có thể liệt kê tất cả mã dự án bằng cách dùng:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      Đặt mã dự án trong thiết bị đầu cuối Cloud Shell Editor
  5. Bạn sẽ thấy thông báo sau:
    Updated property [core/project].
    
    Nếu thấy biểu tượng WARNING và được yêu cầu Do you want to continue (Y/n)?, thì có thể bạn đã nhập sai mã dự án. Nhấn n, nhấn Enter rồi thử chạy lại lệnh gcloud config set project.

4. Bật API và đặt khu vực mặc định

Để có thể triển khai các dịch vụ Cloud Run có hỗ trợ GPU, chúng ta cần bật các API Google Cloud bắt buộc và định cấu hình chế độ cài đặt dự án.

  1. Trong dòng lệnh, hãy bật các API:
gcloud services enable \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  aiplatform.googleapis.com

Nếu được nhắc uỷ quyền, hãy nhấp vào Uỷ quyền để tiếp tục. Nhấp để uỷ quyền cho Cloud Shell

Lệnh này có thể mất vài phút để hoàn tất, nhưng cuối cùng sẽ tạo ra một thông báo thành công tương tự như thông báo này:

Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.
  1. Đặt khu vực Cloud Run mặc định.
gcloud config set run/region europe-west1

5. Chuẩn bị dự án Python

Hãy thiết lập mã khởi đầu có chứa cấu trúc cơ bản cho cả dịch vụ phụ trợ Gemma và dịch vụ tác nhân ADK.

  1. Sao chép kho lưu trữ khởi đầu:
    cd ~
    git clone https://github.com/amitkmaraj/accelerate-ai-lab3-starter.git
    cd accelerate-ai-lab3-starter
    
  2. Tìm hiểu cấu trúc dự án:
    ls -R
    
    Bạn sẽ thấy cấu trúc khởi động sau:
    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. Tổng quan về Cấu trúc (Architecture)

Trước khi triển khai, hãy tìm hiểu về cấu trúc hai dịch vụ:

Phòng thí nghiệm 3: Kiến trúc hai dịch vụ

Thông tin chi tiết quan trọng: Trong quá trình kiểm thử tải, bạn sẽ thấy cả hai dịch vụ đều mở rộng quy mô độc lập – phần phụ trợ GPU (dịch vụ nút thắt) mở rộng quy mô thành 1-3 phiên bản cho tải suy luận, trong khi tác nhân ADK vẫn ở 1 phiên bản để xử lý yêu cầu.

7. Triển khai Gemma Backend lên Cloud Run bằng GPU

Lab 3 Gemma Service

Bước quan trọng đầu tiên là triển khai một mô hình Gemma được tăng tốc bằng GPU. Mô hình này sẽ đóng vai trò là bộ não cho tác nhân ADK của bạn. Việc có một LLM được tách rời và triển khai có thể mang lại lợi ích trong các cấu trúc mà bạn cần một mô hình được tinh chỉnh riêng biệt hoặc yêu cầu mở rộng quy mô riêng biệt.

  1. Chuyển đến thư mục phụ trợ Ollama:
    cd ollama-backend
    
  2. Mở và triển khai Ollama Dockerfile:
    cloudshell edit Dockerfile
    
    Thay thế chú thích TODO bằng:
    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"]
    
    🔧 Chức năng của chế độ này:
    • Sử dụng hình ảnh Ollama chính thức làm nền tảng
    • Đặt OLLAMA_HOST để chấp nhận các kết nối từ mọi địa chỉ IP
    • Hiển thị cổng 8080
  3. Triển khai phần phụ trợ Gemma có hỗ trợ 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

Nếu bạn nhận được thông báo "Việc triển khai từ nguồn yêu cầu phải có một kho lưu trữ Docker Artifact Registry để lưu trữ các vùng chứa đã tạo. Một thông báo "A repository named [cloud-run-source-deploy] in region [europe-west1] will be created." (Một kho lưu trữ có tên [cloud-run-source-deploy] ở khu vực [europe-west1] sẽ được tạo), hãy tiếp tục.

⚙️ Giải thích về cấu hình khoá:

  • GPU: NVIDIA L4 được chọn vì có tỷ lệ hiệu suất trên giá tuyệt vời cho khối lượng công việc suy luận. L4 cung cấp bộ nhớ GPU 24 GB và các hoạt động tối ưu hoá tensor, giúp L4 trở thành lựa chọn lý tưởng cho các mô hình có 270 triệu tham số như Gemma
  • Bộ nhớ: Bộ nhớ hệ thống 16 GB để xử lý việc tải mô hình, các thao tác CUDA và hoạt động quản lý bộ nhớ của Ollama
  • CPU: 8 lõi để xử lý I/O và các tác vụ tiền xử lý tối ưu
  • Đồng thời: 4 yêu cầu cho mỗi phiên bản giúp cân bằng thông lượng với mức sử dụng bộ nhớ GPU
  • Thời gian chờ: 600 giây để đáp ứng việc tải mô hình ban đầu và khởi động vùng chứa

💰 Cân nhắc chi phí: Các phiên bản GPU đắt hơn đáng kể so với các phiên bản chỉ có CPU (khoảng 2 – 4 USD/giờ so với khoảng 0,1 USD/giờ). Chế độ cài đặt --max-instances 1 giúp kiểm soát chi phí bằng cách ngăn chặn việc mở rộng quy mô phiên bản GPU không cần thiết.

  1. Đợi quá trình triển khai hoàn tất và ghi lại URL của dịch vụ:
    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. Triển khai tính năng tích hợp ADK Agent

Bây giờ, hãy tạo một tác nhân ADK tối thiểu kết nối với Gemma backend mà bạn đã triển khai.

  1. Chuyển đến thư mục nhân viên hỗ trợ ADK:
    cd ../adk-agent
    
  2. Mở và triển khai cấu hình tác nhân:
    cloudshell edit production_agent/agent.py
    
    Thay thế tất cả chú thích TODO bằng cách triển khai tối giản này:
    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
    
    🔧 Chức năng của chế độ này:
    • Kết nối với Gemma backend đã triển khai thông qua LiteLlm
    • Tạo một tác nhân đàm thoại đơn giản
    • Định cấu hình chế độ tích hợp với Google Cloud
  3. Mở và triển khai máy chủ FastAPI:
    cloudshell edit server.py
    
    Thay thế tất cả bình luận TODO bằng:
    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")
    
    🔧 Chức năng của chế độ này:
    • Tạo một máy chủ FastAPI có tích hợp ADK
    • Bật giao diện web để kiểm thử
    • Cung cấp các điểm cuối kiểm tra tình trạng
  4. Mở và triển khai Dockerfile:
    cloudshell edit Dockerfile
    
    Thay thế tất cả bình luận TODO bằng:
    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"]
    
    Giải thích về các lựa chọn công nghệ:
    • uv: Trình quản lý gói Python hiện đại, nhanh hơn pip từ 10 đến 100 lần. Công cụ này sử dụng bộ nhớ đệm chung và các lượt tải song song, giúp giảm đáng kể thời gian tạo vùng chứa
    • Python 3.13-slim: Phiên bản Python mới nhất với các phần phụ thuộc tối thiểu của hệ thống, giúp giảm kích thước vùng chứa và bề mặt tấn công
    • Bản dựng nhiều giai đoạn: Việc sao chép uv từ hình ảnh chính thức của nó đảm bảo chúng ta có được tệp nhị phân được tối ưu hoá mới nhất

9. Định cấu hình môi trường và triển khai tác nhân

Bây giờ, chúng ta sẽ định cấu hình tác nhân ADK để kết nối với Gemma phụ trợ đã triển khai và triển khai tác nhân này dưới dạng một dịch vụ Cloud Run. Việc này bao gồm thiết lập các biến môi trường và triển khai tác nhân với cấu hình phù hợp.

  1. Thiết lập cấu hình môi trường:
    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
    

Tìm hiểu về các biến môi trường trong Cloud Run

Biến môi trường là các cặp khoá-giá trị giúp định cấu hình ứng dụng của bạn trong thời gian chạy. Các chỉ số này đặc biệt hữu ích cho:

  • Điểm cuối API và URL dịch vụ (chẳng hạn như phụ trợ Ollama của chúng tôi)
  • Cấu hình thay đổi giữa các môi trường (phát triển, dàn dựng, sản xuất)
  • Dữ liệu nhạy cảm không nên được mã hoá cứng

Triển khai tác nhân 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

⚙️ Cấu hình chính:

  • Tự động mở rộng quy mô: Cố định ở 1 phiên bản (xử lý yêu cầu đơn giản)
  • Tính đồng thời: 10 yêu cầu trên mỗi phiên bản
  • Bộ nhớ: 4 GB cho tác nhân ADK
  • Môi trường: Kết nối với phần phụ trợ Gemma

🔒 Lưu ý về bảo mật: Để đơn giản, lớp học lập trình này sử dụng --allow-unauthenticated. Trong quá trình sản xuất, hãy triển khai phương thức xác thực phù hợp bằng cách sử dụng:

  • Xác thực dịch vụ với dịch vụ Cloud Run bằng tài khoản dịch vụ
  • Chính sách Quản lý danh tính và quyền truy cập (IAM)
  • Khoá API hoặc OAuth để truy cập bên ngoài
  • Cân nhắc sử dụng gcloud run services add-iam-policy-binding để kiểm soát quyền truy cập

Lấy URL dịch vụ của nhân viên hỗ trợ:

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

echo "🎉 ADK Agent deployed at: $AGENT_URL"

✅ Các phương pháp hay nhất về biến môi trường dựa trên tài liệu về biến môi trường Cloud Run:

  1. Tránh các biến dành riêng: Đừng đặt PORT (Cloud Run sẽ tự động đặt biến này) hoặc các biến bắt đầu bằng X_GOOGLE_
  2. Sử dụng tên mô tả: Thêm tiền tố vào các biến để tránh xung đột (ví dụ: GEMMA_MODEL_NAME thay vì MODEL)
  3. Thoát dấu phẩy: Nếu giá trị của bạn có chứa dấu phẩy, hãy sử dụng dấu phân cách khác: --set-env-vars "^@^KEY1=value1,value2@KEY2=..."
  4. Cập nhật so với Thay thế: Sử dụng --update-env-vars để thêm/thay đổi các biến cụ thể mà không ảnh hưởng đến các biến khác

Cách thiết lập biến trong Cloud Run:

  • Từ tệp: gcloud run deploy SERVICE_NAME --env-vars-file .env --labels dev-tutorial codelab-adk (tải nhiều biến từ một tệp)
  • Nhiều cờ: Lặp lại --set-env-vars cho các giá trị phức tạp không thể phân tách bằng dấu phẩy

10. Kiểm thử bằng Giao diện web ADK

Sau khi triển khai cả hai dịch vụ, bạn cần xác thực rằng tác nhân ADK có thể giao tiếp thành công với phụ trợ Gemma được tăng tốc bằng GPU và phản hồi các truy vấn của người dùng.

  1. Kiểm thử điểm cuối về tình trạng:
    curl $AGENT_URL/health
    
    Bạn sẽ thấy:
    { "status": "healthy", "service": "production-adk-agent" }
    
  2. Tương tác với tác nhân bằng cách nhập URL cho production-adk-agent vào một thẻ trình duyệt mới. Bạn sẽ thấy giao diện web ADK.
  3. Hãy thử nghiệm nhân viên hỗ trợ của bạn bằng những cuộc trò chuyện mẫu sau:
    • "Gấu trúc đỏ thường ăn gì trong tự nhiên?"
    • "Bạn có thể cho tôi biết một thông tin thú vị về báo tuyết không?"
    • "Tại sao ếch phi tiêu độc lại có màu sắc tươi sáng?"
    • "Tôi có thể tìm thấy chú kangaroo con mới ở đâu trong vườn thú?"
    👀 Những điều cần quan sát:
    • Nhân viên hỗ trợ sẽ phản hồi bằng mô hình Gemma mà bạn đã triển khai. Bạn có thể xác minh điều này bằng cách quan sát nhật ký cho dịch vụ Gemma đã triển khai. Chúng ta sẽ làm việc này trong phần tiếp theo
    • Câu trả lời được tạo bằng phần phụ trợ tăng tốc GPU
    • Giao diện web mang lại trải nghiệm trò chuyện rõ ràng

Kiểm thử ADK trong phòng thí nghiệm 3

11. Triển khai và chạy kiểm thử tải

Thử nghiệm tải phòng thí nghiệm 3

Để hiểu cách hoạt động triển khai sản xuất của bạn xử lý lưu lượng truy cập thực tế, chúng tôi sẽ triển khai quy trình kiểm thử tải toàn diện để kích hoạt tính năng tự động mở rộng quy mô trên cả tác nhân ADK và các dịch vụ phụ trợ GPU.

  1. Mở và triển khai tập lệnh kiểm thử tải:
    cloudshell edit load_test.py
    
    Thay thế chú thích TODO bằng:
    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")
    
    🔧 Chức năng của chế độ này:
    • Tạo phiên: Sử dụng đúng định dạng API ADK với POST đến /apps/production_agent/users/{user_id}/sessions/{session_id}. Sau khi tạo session_iduser_id, bạn có thể gửi yêu cầu đến tác nhân.
    • Định dạng thông báo: Tuân theo quy cách ADK với app_name, user_id, session_id và đối tượng có cấu trúc new_message
    • Điểm cuối của cuộc trò chuyện: Sử dụng điểm cuối /run để thu thập tất cả sự kiện cùng một lúc (nên dùng cho kiểm thử tải)
    • Realistic Load (Tải thực tế): Tạo tải đàm thoại với thời gian chờ ngắn hơn để kích hoạt tính năng tự động mở rộng quy mô
    📚 Để biết thêm thông tin về các điểm cuối API ADK và mẫu kiểm thử, hãy xem Hướng dẫn kiểm thử ADK.
  2. Cài đặt các phần phụ thuộc:
    uv sync
    pip install locust
    
  3. Locust là một công cụ kiểm thử tải mã nguồn mở, dựa trên Python, được thiết kế để kiểm thử hiệu suất và tải của các ứng dụng web và các hệ thống khác. Đặc điểm chính của công cụ này là các tình huống kiểm thử và hành vi của người dùng được xác định bằng mã Python tiêu chuẩn, mang lại tính linh hoạt và khả năng biểu đạt cao so với những công cụ dựa vào giao diện người dùng đồ hoạ hoặc ngôn ngữ dành riêng cho miền. Chúng ta sẽ sử dụng Locust để mô phỏng lưu lượng truy cập của người dùng vào các dịch vụ của mình.Chạy kiểm thử tải.
    # Run a load test to trigger autoscaling
    locust -f load_test.py \
       -H $AGENT_URL \
       --headless \
       -t 50s \
       -u 3 \
       -r 1
    
    Hãy thử thay đổi các tham số trong bài kiểm thử và quan sát kết quả. Bạn sẽ nhận thấy số lượng ollama-gemma3-270m-gpu tăng đột biến lên 2-3 trường hợp. 📊 Các tham số kiểm thử tải:
    • Thời lượng: 50 giây
    • Người dùng: 3 người dùng đồng thời
    • Tốc độ tạo: 1 người dùng/giây
    • Mục tiêu: Kích hoạt tính năng tự động mở rộng quy mô trên cả hai dịch vụ

12. Quan sát hành vi của tính năng AutoScaling

Khi kiểm thử tải chạy, bạn sẽ có thể quan sát tính năng tự động mở rộng quy mô của Cloud Run đang hoạt động. Đây là nơi bạn sẽ thấy những lợi ích chính về cấu trúc khi tách tác nhân ADK khỏi phần phụ trợ GPU.

Trong quá trình kiểm thử tải, hãy theo dõi cách cả hai dịch vụ Cloud Run mở rộng quy mô trong bảng điều khiển.

  1. Trong Cloud Console, hãy chuyển đến:
    • Cloud Run → production-adk-agent → Metrics
    • Cloud Run → ollama-gemma3-270m-gpu → Metrics

👀 Những điều bạn nên quan sát:

🤖 Dịch vụ tác nhân ADK:

  • Vẫn giữ nguyên ở 1 phiên bản trong khi lưu lượng truy cập tăng lên
  • Mức sử dụng CPU và bộ nhớ tăng đột biến trong thời gian có lưu lượng truy cập cao
  • Xử lý việc quản lý phiên và định tuyến yêu cầu một cách hiệu quả

🎮 Dịch vụ phụ trợ Gemma (Điểm tắc nghẽn):

  • Mở rộng quy mô từ 1 đến 3 phiên bản dựa trên nhu cầu suy luận
  • Mức sử dụng GPU tăng đáng kể khi chịu tải
  • Dịch vụ này trở thành điểm tắc nghẽn do suy luận mô hình chuyên sâu về GPU
  • Thời gian suy luận mô hình vẫn nhất quán nhờ tính năng tăng tốc GPU

💡 Thông tin chi tiết chính:

  • Phần phụ trợ GPU là điểm tắc nghẽn và mở rộng quy mô mạnh mẽ hơn (1-3 phiên bản)
  • Tác nhân ADK vẫn nhất quán
  • Cả hai dịch vụ đều mở rộng quy mô độc lập dựa trên đặc điểm tải riêng của chúng
  • Tính năng tự động mở rộng quy mô giúp duy trì hiệu suất trong các điều kiện tải khác nhau

13. Kết luận

Xin chúc mừng! Bạn đã triển khai thành công một tác nhân ADK sẵn sàng cho sản xuất với phần phụ trợ Gemma được tăng tốc bằng GPU và quan sát thấy hành vi tự động mở rộng quy mô.

✅ Thành tích bạn đạt được

  • ✅ Triển khai một phần phụ trợ mô hình Gemma được tăng tốc bằng GPU trên Cloud Run
  • ✅ Tạo và triển khai một tác nhân ADK tích hợp với phần phụ trợ Gemma
  • ✅ Đã kiểm thử tác nhân bằng giao diện web ADK
  • ✅ Quan sát hành vi tự động mở rộng quy mô trên 2 dịch vụ Cloud Run phối hợp

💡 Thông tin chi tiết chính từ lớp học này

  1. 🎮 Tăng tốc bằng GPU: GPU NVIDIA L4 cải thiện đáng kể hiệu suất suy luận mô hình
  2. 🔗 Điều phối dịch vụ: Hai dịch vụ Cloud Run có thể phối hợp hoạt động một cách liền mạch
  3. 📈 Mở rộng quy mô độc lập: Mỗi dịch vụ mở rộng quy mô dựa trên đặc điểm tải riêng
  4. 🚀 Mức độ sẵn sàng phát hành công khai: Cấu trúc xử lý hiệu quả các mẫu lưu lượng truy cập trong thế giới thực

🔄 Các bước tiếp theo

  • Thử nghiệm nhiều mẫu tải và quan sát hành vi mở rộng quy mô
  • Thử các kích thước mô hình Gemma khác nhau (điều chỉnh bộ nhớ và GPU cho phù hợp)
  • Triển khai tính năng giám sát và cảnh báo cho các quy trình triển khai sản xuất
  • Khám phá các hoạt động triển khai ở nhiều khu vực để có phạm vi cung cấp trên toàn cầu

🧹 Dọn dẹp

Để tránh bị tính phí, hãy xoá các tài nguyên khi bạn hoàn tất:

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

📖 Tài nguyên