Optimum TPU와 함께 TPU를 GKE에서 사용하여 오픈소스 모델 제공


이 튜토리얼에서는 Hugging FaceOptimum TPU 제공 프레임워크와 함께 Tensor Processing Unit(TPU)을 Google Kubernetes Engine(GKE)에서 사용해 대규모 언어 모델(LLM) 오픈소스 모델을 제공하는 방법을 보여줍니다. 이 튜토리얼에서는 Hugging Face에서 오픈소스 모델을 다운로드하고 Optimum TPU를 실행하는 컨테이너를 사용하여 GKE Standard 클러스터에 모델을 배포합니다.

이 가이드는 AI/ML 워크로드를 배포하고 제공할 때 관리형 Kubernetes의 세밀한 제어, 확장성, 복원력, 이동성, 비용 효율성이 필요한 경우 좋은 출발점이 될 수 있습니다.

이 튜토리얼은 LLM 제공을 위해 Kubernetes 컨테이너 조정 기능을 사용하는 데 관심이 있는 Hugging Face 생태계의 생성형 AI 고객, GKE의 신규 또는 기존 사용자, ML 엔지니어, MLOps(DevOps) 엔지니어, 플랫폼 관리자를 대상으로 합니다.

참고로 JetStream, vLLM 및 기타 파트너 제품과 같은 제공 라이브러리를 통합할 수 있는 Vertex AI, GKE, Google Compute Engine 등의 Google Cloud 제품에서 LLM 추론을 수행할 수 있는 여러 가지 옵션이 있습니다. 예를 들어 JetStream을 사용하여 프로젝트에서 최신 최적화를 가져올 수 있습니다. Hugging Face 옵션을 선호하는 경우 Optimum TPU를 사용할 수 있습니다.

Optimum TPU는 다음 기능을 지원합니다.

  • 연속 일괄 처리
  • 토큰 스트리밍
  • Transformer를 사용한 탐욕적 검색 및 다항 샘플링

목표

  1. 모델 특성에 따라 권장 TPU 토폴로지를 사용하여 GKE Standard 클러스터를 준비합니다.
  2. GKE에 Optimum TPU를 배포합니다.
  3. Optimum TPU를 사용하여 curl을 통해 지원되는 모델을 제공합니다.

시작하기 전에

  • 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.
  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  • Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  • Enable the required API.

    Enable the API

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

    Go to project selector

  • Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  • Enable the required API.

    Enable the API

  • 프로젝트에 다음 역할이 있는지 확인합니다. roles/container.admin, roles/iam.serviceAccountAdmin

    역할 확인

    1. Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

      IAM으로 이동
    2. 프로젝트를 선택합니다.
    3. 주 구성원 열에서 이메일 주소가 있는 행을 찾습니다.

      이메일 주소가 열에 없으면 역할이 없는 것입니다.

    4. 이메일 주소가 있는 행에 대해 역할 열에서 역할 목록에 필요한 역할이 있는지 확인합니다.

    역할 부여

    1. Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

      IAM으로 이동
    2. 프로젝트를 선택합니다.
    3. 액세스 권한 부여를 클릭합니다.
    4. 새 주 구성원 필드에 이메일 주소를 입력합니다.
    5. 역할 선택 목록에서 역할을 선택합니다.
    6. 역할을 추가로 부여하려면 다른 역할 추가를 클릭하고 각 역할을 추가합니다.
    7. 저장을 클릭합니다.

환경 준비

이 튜토리얼에서는 Cloud Shell을 사용하여 Google Cloud에서 호스팅되는 리소스를 관리합니다. Cloud Shell에는 kubectlgcloud CLI를 포함하여 이 튜토리얼에 필요한 소프트웨어가 사전 설치되어 있습니다.

Cloud Shell로 환경을 설정하려면 다음 단계를 따르세요.

  1. Google Cloud 콘솔의 Google Cloud 콘솔에서 Cloud Shell 활성화 아이콘 Cloud Shell 활성화를 클릭하여 Cloud Shell 세션을 시작합니다. 그러면 Google Cloud 콘솔 하단 창에서 세션이 시작됩니다.

  2. 기본 환경 변수를 설정합니다.

    gcloud config set project PROJECT_ID
    export PROJECT_ID=$(gcloud config get project)
    export CLUSTER_NAME=CLUSTER_NAME
    export REGION=REGION_NAME
    export ZONE=ZONE
    

    다음 값을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
    • CLUSTER_NAME: GKE 클러스터의 이름입니다.
    • REGION_NAME: GKE 클러스터, Cloud Storage 버킷, TPU 노드가 위치한 리전입니다. 리전에는 TPU v5e 머신 유형을 사용할 수 있는 영역이 포함됩니다(예: us-west1, us-west4, us-central1, us-east1, us-east5 또는 europe-west4).
    • (표준 클러스터만 해당) ZONE: TPU 리소스를 사용할 수 있는 영역입니다(예: us-west4-a). Autopilot 클러스터의 경우 영역을 지정할 필요 없이 리전만 지정하면 됩니다.
  3. Optimum TPU 저장소를 클론합니다.

    git clone https://github.com/huggingface/optimum-tpu.git
    

모델 액세스 권한 얻기

Gemma 2B 또는 Llama3 8B 모델을 사용할 수 있습니다. 이 튜토리얼에서는 이 두 모델에 초점을 맞추지만 Optimum TPU는 더 많은 모델을 지원합니다.

Gemma 2B

GKE에 배포하기 위해 Gemma 모델에 액세스하려면 먼저 라이선스 동의 계약에 서명한 다음 Hugging Face 액세스 토큰을 생성해야 합니다.

Gemma를 사용하려면 동의 계약에 서명해야 합니다. 다음 안내를 따르세요.

  1. 모델 동의 페이지에 액세스합니다.
  2. Hugging Face 계정을 사용하여 동의를 확인합니다.
  3. 모델 약관에 동의합니다.

액세스 토큰 생성

토큰을 아직 만들지 않았다면 새 Hugging Face 토큰을 생성합니다.

  1. 내 프로필 > 설정 > 액세스 토큰을 클릭합니다.
  2. 새 토큰을 클릭합니다.
  3. 원하는 이름과 Read 이상의 역할을 지정합니다.
  4. Generate a token(토큰 생성)을 클릭합니다.
  5. 클립보드에 생성된 토큰을 복사합니다.

Llama3 8B

Hugging Face 저장소에서 Llama3 8b를 사용하려면 동의 계약에 서명해야 합니다.

액세스 토큰 생성

토큰을 아직 만들지 않았다면 새 Hugging Face 토큰을 생성합니다.

  1. 내 프로필 > 설정 > 액세스 토큰을 클릭합니다.
  2. 새 토큰을 선택합니다.
  3. 원하는 이름과 Read 이상의 역할을 지정합니다.
  4. 토큰 생성을 선택합니다.
  5. 클립보드에 생성된 토큰을 복사합니다.

GKE 클러스터 만들기

CPU 노드 1개가 있는 GKE Standard 클러스터를 만듭니다.

gcloud container create CLUSTER_NAME \
    --project=PROJECT_ID \
    --num-nodes=1 \
    --location=ZONE

TPU 노드 풀 만들기

노드 1개와 칩 8개가 있는 v5e TPU 노드 풀을 만듭니다.

gcloud container node-pools create tpunodepool \
    --location=ZONE \
    --num-nodes=1 \
    --machine-type=ct5lp-hightpu-8t \
    --cluster=CLUSTER_NAME

클러스터와 통신하도록 kubectl 구성

gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${REGION}

컨테이너 빌드

make 명령어를 실행하여 이미지를 빌드합니다.

cd optimum-tpu && make tpu-tgi

이미지를 Artifact Registry로 푸시

gcloud artifacts repositories create optimum-tpu --repository-format=docker --location=REGION_NAME && \
gcloud auth configure-docker REGION_NAME-docker.pkg.dev && \
docker image tag huggingface/optimum-tpu REGION_NAME-docker.pkg.dev/PROJECT_ID/optimum-tpu/tgi-tpu:latest && \
docker push REGION_NAME-docker.pkg.dev/PROJECT_ID/optimum-tpu/tgi-tpu:latest

Hugging Face 사용자 인증 정보용 Kubernetes 보안 비밀 만들기

Hugging Face 토큰이 포함된 Kubernetes 보안 비밀을 만듭니다.

kubectl create secret generic hf-secret \
  --from-literal=hf_api_token=${HF_TOKEN} \
  --dry-run=client -o yaml | kubectl apply -f -

Optimum TPU 배포

Optimum TPU를 배포합니다.

Gemma 2B

  1. 다음 매니페스트를 optimum-tpu-gemma-2b-2x4.yaml로 저장합니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tgi-tpu
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: tgi-tpu
      template:
        metadata:
          labels:
            app: tgi-tpu
        spec:
          nodeSelector:
            cloud.google.com/gke-tpu-topology: 2x4
            cloud.google.com/gke-tpu-accelerator: tpu-v5-lite-podslice
          containers:
          - name: tgi-tpu
            image: REGION_NAME-docker.pkg.dev/PROJECT_ID/optimum-tpu/tgi-tpu:latest
            args:
            - --model-id=google/gemma-2b
            - --max-concurrent-requests=4
            - --max-input-length=32
            - --max-total-tokens=64
            - --max-batch-size=1
            securityContext:
                privileged: true
            env:
              - name: HF_TOKEN
                valueFrom:
                  secretKeyRef:
                    name: hf-secret
                    key: hf_api_token
            ports:
            - containerPort: 80
            resources:
              limits:
                google.com/tpu: 8
            livenessProbe:
              httpGet:
                path: /health
                port: 80
              initialDelaySeconds: 300
              periodSeconds: 120
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: service
    spec:
      selector:
        app: tgi-tpu
      ports:
        - name: http
          protocol: TCP
          port: 8080
          targetPort: 80
    

    이 매니페스트는 TCP 포트 8080에 내부 부하 분산기가 있는 Optimum TPU 배포를 설명합니다.

  2. 매니페스트 적용

    kubectl apply -f optimum-tpu-gemma-2b-2x4.yaml
    

Llama3 8B

  1. 다음 매니페스트를 optimum-tpu-llama3-8b-2x4.yaml로 저장합니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tgi-tpu
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: tgi-tpu
      template:
        metadata:
          labels:
            app: tgi-tpu
        spec:
          nodeSelector:
            cloud.google.com/gke-tpu-topology: 2x4
            cloud.google.com/gke-tpu-accelerator: tpu-v5-lite-podslice
          containers:
          - name: tgi-tpu
            image: REGION_NAME-docker.pkg.dev/PROJECT_ID/optimum-tpu/tgi-tpu:latest
            args:
            - --model-id=meta-llama/Meta-Llama-3-8B
            - --max-concurrent-requests=4
            - --max-input-length=32
            - --max-total-tokens=64
            - --max-batch-size=1
            env:
              - name: HF_TOKEN
                valueFrom:
                  secretKeyRef:
                    name: hf-secret
                    key: hf_api_token
            ports:
            - containerPort: 80
            resources:
              limits:
                google.com/tpu: 8
            livenessProbe:
              httpGet:
                path: /health
                port: 80
              initialDelaySeconds: 300
              periodSeconds: 120
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: service
    spec:
      selector:
        app: tgi-tpu
      ports:
        - name: http
          protocol: TCP
          port: 8080
          targetPort: 80
    

    이 매니페스트는 TCP 포트 8080에 내부 부하 분산기가 있는 Optimum TPU 배포를 설명합니다.

  2. 매니페스트 적용

    kubectl apply -f optimum-tpu-llama3-8b-2x4.yaml
    

실행 중인 배포의 로그를 봅니다.

kubectl logs -f -l app=tgi-tpu

출력은 다음과 비슷하게 표시됩니다.

2024-07-09T22:39:34.365472Z  WARN text_generation_router: router/src/main.rs:295: no pipeline tag found for model google/gemma-2b
2024-07-09T22:40:47.851405Z  INFO text_generation_router: router/src/main.rs:314: Warming up model
2024-07-09T22:40:54.559269Z  INFO text_generation_router: router/src/main.rs:351: Setting max batch total tokens to 64
2024-07-09T22:40:54.559291Z  INFO text_generation_router: router/src/main.rs:352: Connected
2024-07-09T22:40:54.559295Z  WARN text_generation_router: router/src/main.rs:366: Invalid hostname, defaulting to 0.0.0.0

다음 섹션으로 이동하기 전에 모델이 완전히 다운로드되었는지 확인합니다.

모델 제공

모델로의 포트 전달을 설정합니다.

kubectl port-forward svc/service 8080:8080

curl을 사용하여 모델 서버와 상호작용

배포된 모델을 확인합니다.

새 터미널 세션에서 curl을 사용해서 모델과 채팅합니다.

curl 127.0.0.1:8080/generate     -X POST     -d '{"inputs":"What is Deep Learning?","parameters":{"max_new_tokens":40}}'     -H 'Content-Type: application/json'

출력은 다음과 비슷하게 표시됩니다.

{"generated_text":"\n\nDeep learning is a subset of machine learning that uses artificial neural networks to learn from data.\n\nArtificial neural networks are inspired by the way the human brain works. They are made up of multiple layers"}

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

배포된 리소스 삭제

이 가이드에서 만든 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 명령어를 실행합니다.

gcloud container clusters delete CLUSTER_NAME \
  --location=ZONE

다음 단계