Дайджесты новостей
Компактная языковая модель Saluki 27B, квантованная до 8 ГБ на потребительском ноутбуке с автономным вызовом инструментов.

Saluki 27B: квантование локальной модели до 8 ГБ для автономного вызова инструментов

Запуск локальных языковых моделей на потребительском железе всегда сопровождался болезненным компромиссом: модели на 7–8 миллиардов параметров легко помещаются в память, но часто ломают JSON-схемы и путаются в аргументах при вызове инструментов. Модели же на 70B требуют мощных рабочих станций с несколькими видеокартами, недоступных для фонового использования на рабочем ноутбуке.

Исследовательская группа ConwayResearch предложила прагматичный выход, опубликовав на Hugging Face модель Underdog-Saluki-27B-1.0.

Взяв за основу архитектуру Qwen3.8-27B, авторы применили агрессивное квантование нового поколения GGUF IQ2-mix. Результат впечатляет: модель с 27 миллиардами параметров сжалась до 7,89 ГБ, что позволяет запускать ее на видеокартах с 8–12 ГБ VRAM или базовых Mac с чипами Apple Silicon. Ранее мы уже обсуждали запуск Qwen 3.8 27B на домашнем железе: тогда речь шла об оптимизации скорости через спекулятивное декодирование, а теперь фокус сместился на радикальную экономию памяти без потери точности вызова функций.

Преодоление деградации квантования при вызове функций

При сверхнизкобитном квантовании (до 2–3 бит на вес) первыми обычно страдают способность следовать системным инструкциям и валидность вывода. Модели начинают терять закрывающие фигурные скобки в JSON или подставлять некорректные типы полей.

В Saluki 27B матричные веса, отвечающие за проекцию внимания и формат чата, были квантованы по гибридной схеме (IQ2-mix): ключевые слои сохранения внимания сохранили повышенную точность, тогда как второстепенные блоки сжаты сильнее. В результате модель сохранила надежность генерации вызовов инструментов (Function Calling) на уровне полноразмерных сетей.

Развертывание через llama.cpp и вызов инструментов

Для инференса используется стандартный сервер llama.cpp. Критически важный нюанс — флаг --jinja: стандартный парсер чат-шаблонов не сможет корректно обработать разметку инструментов Qwen без Jinja-шаблонизатора.

# Запуск локального OpenAI-совместимого сервера с контекстом 32k
llama-server \
  -m Underdog-Saluki-27B-1.0-IQ2-mix.gguf \
  --jinja \
  -ngl 99 \
  -fa on \
  -c 32768 \
  --port 8080

После старта сервера модель готова принимать запросы через стандартный API. Проверим вызов локальной утилиты чтения файлов на Python:

from openai import OpenAI
import json

client = OpenAI(base_url="http://localhost:8080/v1", api_key="not-needed")

tools = [{
    "type": "function",
    "function": {
        "name": "read_local_config",
        "description": "Читает конфигурационный файл из локальной директории",
        "parameters": {
            "type": "object",
            "properties": {
                "file_path": {"type": "string", "description": "Относительный путь к файлу"}
            },
            "required": ["file_path"]
        }
    }
}]

response = client.chat.completions.create(
    model="saluki-27b",
    messages=[{"role": "user", "content": "Проверь настройки в файле config.yaml"}],
    tools=tools,
    tool_choice="auto"
)

# Модель генерирует валидный структурированный вызов без галлюцинаций
tool_call = response.choices[0].message.tool_calls[0]
print(f"Вызов функции: {tool_call.function.name}")
print(f"Аргументы: {tool_call.function.arguments}")

Практические нюансы и вердикт

У экстремального сжатия есть естественные ограничения: Saluki 27B уступает исходной модели в художественной выразительности и сложных метафорах. Кроме того, при активной работе с окном контекста в 32k токенов на ноутбуках возможен нагрев и троттлинг.

Однако в роли локального рабочего агента — исполнителя терминальных команд, проверяльщика конфигов и парсера логов — Saluki 27B демонстрирует выдающийся баланс. Запуск полноценной 27B-модели в объеме 8 ГБ делает автономных агентов доступными на любом современном ноутбуке.