이 튜토리얼에서는Google Cloud의 Google Kubernetes Engine(GKE)에서 370억 개의 활성 파라미터가 있는 6,710억 개의 파라미터 전문가 혼합 모델인 DeepSeek-R1(deepseek-ai/DeepSeek-R1)을 배포하고 서빙하는 방법을 보여줍니다. 이 배포에서는 Cluster Toolkit, 총 16개의 NVIDIA B200 GPU가 있는 멀티 호스트 A4 (a4-highgpu-8g) 가상 머신 (VM) 인스턴스 2개, vLLM 서빙 프레임워크를 사용합니다.
이 튜토리얼에 설명된 배포 구성에서는 Cluster Toolkit을 사용하여 일반 모드에서 GKE 클러스터를 프로비저닝합니다. 클러스터에는 GPUDirect 원격 직접 메모리 액세스 (RDMA) 네트워킹을 통해 연결된 a4-highgpu-8g 노드 2개가 있습니다. 그런 다음 Cloud Storage에서 모델 가중치를 스테이징하고 Kubernetes JobSet API와 Ray를 사용하여 텐서 동시 로드, 전문가 동시 로드, FP8 KV 캐시를 통해 16개의 모든 NVIDIA B200 GPU에서 모델을 서빙합니다.
목표
- Cluster Toolkit을 설치하고 일반 모드에서 멀티 호스트 A4 GKE 클러스터를 프로비저닝합니다.
- Cloud Storage 버킷에 DeepSeek-R1 모델 가중치를 스테이징합니다.
- JobSet 및 Ray를 사용하여 2개의 A4 노드에 총 16개의 NVIDIA B200 GPU가 있는 멀티 호스트 vLLM 추론 서버를 배포합니다.
- vLLM 서버에 채팅 완성 요청을 전송합니다.
- 서빙 벤치마크 워크로드를 실행합니다.
- 배포된 리소스를 정리하세요.
비용
이 문서에서는 비용이 청구될 수 있는Google Cloud구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
시작하기 전에
튜토리얼 환경을 설정합니다.
- Google Cloud CLI를 설치하고 초기화하고
kubectl를 설치합니다. Cloud Shell을 사용하는 경우 두 도구 모두 사전 설치되어 있습니다. - Cloud Shell이 아닌 Linux 또는 macOS 워크스테이션에서 이 튜토리얼을 실행하는 경우 필요한 Cluster Toolkit 종속 항목(예: Terraform 및 Git)을 설치합니다.
Google Cloud 프로젝트에서 Kubernetes Engine API, Compute Engine API, Cloud Storage API, Artifact Registry API, Service Usage API를 사용 설정합니다.
Hugging Face 액세스 토큰 가져오기
이 튜토리얼을 사용하려면 Hugging Face 액세스 토큰이 필요합니다. Hugging Face에서 무료 계정에 가입할 수 있습니다. 계정이 있으면 액세스 토큰을 생성합니다.
- Hugging Face에 오신 것을 환영합니다 페이지에서 계정 아바타를 클릭하고 액세스 토큰을 선택합니다.
- 액세스 토큰 페이지에서 새 토큰 만들기를 클릭합니다.
- 읽기 토큰 유형을 선택하고 토큰 이름을 입력합니다.
- 액세스 토큰이 표시됩니다. 토큰을 안전한 장소에 저장합니다.
필요한 역할
튜토리얼을 완료하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.
- Kubernetes Engine 관리자(
roles/container.admin) - Compute 관리자 (
roles/compute.admin) - 스토리지 관리자 (
roles/storage.admin) - 프로젝트 IAM 관리자 (
roles/resourcemanager.projectIamAdmin) - 서비스 계정 관리자 (
roles/iam.serviceAccountAdmin) - 서비스 계정 사용자(
roles/iam.serviceAccountUser) - 서비스 사용량 소비자(
roles/serviceusage.serviceUsageConsumer)
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
환경 변수 설정
튜토리얼의 인증 및 환경 변수를 설정합니다.
인증을 설정합니다.
이 튜토리얼 전체에서 사용하는 환경 변수를 내보냅니다.
다음을 바꿉니다.
YOUR_PROJECT_ID:Google Cloud 프로젝트의 ID입니다.YOUR_REGION: A4 용량이 있고 클러스터를 배포할 컴퓨팅 리전입니다(예:us-central1).YOUR_ZONE: A4 용량이 있는 컴퓨팅 영역입니다(예:us-central1-b).YOUR_CLUSTER_NAME: GKE 클러스터 및 Cluster Toolkit 배포의 이름입니다. 생성된 노드 풀 서비스 계정 ID(YOUR_CLUSTER_NAME-gke-np-sa)가 30자(영문 기준) Identity and Access Management(IAM) 제한 내에 있도록 20자(영문 기준) 이하의 이름을 사용합니다.YOUR_RESERVATION_NAME: A4 예약의 이름 또는 확장된 예약 블록 경로(RESERVATION_NAME/reservationBlocks/RESERVATION_BLOCK_NAME형식)입니다.YOUR_HF_TOKEN: Hugging Face 액세스 토큰입니다.YOUR_GCS_BUCKET: 모델 가중치를 스테이징하는 Cloud Storage 버킷의 전역 고유 이름입니다. 또한 이 스크립트는 Cluster Toolkit의 Terraform 상태를 저장하기 위해TERRAFORM_BUCKET를YOUR_GCS_BUCKET-tf-state로 설정합니다.
또한 스크립트는
CLUSTER_TOOLKIT_VERSION를v1.104.0로 설정하여 설치할 Cluster Toolkit 버전을 지정합니다. Cluster Toolkit 버전v1.104.0이상에는examples/gke-a4/gke-a4-deployment.yaml에 대한 기본 제공 용량 소비 옵션이 포함되어 있습니다.v1.104.0이전 버전에서는 이러한 용량 옵션을 수동으로 추가해야 합니다.
GKE 클러스터 만들기
Cluster Toolkit을 다운로드하고 일반 모드에서 a4-highgpu-8g 노드 2개, GPUDirect RDMA 네트워킹, JobSet 컨트롤러를 사용하여 GKE 클러스터를 프로비저닝합니다.
CLUSTER_TOOLKIT_VERSION(v1.104.0)에 지정된 버전에 대해 사전 빌드된 Cluster Toolkit 번들을 다운로드하고 압축을 풀고 작업 디렉터리를cluster-toolkit디렉터리로 변경하고 바이너리 버전을 확인합니다.필요한 경우 Cluster Toolkit에서 사용 가능한 명령어와 플래그를 확인합니다.
Cluster Toolkit 배포의 Terraform 상태를 저장하는 Cloud Storage 버킷을 만듭니다.
a4-highgpu-8g노드 2개에 대한examples/gke-a4/gke-a4-deployment.yaml배포 구성 파일을 만듭니다.기본적으로
examples/gke-a4/gke-a4.yaml청사진은 특정 예약을 사용하도록 구성됩니다. 특정 예약이 없는 경우 클러스터를 배포하기 전에examples/gke-a4/gke-a4.yaml를 수정하여 다음 사용 옵션 중 하나를 사용할 수 있습니다.- 스팟 용량: 프로젝트에 GPU, 디스크, CPU에 대한 선점형 할당량이 충분한지 확인합니다.
examples/gke-a4/gke-a4.yaml하단에서--- Option 1: Specific Reservation ---섹션을 주석 처리하고--- Option 4: Spot ---섹션의 주석 처리를 삭제합니다. - Flex-start VM: 프로젝트에 GPU, 디스크, CPU에 대한 충분한 선점형 할당량이 있는지 확인합니다.
examples/gke-a4/gke-a4.yaml하단에서--- Option 1: Specific Reservation ---섹션을 주석 처리하고--- Option 2: DWS Flex Start ---섹션의 주석 처리를 삭제합니다.
- 스팟 용량: 프로젝트에 GPU, 디스크, CPU에 대한 선점형 할당량이 충분한지 확인합니다.
gcluster deploy명령어를 사용하여 GKE 클러스터를 배포합니다.클러스터를 만드는 데 약 30~45분 정도 걸립니다.
--auto-approve플래그 없이./gcluster deploy를 실행하는 경우 제안된 변경사항을 적용하려면 메시지가 표시될 때a를 입력합니다. 배포가 완료되면 출력은 다음과 유사한 메시지로 끝납니다.Apply complete! Resources: 80 added, 0 changed, 0 destroyed.클러스터와 통신하도록
kubectl사용자 인증 정보를 구성합니다.
Cloud Storage에서 모델 가중치 스테이징
DeepSeek-R1 가중치를 A4 노드 중 하나의 로컬 SSD에 다운로드하고 노드 간 빠른 스트리밍을 위해 Cloud Storage 버킷으로 전송합니다.
모델 다운로드 작업, vLLM 추론 서버, 벤치마크 포드의 Kubernetes 매니페스트 파일을 다운로드합니다.
모델 가중치를 저장하기 위해 균일한 버킷 수준 액세스 권한으로 Cloud Storage 버킷을 만듭니다.
기본 Kubernetes 서비스 계정, 기본 Compute Engine 서비스 계정, 클러스터 노드 풀 서비스 계정 (
${CLUSTER_NAME}-gke-np-sa)에 버킷에 대한 IAM 권한을 부여합니다.위 스크립트에서 부여한 IAM 권한에는
--load-format runai_streamer에 필요한 스토리지 기존 버킷 리더 역할 (roles/storage.legacyBucketReader)이 포함됩니다.Hugging Face 액세스 토큰을 저장할
hf-secret이라는 Kubernetes 보안 비밀을 만듭니다.download_model.yaml매니페스트를 검토하거나 이전에 다운로드하지 않은 경우 로컬에서 파일을 만듭니다.Cloud Storage 버킷 이름을
download_model.yaml매니페스트에 대체하고 모델 다운로드 작업을 시작합니다.다운로드 포드가 시작될 때까지 기다린 후 작업 로그를 스트리밍합니다.
모델을 노드의 로컬 NVMe SSD에 다운로드하고 가중치를 Cloud Storage 버킷에 업로드하는 데 약 30~40분이 걸립니다.
작업이 완료되면 163개의
.safetensors샤드가 모두 Cloud Storage 버킷에 있는지 확인합니다.완료된 스테이징 작업을 삭제합니다.
멀티 호스트 vLLM 서버 배포
워크로드 매니페스트 (deepseek_r1_server.yaml)는 두 개의 a4-highgpu-8g 노드에서 멀티 호스트 서빙을 조정하는 ClusterIP 서비스(vllm-r1-leader)와 Kubernetes JobSet (vllm-r1)를 정의합니다.
- 리더 (
leader): 8개의 NVIDIA B200 GPU가 있는 A4 노드에서 복제본 하나를 실행하고, NCCL/gIB 환경(/usr/local/gib/scripts/set_nccl_env.sh)을 소싱하고, 2노드 클러스터의 포트6379에서 Ray 헤드 노드를 시작하고, HTTP 포트8080에서vllm serve를 실행합니다. 서버는--load-format runai_streamer를 사용하여gs://$MODEL_BUCKET/DeepSeek-R1에서 가중치를 직접 스트리밍하고/models/DeepSeek-R1에서 마운트된 Cloud Storage FUSE 볼륨에서 토크나이저를 로드합니다.--tensor-parallel-size 16,--pipeline-parallel-size 1,--distributed-executor-backend ray,--enable-expert-parallel,--kv-cache-dtype fp8_e4m3,--async-scheduling, CUDA 그래프 (FULL_AND_PIECEWISE)로 실행됩니다. - 작업자 (
worker): 8개의 NVIDIA B200 GPU가 있는 두 번째 A4 노드에서 헤드리스 복제본 하나를 실행하고, NCCL/gIB를 구성하고,vllm-r1-leader:6379에서 리더의 Ray 클러스터에 조인합니다.
멀티 호스트 vLLM 서버를 배포하고 모니터링합니다.
deepseek_r1_server.yaml매니페스트를 검토하거나 이전에 다운로드하지 않은 경우 로컬에서 파일을 만듭니다.이 배포를 더 많은 호스트로 확장하려면
deepseek_r1_server.yaml의 매개변수를 업데이트합니다. 예를 들어 총 32개의 NVIDIA B200 GPU가 있는 4개의 A4 노드로 확장하려면worker복제된 작업에서replicas: 3를 설정하고 다음과 같이 리더 인수를 업데이트합니다.--ray_cluster_size=4--tensor-parallel-size=16--pipeline-parallel-size=2
deepseek_r1_server.yaml을 Cloud Storage 버킷 이름으로 대체하고 매니페스트를 클러스터에 적용합니다.서버 시작이 완료될 때까지 리더 및 워커 포드 로그를 모니터링합니다.
kubectl logs -f는 포그라운드에서 로그를 스트리밍하므로 두 포드를 동시에 모니터링하려면 별도의 터미널 세션에서 워커 로그 명령어를 실행합니다. 언제든지 로그 스트리밍을 중지하려면 Control+C를 누릅니다.초기 가중치 스트리밍, 모델 로드, CUDA 그래프 캡처에는 약 15~20분이 걸립니다. 요청을 보내기 전에 리더 포드 로그에 다음 메시지가 출력될 때까지 기다립니다.
(APIServer pid=1) INFO: Started server process [1] (APIServer pid=1) INFO: Waiting for application startup. (APIServer pid=1) INFO: Application startup complete.
추론 요청 전송
배포된 vLLM 서버에 채팅 완성 요청을 전송합니다.
로컬 포트
8080을 백그라운드에서vllm-r1-leader서비스로 전달합니다./v1/chat/completions엔드포인트에 채팅 완성 요청을 전송합니다.
벤치마크 워크로드 실행
8,192개의 입력 토큰과 1,024개의 출력 토큰 (8k/1k) 구성으로 vllm bench serve를 사용하여 배포된 DeepSeek-R1 서버를 벤치마킹합니다.
deepseek_r1_8k_1k.yaml매니페스트를 검토하거나 이전에 다운로드하지 않은 경우 로컬에서 파일을 만듭니다.매니페스트는 입력 토큰 8,192개, 출력 토큰 1,024개, 프롬프트 1,280개, 최대 동시 실행 수 112개를 지정합니다.
deepseek_r1_8k_1k.yaml매니페스트를 적용합니다.vllm-bench-8k-1k포드가 시작될 때까지 기다린 후 벤치마크 로그를 스트리밍합니다.벤치마크를 완료하는 데 약 15분이 걸립니다. 벤치마크가 완료되면 다음과 같은 측정항목이 포함된 출력을 찾습니다.
Output token throughputTotal token throughputTTFTTPOT
삭제
이 튜토리얼에서 사용한 리소스에 대한 추가 비용이 Google Cloud 계정에 청구되지 않게 하려면 Kubernetes 워크로드, GKE 클러스터, Cloud Storage 버킷을 삭제합니다.
벤치마크 포드, vLLM 서버 JobSet 및 서비스, 모델 다운로드 작업, Hugging Face 보안 비밀을 삭제합니다.
스테이징된 모델 가중치를 저장하는 Cloud Storage 버킷을 삭제합니다.
cluster-toolkit디렉터리에서gcluster destroy명령어를 사용하여 GKE 클러스터 및 관련 인프라를 삭제합니다.Terraform 상태를 저장하는 Cloud Storage 버킷을 삭제합니다.
다음 단계
- vLLM에 대해 자세히 알아보기
- NVIDIA B200 GPU를 사용하는 A4 VM 자세히 알아보기
- Cluster Toolkit 자세히 알아보기
- AI 최적화 GKE 클러스터 관리 자세히 알아보기