이 튜토리얼에서는 Hugging Face의 Optimum 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를 사용할 수 있습니다.
최적 TPU는 다음 기능을 지원합니다.
- 연속 일괄 처리
- 토큰 스트리밍
- Transformer를 사용한 탐욕적 검색 및 다항 샘플링
모델 액세스 권한 얻기
Gemma 2B 또는 Llama3 8B 모델을 사용할 수 있습니다. 이 튜토리얼에서는 이 두 모델에 초점을 맞추지만 Optimum TPU는 더 많은 모델을 지원합니다.
Gemma 2B
GKE에 배포하기 위해 Gemma 모델에 액세스하려면 먼저 라이선스 동의 계약에 서명한 다음 Hugging Face 액세스 토큰을 생성해야 합니다.
라이선스 동의 계약 서명
Gemma를 사용하려면 동의 계약에 서명해야 합니다. 다음 안내를 따르세요.
- 모델 동의 페이지에 액세스합니다.
- Hugging Face 계정을 사용하여 동의를 확인합니다.
- 모델 약관에 동의합니다.
액세스 토큰 생성
토큰을 아직 만들지 않았다면 새 Hugging Face 토큰을 생성합니다.
- 내 프로필 > 설정 > 액세스 토큰을 클릭합니다.
- 새 토큰을 클릭합니다.
- 원하는 이름과
Read
이상의 역할을 지정합니다. - Generate a token(토큰 생성)을 클릭합니다.
- 클립보드에 생성된 토큰을 복사합니다.
Llama3 8B
Hugging Face 저장소에서 Llama3 8b를 사용하려면 동의 계약에 서명해야 합니다.
액세스 토큰 생성
토큰을 아직 만들지 않았다면 새 Hugging Face 토큰을 생성합니다.
- 내 프로필 > 설정 > 액세스 토큰을 클릭합니다.
- 새 토큰을 선택합니다.
- 원하는 이름과
Read
이상의 역할을 지정합니다. - 토큰 생성을 선택합니다.
- 클립보드에 생성된 토큰을 복사합니다.
GKE 클러스터 만들기
CPU 노드가 1개인 GKE Standard 클러스터를 만듭니다.
gcloud container clusters 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
TPU 리소스를 사용할 수 있으면 GKE가 노드 풀을 프로비저닝합니다. TPU 리소스를 일시적으로 사용할 수 없는 경우 출력에 GCE_STOCKOUT
오류 메시지가 표시됩니다. TPU 품절 오류를 해결하려면 TPU 요청을 충족할 수 있는 TPU 리소스가 부족함을 참고하세요.
클러스터와 통신하도록 kubectl 구성
gcloud container clusters get-credentials ${CLUSTER_NAME} --location=${ZONE}
컨테이너 빌드
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 배포
이 튜토리얼에서는 Kubernetes 배포를 사용하여 Optimum TPU를 배포합니다. 배포는 클러스터에서 노드 간에 배포되는 여러 포드 복제본을 실행할 수 있는 Kubernetes API 객체입니다.
Gemma 2B
다음 배포 매니페스트를
optimum-tpu-gemma-2b-2x4.yaml
로 저장합니다.이 매니페스트는 TCP 포트 8080에 내부 부하 분산기가 있는 Optimum TPU 배포를 설명합니다.
매니페스트 적용
kubectl apply -f optimum-tpu-gemma-2b-2x4.yaml
Llama3 8B
다음 매니페스트를
optimum-tpu-llama3-8b-2x4.yaml
로 저장합니다.이 매니페스트는 TCP 포트 8080에 내부 부하 분산기가 있는 Optimum TPU 배포를 설명합니다.
매니페스트 적용
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"}