Материалы к статье «Qwen 3.8 27B локально: пять конфигураций на двух RTX 5070 Ti»
================================================================================

nizamov.school/qwen-38-27b-max-context-vllm/

В архиве два файла:

  qwen38-nvfp4-fixed.jinja - исправленный шаблон чата Qwen 3.8 27B
  launch-configs.sh        - все шесть команд запуска из статьи с замерами


1. qwen38-nvfp4-fixed.jinja
===========================

Что исправлено
--------------
В штатном шаблоне, который лежит внутри чекпойнта, есть строка:

    {{- raise_exception('System message must be at the beginning.') }}

Она срабатывает на любом системном сообщении, пришедшем не первым. А клиенты
кладут role="system" в середину диалога регулярно - и сервер отвечает
HTTP 400 (llama.cpp - HTTP 500). Здесь строка заменена обычным рендером
системного хода:

    {{- '<|im_start|>system\n' + content + '<|im_end|>' + '\n' }}

Замер до и после: тест исправности сборки давал 90-95 % на всех четырёх
конфигурациях vLLM и 100 % с этим шаблоном - на всех шести прогонах, включая
четырёхбитный KV-кэш.

Файл один и тот же для NVFP4-сборки в vLLM и для GGUF в llama.cpp: он
байт в байт совпадает с qwen38-fixed.jinja из статьи про Claude Code.

Как использовать
----------------
1. Положите файл в свою домашнюю папку (например, ~/ai/).
2. В команде запуска подставьте СВОЙ путь вместо /home/ilya/ai/.
3. Флаг называется по-разному:

     vLLM:      --chat-template      /home/ilya/ai/qwen38-nvfp4-fixed.jinja
     llama.cpp: --chat-template-file /home/ilya/ai/qwen38-nvfp4-fixed.jinja
                (плюс --jinja)

Проверка: отправьте запрос, где роли идут user -> system -> user. Со штатным
шаблоном придёт 400 или 500, с этим - обычный ответ.


2. launch-configs.sh
====================

Шесть команд, которыми сняты все замеры статьи, с цифрами в комментариях.
Файл не предназначен для запуска целиком - это справочник: скопируйте нужный
блок. Пути к шаблону чата и адрес хоста поправьте под себя.

Коротко, что выбирать:

  Конфигурация 3 - агент и ежедневная работа с кодом. 102.6 ток/с выдачи,
                   ход агента 1.52 с, контекст 131 072. Дефолт.
  Конфигурация 2 - когда нужен vision: модель поднимается целиком,
                   контекста вдвое меньше.
  Конфигурация 1 - один большой документ на 130-250 тысяч токенов, пакетно.
                   Замером подтверждены 248 380 токенов, но 150 с до первого
                   токена на этой длине.
  Конфигурация 4 - запасная: если MTP нестабилен или нужен контекст между
                   131 и 171 тысячей токенов.
  Конфигурация 5 - llama.cpp на трёх картах, если NVFP4 не вариант.
                   split-mode layer ради префилла, tensor ради скорости печати.

Две вещи, общие для всех вариантов:

  - без исправленного шаблона чата не работает ни одна конфигурация;
  - без --enable-prompt-tokens-details vLLM не отдаёт cached_tokens, и вы
    не увидите, работает ли кэш префикса.


Стенд, на котором сняты замеры
==============================

  AMD Ryzen 5 3600, ASUS ROG STRIX X570-F GAMING, 78 032 MB DDR4-3266
  2x RTX 5070 Ti 16 303 MB, PCIe 4.0 x8, NVLink нет   - прогоны vLLM
  + RTX 3090 24 576 MB, PCIe 4.0 x4                    - прогоны llama.cpp
  Ubuntu 26.04, driver 595.71.05, CUDA 13.2
  vLLM 0.27.1, llama.cpp b10446-adb55e514

Замеры сняты собственным инструментом, батч 1, фиксированное зерно.
Разбор каждой цифры - в статье.

Низамов Илья, nizamov.school
