Когда инференс «тормозит», первый рефлекс — масштабировать GPU. Дорого. Половина таких историй лечится обычным nginx перед сервисом — слоем, который не решает задачи модели, но честно берёт на себя все бытовые.
Что забирает на себя гейтвей
- Rate limit per ключ. Модель не должна страдать от того, что один интеграатор написал цикл без сна.
- Таймауты.
proxy_read_timeoutкороче, чем терпение клиента. 503 за 300 мс лучше, чем 200 через минуту — второе ещё и удерживает воркер. - Кэш идемпотентных запросов. Для классификаторов с стабильным входом hit rate 30–60% — обычное дело, и это бесплатно снятая очередь на инференс.
- Честные коды ошибок. 429 с
Retry-Afterвместо «сейчас подумает, но долго».
location /infer {
limit_req zone=infer burst=20 nodelay;
proxy_read_timeout 0.3s;
proxy_next_upstream error timeout http_502 http_503;
proxy_cache infer_cache;
proxy_cache_key "$cache_key";
proxy_cache_valid 200 5m;
add_header X-Cached $upstream_cache_status;
}
Проверка на честность
Через месяц после включения кэша посмотрите, что у вас в X-Cached. Если HIT на запросах с персональными данными или на том, что явно должно считаться заново, — кэш надо чинить, а не гордиться им. Кэш, который кэширует неправильное, хуже отсутствия кэша: он молча врёт.
Самый дешёвый инференс — тот, до которого модель не дошла.
Синий-зелёный на уровне upstream-ов, серые 429 в дашборде вместо красных алертов и GPU, который не греется впустую, — весь профит от слоя, который никто никогда не хвалит. Его и не нужно хвалить. Его нужно просто не выключать «временно» в пятницу.