list
./config.json
./generation_config.json
./large_file_part_aa
./LICENSE
./model-00001-of-00004.safetensors
./model-00001-of-00004.safetensors_00
./model-00001-of-00004.safetensors_01
./model-00001-of-00004.safetensors_02
./model-00002-of-00004.safetensors
./model-00002-of-00004.safetensors_00
./model-00002-of-00004.safetensors_01
./model-00002-of-00004.safetensors_02
./model-00003-of-00004.safetensors
./model-00003-of-00004.safetensors_00
./model-00003-of-00004.safetensors_01
./model-00003-of-00004.safetensors_02
./model-00004-of-00004.safetensors
./model.safetensors.index.json
./original
./original/consolidated.00.pth
./original/consolidated.00.pth_00
./original/consolidated.00.pth_01
./original/consolidated.00.pth_02
./original/consolidated.00.pth_03
./original/consolidated.00.pth_04
./original/consolidated.00.pth_05
./original/consolidated.00.pth_06
./original/consolidated.00.pth_07
./original/consolidated.00.pth_08
./original/params.json
./original/tokenizer.model
./README.md
./special_tokens_map.json
./tokenizer_config.json
./tokenizer.json
./USE_POLICY.md
--
순수 git 명령어(예: git clone, git checkout) 자체로는 GitHub Release Asset을 직접 다운로드할 수 없습니다.
Release Asset은 git의 소스 코드 커밋 히스토리에 포함된 개체가 아니라, GitHub 플랫폼이 별도로 호스팅하는 첨부 파일(바이너리, 압축 파일 등)이기 때문입니다.
대신 리눅스 터미널에서는 1) GitHub 공식 CLI (gh), 2) `curl, 또는 3) wget`을 사용하는 것이 표준 방식입니다.
gh) 사용 (가장 추천)GitHub 공식 터미널 도구인 gh를 사용하면 명령어가 가장 직관적이며, Private 저장소 인증도 손쉽게 처리됩니다.
# 특정 저장소의 최신 릴리스에서 특정 파일 다운로드
gh release download <태그명_또는_생략> --repo <소유자>/<저장소> --pattern "<파일명>"
# 예시: 최신 릴리스의 tar.gz 파일 다운로드
gh release download --repo cli/cli --pattern "*.tar.gz"
curl 사용GitHub 릴리스의 직접 다운로드 URL을 바로 넘겨받아 다운로드합니다 (-L 플래그로 리다이렉트를 반드시 따라가야 합니다).
curl -L -O https://github.com/<소유자>/<저장소>/releases/download/<태그>/<파일명>
Private 저장소의 Asset은 브라우저 URL로 접근하면 404가 발생하므로, GitHub API를 통해 다운로드해야 합니다.
# 1. 파일의 Asset ID 확인
ASSET_ID=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/<소유자>/<저장소>/releases/tags/<태그> \
| grep -B 2 '"name": "<파일명>"' | grep '"id":' | head -n 1 | awk '{print $2}' | tr -d ',')
# 2. application/octet-stream 헤더로 실제 바이너리 다운로드
curl -L -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/octet-stream" \
https://api.github.com/repos/<소유자>/<저장소>/releases/assets/$ASSET_ID \
-o <저장할_파일명>
wget 사용 (Public 저장소)wget https://github.com/<소유자>/<저장소>/releases/download/<태그>/<파일명>
===
엔비디아 Blackwell 아키텍처 기반의 B300 8장(카드당 288GB HBM3e, 8장 합산 약 2.3TB VRAM) 구성은 초거대 MoE 모델이나 FP4/FP8 기반 대규모 병렬 서빙 성능을 한계까지 밀어붙이기에 최적의 인프라입니다.
8B 모델(Llama 3.1 8B)은 단일 GPU의 극히 일부 메모리(약 16GB)만 쓰기 때문에 초기 환경 동작 확인(Sanity Check)용으로 적합하며, B300 8장의 진가를 검증하려면 소형(초고동시성/Throughput 테스트) 중형(Dense 단일 노드 스케일링) 대형 MoE(통신 대역폭/FP4 양자화 한계 검증) 단계로 벤치마크를 확장해야 합니다.
소형 (8B ~ 14B): Throughput & TTFT 극한 테스트
중형 (70B ~ 72B): 표준 고성능 Dense 모델 (TP2 ~ TP8 검증)
대형 MoE (200B ~ 600B+): B300 8장의 VRAM과 통신망을 풀로드하는 모델
| 체급 | 모델명 | 파라미터 (활성/총) | 권장 병렬 구성 (B300 8장 기준) | 벤치마크 핵심 검증 포인트 |
|---|---|---|---|---|
| 소형 | Llama 3.1 8B | 8B (Dense) | 단일 GPU × 8 인스턴스 (DP8) | • 서빙 엔진(vLLM/SGLang) 기본 통신 동작 확인• 배치 사이즈 극한 확장 시 Token Throughput |
| 소·중형 | Qwen 2.5 14B | 14.7B (Dense) | TP=1 or TP=2 (DP4) | • 128k 롱컨텍스트 입력 시 KV Cache 확장성 및 속도 |
| 중형 | Llama 3.3 70B | 70B (Dense) | TP=4 or TP=8 | • BF16 원본 서빙 시 Latency 및 ITL(Inter-Token Latency)• NVLink 간 All-Reduce 통신 효율 측정 |
| 중형 | Qwen 2.5 72B | 72.7B (Dense) | TP=4 (DP2) or TP=8 | • 실무 프로덕션급 추론/코딩 성능 및 복잡한 추론 벤치 |
| 대형 | Mixtral 8x22B | 39B / 141B (MoE) | TP=4 or TP=8 | • MoE 라우팅 오버헤드 측정• 고속 토큰 생성(Decode) 속도 검증 |
| 초대형 | DeepSeek V3/R1 | 37B / 671B (MoE) | FP8/FP4 기반 TP=8 | • Blackwell FP4/FP8 텐서 코어 연산 한계 테스트• 메모리 대역폭(HBM3e) 포화 테스트 |
Llama-3.1-8B-InstructLlama-3.3-70B-InstructDeepSeek-V3 또는 R1 (FP8)===
B300 8장(카드당 288GB HBM3e, 노드 총합 약 2,304GB VRAM)은 671B 총 파라미터를 가진 DeepSeek-V3 / R1 (FP8)을 단일 노드 안에서 온전히 서빙하고도 거대한 KV Cache 공간을 확보할 수 있는 환경입니다.
vllm serve)DeepSeek V3/R1은 고유의 MLA(Multi-head Latent Attention)와 MoE 아키텍처를 사용하므로, vLLM 최신 버전에서 지원하는 최적화 플래그를 함께 설정해야 합니다.
vllm serve deepseek-ai/DeepSeek-V3 \
--tensor-parallel-size 8 \
--pipeline-parallel-size 1 \
--dtype bfloat16 \
--quantization fp8 \
--kv-cache-dtype fp8 \
--max-model-len 32768 \
--gpu-memory-utilization 0.92 \
--enforce-eager \
--trust-remote-code \
--port 8000
DeepSeek-R1 서빙 시: 모델 경로만
deepseek-ai/DeepSeek-R1로 변경하면 구조와 가중치 규격이 동일하므로 세팅은 100% 동일합니다.
--tensor-parallel-size 8--quantization fp8 & `--kv-cache-dtype fp8`--max-model-len 32768 (또는 65536 / 131072)--enforce-eager (권장: 초기 테스트용)--gpu-memory-utilization 0.92nvidia-smi nvlink -s 명령어로 8개 GPU 간 통신 링크가 정상 활성화(NVLink Link status: Up)되어 있는지 확인하세요.==
vLLM 공식 벤치마크 도구인 benchmark_serving.py를 활용해 서빙 중인 DeepSeek V3(8000번 포트)의 TTFT(Time to First Token), TPOT(Time per Output Token), Throughput(토큰/요청 처리량)을 단계별로 측정하는 스크립트입니다.
vLLM 공식 벤치마크 스크립트와 표준 평가용 데이터셋(ShareGPT)을 다운로드합니다.
# vLLM 벤치마크 스크립트 다운로드
wget https://raw.githubusercontent.com/vllm-project/vllm/main/benchmarks/benchmark_serving.py
# ShareGPT 데이터셋 다운로드 (실제 사용자 대화 패턴 반영)
wget https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json
run_benchmark.sh)동시 요청 수(Concurrency)와 요청 생성률(Request Rate)을 단계별로 올려가며 성능 포화 지점을 찾는 실행 스크립트입니다.
#!/usr/bin/env bash
set -e
MODEL_NAME="deepseek-ai/DeepSeek-V3"
API_URL="http://localhost:8000"
DATASET_PATH="./ShareGPT_V3_unfiltered_cleaned_split.json"
OUTPUT_DIR="./benchmark_results"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
mkdir -p "${OUTPUT_DIR}"
echo "=== 1. Health Check ==="
curl -s -f "${API_URL}/v1/models" > /dev/null || { echo "vLLM 서버가 응답하지 않습니다. (포트 8000 확인)"; exit 1; }
echo "vLLM 서빙 정상 확인 완료."
# ---------------------------------------------------------
# 시나리오 1: 단일 요청 Baseline 레이턴시 (TTFT 및 최소 TPOT 측정)
# ---------------------------------------------------------
echo "=== 2. Baseline Latency Test (1 Request, Concurrency=1) ==="
python3 benchmark_serving.py \
--backend vllm \
--base-url "${API_URL}" \
--model "${MODEL_NAME}" \
--dataset-name sharegpt \
--dataset-path "${DATASET_PATH}" \
--num-prompts 50 \
--request-rate inf \
--max-concurrency 1 \
--save-result \
--result-dir "${OUTPUT_DIR}" \
--result-filename "baseline_latencies_${TIMESTAMP}.json"
# ---------------------------------------------------------
# 시나리오 2: 동시성 부하 테스트 (Concurrency = 8, 32, 64, 128)
# B300 8장의 KV Cache 풀로드 및 TP=8 통신 스케일링 측정
# ---------------------------------------------------------
for CONCURRENCY in 8 32 64 128; do
echo "=== 3. Throughput Test (Concurrency: ${CONCURRENCY}) ==="
python3 benchmark_serving.py \
--backend vllm \
--base-url "${API_URL}" \
--model "${MODEL_NAME}" \
--dataset-name sharegpt \
--dataset-path "${DATASET_PATH}" \
--num-prompts 500 \
--request-rate inf \
--max-concurrency "${CONCURRENCY}" \
--save-result \
--result-dir "${OUTPUT_DIR}" \
--result-filename "concurrency_${CONCURRENCY}_${TIMESTAMP}.json"
done
# ---------------------------------------------------------
# 시나리오 3: 고정 인풋/아웃풋 길이 합성 데이터 테스트 (1k Prompt -> 512 Output)
# ---------------------------------------------------------
echo "=== 4. Synthetic Fixed-Length Test (Input: 1024, Output: 512) ==="
python3 benchmark_serving.py \
--backend vllm \
--base-url "${API_URL}" \
--model "${MODEL_NAME}" \
--dataset-name random \
--random-input-len 1024 \
--random-output-len 512 \
--num-prompts 300 \
--max-concurrency 64 \
--save-result \
--result-dir "${OUTPUT_DIR}" \
--result-filename "synthetic_1k_512_${TIMESTAMP}.json"
echo "=== 모든 벤치마크 완료: ${OUTPUT_DIR} 확인 ==="
스크립트 실행 후 출력되는 리포트에서 다음 항목들을 중점적으로 확인합니다.
watch -n 1 nvidia-smi를 띄워 8장 GPU의 Power Draw, Volatile GPU-Util, HBM 점유율이 균등하게 90% 이상 유지되는지 점검합니다.==
B300 8장(총 약 2.3TB VRAM) 환경의 높은 HBM 대역폭과 거대한 메모리를 최적으로 활용할 수 있도록 구성한 체급별 vLLM 서빙 표준 명령어입니다.
8장의 B300에 TP=8로 분산 배치하여 NVLink 기반 All-to-All 통신 대역폭과 빠른 디코딩 속도를 극대화합니다.
vllm serve mistralai/Mixtral-8x22B-Instruct-v0.1 \
--tensor-parallel-size 8 \
--pipeline-parallel-size 1 \
--dtype bfloat16 \
--max-model-len 32768 \
--gpu-memory-utilization 0.90 \
--max-num-seqs 256 \
--port 8000
Dense 모델 특성상 통신 오버헤드와 연산 속도의 균형이 뛰어난 TP=8 구성이 단일 노드 서빙에 가장 적합합니다.
vllm serve Qwen/Qwen2.5-72B-Instruct \
--tensor-parallel-size 8 \
--pipeline-parallel-size 1 \
--dtype bfloat16 \
--max-model-len 32768 \
--gpu-memory-utilization 0.90 \
--trust-remote-code \
--port 8000
--max-model-len 65536 또는 131072로 늘려 테스트할 수 있습니다.표준 70B 모델로, TP=8 단일 인스턴스로 서빙하거나 초고동시성을 위해 TP=4 인스턴스 2개(DP2)로 나누어 올릴 수 있습니다. 표준 권장인 TP=8 설정입니다.
vllm serve meta-llama/Llama-3.3-70B-Instruct \
--tensor-parallel-size 8 \
--pipeline-parallel-size 1 \
--dtype bfloat16 \
--max-model-len 32768 \
--gpu-memory-utilization 0.90 \
--port 8000
14B 모델은 가중치가 약 30GB에 불과하므로, 8장의 GPU를 모두 쓰려면 GPU 2장씩 묶어 TP=2로 4개 인스턴스(DP4)를 띄우거나, 단일 인스턴스 빠른 검증 시 TP=2 또는 TP=4를 사용합니다.
# 단일 인스턴스 검증 (GPU 0, 1번 사용: TP=2)
CUDA_VISIBLE_DEVICES=0,1 vllm serve Qwen/Qwen2.5-14B-Instruct \
--tensor-parallel-size 2 \
--dtype bfloat16 \
--max-model-len 32768 \
--gpu-memory-utilization 0.90 \
--trust-remote-code \
--port 8000
TP=1로도 128k 풀 컨텍스트를 올리고 대규모 배치를 감당할 수 있습니다. Throughput 벤치마크 시에는 노드 1대에서 포트를 다르게 하여 4~8개의 독립 인스턴스를 띄우는 것이 유리합니다.환경 세팅 검증 및 기본 파이프라인(Sanity Check)용으로, TP=1(단일 GPU) 서빙이 표준입니다.
# 단일 인스턴스 검증 (GPU 0번 사용: TP=1)
CUDA_VISIBLE_DEVICES=0 vllm serve meta-llama/Meta-Llama-3.1-8B-Instruct \
--tensor-parallel-size 1 \
--dtype bfloat16 \
--max-model-len 32768 \
--gpu-memory-utilization 0.90 \
--port 8000
| 모델 | 권장 TP 구성 (B300 8장) | GPU당 가중치 점유 | 권장 용도 |
|---|---|---|---|
| Mixtral 8x22B | TP = 8 | 약 35 GB | MoE 라우팅 및 NVLink 패브릭 스트레스 벤치마크 |
| Qwen 2.5 72B | TP = 8 | 약 18 GB | 프로덕션급 고성능 추론 및 롱컨텍스트 평가 |
| Llama 3.3 70B | TP = 8 (또는 TP=4 2) | 약 18 GB | 표준 70B 벤치마크 및 최소 지연시간(Latency) 측정 |
| Qwen 2.5 14B | TP = 2 4 인스턴스 | 약 15 GB | 고효율 동시성 처리 및 경량 고성능 서빙 |
| Llama 3.1 8B | TP = 1 8 인스턴스 | 약 16 GB | 인프라 초기 구동 검증(Sanity Check) 및 최대 QPS 측정 |
==
B300 8장 환경에서 모델별(8B부터 671B MoE까지) 추론 성능을 객관적으로 비교하고 병목을 찾아내려면, 단계별 부하 테스트 워크플로우와 3계층(인프라-엔진-서비스) 모니터링 파이프라인을 갖춰야 합니다.
모든 모델에 대해 동일한 3가지 패턴으로 부하를 주어 지표를 수집하고 비교 매트릭스를 만듭니다.
1단계: Baseline 레이턴시 측정 (Concurrency = 1)
2단계: 동시성(Concurrency) 스위핑 (Concurrency = 4 16 64 128 256)
3단계: 입력 길이(Context Length)별 스트레스 테스트 (1k, 8k, 32k, 64k)
# 모델별로 동시성을 1부터 128까지 순회하며 JSON 결과 생성
for C in 1 8 32 64 128; do
python3 benchmark_serving.py \
--backend vllm \
--base-url http://localhost:8000 \
--model <서빙중인_모델명> \
--dataset-name sharegpt \
--dataset-path ./ShareGPT_V3_unfiltered_cleaned_split.json \
--num-prompts 300 \
--max-concurrency $C \
--save-result \
--result-dir ./results \
--result-filename "${MODEL_NAME}_c${C}.json"
done
단순히 nvidia-smi를 쳐다보는 방식으로는 NVLink 대역폭 병목이나 KV Cache 프리엠션을 잡기 어렵습니다. Prometheus + Grafana 기반의 자동화 모니터링이 표준입니다.
[B300 8장 GPU Hardware] ----> [NVIDIA DCGM Exporter :9400] \
===> [Prometheus] ===> [Grafana Dashboard]
[vLLM Inference Engine] ----> [vLLM Metrics Endpoint :8000] /
B300 8장의 물리적 상태와 NVLink 통신 상태를 감시합니다.
docker run -d --gpus all --net=host nvcr.io/nvidia/k8s/dcgm-exporter:latest (포트 9400 노출)DCGM_FI_DEV_GPU_UTIL: 연산 코어 활용률 (%)DCGM_FI_DEV_MEM_COPY_UTIL: HBM3e 메모리 대역폭 활용률 (Decode 단계 병목 판단의 핵심)DCGM_FI_DEV_NVLINK_BANDWIDTH_TOTAL: NVLink 송수신 처리량 (DeepSeek V3, Mixtral 같은 MoE 서빙 시 통신 포화 여부 확인)DCGM_FI_DEV_POWER_USAGE / TEMP: 전력 소비량(W) 및 발열 스로틀링 여부/metrics 엔드포인트)vLLM이 자체적으로 노출하는 메트릭을 Prometheus로 긁어옵니다 (http://localhost:8000/metrics).
vllm:num_requests_running / vllm:num_requests_waiting: 현재 실행 중인 요청 수 vs VRAM/스케줄러 큐에 대기 중인 요청 수 (Waiting이 급증하면 용량 포화)vllm:gpu_cache_usage_perc: KV Cache 메모리 점유율 (100% 도달 시 선점(Preemption) 발생 위험)vllm:num_preemptions_total: 메모리 부족으로 디코딩 중 쫓겨난 요청 수 (0이어야 정상)vllm:time_to_first_token_seconds_bucket: TTFT 히스토그램 (P50, P90, P99 지연시간 분석)vllm:time_per_output_token_seconds_bucket: TPOT 히스토그램 (사용자 체감 생성 속도)node_memory_MemAvailable_bytes)와 PCIe/디스크 I/O 속도를 추적합니다.벤치마크 실행 중 다음과 같은 지표 패턴이 나타나면 즉시 해당 설정을 튜닝해야 합니다.
| 관측 증상 | 메트릭 이상 징후 | 주요 원인 | 조치 방안 |
|---|---|---|---|
| TTFT(첫 토큰 지연) 급증 | waiting_requests 증가, |
gpu_cache_usage 95%+ | Prefill 단계의 큐 적체 또는 Chunked Prefill 미적용 | --max-num-batched-tokens 상향 또는 프롬프트 크기 제어 |
| Throughput 정체 및 연산 저하 | DCGM GPU_UTIL 낮음,
NVLINK_BANDWIDTH 포화 | MoE All-to-All 통신 또는 TP 병목 | TP 크기 재조정 또는 FP8/FP4 양자화 적용 |
| 토큰 생성 도중 끊김 현상 | num_preemptions_total > 0 | 배치 대비 VRAM(KV Cache) 공간 부족 | --gpu-memory-utilization 상향 또는 --max-num-seqs 축소 |
| Throughput 대비 느린 속도 | MEM_COPY_UTIL 100% 육박,
GPU_UTIL 중간 | Memory Bandwidth Bound (메모리 대역폭 한계) | 자연스러운 LLM Decode 특성이며 배치를 더 묶거나 양자화 도입 |
테스트가 끝난 후 아래와 같은 매트릭스로 정리하면 단일 B300 노드의 워크로드별 수용 능력을 한눈에 비교할 수 있습니다.
==
benchmark_serving.py는 vLLM 오픈소스 진영에서 공식 제공하는 스크립트라 가장 널리 쓰이지만, 업계 유일의 표준은 아니며 실무에서는 더 정교한 오픈소스 부하/벤치마크 프레임워크들을 병행해서 사용합니다.
benchmark_serving.py 외에 주로 쓰이는 LLM 벤치마크 도구GenAI-Perf (Triton / NVIDIA 공식 도구)
Locust / k6 (범용 부하 테스트 툴)
GuideLLM (Neural Magic 제공)
아닙니다. 외부 공인 IP 방화벽을 직접 열지 않는 것이 보안상 훨씬 안전하며, 실무에서도 방화벽 오픈은 권장하지 않습니다.
Prometheus(9090)나 Grafana(3000) 포트를 퍼블릭 인터넷에 그대로 노출하면 브루트포스 공격이나 미인증 메트릭 탈취 위험에 노출됩니다. 다음 3가지 방법 중 하나를 선택하면 방화벽을 열지 않고도 안전하게 접속할 수 있습니다.
로컬 PC(노트북) 터미널에서 SSH 터널링을 뚫어두고 브라우저로 접근하는 방식입니다.
# 로컬 PC 터미널에서 실행 (GPU 노드의 SSH 22번 포트만 열려 있으면 가능)
ssh -N -L 3000:localhost:3000 -L 9090:localhost:9090 user@<GPU_노드_PUBLIC_IP>
http://localhost:3000(Grafana), http://localhost:9090(Prometheus)으로 접속하면 터널을 통해 안전하게 열립니다.0.0.0.0/0 전체 개방 대신, 현재 접속 중인 사무실/자택의 고정 공인 IP에 대해서만 UFW나 클라우드 Security Group에서 허용합니다.
sudo ufw allow from <내_공인_IP> to any port 3000 proto tcp
htpasswd)을 걸어서 포워딩하거나,==
RHEL 기반 베어메탈 환경에서 Prometheus, Grafana, 그리고 3가지 Exporter(Node Exporter, NVIDIA DCGM Exporter, vLLM)를 Systemd 서비스로 구성하고 연동하는 전체 절차입니다.
909030009100 (OS/호스트 리소스)9400 (B300 GPU 하드웨어/NVLink 메트릭)8000 (추론 엔진 /metrics)# 1. Prometheus 시스템 계정 및 디렉터리 생성
sudo useradd --no-create-home --shell /bin/false prometheus
sudo mkdir -p /etc/prometheus /var/lib/prometheus
# 2. 바이너리 다운로드 및 배치 (최신 버전 확인 권장)
cd /tmp
curl -LO https://github.com/prometheus/prometheus/releases/download/v2.54.1/prometheus-2.54.1.linux-amd64.tar.gz
tar -xvf prometheus-2.54.1.linux-amd64.tar.gz
cd prometheus-2.54.1.linux-amd64
sudo cp prometheus promtool /usr/local/bin/
sudo cp -r consoles console_libraries /etc/prometheus/
sudo chown -R prometheus:prometheus /usr/local/bin/prom* /etc/prometheus /var/lib/prometheus
# 3. Systemd 서비스 파일 생성
sudo tee /etc/systemd/system/prometheus.service << 'EOF'
[Unit]
Description=Prometheus Server
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus/ \
--web.listen-address=127.0.0.1:9090 \
--storage.tsdb.retention.time=15d
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
CPU, 호스트 RAM(대형 모델 로딩 모니터링), 디스크 I/O를 수집합니다.
sudo useradd --no-create-home --shell /bin/false node_exporter
cd /tmp
curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar -xvf node_exporter-1.8.2.linux-amd64.tar.gz
sudo cp node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
sudo tee /etc/systemd/system/node_exporter.service << 'EOF'
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter --web.listen-address=127.0.0.1:9100
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
B300 8장의 GPU 사용률, 메모리 대역폭, 전력, 그리고 NVLink 통신 메트릭을 수집합니다.
# 1. NVIDIA 공식 패키지 저장소 등록 (RHEL 계열)
sudo dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel9/x86_64/cuda-rhel9.repo
# 2. DCGM 및 datacenter-gpu-manager 설치
sudo dnf install -y datacenter-gpu-manager datacenter-gpu-manager-exporter
# 3. DCGM 엔진 서비스 실행
sudo systemctl enable --now nvidia-dcgm
# 4. DCGM Exporter 서비스 실행 (기본 포트 9400)
sudo systemctl enable --now dcgm-exporter
(검증: curl -s http://localhost:9400/metrics | grep DCGM_FI_DEV_GPU_UTIL 실행 시 8개 GPU 메트릭 출력 확인)
/etc/prometheus/prometheus.yml)vLLM(포트 8000), DCGM(포트 9400), Node Exporter(포트 9100)를 수집 대상으로 등록합니다.
sudo tee /etc/prometheus/prometheus.yml << 'EOF'
global:
scrape_interval: 2s # LLM 벤치마크 시 급격한 메트릭 스파이크 감지를 위해 2초 권장
evaluation_interval: 2s
scrape_configs:
# 1. 호스트 시스템 리소스
- job_name: 'node_exporter'
static_configs:
- targets: ['127.0.0.1:9100']
# 2. B300 GPU 하드웨어 & NVLink
- job_name: 'dcgm_exporter'
static_configs:
- targets: ['127.0.0.1:9400']
# 3. vLLM 추론 엔진
- job_name: 'vllm'
metrics_path: /metrics
static_configs:
- targets: ['127.0.0.1:8000']
EOF
sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml
sudo systemctl daemon-reload
sudo systemctl enable --now prometheus
(검증: systemctl status prometheus)
# 1. Grafana 공식 YUM 저장소 등록
sudo tee /etc/yum.repos.d/grafana.repo << 'EOF'
[grafana]
name=grafana
baseurl=https://rpm.grafana.com
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://rpm.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
EOF
# 2. Grafana 설치 및 서비스 기동
sudo dnf install -y grafana
sudo systemctl daemon-reload
sudo systemctl enable --now grafana-server
ssh -N -L 3000:localhost:3000 -L 9090:localhost:9090 <계정>@<B300_서버_IP>
http://localhost:3000 (초기 계정: admin / admin)http://localhost:9090 입력 후 Save & test12239 (8개 GPU의 Utilization, HBM Bandwidth, Power를 한눈에 모니터링)1860 (Host CPU, 메모리, 네트워크 인터페이스 모니터링)examples/grafana.json) JSON 파일을 복사하여 Import하면 TTFT, TPOT(Time per Output Token), KV Cache Usage, Running/Waiting Requests 패널이 바로 구성됩니다.==
폐쇄망(Air-gap) 환경에서는 외부 저장소에 직접 접근할 수 없으므로, 인터넷이 연결된 동일 OS(RHEL 9 또는 10) 환경의 PC/서버에서 의존성 RPM 패키지들을 통째로 다운로드하여 압축 반입한 뒤 로컬 레포지토리(Local Repository)를 구성해 설치하는 것이 표준 절차입니다.
dnf download를 활용해 DCGM 및 Exporter의 의존성 패키지까지 한 번에 수집합니다.
# 1. 필수 도구 설치
sudo dnf install -y dnf-plugins-core createrepo
# 2. NVIDIA 공식 CUDA 레포지토리 등록
sudo dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel9/x86_64/cuda-rhel9.repo
# 3. 패키지 다운로드용 디렉터리 생성
mkdir -p ./dcgm_airgap_pkgs
cd ./dcgm_airgap_pkgs
# 4. DCGM 및 Exporter 의존성 포함 전체 다운로드 (--alldeps, --resolve 플래그)
sudo dnf download --resolve --alldeps datacenter-gpu-manager datacenter-gpu-manager-exporter
# 5. 오프라인 메타데이터 생성 (createrepo)
cd ..
createrepo dcgm_airgap_pkgs/
# 6. 아카이브 압축 (B300 서버 반입용)
tar -czvf dcgm_airgap_bundle.tar.gz dcgm_airgap_pkgs/
생성된 dcgm_airgap_bundle.tar.gz 파일을 보안 인가된 저장매체(USB, 사설 파일 전송망 등)를 통해 Air-gap B300 노드로 반입합니다.
반입한 패키지로 로컬 YUM/DNF 저장소를 등록한 뒤 설치를 진행합니다.
# 1. 압축 해제 및 디렉터리 배치
tar -xzvf dcgm_airgap_bundle.tar.gz
sudo mv dcgm_airgap_pkgs /opt/local-repo-dcgm
# 2. 폐쇄망 로컬 저장소(.repo) 파일 생성
sudo tee /etc/yum.repos.d/local-dcgm.repo << 'EOF'
[local-dcgm]
name=Local DCGM Repository
baseurl=file:///opt/local-repo-dcgm
enabled=1
gpgcheck=0
EOF
# 3. 로컬 캐시 갱신 및 설치 (외부 저장소 참조 없이 로컬만 지정)
sudo dnf clean all
sudo dnf --disablerepo="*" --enablerepo="local-dcgm" install -y datacenter-gpu-manager datacenter-gpu-manager-exporter
설치 후 Systemd 서비스 활성화 및 메트릭 출력 확인은 기존과 동일합니다.
# DCGM 엔진 및 Exporter 데몬 기동
sudo systemctl enable --now nvidia-dcgm
sudo systemctl enable --now dcgm-exporter
# 메트릭 수집 검증
curl -s http://localhost:9400/metrics | grep DCGM_FI_DEV_GPU_UTIL
베어메탈 RPM 설치 대신 사내 레지스트리를 쓸 수 있다면, 외부망에서 공식 컨테이너 이미지를 docker save 폐쇄망 반입 docker load(또는 Podman)로 띄우는 것이 라이브러리 충돌 없이 훨씬 간편합니다.
docker pull nvcr.io/nvidia/k8s/dcgm-exporter:latest docker save -o dcgm-exporter.tar nvcr.io/nvidia/k8s/dcgm-exporter:latestdocker load -i dcgm-exporter.tar 후 host network 모드로 실행==
폐쇄망(Air-gap) 환경에서 Grafana를 베어메탈에 설치하는 가장 확실한 방법은 공식 RPM 단일 패키지를 외부망에서 받아 반입한 뒤 설치하거나, 바이너리(tar.gz) 아카이브를 풀어 직접 실행하는 것입니다. Grafana는 단일 바이너리/패키지 구조라 DCGM에 비해 의존성 패키지가 거의 없어 절차가 매우 간단합니다.
Grafana Enterprise/OSS RPM은 핵심 런타임과 라이브러리가 정적 포함되어 있어 추가 의존성 없이 단일 파일로 설치됩니다.
# 공식 RPM 다운로드 (x86_64 기준 최신 안정 버전)
curl -LO https://dl.grafana.com/oss/release/grafana-11.1.0-1.x86_64.rpm
다운로드한 grafana-*.rpm 파일을 보안 승인 매체를 통해 폐쇄망 B300 노드로 반입합니다.
# 외부 저장소 참조 없이 로컬 패키지만 설치
sudo dnf install -y ./grafana-11.1.0-1.x86_64.rpm
# 서비스 등록 및 시작
sudo systemctl daemon-reload
sudo systemctl enable --now grafana-server
(상태 확인: sudo systemctl status grafana-server)
.tar.gz) 사용 (패키지 관리자 미사용 시)시스템 패키지 설치(dnf) 권한이나 의존성 검사를 아예 거치지 않고 특정 디렉터리에 깔끔하게 올려 관리하고 싶을 때 유용합니다.
curl -LO https://dl.grafana.com/oss/release/grafana-11.1.0.linux-amd64.tar.gz
해당 파일을 폐쇄망으로 반입합니다.
# 1. 디렉터리 배치
sudo tar -xzvf grafana-11.1.0.linux-amd64.tar.gz -C /usr/local/
sudo ln -s /usr/local/grafana-v11.1.0 /usr/local/grafana
# 2. 전용 계정 생성 및 권한 부여
sudo useradd --no-create-home --shell /bin/false grafana
sudo chown -R grafana:grafana /usr/local/grafana /usr/local/grafana-v11.1.0
# 3. Systemd 서비스 등록
sudo tee /etc/systemd/system/grafana-server.service << 'EOF'
[Unit]
Description=Grafana Instance
After=network.target
[Service]
User=grafana
Group=grafana
Type=simple
WorkingDirectory=/usr/local/grafana
ExecStart=/usr/local/grafana/bin/grafana server --homepath=/usr/local/grafana
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now grafana-server
3000 (서비스 기동 후 로컬 확인: curl -I http://localhost:3000)http://localhost:9090을 바로 추가해 사용할 수 있습니다.ssh -N -L 3000:localhost:3000 user@<노드IP> 터널링을 열어 브라우저(http://localhost:3000, 기본 계정 admin / admin)로 접속하는 방식을 권장합니다.==
폐쇄망(Air-gap) 환경에서는 외부 허브로 직접 연결할 수 없으므로, 인터넷이 되는 외부 환경에서 모델 가중치(Safetensors)를 내려받아 보안 매체나 사내 전송망을 통해 B300 노드로 반입한 뒤 vLLM에서 로컬 디렉터리 경로를 지정해 구동해야 합니다.
Hugging Face 공식 CLI인 huggingface-cli를 사용하는 것이 가장 빠르고 무결성 검증에 유리합니다.
대용량 파일 전송 중단 시 이어받기가 기본 지원되는 hf_transfer 기반 다운로드를 권장합니다.
# 1. 도구 설치 및 고속 다운로더 활성화
pip install -U "huggingface_hub[cli]" hf_transfer
export HF_HUB_ENABLE_HF_TRANSFER=1
# 2. 토큰 로그인 (Llama 등 승인 모델 다운로드 시 필수)
huggingface-cli login --token <YOUR_HF_TOKEN>
# 3. 모델별 다운로드 (로컬 특정 경로 지정: --local-dir)
# 예: Llama 3.3 70B (~140GB)
huggingface-cli download meta-llama/Llama-3.3-70B-Instruct \
--local-dir /data/models/Llama-3.3-70B-Instruct \
--local-dir-use-symlinks False
# 예: Qwen 2.5 72B (~145GB)
huggingface-cli download Qwen/Qwen2.5-72B-Instruct \
--local-dir /data/models/Qwen2.5-72B-Instruct \
--local-dir-use-symlinks False
# 예: DeepSeek V3 (FP8 체크포인트, ~680GB)
huggingface-cli download deepseek-ai/DeepSeek-V3 \
--local-dir /data/models/DeepSeek-V3 \
--local-dir-use-symlinks False
주의:
--local-dir-use-symlinks False옵션을 주어야 캐시 심볼릭 링크가 아닌 실제 파일로 저장되므로 폐쇄망 이관 시 파일 유실을 막을 수 있습니다.
가중치 파일(.safetensors), 토크나이저 설정(tokenizer.json, tokenizer_config.json), 모델 설정(config.json) 등이 누락 없이 포함된 폴더 전체를 B300 노드의 대용량 스토리지(예: /data/models/)로 복사합니다.
/data/models/Llama-3.3-70B-Instruct/
├── config.json
├── generation_config.json
├── model-00001-of-00030.safetensors
├── ...
├── model.safetensors.index.json
├── tokenizer.json
└── tokenizer_config.json
모델 식별자 대신 로컬 절대 경로를 인자로 넘겨주면, vLLM이 외부 인터넷(Hugging Face Hub) 조회를 시도하지 않고 즉시 로컬 디스크에서 가중치를 읽어와 GPU 메모리에 올립니다.
# Llama 3.3 70B (TP=8)
vllm serve /data/models/Llama-3.3-70B-Instruct \
--tensor-parallel-size 8 \
--dtype bfloat16 \
--max-model-len 32768 \
--gpu-memory-utilization 0.90 \
--port 8000
# DeepSeek V3 (FP8, TP=8)
vllm serve /data/models/DeepSeek-V3 \
--tensor-parallel-size 8 \
--dtype bfloat16 \
--quantization fp8 \
--kv-cache-dtype fp8 \
--max-model-len 32768 \
--gpu-memory-utilization 0.92 \
--enforce-eager \
--trust-remote-code \
--port 8000
노드 디스크로 직접 외장 하드를 물리 연결해 복사하기 어려운 폐쇄망 환경이라면, 사내에 구축된 MinIO, S3 호환 오브젝트 스토리지, 또는 사내 사설 허브(Hugging Face Local Mirror)에 모델 폴더를 업로드해 두고, B300 노드에서 내부 고속망을 통해 로컬 NVMe로 복사해 서빙하는 방식이 가장 효율적입니다.
==
네, 맞습니다. Hugging Face CLI가 업데이트되면서 기존의 길었던 huggingface-cli 대신 훨씬 간결한 hf 명령어가 표준으로 자리 잡았으며, 옵션 체계도 한층 직관적으로 정돈되었습니다.
최신 hf CLI 문법을 반영한 다운로드 및 폐쇄망 반입 절차입니다.
hf 바이너리 단축 명령어는 최신 huggingface_hub 패키지에 기본 내장되어 있습니다.
# 최신 huggingface_hub 및 고속 병렬 다운로더(hf_transfer) 설치
pip install -U "huggingface_hub[cli]" hf_transfer
# 초고속 다운로드 활성화 (Rust 기반 hf_transfer 백엔드)
export HF_HUB_ENABLE_HF_TRANSFER=1
Llama 3.1 / 3.3 같은 접근 승인 모델 다운로드를 위해 토큰을 등록합니다.
hf login --token <YOUR_HF_TOKEN>
hf 다운로드 명령어 (hf download)기존의 복잡했던 --local-dir-use-symlinks False 옵션 없이도, --local-dir을 지정하면 실제 파일 형태로 바로 복사되어 폐쇄망 이관 시 링크가 깨지는 문제가 없습니다.
# 1. Llama 3.3 70B (~140GB)
hf download meta-llama/Llama-3.3-70B-Instruct \
--local-dir /data/models/Llama-3.3-70B-Instruct
# 2. Qwen 2.5 72B (~145GB)
hf download Qwen/Qwen2.5-72B-Instruct \
--local-dir /data/models/Qwen2.5-72B-Instruct
# 3. DeepSeek V3 (FP8 체크포인트, ~680GB)
hf download deepseek-ai/DeepSeek-V3 \
--local-dir /data/models/DeepSeek-V3
# 4. 소형 모델 (Llama 3.1 8B, Qwen 2.5 14B)
hf download meta-llama/Meta-Llama-3.1-8B-Instruct \
--local-dir /data/models/Meta-Llama-3.1-8B-Instruct
hf 플래그--include / --exclude):.bin 파일이나 원본 가중치를 제외하고 순수 safetensors 파일만 경량화해서 내려받을 때 유용합니다.hf download meta-llama/Llama-3.3-70B-Instruct \
--include "*.safetensors" "*.json" "*.txt" \
--local-dir /data/models/Llama-3.3-70B-Instruct
tmux나 screen 내부에서 실행하는 것을 권장합니다.외부망에서 내려받은 /data/models/<모델명> 폴더를 폐쇄망 노드로 반입한 후, 로컬 경로를 직접 넘겨주면 이전과 동일하게 외부 통신 없이 즉각 GPU로 적재됩니다.
# vLLM 로컬 경로 서빙 예시
vllm serve /data/models/Llama-3.3-70B-Instruct \
--tensor-parallel-size 8 \
--dtype bfloat16 \
--port 8000
==
각 모델을 hf download로 내려받을 때 필요한 디스크 용량(순수 다운로드 크기)과 폐쇄망 반입 시 권장 여유 공간입니다.
가중치 정밀도(BF16/FP8)에 따라 실제 파일 크기가 결정됩니다.
| 모델명 | 기본 정밀도 | 디스크 다운로드 크기 (Safetensors 기준) | 권장 디스크 여유 공간 (임시 파일/반입 고려) | 비고 |
|---|---|---|---|---|
| Meta-Llama-3.1-8B-Instruct | BF16 (16-bit) | 약 16 GB | 약 25 GB | 4개 내외 safetensors 샤드 |
| Qwen 2.5 14B Instruct | BF16 (16-bit) | 약 29 ~ 30 GB | 약 45 GB | 8개 내외 샤드 |
| Llama 3.3 70B Instruct | BF16 (16-bit) | 약 138 ~ 140 GB | 약 180 GB | 약 30개 분할 샤드 |
| Qwen 2.5 72B Instruct | BF16 (16-bit) | 약 144 ~ 146 GB | 약 190 GB | 약 37개 분할 샤드 |
| Mixtral 8x22B Instruct | BF16 (16-bit) | 약 265 ~ 280 GB | 약 350 GB | 총 141B 파라미터 원본 가중치 |
| DeepSeek V3 / R1 | FP8 (8-bit) | 약 680 ~ 700 GB | 약 850 GB ~ 1 TB | 671B 총 파라미터 (FP8 체크포인트) |
.cache/huggingface)와 압축 아카이브(tar 등) 생성을 감안하면, 다운로드 작업 서버에는 최소 2 TB 이상의 고속 NVMe/SSD 여유 공간이 확보되어 있어야 합니다.tmux나 screen 세션에서 실행하세요.==
Hugging Face Hub의 원본 구조를 유지하면서 조직/제공자 모델명 포맷/정밀도 버전(Git Commit 태그 또는 날짜) 체계로 버킷 및 Prefix를 설계하는 것이 가장 확장성이 높고 자동화하기 편합니다.
s3://ai-models/
├── hub/ # Hugging Face Mirror 구조 (호환성 최우선)
│ ├── meta-llama/
│ │ └── Llama-3.3-70B-Instruct/
│ │ ├── v1.0/ # 또는 Commit Hash (예: a6c5e...)
│ │ │ ├── config.json
│ │ │ ├── tokenizer.json
│ │ │ ├── tokenizer_config.json
│ │ │ ├── model.safetensors.index.json
│ │ │ └── model-00001-of-00030.safetensors
│ │ └── latest -> (v1.0 Prefix 복사 또는 메타데이터 관리)
│ ├── deepseek-ai/
│ │ └── DeepSeek-V3/
│ │ └── fp8/
│ │ ├── config.json
│ │ └── model-00001-of-00163.safetensors
│ └── Qwen/
│ └── Qwen2.5-72B-Instruct/
│ ├── bf16/
│ └── awq/ # 양자화 포맷별 분리
│
└── fine-tuned/ # 사내 파인튜닝 / LoRA 어댑터 가중치
└── llama-3.3-70b-corp-qa/
├── run-20260915/
│ ├── adapter_config.json
│ └── adapter_model.safetensors
└── checkpoints/ # 학습 도중 중간 체크포인트
config.json, tokenizer.json, *.safetensors 파일들의 상대 경로를 Hugging Face 원본 그대로 유지해야, 노드에서 s3 sync나 mc mirror로 내려받았을 때 vLLM/SGLang이 추가 변환 없이 즉시 로딩합니다.bf16, fp8, awq, gptq 등 서빙 엔진 옵션에 따라 필요한 포맷이 다르므로 서브 디렉터리로 명확히 분리합니다.기술적으로 "필수(Must)"는 아니지만, 실무 운영(DevOps/MLOps) 관점에서는 "사실상 필수(De facto standard)"입니다.
오브젝트 스토리지가 없을 때 대안과 한계는 다음과 같습니다.
/mnt/shared-models)를 바라보게 구성할 수 있습니다.AI 인프라에서 오브젝트 스토리지는 단순 "모델 저장소"를 넘어 전체 AI 수명주기의 핵심 데이터 레이크로 활용됩니다.
| 분류 | 저장되는 세부 항목 | 설명 |
|---|---|---|
| 1. 모델 & 가중치 | • 사전학습 모델 원본 (Base Model) |
• LoRA / QLoRA 어댑터 가중치
• 양자화 모델 (FP8, INT4, AWQ) | 서빙 엔진이 읽어가는 최종 배포 산출물 |
| 2. 학습 체크포인트 | • Optimizer States (Adam 상태값)
• 중간 가중치 (Epoch/Step별 체크포인트)
• Gradient 상태 | 분산 학습 중 노드 장애 시 복구(Fault Tolerance)를 위해 수시로 덤프 |
| 3. 원천 데이터 & 가공셋 | • Raw 텍스트/문서/코드 (Parquet, JSONL)
• 토크나이징 완료된 바이너리 데이터셋
• RAG용 벡터 임베딩 청크 원본 | 데이터 레이크하우스 및 전처리 파이프라인의 입출력 데이터 |
| 4. 토크나이저 & 메타데이터 | • tokenizer.json, vocab.json
• 모델 아키텍처 config.json
• 모델 카드(README), 라이선스 텍스트 | 추론 엔진이 입출력 텍스트를 인코딩/디코딩하기 위한 필수 설정 |
| 5. 평가 & 벤치마크 결과 | • 벤치마크 JSON/CSV 로그 (TTFT, TPOT)
• 모델 성능 평가 지표 (MMLU, HumanEval 점수)
• 서빙 프로파일러 트레이스 파일 | 버전 간 성능 비교 및 감사(Audit)용 데이터 |
| 6. 서빙 런타임 캐시 | • 컴파일된 커널 캐시 (vLLM/Triton 캐시)
• Prefix Caching 스냅샷 | 노드 재기동 시 초기 컴파일 오버헤드를 줄이기 위한 공용 캐시 |
/data/cache)로 S3 동기화(mc mirror 또는 s5cmd)를 고속으로 마친 뒤 로컬 경로를 지정해 VRAM으로 로딩하는 2단계 파이프라인이 정석입니다.==
https://github.com/prometheus/prometheus/releases
https://github.com/prometheus/node_exporter/releases/
Edition Grafana OSS
Version 13.2.2