이 문서에서는 Google Distributed Cloud (GDC) 에어 갭 환경에서 Mistral AI의 가중치 공개 모델을 배포하는 방법을 단계별로 안내합니다. 여기에는 높은 처리량 서빙을 위해 vLLM을 사용하고 Kubernetes, Harbor, GPU 리소스를 포함한 GDC 플랫폼의 기능을 사용하는 방법이 포함됩니다. 모델 섹션에서 모델과 GPU 옵션을 선택합니다. 다른 모든 단계는 모든 모델에서 동일합니다.
지원되는 모델
| 모델 | Hugging Face 저장소 | 매개변수 | 라이선스 | GPU 옵션 |
|---|---|---|---|---|
| Mistral 7B Instruct | mistralai/Mistral-7B-Instruct-v0.2 |
72억 (밀집) | Apache 2.0 | GPU 1개 |
| Mistral NeMo 12B Instruct | mistralai/Mistral-Nemo-Instruct-2407 |
12B (밀집) | Apache 2.0 | GPU 1개 |
| Mistral Small 3.2 24B Instruct | mistralai/Mistral-Small-3.2-24B-Instruct-2506 |
24B (밀집, 비전 인코더 포함) | Apache 2.0 | NVIDIA A100 80GB 1개 NVIDIA H100 94GB 1개 NVIDIA H200 141GB 또는 B300 288GB 1개 |
| Ministral 8B Instruct | mistralai/Ministral-8B-Instruct-2410 |
8B (밀집) | Mistral AI 연구 라이선스 (연구 및 비상업적 용도로만 사용) | GPU 1개 |
| Mixtral 8x7B Instruct | mistralai/Mixtral-8x7B-Instruct-v0.1 |
총 467억 개 / 활성 129억 개 (전문가 혼합, 8x7B) | Apache 2.0 | NVIDIA A100 80GB 2개 NVIDIA H100 94GB 2개 NVIDIA A100 80GB 또는 H100 94GB 1개( --quantization=fp8 사용)NVIDIA H200 141GB 또는 B300 288GB 1개 |
| Magistral Small 1.2 24B | mistralai/Magistral-Small-2509 |
24B (밀집, 추론, 비전 인코더 포함) | Apache 2.0 | NVIDIA A100 80GB 1개 NVIDIA H100 94GB 1개 NVIDIA H200 141GB 또는 B300 288GB 1개 |
아키텍처
이 솔루션에는 컨테이너화된 서빙 백엔드 (vLLM)를 표준 클러스터 내에 배포로 배포하는 작업이 포함됩니다. 모델 가중치는 영구 볼륨에 저장되며, 로컬에서 다운로드되고 로더 포드를 사용하여 업로드된 파일에서 채워집니다. LoadBalancer 유형의 Kubernetes Service는 백엔드 API를 노출하고 NetworkPolicy / ProjectNetworkPolicy 객체는 이에 대한 액세스를 보호합니다.
시작하기 전에
워크스테이션에서 vLLM 참조 구현을 사용한 개방형 가중치 모델을 완료하고 ${HOME}/gdcag-solutions 디렉터리에 액세스할 수 있는지 확인합니다.
Identity and Access Management
필요한 IAM 계정, 역할, 권한이 올바르게 구성되었는지 확인합니다.
조직의 GDC 사용자 역할:
- 선택사항: 표준 클러스터 관리자 (콘솔에서 클러스터 보기)
프로젝트의 GDC 사용자 역할:
- 표준 클러스터 관리자 (
standard-cluster-admin)
표준 클러스터의 GDC 사용자 역할:
StandardClusterRolecluster-admin에 대한StandardClusterRoleBinding(프로젝트 IAM 관리자가 생성, 참조 구현의 Identity and Access Management 섹션 참고)
워크스테이션
달리 명시되지 않는 한 이 가이드의 모든 명령어는 필요한 도구와 환경 및 인터넷에 대한 연결이 있는 워크스테이션에서 실행합니다.
환경 구성은 계층화되어 있습니다.
${HOME}/gdcag-solutions/env.sh는 플랫폼 및 레지스트리 설정을 로드합니다.${HOME}/gdcag-solutions/open-weight-models/vllm/env.sh는 vLLM 설정을 추가합니다.이 사용자 가이드에서는 모델 섹션에 작성하는
env.d/model.sh(모델) 및env.d/accelerator.sh(GPU 옵션 및 런타임 설정)과env.d/model-common.sh(여기에서 파생된 값)를 추가합니다.
사용자 가이드 디렉터리 구조를 만듭니다.
mkdir -p ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d공통 모델 환경 구성 파일을 만듭니다.
GDCS_HF_MODEL에서 모든 경로와 리소스 이름을 파생하므로 모든 모델에서 동일합니다.cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/model-common.sh && echo "Successfully created." || echo "Failed to create!" # Model (derived from env.d/model.sh) export GDCS_HF_DOWNLOAD_PATH="${GDCS_USER_GUIDE_HOME}/hf-models" export GDCS_HF_MODEL_LOWERCASE="${GDCS_HF_MODEL,,}" export GDCS_HF_MODEL_DOWNLOAD_DIR="${GDCS_HF_DOWNLOAD_PATH}/${GDCS_HF_MODEL_LOWERCASE}" export GDCS_HF_PV_MOUNT_PATH="/mnt/hf-model" GDCS_HF_MODEL_KUBERNETES="${GDCS_HF_MODEL_LOWERCASE//\//-}" export GDCS_HF_MODEL_KUBERNETES="${GDCS_HF_MODEL_KUBERNETES//./-}" # Workload export GDCS_WORKLOAD_NAMESPACE="vllm-mistral" export GDCS_WORKLOAD_NAME="${GDCS_HF_MODEL_KUBERNETES}" export GDCS_MODEL_LOADER_POD_NAME="loader-${GDCS_HF_MODEL_KUBERNETES}" EOF사용자 가이드 환경 로더 파일을 만듭니다.
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.sh && echo "Successfully created." || echo "Failed to create!" source "${HOME}/gdcag-solutions/open-weight-models/vllm/env.sh" export GDCS_USER_GUIDE_HOME="${HOME}/gdcag-solutions/open-weight-models/vllm/mistral" echo "GDCS_USER_GUIDE_HOME=${GDCS_USER_GUIDE_HOME}" # Sourced in dependency order: the model selection, the accelerator and runtime settings, then the values derived from them source "${GDCS_USER_GUIDE_HOME}/env.d/model.sh" source "${GDCS_USER_GUIDE_HOME}/env.d/accelerator.sh" source "${GDCS_USER_GUIDE_HOME}/env.d/model-common.sh" echo "GDCS_HF_MODEL=${GDCS_HF_MODEL} (${GDCS_WORKLOAD_ACCELERATOR_COUNT} x ${GDCS_WORKLOAD_ACCELERATOR_TYPE:-unset})" EOF
모델
표준 클러스터의 GPU 노드와 일치하는 모델 및 GPU 옵션을 선택합니다. GDC 에어 갭은 다음 GPU를 제공합니다 (클러스터 노드 머신 유형 참조). 가속기 리소스 유형은 노드가 Kubernetes에 GPU를 노출하는 이름입니다.
| GPU | 메모리 | 머신 유형 | 가속기 리소스 유형 |
|---|---|---|---|
| NVIDIA A100 | 40 GB | a2-highgpu-1g-gdc |
nvidia.com/gpu-pod-NVIDIA_A100_PCIE_40GB |
| NVIDIA A100 | 80GB | a2-ultragpu-1g-gdc, a2-ultragpu-2g-gdc |
nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE |
| NVIDIA H100 | 94 GB | a3-highgpu-1g-gdc (프리뷰), a3-highgpu-2g-gdc (프리뷰), a3-highgpu-4g-gdc |
nvidia.com/gpu-pod-NVIDIA_H100_NVL |
| NVIDIA H200 | 141 GB | a3-ultragpu-8g-gdc |
nvidia.com/gpu-pod-NVIDIA_H200 |
| NVIDIA B300 | 288 GB | a4-ultragpu-8g-gdc |
nvidia.com/gpu-pod-NVIDIA_B300_SXM6_AC |
각 탭에는 모델 사실, 모델 환경 파일 env.d/model.sh을 작성하는 명령어, 선택한 GPU 옵션에 대해 리소스 유형과 vLLM 설정이 자동 입력된 가속기 환경 파일 env.d/accelerator.sh을 작성하는 중첩된 탭이 나열됩니다. 나중에 모델 또는 GPU 옵션을 전환하려면 다른 환경 파일을 작성하고 환경을 다시 소싱한 후 구현 섹션을 반복합니다. 모든 리소스 이름은 모델 이름에서 파생되므로 여러 모델의 워크로드를 동일한 네임스페이스에서 나란히 실행할 수 있습니다.
배포하려는 모델 및 GPU 옵션에 대한 모델 및 가속기 환경 파일을 만듭니다.
Mistral 7B Instruct
속성 값 Hugging Face 저장소 mistralai/Mistral-7B-Instruct-v0.2매개변수 72억 (밀집) 라이선스 Apache 2.0 vLLM에서 사용하는 가중치 Hugging Face 형식 ( model-*.safetensors), 약 14.5GB컨텍스트 길이 토큰 32,000개, 이 가이드에서는 --max-model-len 32768를 사용합니다.모델 환경 파일을 만듭니다.
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/model.sh && echo "Successfully created." || echo "Failed to create!" # Model: Mistral 7B Instruct export GDCS_HF_MODEL="mistralai/Mistral-7B-Instruct-v0.2" export GDCS_HF_MODEL_REVISION="main" # Hugging Face branch, tag, or commit to download export GDCS_HF_DOWNLOAD_EXCLUDE="consolidated* *.bin" EOFGPU 옵션의 가속기 환경 파일을 만듭니다.
NVIDIA A100 40 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA A100 40 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_PCIE_40GB" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="60" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA A100 80GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA A100 80 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="60" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA H100 94 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA H100 94 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H100_NVL" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="60" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA H200 141GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA H200 141 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H200" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="60" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA B300 288 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA B300 288 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_B300_SXM6_AC" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="60" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFMistral NeMo 12B Instruct
속성 값 Hugging Face 저장소 mistralai/Mistral-Nemo-Instruct-2407매개변수 12B (밀집) 라이선스 Apache 2.0 vLLM에서 사용하는 가중치 Mistral 형식 ( consolidated.safetensors,params.json,tekken.json), 약 24.5GB컨텍스트 길이 토큰 128,000개, 이 가이드에서는 --max-model-len 32768를 제공합니다.모델 환경 파일을 만듭니다.
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/model.sh && echo "Successfully created." || echo "Failed to create!" # Model: Mistral NeMo 12B Instruct export GDCS_HF_MODEL="mistralai/Mistral-Nemo-Instruct-2407" export GDCS_HF_MODEL_REVISION="main" # Hugging Face branch, tag, or commit to download export GDCS_HF_DOWNLOAD_EXCLUDE="model-*.safetensors *.bin" EOFGPU 옵션의 가속기 환경 파일을 만듭니다.
NVIDIA A100 40 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA A100 40 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_PCIE_40GB" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="180" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA A100 80GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA A100 80 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="180" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA H100 94 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA H100 94 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H100_NVL" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="180" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA H200 141GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA H200 141 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H200" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="180" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA B300 288 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA B300 288 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_B300_SXM6_AC" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="180" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFMistral Small 3.2 24B Instruct
속성 값 Hugging Face 저장소 mistralai/Mistral-Small-3.2-24B-Instruct-2506매개변수 24B (밀집, 비전 인코더 포함) 라이선스 Apache 2.0 vLLM에서 사용하는 가중치 Mistral 형식 ( consolidated.safetensors,params.json,tekken.json), 약 48GB컨텍스트 길이 토큰 128,000개, 이 가이드에서는 --max-model-len 32768를 제공합니다.모델 환경 파일을 만듭니다.
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/model.sh && echo "Successfully created." || echo "Failed to create!" # Model: Mistral Small 3.2 24B Instruct export GDCS_HF_MODEL="mistralai/Mistral-Small-3.2-24B-Instruct-2506" export GDCS_HF_MODEL_REVISION="main" # Hugging Face branch, tag, or commit to download export GDCS_HF_DOWNLOAD_EXCLUDE="model-*.safetensors *.bin" EOFGPU 옵션의 가속기 환경 파일을 만듭니다.
NVIDIA A100 80GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA A100 80 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="300" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA H100 94 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA H100 94 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H100_NVL" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="300" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA H200 141GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA H200 141 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H200" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="300" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA B300 288 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA B300 288 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_B300_SXM6_AC" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="300" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFMinistral 8B Instruct
속성 값 Hugging Face 저장소 mistralai/Ministral-8B-Instruct-2410매개변수 8B (밀집) 라이선스 Mistral AI 연구 라이선스 (연구 및 비상업적 용도로만 사용) vLLM에서 사용하는 가중치 Mistral 형식 ( consolidated.safetensors,params.json,tekken.json), 약 16GB컨텍스트 길이 토큰 128,000개, 이 가이드에서는 --max-model-len 32768를 제공합니다.모델 환경 파일을 만듭니다.
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/model.sh && echo "Successfully created." || echo "Failed to create!" # Model: Ministral 8B Instruct export GDCS_HF_MODEL="mistralai/Ministral-8B-Instruct-2410" export GDCS_HF_MODEL_REVISION="main" # Hugging Face branch, tag, or commit to download export GDCS_HF_DOWNLOAD_EXCLUDE="model-*.safetensors *.bin" EOFGPU 옵션의 가속기 환경 파일을 만듭니다.
NVIDIA A100 40 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA A100 40 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_PCIE_40GB" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="120" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA A100 80GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA A100 80 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="120" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA H100 94 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA H100 94 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H100_NVL" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="120" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA H200 141GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA H200 141 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H200" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="120" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA B300 288 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA B300 288 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_B300_SXM6_AC" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="120" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFMixtral 8x7B Instruct
속성 값 Hugging Face 저장소 mistralai/Mixtral-8x7B-Instruct-v0.1매개변수 총 467억 개 / 활성 129억 개 (전문가 혼합, 8x7B) 라이선스 Apache 2.0 vLLM에서 사용하는 가중치 Hugging Face 형식 ( model-*.safetensors), 약 93GB (저장소에는consolidated.*.ptPyTorch 파일도 포함되어 있으며 제외됨)컨텍스트 길이 토큰 32,000개, 이 가이드에서는 --max-model-len 32768를 사용합니다.모델 환경 파일을 만듭니다.
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/model.sh && echo "Successfully created." || echo "Failed to create!" # Model: Mixtral 8x7B Instruct export GDCS_HF_MODEL="mistralai/Mixtral-8x7B-Instruct-v0.1" export GDCS_HF_MODEL_REVISION="main" # Hugging Face branch, tag, or commit to download export GDCS_HF_DOWNLOAD_EXCLUDE="consolidated* *.bin" EOFGPU 옵션의 가속기 환경 파일을 만듭니다.
NVIDIA A100 80GB (GPU 2개)
A100 80GB GPU 2개가 있는 노드가 필요합니다 (
a2-ultragpu-2g-gdc). vLLM은--tensor-parallel-size 2로 실행됩니다.cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA A100 80 GB (2 GPUs) export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE" export GDCS_WORKLOAD_ACCELERATOR_COUNT="2" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="480" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA H100 94GB (GPU 2개)
H100 GPU (
a3-highgpu-2g-gdc또는a3-highgpu-4g-gdc)가 2개 이상 있는 노드가 필요합니다. vLLM은--tensor-parallel-size 2로 실행됩니다.cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA H100 94 GB (2 GPUs) export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H100_NVL" export GDCS_WORKLOAD_ACCELERATOR_COUNT="2" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="480" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA A100 80 GB (FP8)
--quantization=fp8는 로드하는 동안 가중치를 FP8로 양자화하며(93GB 대신 약 47GB), 출력 품질이 약간 낮습니다.cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA A100 80 GB (FP8) export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="--quantization=fp8" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="480" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA H100 94 GB (FP8)
--quantization=fp8는 로드하는 동안 가중치를 FP8로 양자화하므로(93GB 대신 약 47GB) 출력 품질이 약간 낮아집니다.cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA H100 94 GB (FP8) export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H100_NVL" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="--quantization=fp8" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="480" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA H200 141GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA H200 141 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H200" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="480" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFNVIDIA B300 288 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA B300 288 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_B300_SXM6_AC" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="32768" export GDCS_VLLM_EXTRA_ARGS="" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="480" export GDCS_VLLM_TEST_MAX_TOKENS="128" EOFMagistral Small 1.2 24B
속성 값 Hugging Face 저장소 mistralai/Magistral-Small-2509매개변수 24B (밀집, 추론, 비전 인코더 포함) 라이선스 Apache 2.0 vLLM에서 사용하는 가중치 Mistral 형식 ( consolidated.safetensors,params.json,tekken.json), 약 48GB컨텍스트 길이 128k 토큰 (Mistral에서 40k 권장), 이 가이드에서는 --max-model-len 40960를 제공합니다.모델 환경 파일을 만듭니다.
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/model.sh && echo "Successfully created." || echo "Failed to create!" # Model: Magistral Small 1.2 24B export GDCS_HF_MODEL="mistralai/Magistral-Small-2509" export GDCS_HF_MODEL_REVISION="main" # Hugging Face branch, tag, or commit to download export GDCS_HF_DOWNLOAD_EXCLUDE="model-*.safetensors *.bin" EOFGPU 옵션의 가속기 환경 파일을 만듭니다.
NVIDIA A100 80GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA A100 80 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="40960" export GDCS_VLLM_EXTRA_ARGS="--reasoning-parser=mistral" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="300" export GDCS_VLLM_TEST_MAX_TOKENS="1024" EOFNVIDIA H100 94 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA H100 94 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H100_NVL" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="40960" export GDCS_VLLM_EXTRA_ARGS="--reasoning-parser=mistral" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="300" export GDCS_VLLM_TEST_MAX_TOKENS="1024" EOFNVIDIA H200 141GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA H200 141 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_H200" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="40960" export GDCS_VLLM_EXTRA_ARGS="--reasoning-parser=mistral" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="300" export GDCS_VLLM_TEST_MAX_TOKENS="1024" EOFNVIDIA B300 288 GB
cat << 'EOF' > ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.d/accelerator.sh && echo "Successfully created." || echo "Failed to create!" # Accelerator: NVIDIA B300 288 GB export GDCS_WORKLOAD_ACCELERATOR_TYPE="nvidia.com/gpu-pod-NVIDIA_B300_SXM6_AC" export GDCS_WORKLOAD_ACCELERATOR_COUNT="1" # vLLM export GDCS_VLLM_MAX_MODEL_LEN="40960" export GDCS_VLLM_EXTRA_ARGS="--reasoning-parser=mistral" export GDCS_VLLM_STARTUP_FAILURE_THRESHOLD="300" export GDCS_VLLM_TEST_MAX_TOKENS="1024" EOF환경 파일을 소싱합니다.
source ${HOME}/gdcag-solutions/open-weight-models/vllm/mistral/env.sh출력은 다음과 비슷합니다.
GDCS_ROOT_HOME=HOME_DIRECTORY_PATH/gdcag-solutions GDCS_IMPLEMENTATION_HOME=HOME_DIRECTORY_PATH/gdcag-solutions/open-weight-models/vllm GDCS_USER_GUIDE_HOME=HOME_DIRECTORY_PATH/gdcag-solutions/open-weight-models/vllm/mistral GDCS_HF_MODEL=HUGGING_FACE_REPOSITORY (ACCELERATOR_COUNT x ACCELERATOR_RESOURCE_TYPE)
클러스터
gdcloud을 구성합니다.gdcloud config set core/account "default-user" gdcloud config set core/organization_console_url "${GDC_ZONAL_CONSOLE_URL}" gdcloud config set core/project "${GDC_PROJECT}" gdcloud config set core/zone "${GDC_ZONE}"GDC 환경에 인증합니다.
gdcloud auth login클러스터 사용자 인증 정보를 검색합니다.
gdcloud clusters get-credentials "${GDC_STANDARD_CLUSTER_NAME}" \ --project="${GDC_PROJECT}" \ --standard \ --zone="${GDC_ZONE}"클러스터에 대한 연결을 확인합니다.
kubectl get nodes -L node.cluster.private.gdc.goog/machine-class가속기 환경 파일의 가속기 리소스 유형을 클러스터에서 사용할 수 있는지 확인합니다. 이 명령어는 노드가 노출하는 가속기 리소스 유형 (이름은 설치된 GPU 모델에 따라 다르며 GPU 노드가 없는 클러스터에서는 비어 있음)과 구성된 값을 나열합니다.
kubectl get nodes --output=json | jq -r '[.items[].status.allocatable | keys[] | select(startswith("nvidia.com/"))] | unique[]' echo "GDCS_WORKLOAD_ACCELERATOR_TYPE=${GDCS_WORKLOAD_ACCELERATOR_TYPE}"
구현
네임스페이스
네임스페이스를 만드세요.
kubectl create namespace "${GDCS_WORKLOAD_NAMESPACE}" \ --dry-run=client \ --output=yaml | kubectl apply -f -imagePullSecret를 추가합니다.kubectl create secret docker-registry "${GDCS_HARBOR_K8S_PULL_SECRET}" \ --dry-run=client \ --from-file=.dockerconfigjson=${GDCS_HARBOR_K8S_DOCKER_CONFIG}/config.json \ --namespace="${GDCS_WORKLOAD_NAMESPACE}" \ --output=yaml | kubectl apply -f -
모델 가중치
모델 가중치 (선택한 모델에 vLLM이 필요한 파일만,
GDCS_HF_DOWNLOAD_EXCLUDE는 나머지를 건너뜀)를 다운로드하고.cache디렉터리를 삭제합니다.EXCLUDE_ARGS=() if [[ -n "${GDCS_HF_DOWNLOAD_EXCLUDE:-}" ]]; then read -r -a EXCLUDE_PATTERNS <<< "${GDCS_HF_DOWNLOAD_EXCLUDE}" EXCLUDE_ARGS=(--exclude "${EXCLUDE_PATTERNS[@]}") fi hf download "${GDCS_HF_MODEL}" --revision "${GDCS_HF_MODEL_REVISION}" --local-dir "${GDCS_HF_MODEL_DOWNLOAD_DIR}" "${EXCLUDE_ARGS[@]}" && \ rm -rf "${GDCS_HF_MODEL_DOWNLOAD_DIR}/.cache"다운로드한 모델 가중치에서 25% 오버헤드를 사용하여 필요한
PersistentVolumeClaim크기를 계산합니다 (다음 전체 GiB로 반올림).MODEL_KIB=$(du -sk "${GDCS_HF_MODEL_DOWNLOAD_DIR}" | awk '{print $1}') export GDCS_MODEL_PVC_SIZE="$(( (MODEL_KIB * 125 / 100 + 1048575) / 1048576 ))Gi" echo "GDCS_MODEL_PVC_SIZE=${GDCS_MODEL_PVC_SIZE}"모델 가중치에 대한 ReadWriteOnce PersistentVolumeClaim의 매니페스트를 만듭니다.
cat <<EOF > "${GDCS_USER_GUIDE_HOME}/${GDCS_WORKLOAD_NAME}-rwo-pvc.yaml" apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ${GDCS_WORKLOAD_NAME}-rwo spec: accessModes: - ReadWriteOnce resources: requests: storage: ${GDCS_MODEL_PVC_SIZE} storageClassName: standard-rwo volumeMode: Filesystem EOF모델 가중치에 대한 PersistentVolumeClaim의 매니페스트를 적용합니다.
kubectl apply \ --filename="${GDCS_USER_GUIDE_HOME}/${GDCS_WORKLOAD_NAME}-rwo-pvc.yaml" \ --namespace="${GDCS_WORKLOAD_NAMESPACE}"PersistentVolumeClaim가 바인딩되고 인프라 운영자가 I/O 서비스 품질 (QoS) 정책을 조정하는 데 필요한 값을 출력할 때까지 기다립니다.kubectl wait \ --for=jsonpath='{.status.phase}'=Bound \ "pvc/${GDCS_WORKLOAD_NAME}-rwo" \ --namespace="${GDCS_WORKLOAD_NAMESPACE}" \ --timeout=120s BACKING_PVC=$(kubectl get pvc "${GDCS_WORKLOAD_NAME}-rwo" \ --namespace="${GDCS_WORKLOAD_NAMESPACE}" \ --output=jsonpath='{.spec.volumeName}') echo "BACKING_PVC=${BACKING_PVC} ORG=${GDC_ORG}"클러스터에서
performance-rwo를 사용할 수 없는 경우 인프라 운영자에게PersistentVolumeClaim를 지원하는 볼륨에 고성능 QoS 정책(system-performance-<ORG>-admin, GiB당 30 IOPS, 최소 6,148 IOPS)을 적용하도록 요청하세요. 이전 단계에서 출력된BACKING_PVC및ORG값을 제공합니다. 인프라 운영자는 FILE-R0097에 설명된 대로 정책을 적용합니다. 이 정책은 라이브 볼륨에 적용되므로 다음 단계를 계속 진행할 수 있습니다.모델 로더 포드의 매니페스트를 만듭니다.
cat <<EOF > "${GDCS_USER_GUIDE_HOME}/${GDCS_MODEL_LOADER_POD_NAME}-pod.yaml" apiVersion: v1 kind: Pod metadata: name: ${GDCS_MODEL_LOADER_POD_NAME} spec: containers: - name: uploader image: ${GDCS_HARBOR_PROJECT_URI}/library/busybox:${GDCS_BUSYBOX_IMAGE_TAG} command: ["sleep", "infinity"] volumeMounts: - name: model-data mountPath: ${GDCS_HF_PV_MOUNT_PATH} imagePullSecrets: - name: ${GDCS_HARBOR_K8S_PULL_SECRET} volumes: - name: model-data persistentVolumeClaim: claimName: ${GDCS_WORKLOAD_NAME}-rwo EOF모델 로더 포드의 매니페스트를 적용합니다.
kubectl apply \ --filename="${GDCS_USER_GUIDE_HOME}/${GDCS_MODEL_LOADER_POD_NAME}-pod.yaml" \ --namespace="${GDCS_WORKLOAD_NAMESPACE}"모델 로더 포드가 실행될 때까지 기다립니다.
watch --color --interval 5 --no-title \ "kubectl get pod/${GDCS_MODEL_LOADER_POD_NAME} \ --namespace=${GDCS_WORKLOAD_NAMESPACE} | GREP_COLORS='mt=01;92' grep -E --color=always -e '^' -e 'Running'"모델 가중치를
PersistentVolume에 업로드합니다. 스크립트는 동일한 크기로 이미 존재하는 파일을 건너뛰므로 다시 실행할 수 있습니다.export LOCAL_MODEL_DIR="${GDCS_HF_MODEL_DOWNLOAD_DIR}" export REMOTE_MODEL_DIR="${GDCS_HF_PV_MOUNT_PATH}/${GDCS_HF_MODEL_LOWERCASE}" export REMOTE_MOUNT_DIR="${GDCS_HF_PV_MOUNT_PATH}" ${GDCS_IMPLEMENTATION_HOME}/model_weight_upload.sh모델 로더 포드를 삭제합니다.
kubectl delete pod/${GDCS_MODEL_LOADER_POD_NAME} \ --namespace="${GDCS_WORKLOAD_NAMESPACE}"
추론 서버
vLLM 배포의 매니페스트를 만듭니다. ConfigMap은 환경에서 모델별 vLLM 설정을 전달하므로 매니페스트는 모든 모델 및 GPU 옵션에 대해 동일합니다.
cat <<EOF > "${GDCS_USER_GUIDE_HOME}/${GDCS_WORKLOAD_NAME}-deployment.yaml" apiVersion: v1 kind: ConfigMap metadata: name: ${GDCS_WORKLOAD_NAME} data: MAX_MODEL_LEN: "${GDCS_VLLM_MAX_MODEL_LEN}" MODEL: "${GDCS_HF_PV_MOUNT_PATH}/${GDCS_HF_MODEL_LOWERCASE}" PORT: "8000" TENSOR_PARALLEL_SIZE: "${GDCS_WORKLOAD_ACCELERATOR_COUNT}" VLLM_EXTRA_ARGS: "${GDCS_VLLM_EXTRA_ARGS}" --- apiVersion: apps/v1 kind: Deployment metadata: name: ${GDCS_WORKLOAD_NAME} labels: app: ${GDCS_WORKLOAD_NAME} spec: replicas: 1 selector: matchLabels: app: ${GDCS_WORKLOAD_NAME} strategy: type: Recreate template: metadata: labels: app: ${GDCS_WORKLOAD_NAME} spec: containers: - command: - /bin/sh - -c args: - exec vllm serve "\$MODEL" --port="\$PORT" --tensor-parallel-size="\$TENSOR_PARALLEL_SIZE" --max-model-len="\$MAX_MODEL_LEN" \$VLLM_EXTRA_ARGS envFrom: - configMapRef: name: ${GDCS_WORKLOAD_NAME} image: ${GDCS_HARBOR_PROJECT_URI}/vllm/vllm-openai:${GDCS_VLLM_IMAGE_TAG}-fips livenessProbe: failureThreshold: 3 httpGet: path: /health port: 8000 periodSeconds: 20 timeoutSeconds: 5 name: vllm ports: - containerPort: 8000 readinessProbe: failureThreshold: 3 httpGet: path: /health port: 8000 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 5 resources: limits: ${GDCS_WORKLOAD_ACCELERATOR_TYPE}: "${GDCS_WORKLOAD_ACCELERATOR_COUNT}" requests: ${GDCS_WORKLOAD_ACCELERATOR_TYPE}: "${GDCS_WORKLOAD_ACCELERATOR_COUNT}" startupProbe: httpGet: path: /health port: 8000 failureThreshold: ${GDCS_VLLM_STARTUP_FAILURE_THRESHOLD} periodSeconds: 10 timeoutSeconds: 5 volumeMounts: - name: model-weights mountPath: ${GDCS_HF_PV_MOUNT_PATH} - name: shm mountPath: /dev/shm securityContext: seLinuxOptions: type: spc_t imagePullSecrets: - name: ${GDCS_HARBOR_K8S_PULL_SECRET} volumes: - name: model-weights persistentVolumeClaim: claimName: ${GDCS_WORKLOAD_NAME}-rwo - name: shm emptyDir: medium: Memory sizeLimit: "8Gi" --- apiVersion: v1 kind: Service metadata: name: ${GDCS_WORKLOAD_NAME} spec: ports: - name: vllm-http port: 80 protocol: TCP targetPort: 8000 selector: app: ${GDCS_WORKLOAD_NAME} type: LoadBalancer EOFvLLM 배포의 매니페스트를 적용합니다.
kubectl apply \ --filename="${GDCS_USER_GUIDE_HOME}/${GDCS_WORKLOAD_NAME}-deployment.yaml" \ --namespace="${GDCS_WORKLOAD_NAMESPACE}"vLLM
NetworkPolicy의 매니페스트를 만듭니다.cat << EOF > "${GDCS_USER_GUIDE_HOME}/vllm-networkpolicy.yaml" && echo "Successfully created." || echo "Failed to create!" apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-vllm-ingress namespace: ${GDCS_WORKLOAD_NAMESPACE} spec: ingress: - from: - ipBlock: cidr: 0.0.0.0/0 - namespaceSelector: {} ports: - port: 8000 protocol: TCP podSelector: {} policyTypes: - Ingress EOFvLLM
NetworkPolicy의 매니페스트를 적용합니다.kubectl apply \ --filename="${GDCS_USER_GUIDE_HOME}/vllm-networkpolicy.yaml"
포드가 실행될 때까지 기다립니다.
watch --color --interval 5 --no-title \ "kubectl get pods --selector=app=${GDCS_WORKLOAD_NAME} \ --namespace=${GDCS_WORKLOAD_NAMESPACE} | GREP_COLORS='mt=01;92' grep -E --color=always -e '^' -e 'Running'"배포가 준비될 때까지 기다립니다.
watch --color --interval 5 --no-title \ "kubectl get deployment/${GDCS_WORKLOAD_NAME} \ --namespace=${GDCS_WORKLOAD_NAMESPACE} | GREP_COLORS='mt=01;92' grep -E --color=always -e '^' -e '1/1 1 1'"선택사항: 컨테이너 로그를 스트리밍하여 시작 진행 상황을 모니터링합니다.
kubectl logs deployment/${GDCS_WORKLOAD_NAME} \ --follow \ --namespace="${GDCS_WORKLOAD_NAMESPACE}"
유효성 검사
vLLM의 LoadBalancer IP 주소를 검색합니다.
export VLLM_LB_IP=$(kubectl get service/${GDCS_WORKLOAD_NAME} --namespace="${GDCS_WORKLOAD_NAMESPACE}" --output=jsonpath='{.status.loadBalancer.ingress[*].ip}') echo "VLLM_LB_IP=${VLLM_LB_IP}"vLLM에 테스트 요청을 전송합니다.
max_tokens값은env.d/accelerator.sh의GDCS_VLLM_TEST_MAX_TOKENS입니다. 추론 단계에서 출력 토큰을 소비하므로 추론 모델에는 더 큰 예산이 필요합니다.curl http://${VLLM_LB_IP}/v1/models curl http://${VLLM_LB_IP}/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "'${GDCS_HF_PV_MOUNT_PATH}/${GDCS_HF_MODEL_LOWERCASE}'", "messages": [ {"role": "user", "content": "Explain Google Distributed Cloud air-gapped briefly."} ], "max_tokens": '${GDCS_VLLM_TEST_MAX_TOKENS}' }'예를 들어 아직
ProjectNetworkPolicy에서 허용하지 않아 워크스테이션에서 LoadBalancer IP 주소에 연결할 수 없는 경우 포트 전달을 통해 요청을 전송합니다.kubectl port-forward service/${GDCS_WORKLOAD_NAME} \ --namespace="${GDCS_WORKLOAD_NAMESPACE}" 8000:80 & PF_PID=$! sleep 1 curl http://127.0.0.1:8000/v1/models kill ${PF_PID}