노드 1개에서 Llama 3.3 70B를 서빙합니다.
5분 전에 제공된 머신에서 요청에 응답하는 OpenAI 호환 엔드포인트까지 — 처리량을 조용히 절반으로 떨어뜨리는 플래그 2개와, 침해로 이어지는 플래그 1개를 함께 다룹니다.
짧은 답
- 필요 메모리
- 4비트에서 43 GB, FP8에서 82 GB, BF16에서 164 GB — 모두 8k 컨텍스트 기준
- 가장 단순한 머신
- 80 GB 카드 1장. 샤딩 없음, 인터커넥트 없음, 동기화 없음
- 첫 토큰까지의 시간
- 제공 후 15분 미만, 그중 대부분은 가중치 내려받기
- 단 하나의 실수
- 공인 주소에 포트 8000을 공개하는 것. 인증이 전혀 없습니다
필요한 것
700억 파라미터입니다. 4비트에서는 가중치가 35 GB이고, KV 캐시는 8k 컨텍스트에서 단일 요청 기준으로 2.5 GB를 추가하며, 런타임 오버헤드는 약 15%입니다. 나머지는 모두 이 숫자 3개에서 나옵니다 — 사이징 가이드가 그 근거를 보여 줍니다.
| 정밀도 | 가중치 | 8k 총량 | 32k 총량 | 128k 총량 |
|---|---|---|---|---|
| BF16 / FP16 | 140 GB | 164 GB | 173 GB | 207 GB |
| FP8 | 70 GB | 82 GB | 86 GB | 103 GB |
| 4-bit (AWQ, GPTQ) | 35 GB | 43 GB | 52 GB | 86 GB |
128k의 4비트 행을 보십시오: AWQ와 GPTQ는 가중치만 양자화하므로, 가중치는 35 GB로 줄지만 캐시는 전혀 줄지 않습니다. 이 사실 하나가 아래 머신 선택의 대부분을 결정합니다.
노드 선택
이 모델을 단일 카드에 담는, 당사 카탈로그에서 가장 저렴한 머신입니다. 가능하다면 택해야 할 구성입니다 — 샤딩이 없으면 동기화도 없고, 디버깅할 것이 하나 줄어듭니다.
| 노드 | 들어가는 정밀도 | 카드 메모리 | 예상 tok/s | 월 요금 |
|---|---|---|---|---|
| NVIDIA RTX A6000 | 4-bit (AWQ, GPTQ) | 48 GB | ~10 | $286/월 |
| 2 × NVIDIA RTX A6000 | 4-bit (AWQ, GPTQ) | 48 GB | ~10 | $597/월 |
| NVIDIA L40S | 4-bit (AWQ, GPTQ) | 48 GB | ~11 | $714/월 |
| NVIDIA A100 PCIe | 4-bit (AWQ, GPTQ) | 80 GB | ~25 | $1,091/월 |
처리량은 단일 스트림 생성 기준이며, 메모리 대역폭에 좌우되고, 의도적으로 보수적으로 잡았습니다. 연속 배칭을 쓰면 동시 요청 전체의 합계는 몇 배 더 높아집니다 — 그것이 바로 vLLM의 존재 이유입니다.
설정 10분
주소를 빼면 여기에 당사에만 해당하는 것은 없습니다. Docker와 NVIDIA 컨테이너 툴킷, 그리고 동작하는 드라이버 스택은 이미 머신에 설치되어 있습니다.
$ ssh root@203.0.113.42
$ nvidia-smi --query-gpu=name,memory.total --format=csv
# Weights on the fast local NVMe, not the system volume.
$ mkdir -p /scratch/models
$ df -h /scratch
# A gated model needs a token. Skip if yours is open.
$ export HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxx
서버 시작
컨테이너 1개입니다. 첫 실행에서 양자화된 가중치를 약 40 GB 내려받으며, 1 Gbit/s 포트에서는 몇 분이 걸립니다. 이후 재시작은 몇 초면 됩니다.
$ docker run -d --name vllm --restart unless-stopped \
--gpus all --ipc=host \
-v /scratch/models:/root/.cache/huggingface \
-e HF_TOKEN="$HF_TOKEN" \
-p 127.0.0.1:8000:8000 \
vllm/vllm-openai:latest \
--model casperhansen/llama-3.3-70b-instruct-awq \
--quantization awq_marlin \
--max-model-len 8192 \
--gpu-memory-utilization 0.92
# Watch it load. "Application startup complete" is the signal.
$ docker logs -f vllm
$ curl -s http://127.0.0.1:8000/v1/models | head
$ curl -s http://127.0.0.1:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"casperhansen/llama-3.3-70b-instruct-awq",
"messages":[{"role":"user","content":"In one sentence: what is a KV cache?"}],
"max_tokens":80}'
중요한 플래그
전 세계에 공개하지 않기
0.0.0.0에 바인딩하면 개방된 추론 서버가 되며, 스캐너는 그런 서버를 몇 시간 안에 찾아냅니다. 위 명령의 -p 127.0.0.1:8000:8000 부분을 눈여겨보십시오 — 앞쪽 주소가 이 서버를 인터넷에서 떼어 놓는 요소이며, 다른 곳에서 명령을 복사할 때 가장 자주 빠뜨리는 글자이기도 합니다.
SSH 터널로 직접 쓰시는 머신에서 접속하십시오 — 포트를 열 필요도, 인증서를 관리할 필요도, 잘못 설정할 것도 없습니다:
$ ssh -N -L 8000:127.0.0.1:8000 root@203.0.113.42
# Now http://127.0.0.1:8000 on your laptop is the server.
정말로 공개해야 한다면, 앞단에 TLS와 API 키를 갖춘 리버스 프록시를 두고, 방화벽에서 출발지 주소도 제한하십시오. 문서에 최소한의 규칙 세트가 있습니다. 요청하는 누구에게나 응답하게 될 엔드포인트에는 이중, 삼중의 방어가 올바른 자세입니다.
처리량 높이기
시도해 볼 만한 순서대로입니다. 앞의 2가지는 비용이 들지 않으며 대개 가장 큰 이득을 줍니다.
--max-model-len값을 실제 컨텍스트에 맞게 낮추십시오. 거의 언제나 단일 조치로는 가장 큰 이득이고, 실제로 쓰고 있던 것을 잃지도 않습니다.--gpu-memory-utilization값을 0.95로 올리십시오. 전용 머신이므로, 카드 위에 자리를 남겨 줄 다른 것이 없습니다.- 카드가 지원한다면 FP8 KV 캐시를 켜십시오. 담을 수 있는 양이 2배가 됩니다.
- 클라이언트 쪽에서 배칭하십시오. 연속 배칭은 요청이 동시에 도착할 때만 효과가 있습니다. 요청을 하나씩 보내면 어떻게 설정하더라도 카드 대부분이 유휴 상태로 남습니다.
- 그다음에, 그리고 그때에만 더 빠른 카드를 고려하십시오. 생성 속도는 메모리 대역폭에 좌우되므로, 같은 모델에서 4,800 GB/s의 H200은 2,000의 H100 PCIe보다 대략 2.4× 빠릅니다 — 실제 이득이지만, 이 목록에서 가장 비싼 방법입니다.
$ docker exec vllm python -m vllm.entrypoints.openai.api_server --help | head -1
$ docker exec vllm vllm bench serve \
--model casperhansen/llama-3.3-70b-instruct-awq \
--num-prompts 200 --request-rate 8
# And watch the card while it runs: if utilisation sits below 90%,
# the bottleneck is your client, not the GPU.
$ nvidia-smi dmon -s um
계속 가동하기
첫날에 해 둘 만한 3가지입니다. 3가지 모두 14일째에 발견하면 성가시기 때문입니다.
재시작 정책
위 명령에는 --restart unless-stopped 옵션이 들어 있습니다. 재부팅 후 컨테이너가 다시 올라오고 가중치는 이미 /scratch에 있으므로, 1분 이내에 다시 동작합니다.
프로세스가 아니라 카드를 모니터링하기
버스에서 떨어져 나간 GPU도 겉보기에는 정상인 컨테이너를 유지합니다. 헬스 체크에서 nvidia-smi -q -d PERFORMANCE 명령을 실행하면 이를 잡아내지만, 포트 점검으로는 잡아내지 못합니다.
가중치는 백업되지 않음
가중치는 로컬 NVMe에만 있고 다른 어디에도 없습니다. 그래도 괜찮습니다 — 다시 내려받을 수 있기 때문입니다. 파인튜닝한 어댑터는 그렇지 않으니, 머신 밖 어딘가에 보관하십시오.
그리고 이용 기간이 끝나면 유예 기간 없이 1시간 이내에 디스크를 소거합니다. /scratch에 있는 모든 것이 함께 사라집니다. 이는 의도된 것입니다 — 받으신 머신에 다른 사람의 데이터가 없었음을 보장하는 것과 같은 약속입니다 — 다만 이용 기간의 마지막 날은 자료를 옮기기 시작할 날이 아니라는 뜻이기도 합니다.
다른 가이드
- 실전 · 10분
카드 1장에서 70B 모델 파인튜닝
48 GB GPU 1장으로 QLoRA를 돌릴 때 무엇이 들어가고, 한 달 비용이 얼마이며, 전체 파인튜닝이 왜 완전히 다른 급의 머신을 요구하는지 설명합니다.
가이드 읽기 - 결제 · 8분
암호화폐로 서버 결제하기
결제 버튼을 누르고 root를 받기까지 실제로 무슨 일이 일어나는지, 어떤 코인을 고를지, 그리고 첫 결제에서 돈을 잃는 실수 4가지.
가이드 읽기 - 사이징 · 9분
모델에 실제로 필요한 VRAM
“모델이 들어갈까”라는 질문 뒤에 있는 계산: 가중치, KV 캐시, 그리고 경험칙이 3배나 어긋나는 지점 2곳을 그대로 짚습니다.
가이드 읽기