이 가이드가 만드는 것
하나의 GPU 인스턴스가 HTTP API를 통해 오픈 가중치 모델을 서빙하며, OpenAI 호환 스키마를 사용하므로 기존의 모든 클라이언트 라이브러리가 기본 URL만 바꾸면 동작합니다. nginx 뒤에서 TLS, API 키, 재부팅 후에도 유지되는 systemd 유닛과 함께 구성됩니다.
G-L40S에서 작성됨: 단일 카드에 48 기가바이트의 VRAM을 PCIe를 통해 인스턴스에 패스스루하며, 테넌트 간 시간 분할이 아닙니다. 이 차이는 예측 가능한 대기 시간과 다른 사람의 트레이닝 작업 뒤에서 기다리는 것의 차이입니다. 카드는 취소할 때까지 사용자의 것입니다.
시작하기 전에
- Debian 13이 설치된 G-L40S. 20 기가바이트의 G-ADA는 더 작은 모델에 적합하며, 4단계의 계산이 어떤 모델인지 알려줍니다.
- 이 플랜의 2 테라바이트 NVMe는 가중치 저장에 적합합니다. 루트 파일 시스템에 캐시를 두어 40 기가바이트를 두 번 다운로드하는 것은 시간 낭비입니다.
- 인스턴스를 가리키는 호스트 이름, 아래
llm.example.com.
1. 드라이버
sed -i "s/ main$/ main contrib non-free-firmware non-free/" /etc/apt/sources.list.d/debian.sources
apt update
apt install -y nvidia-driver firmware-misc-nonfree build-essential
reboot다시 부팅된 후:
nvidia-smi카드가 나열되고, 드라이버 버전이 표시되며, 메모리 사용량이 거의 0이어야 합니다. 이 시점에서 카드가 없으면 거의 항상 오래된 initramfs이며, 티켓을 열기 전에 update-initramfs -u를 실행하고 한 번 더 재부팅하세요.
nvidia-smi -q -d PERFORMANCE | grep -A3 "Clocks Event Reasons"
nvidia-smi -pm 1지속 모드는 프로세스 간 드라이버 로드를 유지하여 모든 재시작에서 초기화 시간을 몇 초 줄입니다.
2. 런타임
apt install -y python3-venv python3-pip
install -d -o root -g root /srv/models /opt/vllm
python3 -m venv /opt/vllm/venv
/opt/vllm/venv/bin/pip install --upgrade pip
/opt/vllm/venv/bin/pip install vllm설치 과정에서 대용량 CUDA 링크 휠 세트를 가져오므로 시간이 걸립니다. 그 동안 모델을 결정하세요.
3. 맞는 모델 선택
가중치는 예산의 최소치입니다. 16비트 정밀도의 모델은 10억 파라미터당 약 2 기가바이트의 VRAM이 필요하며, 동시 요청마다 키-값 캐시와 약 1 기가바이트의 런타임 오버헤드가 추가됩니다.
| 카드 | 16비트 가중치 | 현실적인 모델 크기 | 캐시용 여유 |
|---|---|---|---|
| L40S, 48 GB | 10억당 2 GB | 약 200억까지 | 6~8 GB |
| L40S, 48 GB, 8비트 | 10억당 1 GB | 약 340억까지 | 10 GB |
| RTX 4000 Ada, 20 GB | 10억당 2 GB | 약 70억까지 | 5 GB |
| L40S 2개, 96 GB | 10억당 2 GB | 약 400억까지 | 12 GB |
캐시 열은 동시에 엔드포인트를 사용할 수 있는 사용자 수를 결정합니다. 카드를 가중치로 가득 채우면 매우 빠른 단일 사용자 장난감이 됩니다.
4. 서빙
캐시를 NVMe로 지정하고 서버를 시작합니다. 선택한 오픈 가중치 모델의 저장소 식별자를 대체하세요. 런타임은 첫 시작 시 모델을 가져옵니다.
cat > /etc/systemd/system/vllm.service <<EOF
[Unit]
Description=vLLM inference server
After=network-online.target
[Service]
Environment=HF_HOME=/srv/models
Environment=VLLM_API_KEY=<a long random string>
ExecStart=/opt/vllm/venv/bin/vllm serve <org>/<model> \\
--host 127.0.0.1 --port 8000 \\
--served-model-name local \\
--max-model-len 16384 \\
--gpu-memory-utilization 0.92 \\
--max-num-seqs 32
Restart=on-failure
RestartSec=10
TimeoutStartSec=1800
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl enable --now vllm
journalctl -fu vllm루프백에 바인딩하는 것은 의도적입니다. 런타임의 API 키 확인은 단일 공유 비밀이며 뒤에 속도 제한이 없으므로 nginx가 노출을 담당하고 런타임은 공용 인터페이스를 건드리지 않습니다.
긴 시작 타임아웃은 첫 실행 시 수십 기가바이트를 다운로드하고 커널을 컴파일하기 때문입니다. 이후 시작은 1분 미만입니다.
5. 프록시 및 TLS
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name llm.example.com;
ssl_certificate /etc/letsencrypt/live/llm.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/llm.example.com/privkey.pem;
location /v1/ {
proxy_pass http://127.0.0.1:8000;
proxy_buffering off;
proxy_read_timeout 600s;
proxy_set_header Host $host;
}
}proxy_buffering off는 스트리밍 응답이 스트리밍되도록 하는 줄입니다. 이 설정을 켜두면 nginx가 버퍼가 가득 찼다고 느낄 때 토큰이 적절한 배치로 도착하며, 느린 모델처럼 보이지만 그렇지 않습니다.
확인
카드부터 시작:
nvidia-smi --query-gpu=memory.used,memory.total,utilization.gpu --format=csv사용된 메모리는 전체의 약 90%여야 합니다. --gpu-memory-utilization가 요청한 것이기 때문입니다. 그 다음 엔드포인트:
curl -s https://llm.example.com/v1/models -H "Authorization: Bearer <the key>" | head -20local라는 이름의 모델 하나입니다. 이제 실제 완성 요청을 보내고 시간을 재보세요:
time curl -s https://llm.example.com/v1/chat/completions \
-H "Authorization: Bearer <the key>" \
-H "Content-Type: application/json" \
-d '{"model":"local","messages":[{"role":"user","content":"List three prime numbers."}],"max_tokens":64}'마지막으로, 한 번에 하나의 요청이 아닌 부하 상태에서 측정하세요. 그것이 유일하게 인용할 가치가 있는 숫자입니다:
/opt/vllm/venv/bin/vllm bench serve \
--backend openai-chat \
--base-url https://llm.example.com \
--endpoint /v1/chat/completions \
--model local --num-prompts 200 --request-rate 8출력에서 세 가지 숫자를 읽으세요: 총 출력 토큰/초, 첫 토큰까지의 중앙값 시간, 99번째 백분위수 종단 간 시간. 단일 L40S에서 100억~200억 범위의 모델을 사용할 때, 총 출력 처리량이 초당 수백 토큰이고 첫 토큰까지의 시간이 1초 미만이면 예상되는 형태입니다. 동시성에 따라 첫 토큰까지의 시간이 증가하면 키-값 캐시가 너무 작은 것이므로 --max-model-len 또는 --max-num-seqs를 낮추고 다시 실행하세요.
이후
첫 주 동안 nvidia-smi dmon로 온도와 클록 스로틀링을 주시하세요. 지속적인 부하에서 열 스로틀링이 발생하는 카드는 네트워크 탓으로 돌려지는 간헐적 속도 저하를 만들기 때문입니다. 요금 측면에서 GPU 인스턴스는 카드가 바쁘든 유휴 상태든 비용이 같으므로, 유지하지 말고 작업을 배치로 처리하세요. 가격은 GPU 페이지에 있습니다.