Машинный перевод на GPU: seq2seq/Transformer и низкая латентность

Задача страницы. Показать, как спроектировать и запустить NMT‑сервис (Neural Machine Translation) на облачных GPU: выбор архитектуры encoder‑decoder Transformer, режимы декодирования (greedy/beam), настройка стриминга токенов, планирование VRAM/QPS, квантизация и наблюдаемость.

TL;DR

  • Онлайн‑перевод (чат/виджет) — минимальная p95: greedy/beam=2, короткие лимиты, микро‑батчинг, SSE‑стриминг.
  • Пакетный перевод — максимальный TPS: крупные батчи, beam=1–4, interruptible‑узлы, планирование I/O.
  • Снижайте цену/1M токенов через INT8/FP8, жёсткие лимиты длины, раздельные пулы short/long и prefix‑кэш там, где поддерживается.
  • Метрики: TTFT/TBT/TTLT, tok/s prefill/decode, BLEU/COMET оффлайн, ошибки и тайм‑ауты.

Связанные страницы: /solutions/llm-inference/streaming//solutions/llm-inference/observability//solutions/llm-inference/quantization//solutions/llm-inference/costs//solutions/cost-planner//solutions/performance-tuning//solutions/multi-gpu//solutions/monitoring-logging//solutions/security//solutions/templates/

Сценарии использования и требования

  • Онлайн‑перевод (low‑latency): чат/виджет/поддержка — важен TTFT и p95; рекомендуем greedy или beam=2, стриминг, микро‑батчинг 8–32.
  • Пакетный перевод (high‑throughput): документы/каталоги/лог‑потоки — важны tok/s и цена; крупные батчи 512–4096, beam=1–4, interruptible.
  • Синхронный субтайтлинг/речь→текст→перевод: строгие тайм‑ауты, сегментация на короткие фразы, ограничение max_new_tokens.

Архитектура NMT (encoder‑decoder)

Токенизация → Encoder (self-attn) → Context

→ Decoder (self-attn + cross-attn) → Logits → (Greedy/Beam) → Токены

Критичные места:

  • Prefill энкодера (скорость матмулов, длина входа).
  • Decode декодера (по одному шагу; решает beam‑ширина и кэш KV).
  • Кэш KV (decoder self‑/cross‑attn) — планируйте VRAM по длине и beam.

Латентность, QPS и цена: быстрые формулы Обозначим: L_src — длина источника (токены), L_tgt — длина перевода, P_enc — ток/с энкодера (prefill), D_dec — ток/с декодера на батч, B — фактический батч декодера, beam — ширина луча, O — накладные.

Латентность (приближённо):

T ≈ (L_src / P_enc) + (L_tgt / (D_dec / (B × f_beam))) + O

# f_beam ≥ 1 — замедление из-за beam (обычно ~1.2–2.0 при beam 2–4)

Пропускная способность:

QPS ≈ B / T

Стоимость за 1M токенов (decode‑центрично):

Tokens_per_hour ≈ D_dec × 3600

Cost_per_1M ≈ (GPU_hour_price × Num_GPU) / (Tokens_per_hour / 1e6)

Подробности расчётов — /solutions/llm-inference/costs/.

Подбор GPU и VRAM‑бюджета

Прикидка памяти:

VRAM_total ≈ Weights + KV_dec_peak + Runtime_overhead(5–15%)

Weights ≈ N_params × bits_per_weight / 8

KV_dec_peak ≈ beam × L_tgt_max × H_heads × d_head × L_layers × bytes

Ориентиры выбора:

  • L40S/A100 40–80 ГБ — онлайн + средние батчи, низкая p95, beam=1–4.
  • A10 24 ГБ / T4 16 ГБ — компактные модели/тонкие инстансы, greedy/beam=1–2.
  • H100 80 ГБ — FP8/высокий TPS, большие очереди, строгий SLA.

Для сегментации по задачам используйте пулы short/long и/или MIG (см. /solutions/llm-inference/multi-model/, /solutions/mig/).

Декодирование: greedy vs beam (и как быстро)

  • Greedy — максимум скорости, минимум VRAM и сложности; хорошо для онлайн‑виджетов.
  • Beam=2–4 — выше качество (реже «обрывы»), умеренное замедление.
  • Length/Coverage penalty — предотвращают слишком короткие или избыточные переводы.
  • Early exit — завершайте, когда все лучи пришли к EOS или улучшения нет N шагов.

Псевдокод beam‑декодера (упрощено):

def beam_decode(enc_ctx, beam=2, max_new=128, alpha=0.6):
 beams = [([BOS], 0.0)] * beam
 finished = []
 for t in range(max_new):
 cand = []
 for tokens, score in beams:
 logp = step_decode(enc_ctx, tokens) # logits→logprobs
 topk = top_k(logp, k=beam)
 for tok, lp in topk:
 ntoks = tokens + [tok]
 # length penalty (alpha): score / ((5+len)^alpha / (5+1)^alpha)
 cand.append((ntoks, (score + lp) / ((5+len(ntoks))**alpha)))
 beams = top_k(cand, k=beam)
 # переносим завершённые гипотезы
 beams, done = split(beams, EOS)
 finished.extend(done)
 if not beams: break
 return best(finished or beams)
``` **Стриминг перевода (SSE/WebSocket)**

Онлайн‑перевод выигрывает от **потоковой отдачи** токенов: пользователь видит первые слова через 100–300 мс.

- Рекомендуется **SSE** для веб‑клиентов, **WebSocket** — для двусторонних UI.
- Сегментация: «коммитить» куски по границам слов/знаков, чтобы не «дёргался» текст.
- Лимиты: prefill timeout, idle timeout (между токенами), общий overall timeout.

Подробные паттерны и примеры кода: /solutions/llm-inference/streaming/.

**Мини‑сервер SSE (фрагмент):**

from fastapi import FastAPI, Request from fastapi.responses import StreamingResponse import json, asyncio app = FastAPI() async def translate_stream(src_text, beam=2, max_new=120): yield "event: startndata: {}nn" async for token in decode_tokens(src_text, beam, max_new): # ваша реализация payload = {"choices":[{"delta":{"content":token}}]} yield f"data: {json.dumps(payload, ensure_ascii=False)}nn" await asyncio.sleep(0) # отдаём управление циклу yield "event: donendata: [DONE]nn" @app.post("/v1/translate_stream") async def api(req: Request): body = await req.json() return StreamingResponse( translate_stream(body["text"], body.get("beam",2), body.get("max_new",120)), media_type="text/event-stream", headers={"Cache-Control":"no-cache","X-Accel-Buffering":"no"} )


**Качество vs скорость: что настраивать**

- **Квантизация весов и KV‑кэша**: INT8/INT4, FP8 (на Hopper) — см. /solutions/llm-inference/quantization/.
- **Mixed precision**: BF16/FP16 — см. /solutions/performance-tuning/.
- **Словарь/разметка**: улучшайте сегментацию (SentencePiece‑подобные токенизаторы), нормализуйте кавычки/дефисы.
- **Length/coverage penalty, no‑repeat‑ngrams**: меньше артефактов/повторов.
- **Domain adapters/finetune**: для узких доменов — отдельные веса/адаптеры (см. /solutions/llm-training/finetune-lora/).
- **Ререйтинг n‑best** (при beam): простые эвристики + короткий reranker в _long‑пуле_.

**Токенизация и очереди**

- Нормируйте L2, используйте **cosine** как IP c нормировкой.
- Проверяйте **двуязычность/мультиязычность** вашего энкодера.
- Оффлайн‑оценка: Recall@K/MRR на валид‑запросах; онлайновая — CSAT/deflection.

 Подробнее: [/solutions/rag/evaluation/](/solutions/rag/evaluation/).

**Ингест‑пайплайн (офлайн): от текстов к индексу**

- **Параллельная токенизация** на CPU (по числу ядер), выделенная очередь; передача на GPU с pinned memory.
- **Бакетизация по длинам**: группируйте запросы схожей длины (L\_src) — повышает утилизацию и стабильность p95.
- **Микро‑батчи** 8–32 для онлайн‑пула; **крупные батчи** 512–4096 — для пакетного перевода.
- **Раздельные пулы** short/long по длинам/лимитам — см. /solutions/llm-inference/multi-model/.

**Наблюдаемость и SLA**

Собирайте в проде (см. /solutions/llm-inference/observability/):

- **TTFT/TBT/TTLT** p50/p95/p99; **timeouts/errors**.
- **Prefill rate / Decode tok/s**, **batch size**, распределение L\_src/L\_tgt.
- **GPU** (util/HBM), **KV‑кэш** (занятость/эвикции).
- **BLEU/COMET оффлайн**, **CSAT** и возвраты — в A/B по пулям.

Алерты и логи — /solutions/monitoring-logging/.

**Экономика и режимы инстансов**

- **Онлайн‑пул (on‑demand)** — строгий SLA, резервы под пиковые часы.
- **Пакетный пул (interruptible)** — дешёвый массовый перевод, толерантен к рестартам.
- Считайте цену: /solutions/llm-inference/costs/; подбирайте режимы: /solutions/cost-planner/, /solutions/interruptible-patterns/.

**Безопасность и язык**

- **Фильтрация** контента (брань, PII) и пост‑обработка — см. /solutions/llm-inference/guardrails/, /solutions/security/.
- **Нормализация** пробелов, кавычек, числа/даты; аккуратные правила для RU↔EN и др. пар.

**Как это запустить в cloudcompute.ru**

- В /solutions/templates/ доступны пресеты:
 **“NMT‑Low‑Latency”** — encoder‑decoder, _greedy/beam=2_, SSE‑стриминг, микро‑батчинг, метрики TTFT/TBT/TTLT.
 **“NMT‑Batch”** — крупные батчи, _beam=1–4_, очереди задач, сохранение в файловое хранилище.
- Под конкретный SLA подберём GPU и лимиты: /solutions/cost-planner/.

**Чек‑лист перед продом**

- Выбрана архитектура и стек (encoder‑decoder Transformer, формат весов).
- Лимиты длины (max\_src, max\_new), _greedy/beam_ и penalties.
- Настроены пулы **short/long**, стриминг SSE/WS и тайм‑ауты.
- Включены **BF16/FP16** и **INT8/FP8** (где доступно).
- Наблюдаемость: TTFT/TBT/TTLT, tok/s, GPU/HBM, KV‑кэш; алерты.
- Экономика: рассчитана цена/1M, выбран режим инстансов.
- Guardrails и пост‑обработка текста в проде.

**Навигация по разделу**

[/solutions/llm-inference/streaming/](/solutions/llm-inference/streaming/) • [/solutions/llm-inference/observability/](/solutions/llm-inference/observability/) • [/solutions/llm-inference/quantization/](/solutions/llm-inference/quantization/) • [/solutions/llm-inference/costs/](/solutions/llm-inference/costs/) • [/solutions/cost-planner/](/solutions/cost-planner/) • [/solutions/performance-tuning/](/solutions/performance-tuning/) • [/solutions/multi-gpu/](/solutions/multi-gpu/) • [/solutions/monitoring-logging/](/solutions/monitoring-logging/) • [/solutions/security/](/solutions/security/) • [/solutions/templates/](/solutions/templates/)

Готовы запустить?

Запустить GPU-сервер