데이터센터 6곳 전체 정상

암호화폐 결제 · 신원 확인 없음 · 5분 미만 안에 root 권한

실전 가이드 · 11분 분량

노드 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개에서 나옵니다 — 사이징 가이드가 그 근거를 보여 줍니다.

Llama 3.3 70B에 필요한 메모리, 정밀도와 컨텍스트별
정밀도가중치 8k 총량32k 총량128k 총량
BF16 / FP16레퍼런스 품질 140 GB 164 GB 173 GB 207 GB
FP8레퍼런스급, Hopper와 Blackwell 70 GB 82 GB 86 GB 103 GB
4-bit (AWQ, GPTQ)가장 작은 가중치, 캐시는 FP16 유지 35 GB 43 GB 52 GB 86 GB

128k의 4비트 행을 보십시오: AWQ와 GPTQ는 가중치만 양자화하므로, 가중치는 35 GB로 줄지만 캐시는 전혀 줄지 않습니다. 이 사실 하나가 아래 머신 선택의 대부분을 결정합니다.

노드 선택

이 모델을 단일 카드에 담는, 당사 카탈로그에서 가장 저렴한 머신입니다. 가능하다면 택해야 할 구성입니다 — 샤딩이 없으면 동기화도 없고, 디버깅할 것이 하나 줄어듭니다.

Llama 3.3 70B를 카드 1장에 담는 노드
노드들어가는 정밀도카드 메모리예상 tok/s월 요금
NVIDIA RTX A6000PCIe 5.0 · 768 GB/s 4-bit (AWQ, GPTQ) 48 GB ~10 $286/월
2 × NVIDIA RTX A6000PCIe 5.0 ×16 · 768 GB/s 4-bit (AWQ, GPTQ) 48 GB ~10 $597/월
NVIDIA L40SPCIe 5.0 · 864 GB/s 4-bit (AWQ, GPTQ) 48 GB ~11 $714/월
NVIDIA A100 PCIePCIe 5.0 · 1,935 GB/s 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 포트에서는 몇 분이 걸립니다. 이후 재시작은 몇 초면 됩니다.

vLLM, 단일 카드, 4비트
$ 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}'

중요한 플래그

--max-model-len실제로 서빙하는 컨텍스트에 맞춰 설정vLLM은 선언된 최댓값에 맞추어 KV 캐시를 예약합니다. 8192를 서빙하면서 131072를 선언하면 필요한 메모리의 16배를 버리게 되고, 증상은 오류가 아니라 “동시성 부족”으로 나타납니다.
--gpu-memory-utilization0.90~0.95vLLM이 점유할 수 있는 카드의 비율입니다. 점유하지 않은 부분은 모두 낭비되며, 전용 머신에서 기본값 0.90을 그대로 두면 실제 동시성을 잃습니다. 0.95를 넘기지 마십시오.
--ipc=host선택 사항이 아니라 필수이 옵션이 없으면 컨테이너의 공유 메모리가 64 MB로 제한됩니다. 단일 카드에서는 문제없이 넘어갈 수도 있지만, 카드 간 분할한 모델에서는 NCCL이 쓸모 있는 오류 없이 멈춥니다.
--tensor-parallel-size모델이 들어가지 않을 때만카드 1장에 들어가는 모델을 샤딩하면 오히려 느려집니다. 인터커넥트 가이드를 참조하십시오 — 비싼 노드가 저렴한 노드보다 못한 성능을 내게 만드는 가장 흔한 방법이 바로 이것입니다.
--kv-cache-dtype fp8캐시 크기가 절반으로 줄어듦Hopper와 Blackwell에서 사용할 수 있습니다. 담을 수 있는 컨텍스트나 동시성이 2배가 되며, 품질 손실은 대개 측정되지 않는 수준입니다. 이 목록에서 가장 쉬운 이득입니다.
--max-num-seqs실제 동시성에 맞춰 상한 설정사용자 8명을 서빙하는 머신에서 이 값을 256으로 두면, vLLM은 256을 기준으로 계획을 세워 감당할 수 없는 요청까지 받아들이고, 그 결과는 거부가 아니라 지연 시간 급증으로 나타납니다.

전 세계에 공개하지 않기

OpenAI 호환 API는 기본적으로 인증이 없습니다. 공인 주소에서 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가지는 비용이 들지 않으며 대개 가장 큰 이득을 줍니다.

  1. --max-model-len 값을 실제 컨텍스트에 맞게 낮추십시오. 거의 언제나 단일 조치로는 가장 큰 이득이고, 실제로 쓰고 있던 것을 잃지도 않습니다.
  2. --gpu-memory-utilization 값을 0.95로 올리십시오. 전용 머신이므로, 카드 위에 자리를 남겨 줄 다른 것이 없습니다.
  3. 카드가 지원한다면 FP8 KV 캐시를 켜십시오. 담을 수 있는 양이 2배가 됩니다.
  4. 클라이언트 쪽에서 배칭하십시오. 연속 배칭은 요청이 동시에 도착할 때만 효과가 있습니다. 요청을 하나씩 보내면 어떻게 설정하더라도 카드 대부분이 유휴 상태로 남습니다.
  5. 그다음에, 그리고 그때에만 더 빠른 카드를 고려하십시오. 생성 속도는 메모리 대역폭에 좌우되므로, 같은 모델에서 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에 있는 모든 것이 함께 사라집니다. 이는 의도된 것입니다 — 받으신 머신에 다른 사람의 데이터가 없었음을 보장하는 것과 같은 약속입니다 — 다만 이용 기간의 마지막 날은 자료를 옮기기 시작할 날이 아니라는 뜻이기도 합니다.

당사가 임대하는 모든 노드에서 이 모델을 확인해 보십시오.

구성 도구는 어떤 구성이 이 모델을 단일 카드에 담는지, 어떤 구성이 분할해야 하는지, 그리고 각각의 비용이 얼마인지 알려 줍니다.

로그인

콘솔, 청구서, 대역 외 접근.

계정이 없으십니까?

별도의 회원가입은 없습니다. 첫 주문을 진행하는 동안 계정이 만들어집니다 — 결제 단계에서 이메일과 비밀번호를 직접 정하시고, 머신이 준비될 때쯤이면 콘솔도 이미 열려 있습니다.

서버 구성하기

Language