이 튜토리얼에서는 Google Kubernetes Engine(GKE)에서 전문가 혼합 모델인 Qwen3-30B-A3B(Qwen/Qwen3-30B-A3B-FP8)를 배포하고 서빙하는 방법을 보여줍니다. 이 배포에서는 멀티 호스트 TPU v6e(Trillium) 가속기와 TorchTPU(torchtpu) 및 프리필 디코딩(PD) 분리가 포함된 vLLM TPU 서빙 프레임워크를 사용합니다.
이 튜토리얼에 설명된 배포 구성에서는 각각 2x4 토폴로지로 정렬된 멀티 호스트 ct6e-standard-4t 노드 풀 2개를 프로비저닝합니다(노드 풀당 노드 2개에 TPU v6e 칩 8개, 총 16개의 TPU v6e 칩). Kubernetes JobSet API 및 Ray를 사용하여 다음을 수행합니다.
- 데이터 동시 로드 및 전문가 동시 로드가 사용 설정된 별도의 TPU v6e 슬라이스에서 분리된 멀티 호스트 사전 입력 및 디코딩 서버를 실행합니다.
- 분리 프록시를 통해 요청을 라우팅합니다.
더 큰 Qwen3.5-397B 모델을 사용하여 TPU7x(Ironwood) 가속기에서 유사한 멀티 호스트 vLLM TorchTPU 서빙 워크플로를 실행하려면 TPU7x 가속기에서 멀티 호스트 vLLM TorchTPU를 사용하여 GKE에서 Qwen3.5-397B 서빙을 참조하세요.
목표
- GKE 클러스터와 멀티 호스트 TPU v6e 노드 풀을 설정합니다.
- Cloud Storage 버킷에 모델 가중치를 스테이징합니다.
- JobSet를 사용하여 멀티 호스트 vLLM TorchTPU 프리필, 디코딩, 프록시 서버를 배포합니다.
- 서빙 벤치마크 워크로드를 실행하고 결과를 분석합니다.
- 삭제
비용
이 문서에서는 비용이 청구될 수 있는Google Cloud구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
튜토리얼 환경을 설정합니다.
Google Cloud 프로젝트에서 Kubernetes Engine API를 사용 설정합니다.
Google Cloud CLI를 설치하고 초기화하고
kubectl를 설치합니다. Cloud Shell을 사용하는 경우 두 도구 모두 사전 설치되어 있습니다.TPU 용량이 있는 리전에 프로젝트의 SSD 할당량 및 외부 IP 주소 할당량이 충분한지 확인합니다.
Google Cloud 콘솔에서 할당량 및 시스템 한도 페이지로 이동합니다.
영구 디스크 SSD(GB)로 필터링하고 대상 리전에 사용 가능한 SSD 할당량이 충분한지 확인합니다.
사용 중인 리전 외부 IPv4 주소로 필터링하고 대상 리전에 IP 주소 할당량이 충분한지 확인합니다.
Hugging Face 액세스 토큰 가져오기
이 튜토리얼을 사용하려면 Hugging Face 액세스 토큰이 필요합니다. Hugging Face에서 무료 계정에 가입할 수 있습니다. 계정이 있으면 액세스 토큰을 생성합니다.
- Hugging Face에 오신 것을 환영합니다 페이지에서 계정 아바타를 클릭하고 액세스 토큰을 선택합니다.
- 액세스 토큰 페이지에서 새 토큰 만들기를 클릭합니다.
- 읽기 토큰 유형을 선택하고 토큰 이름을 입력합니다.
- 액세스 토큰이 표시됩니다. 토큰을 안전한 장소에 저장합니다.
필요한 역할
튜토리얼을 완료하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.
- Kubernetes Engine 관리자(
roles/container.admin) - Compute 관리자(
roles/compute.admin) - 스토리지 관리자 (
roles/storage.admin) - 서비스 계정 사용자(
roles/iam.serviceAccountUser)
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
환경 변수 설정
환경 변수를 설정하려면 다음 단계를 완료하세요.
인증을 설정합니다.
이 튜토리얼 전체에서 사용하는 환경 변수를 내보냅니다.
다음을 바꿉니다.
YOUR_PROJECT_ID:Google Cloud 프로젝트의 ID입니다.YOUR_REGION: 클러스터를 배포할 리전입니다(예:us-central1).YOUR_ZONE: TPU v6e 노드 풀을 배포할 영역입니다(예:us-central1-c).YOUR_CLUSTER_NAME: GKE 클러스터의 이름입니다.YOUR_RESERVATION_NAME: 예약을 사용하는 경우 TPU v6e 예약의 이름입니다.YOUR_GCS_BUCKET: 모델 가중치를 스테이징하는 데 사용하는 Cloud Storage 버킷의 이름입니다.YOUR_HF_TOKEN: Hugging Face 액세스 토큰입니다.
커스텀 vLLM TorchTPU 컨테이너 이미지를 사용하는 경우
VLLM_IMAGE변수의 기본vllm/vllm-torchtpu이미지 URI를 이미지의 URI로 바꿉니다. 공개 이미지는 vLLM TorchTPU 저장소를 참조하세요.
GKE 클러스터 만들기
일반 모드에서 GKE 클러스터를 만들고 프리필 및 디코딩 분리를 위해 멀티 호스트 TPU v6e 노드 풀 2개를 연결하려면 다음 단계를 완료하세요.
GKE용 워크로드 아이덴티티 제휴가 사용 설정된 리전 GKE 클러스터를 만듭니다.
출력은 다음과 비슷합니다.
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS STACK_TYPE asq-v6e us-central1 1.35.7-gke.1027000 35.226.172.84 e2-standard-4 1.35.7-gke.1027000 3 RUNNING IPV4각각
ct6e-standard-4t노드 2개를 포함하는 멀티 호스트 TPU v6e 노드 풀 2개를 만듭니다(노드 풀당2x4토폴로지에 TPU v6e 칩 8개, 총 16개의 TPU v6e 칩).이 튜토리얼에서는 스팟 용량(
--spot)을 사용합니다. 스팟 용량을 사용하는 인스턴스는 노드 풀이 생성된 후 생성되는 데 시간이 걸릴 수 있으며 워크로드 실행 중에 선점될 수 있습니다. 다음 플래그를 전달하여 예약 또는 Flex-start VM을 사용하여 노드 풀을 만들 수도 있습니다.특정 예약: 특정 예약을 사용하여 노드 풀을 만듭니다.
TPU 예약에 대해 자세히 알아보려면 Cloud TPU 예약 정보를 참조하세요.
Flex-start VM: Flex-start 소비 옵션을 사용하여 노드 풀을 프로비저닝합니다.
자세한 내용은 TPU 및 Flex-start VM으로 소규모 일괄 워크로드 실행을 참조하세요.
각 노드 풀의 출력은 다음과 비슷합니다.
NAME MACHINE_TYPE DISK_SIZE_GB NODE_VERSION np-0 ct6e-standard-4t 100 1.35.7-gke.1027000클러스터와 통신하도록
kubectl사용자 인증 정보를 구성합니다.
Cloud Storage에서 모델 가중치 스테이징
워크로드 실행을 위해 Cloud Storage 버킷에 모델 가중치를 스테이징합니다.
균일한 버킷 수준 액세스로 Cloud Storage 버킷을 만듭니다.
기본 Compute Engine 서비스 계정과 기본 Kubernetes 서비스 계정에 버킷에 대한 Identity and Access Management(IAM) 권한을 부여합니다.
Hugging Face 액세스 토큰을 저장할
hf-secret이라는 Kubernetes 보안 비밀을 만듭니다.download_qwen3_30b.yaml매니페스트를 가져옵니다.또는 다음 콘텐츠로
download_qwen3_30b.yaml라는 파일을 만듭니다.Qwen/Qwen3-30B-A3B-FP8모델 가중치를 스테이징 볼륨에 다운로드하고 Cloud Storage 버킷으로 전송합니다.이 단계를 완료하는 데 약 5~10분이 걸립니다.
포드가 시작될 때까지 기다린 후 다운로드 작업 로그를 모니터링합니다.
작업이 완료되면 16개의
.safetensors샤드가 모두 Cloud Storage 버킷에 있는지 확인합니다.완료된 스테이징 작업을 삭제합니다.
멀티 호스트 vLLM TorchTPU 서버 배포
워크로드 매니페스트(v6e_qwen3_server_multihost_slice.yaml)는 두 개의 2x4 TPU v6e 노드 풀에서 분리된 프리필 및 디코딩 서빙을 조정하는 세 개의 복제된 작업이 있는 Kubernetes JobSet 리소스(vllm-qwen3-30b-pd-disagg-v6e)를 정의합니다.
프리필 서버(
prefill): 하나의2x4TPU v6e 노드 풀에서 두 개의 복제본을 실행합니다(호스트당 4개의 칩이 있는ct6e-standard-4t노드 2개, 총 8개의 TPU 코어). 포드는 2노드 Ray 클러스터를 형성하고Qwen/Qwen3-30B-A3B-FP8의 포트8000에서 vLLM TorchTPU를 실행합니다. 서버는 다음 플래그를 사용하여kv_producer로 구성된TPURaidenConnector를 사용합니다.--data-parallel-size=8--tensor-parallel-size=1--enable-expert-parallel--load-format=runai_streamer
디코딩 서버(
decode): 두 번째2x4TPU v6e 노드 풀에서 복제본 2개를 실행합니다(총 TPU 코어 8개). JobSet는cloud.google.com/gke-nodepool라벨의 포드 어피니티 및 안티어피니티 규칙을 사용하여 프리필 및 디코딩을 별도의 노드 풀로 격리합니다. 포드는 2노드 Ray 클러스터를 형성하고TPURaidenConnector가kv_consumer로 구성된 포트7200에서 vLLM TorchTPU를 실행합니다.분리 프록시(
proxy): 포트10000에서toy_proxy_server.py스크립트를 실행하여 프리필 서버(포트8000)와 디코딩 서버(포트7200) 간의 요청 라우팅 및 KV 캐시 전송을 조정합니다.
분리된 vLLM 서버를 배포하고 모니터링하려면 다음 단계를 완료합니다.
클러스터에 Kubernetes JobSet CustomResourceDefinition 및 컨트롤러를 설치합니다.
서버 매니페스트를 가져옵니다.
또는 다음 콘텐츠로
v6e_qwen3_server_multihost_slice.yaml이라는 파일을 만듭니다.Cloud Storage 버킷 이름과 컨테이너 이미지를
v6e_qwen3_server_multihost_slice.yaml파일에 대체하고 매니페스트를 적용합니다.이 구성은 프리필에
2x4TPU v6e 슬라이스(노드 2개) 1개와 디코딩에2x4TPU v6e 슬라이스(노드 2개) 1개를 사용합니다. 풀의 노드 수를 확장하려면replicas필드(replicas: NUM_NODES)를 업데이트합니다.NUM_NODES를 사용하려는 노드 수로 바꿉니다.애플리케이션 시작이 완료될 때까지 프리필 및 디코딩 포드 로그를 모니터링합니다.
초기 모델 로드 및 컴파일은 처음 실행할 때 약 15~25분이 걸립니다.
스팟 용량 또는 Flex-start VM과 같은 선점형 용량을 사용하는 경우 노드 풀 생성 후 TPU 슬라이스 노드가 생성되는 데 시간이 더 오래 걸릴 수 있으며 워크로드 실행 중에 선점될 수 있습니다. 자세한 내용은 선점형 VM 인스턴스를 참조하세요. TPU 슬라이스 노드가 생성되었는지 확인하려면 노드 상태 및 조건 확인을 참조하세요.
벤치마크 워크로드를 실행하기 전에 프리필 및 디코딩 서버 로그 모두에서
Application startup complete가 보고될 때까지 기다립니다.(APIServer pid=1) INFO: Started server process [1] (APIServer pid=1) INFO: Waiting for application startup. (APIServer pid=1) INFO: Application startup complete.
벤치마크 워크로드 실행
8,192 토큰 입력 및 1,024 토큰 출력(8k/1k) 워크로드를 사용하여 배포된 Qwen3-30B-A3B 모델을 분리 프록시에 대해 벤치마킹하려면 다음 단계를 완료합니다.
벤치마크 매니페스트를 가져옵니다.
또는 다음 콘텐츠로
v6e_qwen3_benchmark_multihost_slice.yaml이라는 파일을 만듭니다.벤치마크 작업 매니페스트를 적용합니다.
벤치마크 포드가 준비될 때까지 기다린 후 벤치마크 작업 로그를 모니터링합니다.
벤치마크가 완료되면 다음과 같은 측정항목이 포함된 출력을 찾습니다.
Output token throughputTotal token throughputTTFTTPOT
삭제
이 튜토리얼에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 Kubernetes 워크로드, TPU v6e 노드 풀, GKE 클러스터, Cloud Storage 버킷을 삭제합니다.
Kubernetes 워크로드를 삭제합니다.
TPU v6e 노드 풀과 GKE 클러스터를 삭제합니다.
스테이징된 모델 가중치를 저장하는 Cloud Storage 버킷을 삭제합니다. 모델 가중치를 유지하려면 이 단계를 건너뛰거나 원하는 위치에 복사합니다.
다음 단계
- Cloud TPU의 vLLM 자세히 알아보기
- TPU v6e(Trillium) 자세히 알아보기
- Cloud TPU 자세히 알아보기