Практика · руководство · 11 мин на чтение

# Обслуживание Llama 3.3 70B на одном узле.

От машины, полученной пять минут назад, до OpenAI-совместимого эндпоинта, отвечающего на запросы — с двумя флагами, которые незаметно вдвое снижают пропускную способность, и одним, из-за которого вас взломают.

Коротко

- **Требуется памяти:** 43 GB на 4-bit, 82 GB на FP8, 164 GB на BF16 — всё при контексте 8k
- **Самая простая машина:** Одна карта на 80 GB. Без шардинга, без интерконнекта, без синхронизации
- **Время до первого токена:** Меньше пятнадцати минут с момента получения, большая часть — загрузка весов
- **Единственная ошибка:** Публикация порта 8000 на публичном адресе. У него нет аутентификации

## Что вам нужно

70 миллиардов параметров. В 4-bit это 35 GB весов; KV-кэш добавляет ещё 2.5 GB при контексте 8k для одного запроса, а накладные расходы времени выполнения — около 15 %. Всё остальное следует из этих трёх чисел — [руководство по расчёту VRAM](https://gpuserver.io/ru/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 |

Обратите внимание на строку 4-bit при 128k: веса сжимаются до 35 GB, а кэш не сжимается вовсе, потому что AWQ и GPTQ квантуют только веса. Именно этот факт определяет большую часть выбора машины ниже.

## Выбор узла

Самые дешёвые машины в нашем каталоге, где эта модель помещается на *одну* карту — конфигурация, которая нужна вам, если она доступна: без шардинга не нужна синхронизация, и на одну проблему для отладки меньше.

**Узлы, где Llama 3.3 70B помещается на одну карту**

| Узел | Точность, которая помещается | Память карты | Расчётный tok/s | В месяц |
|---|---|---|---|---|
| [NVIDIA RTX A6000](https://gpuserver.io/ru/gpu/rtx-a6000) PCIe 5.0 · 768 GB/s | 4-bit (AWQ, GPTQ) | 48 GB | ~10 | $286/мес |
| [2 × NVIDIA RTX A6000](https://gpuserver.io/ru/gpu/rtx-a6000) PCIe 5.0 ×16 · 768 GB/s | 4-bit (AWQ, GPTQ) | 48 GB | ~10 | $597/мес |
| [NVIDIA L40S](https://gpuserver.io/ru/gpu/l40s) PCIe 5.0 · 864 GB/s | 4-bit (AWQ, GPTQ) | 48 GB | ~11 | $714/мес |
| [NVIDIA A100 PCIe](https://gpuserver.io/ru/gpu/a100-80gb) PCIe 5.0 · 1,935 GB/s | 4-bit (AWQ, GPTQ) | 80 GB | ~25 | $1,091/мес |

Пропускная способность — это генерация в один поток, ограниченная пропускной способностью памяти, и намеренно консервативная оценка. При непрерывном батчинге *суммарная* пропускная способность по всем параллельным запросам в разы выше — в этом весь смысл vLLM.

## Десять минут настройки

Здесь нет ничего специфичного именно для нас, кроме адреса. Docker, NVIDIA container toolkit и рабочий стек драйверов уже установлены на машине.

Подтвердите машину, затем подготовьте место для весов

```
$ 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
```

## Запуск сервера

Один контейнер. При первом запуске скачивается около 40 GB квантованных весов, что на порту 1 Gbit/s занимает несколько минут; каждый следующий перезапуск — секунды.

vLLM, одна карта, 4-bit

```
$ 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-кэш под заявленный максимум. Если заявить 131072, а обслуживать 8192, впустую тратится в шестнадцать раз больше памяти, чем нужно, а симптом — «недостаточно параллельности», а не ошибка.

--gpu-memory-utilization 0.90 to 0.95 Доля карты, которую может занять vLLM. Всё, что не занято, простаивает впустую; оставленное по умолчанию значение 0.90 на выделенной машине стоит вам реальной параллельности. Не поднимайте выше 0.95.

--ipc=host Обязательно, а не по желанию Без него разделяемая память контейнера ограничена 64 MB. На одной карте это может сойти с рук; на шардированной модели NCCL зависает без внятной ошибки.

--tensor-parallel-size Только если модель не помещается Шардинг модели, которая помещается на одну карту, делает её *медленнее*. См. [руководство по интерконнекту](https://gpuserver.io/ru/guides/nvlink-vs-pcie) — это самый распространённый способ заставить дорогой узел уступать дешёвому.

--kv-cache-dtype fp8 Уменьшает кэш вдвое На Hopper и Blackwell. Удваивает контекст или параллельность, которые вы можете держать, ценой качества, которую обычно невозможно измерить. Самый простой выигрыш в этом списке.

--max-num-seqs Ограничьте его реальной параллельностью Если оставить 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.
```

Если ему действительно нужно быть публичным, поставьте перед ним reverse proxy с TLS и API-ключом, а также ограничьте адреса источника в файрволе. В [документации](https://gpuserver.io/ru/docs#firewall) есть минимальный набор правил. Для эндпоинта, который отвечает всем подряд, двойная защита — это правильный подход.

## Повышение пропускной способности

В порядке, в котором стоит пробовать. Первые два — бесплатны и обычно дают наибольший выигрыш.

1. **Снизьте `--max-model-len` до реального контекста.** Почти всегда это даёт наибольший выигрыш и не отнимает ничего, чем вы пользовались.
2. **Повысьте `--gpu-memory-utilization` до 0.95.** Это выделенная машина: оставлять место больше не для кого.
3. **Включите FP8 KV-кэш**, если карта это поддерживает. Удваивает то, что помещается.
4. **Батчинг на стороне клиента.** Непрерывный батчинг помогает только при одновременном поступлении запросов. Запросы по одному оставляют большую часть карты простаивать, что бы вы ни настроили.
5. **И только затем — более быстрая карта.** Генерация ограничена пропускной способностью памяти, поэтому H200 при 4 800 GB/s примерно в 2,4× быстрее, чем H100 PCIe при 2 000 для той же модели — реальный выигрыш, и самый дорогой пункт в этом списке.

Измеряйте до и после — не гадайте

```
$ 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
```

## Поддержание работы

Три вещи, которые стоит сделать в первый день, потому что все три неприятно обнаружить на четырнадцатый.

### Политика перезапуска

`--restart unless-stopped` есть в команде выше. После перезагрузки контейнер возвращается, а веса уже лежат на `/scratch`, так что всё поднимается меньше чем за минуту.

### Следите за картой, а не за процессом

GPU, отвалившийся от шины, оставляет контейнер на вид здоровым. `nvidia-smi -q -d PERFORMANCE` в проверке состояния это обнаружит; проверка порта — нет.

### Веса не резервируются

Они находятся на вашем локальном NVMe и больше нигде. Это нормально — их можно скачать заново. А вот ваши файнтюнинговые адаптеры — нет, так что храните их где-то вне машины.

А когда срок заканчивается, диски стираются в течение часа без льготного периода. Всё на `/scratch` исчезает вместе с ними. Это сделано намеренно — то же самое обещание гарантирует, что на полученной вами машине не было чужих данных, — но это значит, что последний день срока не подходит для того, чтобы начинать копировать данные.

## Проверьте эту модель на каждом узле, который мы сдаём.

Конфигуратор показывает, какие конфигурации помещают её на одну карту, какие вынуждены делить, и сколько стоит каждая.

[Открыть конфигуратор](https://gpuserver.io/ru/configure) [Читать руководства](https://gpuserver.io/ru/guides)

## Другие руководства

- [Практика · 10 мин Файнтюнинг модели 70B на одной карте QLoRA на одной GPU с 48 GB: что помещается, сколько это стоит в месяц и почему полный файнтюнинг — машина совсем другого уровня. Читать руководство](https://gpuserver.io/ru/guides/lora-finetune)
- [Оплата · 8 мин Оплата сервера криптовалютой Что на самом деле происходит между нажатием «оплатить» и получением root, какую монету выбрать и четыре ошибки, которые теряют деньги при первом платеже. Читать руководство](https://gpuserver.io/ru/guides/pay-in-crypto)
- [Расчёт · 9 мин Сколько VRAM реально нужно модели Арифметика вопроса «поместится ли модель»: веса, KV-кэш и два места, где эмпирическое правило ошибается сразу втрое. Читать руководство](https://gpuserver.io/ru/guides/vram-sizing)

---

Источник: https://gpuserver.io/ru/guides/serve-llama-70b/. Этот файл формируется на основе тех же данных, что и сайт; если цифра здесь отличается от страницы сайта, приоритет у страницы, а этот файл устарел — канонический источник: https://gpuserver.io/.
