Технологии
«Без генерации токена ответа»: AWS развернула decision-модели на llama.cpp DLC в SageMaker AI
12 октября 2026 года AWS описала в блоге Machine Learning два пути обслуживания decision-моделей в Amazon SageMaker AI: штатный — через AWS Deep Learning Container для llama.cpp с OpenAI-совместимыми chat completions, и расширенный — через SemIf, который возвращает вероятности по объявленным вариантам без генерации токена ответа.

Зачем нужны оценки вместо текста
Приложения, которые маршрутизируют запросы, выбирают действие агента или назначают исход по политике, часто нуждаются не в свободном тексте, а в оценках по фиксированному набору вариантов. Управляемый путь для таких квантизованных моделей AWS строит на CPU или GPU: контейнер находит первый файл.gguf в каталоге /opt/ml/model, отображает POST /invocations на llama-server и передаёт переменные SM_LLAMA_CPP_* в аргументы llama.cpp.
Штатному пути не нужны Dockerfile или репозиторий ECR: модель упаковывается как model.tar.gz в Amazon S3, а опубликованный образ DLC указывается напрямую. Вместо GGUF из S3 можно настроить SM_LLAMA_CPP_HF_REPO и SM_LLAMA_CPP_HF_FILE, чтобы контейнер скачал файл из Hugging Face при наличии исходящего доступа.
Почему для вероятностей нужен дочерний образ
HTTP-API llama-server не выставляет логиты последней позиции и операции с состоянием, на которые опирается SemIf. Поэтому структурный путь собирает дочерний образ через AWS CodeBuild и хранит его в Amazon ECR: образ сохраняет скомпилированные CPU- или CUDA-библиотеки DLC, но заменяет точку входа на адаптер, совместимый с SageMaker.
Схемы у путей разные: штатный принимает массив messages с ролью и содержимым плюс параметры генерации вроде max_tokens и stream, а SemIf — объект decision с идентификатором, неструктурированным состоянием, вопросом и упорядоченным списком допустимых вариантов. В ответ приходят option_ids, probabilities и сырые option_logits в том же порядке — вместе с метаданными промпта, таймингов и закреплённой модели. При стабильных идентификаторах вариантов приложение применяет пороги, откаты и проверки политики, не разбирая сгенерированную прозу.
Замер: 231 задача JevBench, CPU против GPU
Одни и те же 231 публичные задачи JevBench отправлялись последовательно на CPU-эндпоинт и на GPU-эндпоинт — это замер расширения SemIf, а не штатного текстового пути. На модели Qwen3.5-4B Q4_K_M в конфигурации ml.c6i.8xlarge с 32 потоками и образом llama-cpp:server-sagemaker-cpu-v1 получилось 231/231 валидных ответов, точность 179/231 (77.5%), p50 1.715 секунды и p95 19.291 секунды. В конфигурации ml.g6e.xlarge с полной выгрузкой на GPU и образом llama-cpp:server-sagemaker-cuda-v1 — 231/231, 180/231 (77.9%), p50 0.352 секунды и p95 0.599 секунды.
По сравнению с CPU-конфигурацией GPU-эндпоинт оказался в 4.9 раза быстрее по p50 и в 32.2 раза быстрее по p95. Стартовые логи подтвердили, что llama.cpp выгрузила на NVIDIA L40S все 34 слоя модели. Разница в один ответ не говорит о выигрыше в качестве: CPU- и GPU-образы использовали разные сборки llama.cpp и дали разные предсказания на шести трудных задачах, и AWS просит считать это вариацией рантайма, а не доказательством того, что выгрузка на GPU улучшает модель.
Меньшие модели снижали медианную задержку, но кандидаты на 2B и 0.8B дали 66.7% и 58.4% точности, поэтому качество-first дефолтом в примере остаётся 4B Q4_K_M; сами измерения включают сетевую задержку и гарантией сервиса не являются.
Что важно в эксплуатации
Адаптер сериализует скоринг вокруг одного stateful-контекста llama.cpp, поэтому масштабироваться нужно инстансами эндпоинта, а не рассчитывать на параллельный скоринг внутри контейнера. При перегрузке он возвращает повторяемые ответы HTTP 503 вместо неограниченной очереди вокруг того же контекста. GPU-путь задаёт упорядоченный пул инстансов, но это запасные варианты размещения, а не балансировка: SageMaker выбирает один доступный тип, и создание эндпоинта занимает больше времени, пока он идёт по пулу.
Скрипты развёртывания отклоняют изменяемые теги образов, а сборка модели сверяет контрольную сумму GGUF и останавливается при расхождении. Итоговая рекомендация AWS: CPU — для фоновых, офлайн- или низкопоточных нагрузок, которые терпят секунды ответа; GPU — для интерактивных решений, длинных промптов и жёстких требований к хвостовой задержке.
Авторизацию и детерминированные бизнес-правила AWS просит держать вне модели и проверять вероятности, прежде чем считать их операционной уверенностью. Удаление генерации токена ответа не убирает инференс: модель всё равно обрабатывает состояние, вопрос и описания вариантов.
SemIf, ранее OpenJev, AWS помещает в более широкий класс decision-моделей, которые оценивают заданные приложением исходы из неструктурированного состояния, — рядом с Jev от TypeSafe с его API /v1/systemone, Kev и Strands Decider 2B.