Ollama를 사용하여 Cloud Run GPU에서 LLM 추론 실행


이 튜토리얼에서는 빠른 추론을 위해 GPU 지원 Cloud Run 서비스에 개방형 대규모 언어 모델(LLM)인 Google의 Gemma 2를 배포하는 방법을 알아봅니다.

개방형 모델용 LLM 추론 서버인 Ollama를 사용합니다. 튜토리얼을 완료한 후에는 Llama 3.1(8B), Mistral(7B), Qwen2(7B)를 비롯한 Ollama에서 지원하는 다른 개방형 모델도 자유롭게 살펴보세요.

목표

  • GPU 지원 Cloud Run 서비스에서 Gemma 2 모델을 사용하여 Ollama를 배포합니다.
  • 비공개 엔드포인트에서 Ollama 서비스에 메시지를 보냅니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Artifact Registry, Cloud Build, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  7. gcloud CLI를 설치하고 초기화합니다.
  8. 이 튜토리얼을 완료하려면 할당량 및 시스템 한도 페이지의 Cloud Run Admin API 아래에서 Total Nvidia L4 GPU allocation, per project per region 할당량을 요청합니다.

필요한 역할

튜토리얼을 완료하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

gcloud 설정

Cloud Run 서비스에 Google Cloud CLI를 구성하려면 다음 안내를 따르세요.

  1. 기본 프로젝트를 설정합니다.

    gcloud config set project PROJECT_ID

    아이콘을 클릭하여 PROJECT_ID 변수를 이 튜토리얼을 위해 만든 프로젝트 이름으로 바꿉니다. 이렇게 하면 이 페이지에서 PROJECT_ID를 참조하는 모든 등록정보에 올바른 값이 이미 입력됩니다.

  2. Cloud Run 명령어에 us-central1 리전을 사용하도록 Google Cloud CLI를 구성합니다.

    gcloud config set run/region us-central1

Artifact Registry Docker 저장소 만들기

이 튜토리얼의 컨테이너 이미지를 저장할 Docker 저장소를 만듭니다.

gcloud artifacts repositories create REPOSITORY \
  --repository-format=docker \
  --location=us-central1

REPOSITORY를 원본 이름으로 바꿉니다. 예를 들면 repo입니다.

Docker를 사용하여 Ollama 및 Gemma로 컨테이너 이미지 만들기

  1. Ollama 서비스용 디렉터리를 만들고 작업 디렉터리를 이 새 디렉터리로 변경합니다.

    mkdir ollama-backend
    cd ollama-backend
  2. Dockerfile 파일 만들기

    FROM ollama/ollama:0.3.6
    
    # 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 gemma2:9b
    RUN ollama serve & sleep 5 && ollama pull $MODEL 
    
    # Start Ollama
    ENTRYPOINT ["ollama", "serve"]

더 빠른 인스턴스 시작을 위해 컨테이너 이미지에 모델 가중치 저장

Gemma 2(9B) 및 비슷한 크기의 모델의 모델 가중치를 컨테이너 이미지에 직접 저장하는 것이 좋습니다.

모델 가중치는 LLM의 동작을 정의하는 수치 매개변수입니다. Ollama는 추론 요청 제공을 시작하기 전 컨테이너 인스턴스 시작 중 이러한 파일을 완전히 읽고 GPU 메모리(VRAM)에 가중치를 로드해야 합니다.

Cloud Run에서 요청 지연 시간을 최소화하려면 빠른 컨테이너 인스턴스 시작이 중요합니다. 컨테이너 인스턴스의 시작 시간이 느리면 서비스가 0에서 1개 인스턴스로 확장하는 데 더 오래 걸리고, 트래픽 급증 중에는 수평 확장하는 데 더 많은 시간이 필요합니다.

빠른 시작을 보장하기 위해 모델 파일을 컨테이너 이미지 자체에 저장합니다. 이렇게 하면 시작 중에 원격 위치에서 파일을 다운로드하는 것보다 빠르고 안정적입니다. Cloud Run의 내부 컨테이너 이미지 저장소는 트래픽 급증을 처리하도록 최적화되어 인스턴스가 시작될 때 컨테이너의 파일 시스템을 빠르게 설정할 수 있습니다.

Gemma 2(9B)의 모델 가중치는 스토리지 5.4GB를 차지합니다. 모델이 클수록 모델 가중치 파일이 더 커지며, 이러한 파일을 컨테이너 이미지에 저장하는 것은 실용적이지 않을 수 있습니다. 절충사항에 관한 개요는 권장사항: GPU를 사용하는 Cloud Run의 AI 추론을 참고하세요.

Cloud Build를 사용하여 컨테이너 이미지를 빌드합니다.

Cloud Build로 컨테이너 이미지를 빌드하고 Artifact Registry 저장소에 푸시하려면 다음 안내를 따르세요.

gcloud builds submit \
   --tag us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/ollama-gemma \
   --machine-type e2-highcpu-32

다음 사항을 참고하세요.

  • 이 명령어는 더 빠른 빌드를 위해 CPU 및 네트워크 대역폭이 더 많은 강력한 머신 유형을 선택합니다.
  • 빌드하는 데 약 7분이 소요됩니다.
  • 대안은 Docker를 사용하여 로컬로 이미지를 빌드하고 Artifact Registry로 푸시하는 것입니다. 네트워크 대역폭에 따라 Cloud Build에서 실행하는 것보다 속도가 느릴 수 있습니다.

Ollama를 Cloud Run 서비스로 배포

Artifact Registry 저장소에 컨테이너 이미지가 저장되었으므로 이제 Ollama를 Cloud Run 서비스로 배포할 수 있습니다.

전용 서비스 계정 만들기

Ollama 서비스에서 서비스 ID로 사용하는 전용 서비스 계정을 만듭니다.

gcloud iam service-accounts create OLLAMA_IDENTITY \
  --display-name="Service Account for Ollama Cloud Run service"

OLLAMA_IDENTITY를 만들려는 서비스 계정의 이름(예: ollama)으로 바꿉니다.

필요한 최소한의 권한 집합으로 모든 Cloud Run 서비스에 전용 서비스 계정을 만드는 것이 좋습니다. Ollama 서비스는 Google Cloud API를 호출할 필요가 없으므로 서비스 계정에 권한을 부여할 필요가 없습니다.

서비스 배포

Cloud Run에 서비스를 배포합니다.

gcloud beta run deploy ollama-gemma \
  --image us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/ollama-gemma \
  --concurrency 4 \
  --cpu 8 \
  --set-env-vars OLLAMA_NUM_PARALLEL=4 \
  --gpu 1 \
  --gpu-type nvidia-l4 \
  --max-instances 7 \
  --memory 32Gi \
  --no-allow-unauthenticated \
  --no-cpu-throttling \
  --service-account OLLAMA_IDENTITY@PROJECT_ID.iam.gserviceaccount.com \
  --timeout=600

이 명령어에서 다음과 같은 중요한 플래그에 유의하세요.

  • --concurrency 4는 환경 변수 OLLAMA_NUM_PARALLEL의 값과 일치하도록 설정됩니다.
  • --gpu-type nvidia-l4가 포함된 --gpu 1는 서비스의 모든 Cloud Run 인스턴스에 NVIDIA L4 GPU 1개를 할당합니다.
  • --no-allow-authenticated는 서비스에 대해 인증되지 않은 액세스를 제한합니다. 서비스를 비공개로 유지하면 서비스 간 통신에 Cloud Run에서 기본 제공하는 Identity and Access Management (IAM) 인증을 사용할 수 있습니다. IAM을 사용하여 액세스 관리를 참고하세요.
  • GPU를 사용 설정하려면 --no-cpu-throttling가 필요합니다.
  • --service-account는 해당 서비스의 서비스 ID를 설정합니다.

최적의 성능을 위한 동시 실행 설정

이 섹션에서는 권장되는 동시 실행 설정에 대한 컨텍스트를 제공합니다. 최적의 요청 지연 시간을 위해 --concurrency 설정이 Ollama의 OLLAMA_NUM_PARALLEL 환경 변수와 동일한지 확인합니다.

  • OLLAMA_NUM_PARALLEL는 추론 요청을 동시에 처리하기 위해 각 모델당 사용할 수 있는 요청 슬롯 수를 결정합니다.
  • --concurrency는 Cloud Run이 Ollama 인스턴스에 동시에 전송하는 요청 수를 결정합니다.

--concurrencyOLLAMA_NUM_PARALLEL을 초과하면 Cloud Run은 Ollama의 모델에 사용 가능한 요청 슬롯보다 더 많은 요청을 보낼 수 있습니다. 이로 인해 Ollama 내에서 요청 큐가 발생하여 큐에 추가된 요청에 대해 요청 지연 시간이 늘어납니다. 또한 대기열에 추가된 요청이 Cloud Run을 수평 확장하고 새 인스턴스를 시작하도록 트리거하지 않으므로 자동 확장의 응답성이 떨어집니다.

Ollama는 또한 하나의 GPU에서 여러 모델을 서빙하도록 지원합니다. Ollama 인스턴스에서 요청 큐를 완전히 방지하려면 여전히 OLLAMA_NUM_PARALLEL와 일치하도록 --concurrency를 설정해야 합니다.

OLLAMA_NUM_PARALLEL을 늘리면 동시 요청 시간이 더 오래 걸릴 수 있습니다.

사용률 최적화

최적의 GPU 사용률을 위해서는 --concurrency를 늘려서 OLLAMA_NUM_PARALLEL 값의 두 배 이내로 유지합니다. 이렇게 하면 Ollama에서 요청이 큐에 추가되지만 사용률을 개선하는 데 도움이 될 수 있습니다. Ollama 인스턴스는 큐의 요청을 즉시 처리할 수 있으며 큐는 트래픽 급증을 흡수하는 데 도움이 됩니다.

curl로 배포된 Ollama 서비스 테스트

이제 Ollama 서비스를 배포했으므로 요청을 보낼 수 있습니다. 하지만 요청을 직접 전송하면 Cloud Run이 HTTP 401 Unauthorized로 응답합니다. LLM 추론 API는 프런트엔드 애플리케이션과 같이 다른 서비스를 호출하기 위한 것이므로 이는 의도된 것입니다. Cloud Run에서 서비스 간 인증에 대한 자세한 내용은 서비스 간 인증을 참조하세요.

Ollama 서비스에 요청을 전송하려면 Cloud Run 개발자 프록시를 사용하는 등 요청에 유효한 OIDC 토큰이 포함된 헤더를 추가합니다.

  1. 프록시를 시작하고 cloud-run-proxy 구성요소를 설치하라는 메시지가 표시되면 Y를 선택합니다.

    gcloud run services proxy ollama-gemma --port=9090
  2. 프록시를 실행 상태로 둔 채 별도의 터미널 탭에서 요청을 전송합니다. 프록시는 localhost:9090에서 실행됩니다.

    curl http://localhost:9090/api/generate -d '{
      "model": "gemma2:9b",
      "prompt": "Why is the sky blue?"
    }'

    이 명령어는 다음과 유사한 스트리밍 출력을 제공합니다.

    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.288463414Z","response":"The","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.320937525Z","response":" sky","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.353173544Z","response":" appears","done":false}
    {"model":"gemma2:9b","created_at":"2024-07-15T23:21:39.385284976Z","response":" blue","done":false}
    ...
    

삭제

  1. 이 튜토리얼에서 만든 다른 Google Cloud 리소스를 삭제합니다.

다음 단계