실습 3: 프로토타입에서 프로덕션으로 - GPU를 사용하여 ADK 에이전트를 Cloud Run에 배포

1. 소개

개요

이 실습에서는 GPU로 가속화된 Gemma 백엔드를 사용하여 프로덕션 지원 에이전트 개발 키트 (ADK) 에이전트를 배포합니다. 중점은 GPU 지원 Cloud Run 서비스 설정, ADK 에이전트와 모델 백엔드 통합, 부하 상태에서의 자동 확장 동작 관찰과 같은 중요한 배포 패턴에 있습니다.

실습할 내용

이 실습에서는 다음과 같은 중요한 프로덕션 배포 측면에 중점을 둡니다.

  1. GPU를 사용하여 Gemma를 Cloud Run에 배포 - 고성능 Gemma 모델 백엔드 설정
  2. ADK 에이전트와 Gemma 배포 통합 - 에이전트를 GPU 가속 모델에 연결
  3. ADK 웹 인터페이스로 테스트 - 대화형 에이전트가 올바르게 작동하는지 확인합니다.
  4. 부하 테스트 실행 - 부하가 가해질 때 두 Cloud Run 인스턴스가 모두 자동 확장되는지 확인합니다.

광범위한 에이전트 개발보다는 프로덕션 배포 패턴에 중점을 둡니다.

학습할 내용

  • 프로덕션용으로 GPU 가속 Gemma 모델을 Cloud Run에 배포
  • 외부 모델 배포를 ADK 에이전트와 통합
  • 프로덕션 환경에서 바로 사용할 수 있는 AI 에이전트 배포 구성 및 테스트
  • 부하가 걸린 상태에서 Cloud Run 자동 확장 동작 이해
  • 트래픽 급증 시 여러 Cloud Run 인스턴스가 어떻게 조정되는지 관찰
  • 부하 테스트를 적용하여 성능 및 자동 확장 검증

2. 프로젝트 설정

  1. 아직 Google 계정이 없다면 Google 계정을 만들어야 합니다.
    • 직장 또는 학교 계정 대신 개인 계정을 사용하세요. 직장 및 학교 계정에는 이 실습에 필요한 API를 사용 설정하지 못하도록 하는 제한이 있을 수 있습니다.
  2. Google Cloud 콘솔에 로그인합니다.
  3. Cloud 콘솔에서 결제를 사용 설정합니다.
    • 이 실습을 완료하는 데 드는 Cloud 리소스 비용은 미화 1달러 미만입니다.
    • 이 실습이 끝나면 단계에 따라 리소스를 삭제하여 추가 요금이 발생하지 않도록 할 수 있습니다.
    • 신규 사용자는 미화$300 상당의 무료 체험판을 사용할 수 있습니다.
  4. 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다.

3. Cloud Shell 편집기 열기

  1. 이 링크를 클릭하여 Cloud Shell 편집기로 바로 이동합니다.
  2. 오늘 언제든지 승인하라는 메시지가 표시되면 승인을 클릭하여 계속합니다. 클릭하여 Cloud Shell 승인
  3. 터미널이 화면 하단에 표시되지 않으면 다음을 실행하여 엽니다.
    • 보기를 클릭합니다.
    • 터미널을 클릭합니다.Cloud Shell 편집기에서 새 터미널 열기
  4. 터미널에서 다음 명령어를 사용하여 프로젝트를 설정합니다.
    • 형식:
      gcloud config set project [PROJECT_ID]
      
    • 예:
      gcloud config set project lab-project-id-example
      
    • 프로젝트 ID를 기억할 수 없는 경우 다음 단계를 따르세요.
      • 다음 명령어를 사용하여 모든 프로젝트 ID를 나열할 수 있습니다.
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      Cloud Shell 편집기 터미널에서 프로젝트 ID 설정
  5. 다음 메시지가 표시되어야 합니다.
    Updated property [core/project].
    
    WARNING이 표시되고 Do you want to continue (Y/n)?이 표시되면 프로젝트 ID를 잘못 입력했을 수 있습니다. n를 누르고 Enter를 누른 후 gcloud config set project 명령어를 다시 실행해 보세요.

4. API 사용 설정 및 기본 리전 설정

GPU 지원을 사용하여 Cloud Run 서비스를 배포하려면 필요한 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 백엔드와 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서비스 아키텍처를 이해해 보겠습니다.

실습 3 2개 서비스 아키텍처

핵심 통계: 부하 테스트 중에 두 서비스가 독립적으로 확장되는 것을 확인할 수 있습니다. GPU 백엔드 (병목 서비스)는 추론 부하에 따라 1~3개의 인스턴스로 확장되는 반면 ADK 에이전트는 요청 처리를 위해 1개의 인스턴스로 유지됩니다.

7. GPU를 사용하여 Gemma 백엔드를 Cloud Run에 배포

실습 3 Gemma 서비스

첫 번째 중요한 단계는 ADK 에이전트의 두뇌 역할을 할 GPU 가속 Gemma 모델을 배포하는 것입니다. 분리되고 배포된 LLM은 별도의 미세 조정된 모델이 필요하거나 격리된 확장 기능이 필요한 아키텍처에서 유용할 수 있습니다.

  1. Ollama 백엔드 디렉터리로 이동합니다.
    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 이미지를 기반으로 사용
    • 모든 IP 주소의 연결을 허용하도록 OLLAMA_HOST를 설정합니다.
    • 포트 8080을 노출합니다.
  3. GPU 지원을 사용하여 Gemma 백엔드를 배포합니다.
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 저장소가 필요합니다. '[europe-west1] 리전에 [cloud-run-source-deploy] 라는 저장소가 생성됩니다.'라는 메시지가 표시되면 계속합니다.

⚙️ 주요 구성 설명:

  • GPU: 추론 워크로드에 대한 뛰어난 가격 대비 성능을 제공하는 NVIDIA L4가 선택되었습니다. L4는 24GB GPU 메모리와 최적화된 텐서 작업을 제공하므로 Gemma와 같은 2억 7천만 개의 매개변수 모델에 적합합니다.
  • 메모리: 모델 로드, CUDA 작업, Ollama의 메모리 관리를 처리하는 16GB 시스템 메모리
  • CPU: 최적의 I/O 처리 및 전처리 작업을 위한 8코어
  • 동시성: 인스턴스당 4개의 요청은 처리량과 GPU 메모리 사용량의 균형을 유지합니다.
  • 제한 시간: 초기 모델 로드 및 컨테이너 시작을 수용하는 600초

💰 비용 고려사항: GPU 인스턴스는 CPU 전용 인스턴스보다 훨씬 비쌉니다 (시간당 ~$2~4 vs 시간당 ~$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 에이전트 통합 구현

이제 배포된 Gemma 백엔드에 연결되는 최소 ADK 에이전트를 만들어 보겠습니다.

  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")
    
    🔧 기능:
    • ADK 통합으로 FastAPI 서버를 만듭니다.
    • 테스트를 위한 웹 인터페이스를 사용 설정합니다.
    • 상태 점검 엔드포인트를 제공합니다.
  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: pip보다 10~100배 빠른 최신 Python 패키지 관리자입니다. 전역 캐시와 병렬 다운로드를 사용하여 컨테이너 빌드 시간을 크게 줄입니다.
    • Python 3.13-slim: 최소한의 시스템 종속 항목이 있는 최신 Python 버전으로, 컨테이너 크기와 공격 표면을 줄입니다.
    • 다단계 빌드: 공식 이미지에서 uv를 복사하면 최신 최적화 바이너리를 가져올 수 있습니다.

9. 환경 구성 및 에이전트 배포

이제 배포된 Gemma 백엔드에 연결하도록 ADK 에이전트를 구성하고 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 백엔드)
  • 환경 (개발, 스테이징, 프로덕션) 간에 변경되는 구성
  • 하드 코딩하면 안 되는 민감한 정보

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개
  • 메모리: ADK 에이전트용 4GB
  • 환경: Gemma 백엔드에 연결

🔒 보안 참고사항: 이 실습에서는 편의상 --allow-unauthenticated를 사용합니다. 프로덕션에서는 다음을 사용하여 적절한 인증을 구현하세요.

  • 서비스 계정을 사용한 Cloud Run 서비스 간 인증
  • ID 및 액세스 관리 (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. 설명적인 이름 사용: 충돌을 방지하기 위해 변수에 접두사를 추가합니다 (예: MODEL 대신 GEMMA_MODEL_NAME)
  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 에이전트가 GPU 가속 Gemma 백엔드와 성공적으로 통신하고 사용자 쿼리에 응답할 수 있는지 확인합니다.

  1. 상태 엔드포인트를 테스트합니다.
    curl $AGENT_URL/health
    
    다음과 같이 표시됩니다.
    { "status": "healthy", "service": "production-adk-agent" }
    
  2. 새 브라우저 탭에 production-adk-agent의 URL을 입력하여 에이전트와 상호작용합니다. ADK 웹 인터페이스가 표시됩니다.
  3. 다음 샘플 대화로 에이전트를 테스트하세요.
    • "레서판다는 야생에서 주로 무엇을 먹나요?"
    • "눈표범에 관한 흥미로운 사실을 알려 줘."
    • '화살개구리는 왜 이렇게 화려한 색을 띠고 있어?'
    • '동물원에서 새 아기 캥거루는 어디에서 볼 수 있어?'
    👀 관찰할 내용:
    • 에이전트가 배포된 Gemma 모델을 사용하여 응답합니다. 배포된 Gemma 서비스의 로그를 관찰하여 이를 확인할 수 있습니다. 다음 섹션에서 이 작업을 수행합니다.
    • GPU 가속 백엔드에서 대답을 생성합니다.
    • 웹 인터페이스는 깔끔한 채팅 환경을 제공합니다.

실습 3 ADK 테스트

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")
    
    🔧 기능:
    • 세션 생성: /apps/production_agent/users/{user_id}/sessions/{session_id}에 POST를 사용하여 적절한 ADK API 형식을 사용합니다. session_iduser_id를 만든 후 에이전트에 요청할 수 있습니다.
    • 메시지 형식: app_name, user_id, session_id, 구조화된 new_message 객체를 사용하여 ADK 사양을 따름
    • 대화 엔드포인트: /run 엔드포인트를 사용하여 모든 이벤트를 한 번에 수집합니다 (부하 테스트에 권장).
    • 실제 로드: 대화형 로드를 만들어 대기 시간을 단축하여 자동 확장을 트리거합니다.
    📚 ADK API 엔드포인트 및 테스트 패턴에 관한 자세한 내용은 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명
    • 대상: 두 서비스 모두에서 자동 확장 트리거

12. AutoScaling 동작 관찰

부하 테스트가 실행되면 Cloud Run의 자동 확장이 작동하는 것을 확인할 수 있습니다. 여기에서 ADK 에이전트를 GPU 백엔드에서 분리할 때의 주요 아키텍처 이점을 확인할 수 있습니다.

부하 테스트 중에 콘솔에서 두 Cloud Run 서비스가 확장되는 방식을 모니터링합니다.

  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개).
  • ADK 에이전트가 일관되게 유지됨
  • 두 서비스 모두 개별 부하 특성에 따라 독립적으로 확장됩니다.
  • 자동 확장은 다양한 부하 조건에서 성능을 유지하는 데 도움이 됩니다.

13. 결론

축하합니다. GPU 가속 Gemma 백엔드를 사용하여 프로덕션 지원 ADK 에이전트를 배포하고 자동 확장 동작을 관찰했습니다.

✅ 달성한 내용

  • ✅ Cloud Run에 GPU 가속 Gemma 모델 백엔드 배포
  • ✅ Gemma 백엔드와 통합되는 ADK 에이전트를 만들고 배포했습니다.
  • ✅ ADK 웹 인터페이스를 사용하여 에이전트를 테스트했습니다.
  • ✅ 두 개의 조정된 Cloud Run 서비스에서 자동 확장 동작이 관찰됨

💡 이 실습의 주요 내용

  1. 🎮 GPU 가속: NVIDIA L4 GPU는 모델 추론 성능을 크게 향상합니다.
  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

📖 리소스