실전 가이드 · 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개에서 나옵니다 — [사이징 가이드](https://gpuserver.io/ko/guides/vram-sizing)가 그 근거를 보여 줍니다.

**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 A6000](https://gpuserver.io/ko/gpu/rtx-a6000) PCIe 5.0 · 768 GB/s | 4-bit (AWQ, GPTQ) | 48 GB | ~10 | $286/월 |
| [2 × NVIDIA RTX A6000](https://gpuserver.io/ko/gpu/rtx-a6000) PCIe 5.0 ×16 · 768 GB/s | 4-bit (AWQ, GPTQ) | 48 GB | ~10 | $597/월 |
| [NVIDIA L40S](https://gpuserver.io/ko/gpu/l40s) PCIe 5.0 · 864 GB/s | 4-bit (AWQ, GPTQ) | 48 GB | ~11 | $714/월 |
| [NVIDIA A100 PCIe](https://gpuserver.io/ko/gpu/a100-80gb) PCIe 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-utilization 0.90~0.95 vLLM이 점유할 수 있는 카드의 비율입니다. 점유하지 않은 부분은 모두 낭비되며, 전용 머신에서 기본값 0.90을 그대로 두면 실제 동시성을 잃습니다. 0.95를 넘기지 마십시오.

--ipc=host 선택 사항이 아니라 필수 이 옵션이 없으면 컨테이너의 공유 메모리가 64 MB로 제한됩니다. 단일 카드에서는 문제없이 넘어갈 수도 있지만, 카드 간 분할한 모델에서는 NCCL이 쓸모 있는 오류 없이 멈춥니다.

--tensor-parallel-size 모델이 들어가지 않을 때만 카드 1장에 들어가는 모델을 샤딩하면 오히려 *느려집니다*. [인터커넥트 가이드](https://gpuserver.io/ko/guides/nvlink-vs-pcie)를 참조하십시오 — 비싼 노드가 저렴한 노드보다 못한 성능을 내게 만드는 가장 흔한 방법이 바로 이것입니다.

--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 키를 갖춘 리버스 프록시를 두고, 방화벽에서 출발지 주소도 제한하십시오. [문서](https://gpuserver.io/ko/docs#firewall)에 최소한의 규칙 세트가 있습니다. 요청하는 누구에게나 응답하게 될 엔드포인트에는 이중, 삼중의 방어가 올바른 자세입니다.

## 처리량 높이기

시도해 볼 만한 순서대로입니다. 앞의 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`에 있는 모든 것이 함께 사라집니다. 이는 의도된 것입니다 — 받으신 머신에 다른 사람의 데이터가 없었음을 보장하는 것과 같은 약속입니다 — 다만 이용 기간의 마지막 날은 자료를 옮기기 시작할 날이 아니라는 뜻이기도 합니다.

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

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

[구성 도구 열기](https://gpuserver.io/ko/configure) [가이드 둘러보기](https://gpuserver.io/ko/guides)

## 다른 가이드

- [실전 · 10분 카드 1장에서 70B 모델 파인튜닝 48 GB GPU 1장으로 QLoRA를 돌릴 때 무엇이 들어가고, 한 달 비용이 얼마이며, 전체 파인튜닝이 왜 완전히 다른 급의 머신을 요구하는지 설명합니다. 가이드 읽기](https://gpuserver.io/ko/guides/lora-finetune)
- [결제 · 8분 암호화폐로 서버 결제하기 결제 버튼을 누르고 root를 받기까지 실제로 무슨 일이 일어나는지, 어떤 코인을 고를지, 그리고 첫 결제에서 돈을 잃는 실수 4가지. 가이드 읽기](https://gpuserver.io/ko/guides/pay-in-crypto)
- [사이징 · 9분 모델에 실제로 필요한 VRAM “모델이 들어갈까”라는 질문 뒤에 있는 계산: 가중치, KV 캐시, 그리고 경험칙이 3배나 어긋나는 지점 2곳을 그대로 짚습니다. 가이드 읽기](https://gpuserver.io/ko/guides/vram-sizing)

---

출처: https://gpuserver.io/ko/guides/serve-llama-70b/. 이 파일은 웹사이트와 동일한 데이터에서 생성됩니다. 여기의 수치가 페이지와 다르다면 페이지가 정본이고 이 파일이 오래된 것입니다 — 정식 출처는 https://gpuserver.io/입니다.
