목록으로

Programming Notes

Azure Container Apps 서버리스 GPU 기반의 Gemma 4

호스팅된 AI 서비스에 보내는 모든 프롬프트는 사용자가 관리하는 테넌트(Tenant)를 벗어납니다. 작성한 코드, 아키텍처 결정 사항, 독점적인 로직 등 모든 데이터가 제어할 수 없는 네트워크 경계를 넘나들게 됩니다. 규제가 엄격한 산업군에서 일하거나 민감한 지적 재산(IP)을 다루는 팀에게 이것은 단순한 철학적 고민이 아닙니다. 바로 컴플라이언스 준수의 핵심적인 걸림돌입니다.

만약 단 한 번의 명령어로 여러분의 Azure 구독 내 GPU에서 실행되는, 완전히 프라이빗한 AI 코딩 에이전트를 구축할 수 있다면 어떨까요?

이 템플릿이 바로 그 역할을 합니다. 단 한 번의 azd up, 15분이면 Google의 Gemma 4가 Azure Container Apps(ACA) 서버less GPU에서 실행됩니다. 인증 기능으로 보호되는 OpenAI 호환 API를 갖추고, 터미널 기반 코딩 에이전트인 OpenCode를 지원할 준비를 마칩니다. 어떤 데이터도 환경 외부로 나가지 않습니다. 제3자 모델 제공업체는 여러분의 코드를 볼 수 없습니다. 모든 것은 여러분의 통제 하에 있습니다.

왜 ACA에서 AI를 자체 호스팅해야 할까요?

Azure Container Apps 서버리스 GPU를 사용하면 VM, Kubernetes 클러스터 또는 GPU 드라이버를 직접 관리할 필요 없이 온디맨드 GPU 컴퓨팅을 사용할 수 있습니다. 컨테이너, GPU, HTTPS 엔드포인트만 있으면 나머지는 Azure가 알아서 처리합니다.

이 방식이 일반적인 호스팅 모델 API를 호출하는 것과 다른 점은 다음과 같습니다.

  • 완벽한 데이터 프라이버시 — 코드와 프롬프트가 Azure 구독을 절대 벗어나지 않습니다. 개인정보(PII) 노출, 데이터 유출, 제3자 데이터 처리 위험이 없습니다. HIPAA, SOC 2 또는 내부 IP 정책을 준수해야 하는 팀에게 이는 가장 간단한 보안 AI 개발 경로입니다.
  • 예측 가능한 비용 — 토큰당 비용이 아니라 GPU 컴퓨팅 시간만큼만 비용을 지불합니다. 배포된 모델에 대해 원하는 만큼 프롬프트를 실행하세요.
  • 속도 제한(Rate Limits) 없음 — GPU는 여러분의 소유입니다. 쓰로틀링도, 대기열도, 용량 확보를 기다릴 필요도 없습니다.
  • 유연한 모델 선택 — 몇 분 만에 모델을 교체할 수 있습니다. 빠른 반복 작업을 위해 4B 파라미터의 Gemma 4로 시작했다가, 복잡한 추론 작업이 필요할 때 26B로 확장할 수 있습니다.

이것은 편리함과 프라이버시 사이의 타협이 아닙니다. ACA 서버리스 GPU를 사용하면 자체 호스팅 AI를 SaaS 엔드포인트만큼 쉽게 배포하면서도 데이터 주권은 그대로 유지할 수 있습니다.

구축 내용

Gemma 4 + Ollama를 ACA 서버리스 GPU에서 안전하게 실행하기 위한 구성도

이 템플릿은 Azure Container Apps 환경에 두 개의 컨테이너를 배포합니다.

  1. Ollama + Gemma 4 — 서버리스 GPU(NVIDIA T4 또는 A100)에서 실행되며 OpenAI 호환 API를 제공합니다.
  2. Nginx 인증 프록시 — 기본 인증(Basic Auth)을 추가하고 HTTPS를 통해 엔드포인트를 노출하는 가벼운 리버스 프록시입니다.

Ollama 컨테이너는 첫 실행 시 Gemma 4 모델을 가져오므로 미리 빌드하거나 업로드할 필요가 없습니다. Nginx 프록시는 무료 컨셉션(Consumption) 프로필에서 실행되며, Ollama 컨테이너만 GPU를 사용합니다.

배포가 완료되면 curl, 모든 OpenAI 호환 SDK 또는 프라이빗 GitHub Copilot 대안인 터미널 기반 AI 코딩 에이전트 OpenCode와 함께 사용할 수 있는 단일 HTTPS 엔드포인트가 생성됩니다.

1단계: azd up으로 배포하기

Azure CLIAzure Developer CLI (azd)가 설치되어 있어야 합니다.

git clone https://github.com/simonjj/gemma4-on-aca.git
cd gemma4-on-aca
azd up

설정 과정에서 세 가지 선택 사항을 묻습니다.

GPU 선택 — 소형 모델을 위한 T4(16GB VRAM) 또는 전체 Gemma 4 라인업을 위한 A100(80GB VRAM) 중에서 선택합니다.

모델 선택 — 선택한 GPU에 따라 달라집니다. 기본값은 각 GPU 등급에서 최적의 품질 대비 속도 비율을 갖도록 튜닝되어 있습니다.

프록시 비밀번호 — 기본 인증으로 엔드포인트를 보호하기 위한 비밀번호입니다.

사용 가능한 지역: 서버리스 GPU는 australiaeast, brazilsouth, canadacentral, eastus, italynorth, swedencentral, uksouth, westus, westus3다양한 지역에서 사용할 수 있습니다. 위치를 선택할 때 이 중 하나를 고르세요.

그게 전부입니다. 프로비저닝에는 약 10분 정도 소요되며, 대부분은 ACA 환경 생성과 모델 다운로드를 기다리는 시간입니다.

배포 결과 화면

모델 선택하기

Gemma 4는 네 가지 크기로 제공됩니다. GPU와 작업 부하에 맞는 모델을 선택하세요.

모델 파라미터 아키텍처 컨텍스트 모달리티 디스크 크기
gemma4:e2b ~2B Dense 128K 텍스트, 이미지, 오디오 ~7 GB
gemma4:e4b ~4B Dense 128K 텍스트, 이미지, 오디오 ~10 GB
gemma4:26b 26B MoE (4B active) 256K 텍스트, 이미지 ~18 GB
gemma4:31b 31B Dense 256K 텍스트, 이미지 ~20 GB

ACA 실제 성능 측정 결과

Sweden Central 지역에서 Ollama v0.20(Q4_K_M 양자화 및 32K 컨텍스트)을 사용하여 두 GPU 등급의 모든 모델을 벤치마킹했습니다.

모델 GPU 토큰/초 TTFT 비고
gemma4:e2b T4 ~81 ~15ms T4에서 가장 빠름
gemma4:e4b T4 ~51 ~17ms T4 권장 선택 — 최적의 품질/속도
gemma4:e2b A100 ~184 ~9ms 매우 빠름
gemma4:e4b A100 ~129 ~12ms 가벼운 작업에 적합
gemma4:26b A100 ~113 ~14ms A100 권장 선택 — 강력한 추론 능력
gemma4:31b A100 ~40 ~30ms 최고 품질, 속도는 느림

T4에서 4B 모델로 초당 51개 토큰을 생성하는 속도는 대화형 코딩 지원에 충분히 빠릅니다. A100에서 26B 모델은 초당 113개 토큰을 생성하며 훨씬 뛰어난 추론 능력을 보여줍니다. 복잡한 리팩토링, 아키텍처 질문, 다중 파일 변경 작업에 이상적입니다.

26B 및 31B 모델은 T4의 16GB VRAM에 들어가지 않으므로 A100이 필요합니다.

2단계: 엔드포인트 확인

azd up이 완료되면 포스트 프로비저닝 훅이 엔드포인트 URL을 출력합니다. 테스트해 보세요.

curl -u admin:<YOUR_PASSWORD> \
  https://<YOUR_PROXY_ENDPOINT>/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemma4:e4b",
    "messages": [{"role": "user", "content": "Hello!"}]
  }'

Gemma 4의 응답이 포함된 JSON 결과를 받게 됩니다. 이 엔드포인트는 완전히 OpenAI와 호환되므로, OpenAI API 형식을 지원하는 모든 도구나 SDK에서 작동합니다.

3단계: OpenCode 연결

이제 진정한 힘을 발휘할 차례입니다. OpenCode는 터미널 기반 AI 코딩 에이전트입니다. GitHub Copilot과 비슷하지만, 터미널에서 실행되며 사용자가 선택한 모델 백엔드를 가리킬 수 있습니다.

azd up 포스트 프로비저닝 훅은 올바른 엔드포인트와 자격 증명이 포함된 opencode.json을 프로젝트 디렉토리에 자동으로 생성합니다. 수동으로 생성해야 하는 경우의 예시는 다음과 같습니다.

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "gemma4-aca": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Gemma 4 on ACA",
      "options": {
        "baseURL": "https://<YOUR_PROXY_ENDPOINT>/v1",
        "headers": {
          "Authorization": "Basic <BASE64_OF_admin:YOUR_PASSWORD>"
        }
      },
      "models": {
        "gemma4:e4b": {
          "name": "Gemma 4 e4b (4B)"
        }
      }
    }
  }
}

Base64 값 생성: echo -n "admin:YOUR_PASSWORD" | base64

이제 실행해 보세요.

opencode run -m "gemma4-aca/gemma4:e4b" "Write a binary search in Rust"

이 명령은 프롬프트를 ACA GPU에서 실행 중인 Gemma 4로 보내고 응답을 터미널로 스트리밍합니다. 모든 토큰은 여러분의 인프라에서 생성됩니다. 구독 외부로 나가는 데이터는 전혀 없습니다.

대화형 세션을 원하시면 TUI를 실행하세요.

opencode

/models 명령으로 모델을 선택하고, Gemma 4를 골라 코딩을 시작하세요. OpenCode는 파일 편집, 코드 생성, 리팩토링, 멀티턴 대화를 지원하며 이 모든 기능은 프라이빗한 Gemma 4 인스턴스에 의해 구동됩니다.

프라이버시가 중요한 이유

이 솔루션은 코드를 외부 API로 보낼 수 없는 팀에게 가장 중요합니다.

  • HIPAA 규제 의료 앱 — 코드, 스키마 정의 및 테스트 픽스처에 포함된 환자 데이터가 Azure 구독 내에 머뭅니다.
  • 금융 서비스 — 독점적인 트레이딩 알고리즘과 리스크 모델이 네트워크 경계를 절대 벗어나지 않습니다.
  • 국방 및 정부 — 기밀 또는 CUI 관련 코드베이스가 외부 데이터 처리 계약 없이도 AI의 도움을 받을 수 있습니다.
  • 민감한 IP를 가진 스타트업 — AI를 사용하여 더 빠르게 빌드하는 동안에도 핵심 기술은 비밀로 유지됩니다.

ACA 서버리스 GPU를 사용하면 이러한 프라이버시를 확보하기 위해 VM을 관리하거나 Kubernetes 클러스터를 운영할 필요가 없습니다. GPU가 부착된 관리형 컨테이너일 뿐입니다. Azure가 인프라를 관리하고, 여러분은 데이터 경계를 소유합니다.

리소스 정리

작업을 마친 후에는 다음 명령어로 정리할 수 있습니다.

azd down

이 명령은 모든 Azure 리소스를 삭제합니다. ACA 서버리스 GPU는 컨테이너가 실행 중일 때만 비용을 청구하므로, 환경을 삭제하지 않고 비용을 일시 중지하려면 복제본(replicas)을 0으로 스케일링할 수도 있습니다.

시작하기

  • 📖 GitHub의 gemma4-on-aca — 클론하고 azd up을 실행하여 바로 시작하세요.
  • 🤖 OpenCode — Gemma 4 엔드포인트에 연결되는 터미널 AI 에이전트입니다.
  • 📌 Gemma 4 문서 — 모델 아키텍처 및 기능에 대해 알아보세요.
  • 📌 ACA 서버리스 GPU — GPU 지역 및 워크로드 프로필 상세 정보입니다.