Новости Милана

Qwen3.8-27B: Запуск передовой открытой модели на вашей локальной GPU

21 августа 2026 г.Javier Morales14 мин

Локальный запуск передовой открытой модели стал реальностью для разработчиков, которым нужны нулевые затраты на API, полный контроль над данными и офлайн-доступ. Qwen3.8-27B — это модель с открытым весом по лицензии Apache 2.0, которая объединяет плотную архитектуру с 27 миллиардами параметров, нативный контекст 262K, возможности работы с изображениями и расширенный контекст YaRN до 1 миллиона токенов. Все это упаковано так, что помещается на одну потребительскую GPU с 24 ГБ VRAM при квантовании Q4_K_M. Эта статья проведет вас через практическую настройку с использованием трех инструментов для развертывания: Ollama, LM Studio и vLLM.

Как запустить Qwen3.8-27B на локальной GPU

  1. Проверьте, имеет ли ваша GPU не менее 24 ГБ VRAM, выполнив команду nvidia-smi --query-gpu=memory.total --format=csv.
  2. Убедитесь, что точный идентификатор модели существует в библиотеке Ollama или на HuggingFace перед скачиванием.
  3. Выберите инструмент для развертывания: Ollama для простоты, LM Studio для графического интерфейса или vLLM для пропускной способности.
  4. Загрузите квантованный вариант Q4_K_M GGUF (для Ollama/LM Studio) или AWQ (для vLLM) (приблизительно 18 ГБ).
  5. Настройте окно контекста на 32 768 токенов как отправную точку для карт с 24 ГБ.
  6. Запустите сервер и протестируйте с помощью интерактивного чат-запроса, чтобы подтвердить корректную генерацию.
  7. Проведите бенчмаркинг токенов в секунду, используя предоставленный скрипт для измерения производительности.
  8. Интегрируйте REST API или API, совместимый с OpenAI, в ваш код приложения.

Что делает Qwen3.8-27B достойной для локального запуска

Параметры модели

Qwen3.8-27B — это плотный трансформер с 27 миллиардами параметров, а не модель «смесь экспертов», что означает, что все параметры активны при каждом проходе. Его нативное окно контекста составляет 262 144 токена, а масштабирование YaRN (Yet another RoPE extensioN) расширяет его до ~1 миллиона токенов при правильной настройке на уровне развертывания. Модель нативно поддерживает ввод изображений, обрабатывая задачи понимания изображений, такие как анализ диаграмм, скриншотов и документов, наряду со стандартной генерацией текста.

Qwen3.8-27B распространяется под лицензией Apache 2.0. Нет никаких ограничений на использование, никаких исключений для коммерческого использования и никаких требований к регистрации. Разработчики могут развертывать ее в продуктах, дообучать и распространять измененные веса без необходимости согласования условий лицензии.

Почему локально, а не через API?

Для рабочих процессов, требующих большого количества итераций, таких как инженерия подсказок (prompt engineering), агентные циклы или разработка RAG-пайплайнов, затраты на API за каждый токен быстро накапливаются. Локальное развертывание полностью устраняет эту переменную, хотя и переносит затраты на первоначальное оборудование, время настройки и текущее обслуживание (обновления драйверов, управление версиями моделей, дисковое пространство).

Конфиденциальные проекты, работающие с медицинскими записями, юридическими документами или проприетарным кодом, позволяют хранить все данные на локальной машине. Офлайн-доступ важен для изолированных сред и развертываний в полевых условиях. Детерминированную воспроизводимость — когда одинаковые веса, квантование, температура и зерно дают одинаковый результат — гораздо легче гарантировать локально, чем через удаленный API, бэкэнд которого может измениться без предупреждения. Локальный инференс также устраняет задержку сетевых "туда-обратно" из агентных и RAG-пайплайнов, передавая контроль над временем до первого токена непосредственно разработчику.

Требования к оборудованию и варианты квантования

Предварительные требования

  • NVIDIA GPU с подтвержденной VRAM: выполните nvidia-smi --query-gpu=memory.total --format=csv для подтверждения.
  • Драйвер NVIDIA ≥ 525: выполните nvidia-smi и проверьте отображаемую версию драйвера.
  • CUDA toolkit (для vLLM): CUDA 11.8 или 12.1+. Подтвердите с помощью nvcc --version.
  • ОС: Linux (все методы), macOS (только Ollama и LM Studio), Windows + WSL2 (только Ollama).
  • Python 3.8–3.11 (для vLLM и скрипта бенчмаркинга). Подтвердите с помощью python3 --version.
  • NVMe SSD с не менее чем 20 ГБ свободного места для Q4_K_M GGUF (до 54 ГБ для FP16).

Бюджет VRAM по уровню квантования

Следующая таблица сопоставляет уровень квантования с потреблением VRAM, влиянием на качество, рекомендуемым классом GPU и практической максимальной длиной контекста, достижимой без ошибок нехватки памяти.

Квантование VRAM (веса модели) Влияние на качество Рекомендуемая GPU Макс. практический контекст
FP16 ~54 ГБ Базовый (без потерь) 2x A100 80 ГБ 262K
Q8_0 ~27 ГБ Незначительное A6000 48 ГБ (контекст ограничен ~8K–16K на A100 40 ГБ) 128K+
Q5_K_M ~21 ГБ Очень незначительное A6000 48 ГБ (недостаточный запас KV для 24 ГБ GPU) 64K
Q4_K_M ~18 ГБ Незначительное; лучшее соотношение цена/качество RTX 4090/5090 24 ГБ 32K–48K
Q3_K_M ~14 ГБ Заметное при задачах рассуждения RTX 4070 Ti Super 16 ГБ 16K–24K

Q4_K_M является оптимальным вариантом для потребительских карт с 24 ГБ VRAM, таких как RTX 4090 и RTX 5090. Это оставляет около 6 ГБ VRAM для KV-кэша, который напрямую определяет, сколько контекста модель может фактически использовать во время выполнения. NVIDIA A5000 также имеет 24 ГБ VRAM, но это профессиональная GPU класса Quadro по более высокой цене (~$2000+ против ~$1600 за RTX 4090); она предлагает тот же бюджет VRAM, но ориентирована на рабочие станции.

Важно: Q5_K_M (~21 ГБ веса) не подходит для эффективного использования на GPU с 24 ГБ. После загрузки весов остается всего ~3 ГБ — намного меньше, чем минимальные ~6 ГБ, необходимые для практического KV-кэша. Используйте Q5_K_M только на картах с 48 ГБ+ VRAM, таких как A6000.

Минимальные и рекомендуемые характеристики

Минимально жизнеспособная GPU — это 16 ГБ VRAM, использующая Q3_K_M с контекстом, ограниченным примерно 16K токенов. Рекомендуемая конфигурация — карта с 24 ГБ VRAM, использующая Q4_K_M. Системная ОЗУ должна составлять не менее 32 ГБ для Q4_K_M/Q3_K_M. FP16-сервинг требует 64 ГБ+ системной ОЗУ для размещения полных весов во время загрузки. Во время загрузки модели хост-память временно хранит всю модель перед передачей слоев на GPU, а KV-кэш, превышающий VRAM, сбрасывается в системную ОЗУ. Хранилище должно быть NVMe SSD. Файлы моделей варьируются от ~14 ГБ (Q3_K_M GGUF) до 54 ГБ (FP16), и загрузка с вращающегося диска увеличивает время запуска на минуты по сравнению с секундами на NVMe.

Выгрузка на CPU, когда некоторые слои трансформера работают на CPU, а другие остаются на GPU, технически возможна в бэкэндах на базе llama.cpp. На практике выгрузка более чем нескольких слоев на CPU резко снижает скорость генерации до менее чем 2 токенов в секунду, делая это возможным только для коротких, неинтерактивных задач.

Метод 1: Запуск Qwen3.8-27B с Ollama

Установка Ollama и загрузка модели

Ollama предоставляет самый быстрый путь от нуля до запуска инференса. Установка зависит от платформы.


curl -fsSL https://ollama.com/install.sh -o install.sh
sh install.sh

# Или для macOS:
brew install ollama

# Запуск Ollama в фоновом режиме:
ollama serve &
OLLAMA_PID=$!

# Ожидание готовности Ollama:
for i in $(seq 1 30); do
  if curl -sf http://localhost:11434/ > /dev/null 2>&1; then
    echo 'Ollama ready.'
    break
  fi
  sleep 1
done

if ! curl -sf http://localhost:11434/ > /dev/null 2>&1; then
  echo 'ERROR: Ollama did not start within 30 seconds.' >&2
  kill '$OLLAMA_PID'
  exit 1
fi

# Загрузка модели Qwen3.8-27B с квантованием Q4_K_M:
ollama pull qwen3.8-27b:q4_K_M

# Просмотр списка загруженных моделей:
ollama list

# Просмотр активных моделей (должна быть видна qwen3.8-27b):
ollama ps
    

Вывод ollama list должен показать qwen3.8-27b:q4_K_M с его размером. Запуск ollama ps во время активной загрузки модели подтверждает, что слои GPU назначены. Если GPU-слои не отображаются, убедитесь, что драйвер NVIDIA установлен правильно и nvidia-smi показывает GPU.

Интерактивный чат и базовая конфигурация

Для повторяемой конфигурации Modelfile позволяет разработчикам зафиксировать системную подсказку, окно контекста, температуру и параметры сэмплирования.


FROM qwen3.8-27b:q4_K_M

PARAMETER num_ctx 32768
PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER stop '<|im_end|>'
PARAMETER stop '<|endoftext|>'

SYSTEM '''You are a senior software engineer. Provide precise, working code with brief explanations. Always specify language and runtime versions.'''
    

Сборка и запуск:


ollama create qwen3.8-custom -f Modelfile-qwen3.8-27b

ollama run qwen3.8-custom
    

Значение num_ctx 32768 является практическим значением по умолчанию для карт с 24 ГБ при Q4_K_M. Увеличение этого значения линейно увеличивает потребление памяти KV-кэшем. При контексте 32K ожидайте около 4 ГБ KV-кэша в дополнение к 18 ГБ весов модели, что оставляет небольшой, но рабочий запас на карте с 24 ГБ.

Использование REST API Ollama

Программный доступ открывает интеграцию с скриптами, агентами и бэкэндами приложений. Ollama по умолчанию предоставляет REST API по адресу localhost:11434.


IMAGE_B64=$(python3 -c \
  'import base64,sys; sys.stdout.write(base64.b64encode(open('screenshot.png','rb').read()).decode())')

PAYLOAD=$(jq -n \
  --arg img '$IMAGE_B64' \
  '{
    model: 'qwen3.8-custom',
    messages: [{
      role: 'user',
      content: 'Describe the layout of this UI screenshot and identify any usability issues.',
      images: [$img]
    }],
    stream: false
  }')

curl http://localhost:11434/api/chat \
  -H 'Content-Type: application/json' \
  -d '$PAYLOAD'
    

Тот же вызов с использованием Python-библиотеки ollama:


import ollama
import base64
import os
import sys

image_path = 'screenshot.png'

if not os.path.isfile(image_path):
    sys.exit(f'ERROR: Image file not found: {image_path}')

try:
    with open(image_path, 'rb') as f:
        image_data = base64.b64encode(f.read()).decode('utf-8')
except OSError as e:
    sys.exit(f'ERROR: Could not read image file: {e}')

response = ollama.chat(
    model='qwen3.8-custom',
    messages=[
        {
            'role': 'user',
            'content': 'Describe the layout of this UI screenshot and identify any usability issues.',
            'images': [image_data],
        }
    ],
)
print(response['message']['content'])
    

Для потоковой передачи ответов установите 'stream': true в полезной нагрузке curl или передайте stream=True методу Python и итерируйте по фрагментам ответа.

Метод 2: Запуск Qwen3.8-27B с LM Studio

Загрузка и конфигурация GPU

LM Studio предоставляет рабочий процесс на основе графического интерфейса. Откройте браузер моделей, найдите 'Qwen3.8-27B' и выберите вариант Q4_K_M GGUF. Менеджер загрузки автоматически проверяет целостность файла.

После загрузки перейдите на панель настроек модели. Установите для слоев выгрузки на GPU максимальное значение, которое может поддерживать карта. На GPU с 24 ГБ VRAM и весами Q4_K_M обычно возможно выгрузить все слои на GPU. Установите длину контекста в той же панели. Начать с 32 768 токенов разумно; отслеживайте использование VRAM с помощью nvidia-smi -l 1 и уменьшайте, если система испытывает нехватку памяти во время генерации.

Сервер API, совместимый с OpenAI

LM Studio может предоставить локальный сервер, который общается с API OpenAI Chat Completions. Включите его на вкладке сервера в пользовательском интерфейсе. По умолчанию конечная точка — http://localhost:1234/v1.

Важно: Идентификатор модели, используемый в вызовах API, должен совпадать с точной строкой, отображаемой на вкладке сервера LM Studio после загрузки модели. Скопируйте эту строку и используйте ее в качестве значения model ниже. Отображаемый здесь идентификатор является примером и может не совпадать с вашей установкой.


from openai import OpenAI
import os

client = OpenAI(
    base_url='http://localhost:1234/v1',
    api_key=os.environ.get('LM_STUDIO_API_KEY', 'lm-studio'),
)

stream = client.chat.completions.create(
    model='qwen3.8-27b-q4_k_m', # Убедитесь, что это точное имя модели в LM Studio
    messages=[
        {'role': 'system', 'content': 'You are a concise technical assistant.'},
        {'role': 'user', 'content': 'Explain the difference between PagedAttention and standard KV cache allocation in three sentences.'},
    ],
    stream=True,
)

for chunk in stream:
    if not chunk.choices:
        continue
    delta_content = chunk.choices[0].delta.content
    if delta_content:
        print(delta_content, end='', flush=True)
print()
    

Это замена для любого кода, который уже нацелен на OpenAI SDK. Измените base_url и model, и остальная логика приложения останется неизменной.

Метод 3: Запуск Qwen3.8-27B с vLLM (для пропускной способности)

Когда выбирать vLLM вместо Ollama или LM Studio

vLLM нацелен на пропускную способность. Его механизм PagedAttention управляет памятью GPU для KV-кэша в не смежных блоках, подобно страничной виртуальной памяти, значительно уменьшая потери памяти при обслуживании нескольких одновременных запросов. Непрерывная пакетная обработка означает, что vLLM добавляет новые запросы в текущий пакет без ожидания завершения существующих запросов. Эти функции делают vLLM правильным выбором для пакетных заданий инференса, нагрузочного тестирования и продакшн-подобного развертывания. Компромисс — сложность настройки: vLLM требует Linux, совместимого CUDA toolkit (CUDA 11.8 или 12.1+) и, начиная с последних версий, поддержка GGUF может быть экспериментальной или отсутствовать — проверьте это с вашей установленной версией через vllm --version и журнал изменений vLLM. AWQ и GPTQ — рекомендуемые форматы квантования для vLLM.

Установка и развертывание модели


python3 -m venv vllm-env
source vllm-env/bin/activate
pip install vllm==0.4.3 # Используйте актуальную версию

# Проверка версии vLLM и CUDA
python3 -c 'import vllm; print('vLLM version:', vllm.__version__)'
python3 -c 'import torch; print('CUDA available:', torch.cuda.is_available(), '| CUDA version:', torch.version.cuda)'
nvcc --version

# Проверка поддержки RoPE
vllm serve --help 2>&1 | grep -i rope

# Запуск сервера vLLM
# Убедитесь, что модель Qwen/Qwen3.8-27B-AWQ доступна на HuggingFace
vllm serve Qwen/Qwen3.8-27B-AWQ \
  --quantization awq \
  --max-model-len 32768 \
  --gpu-memory-utilization 0.85 \
  --dtype auto \
  --host 127.0.0.1 \
  --port 8000
    

Несоответствие версий CUDA: Установка vLLM через pip install vllm по умолчанию использует колесо CUDA 12.1. Если ваша система использует другую версию CUDA, обратитесь к документации по установке vLLM для инструкций по установке правильного колеса. Несоответствие CUDA приводит к загадочным ошибкам во время выполнения.

Тестирование конечной точки:


curl http://localhost:8000/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "Qwen/Qwen3.8-27B-AWQ",
    "messages": [
      {"role": "user", "content": "Write a Python function that merges two sorted lists in O(n) time."}
    ],
    "max_tokens": 512
  }'
    

Бенчмаркинг вашей установки

Измерение токенов в секунду для любого из трех методов развертывания можно выполнить с помощью простого скрипта измерения времени.


pip install requests
    

import time
import requests

API_URL = 'http://localhost:8000/v1/chat/completions' # Измените, если используете другой порт/сервер
PAYLOAD = {
    'model': 'Qwen/Qwen3.8-27B-AWQ', # Убедитесь, что это точное имя модели, используемое сервером
    'messages': [{'role': 'user', 'content': 'Explain quantum entanglement in 200 words.'}],
    'max_tokens': 256,
    'stream': False,
}

start = time.perf_counter()
try:
    raw = requests.post(API_URL, json=PAYLOAD, timeout=120)
    raw.raise_for_status()
    resp = raw.json()
except requests.exceptions.RequestException as e:
    raise SystemExit(f'HTTP request failed: {e}')
except ValueError as e:
    raise SystemExit(f'Response was not valid JSON: {e}\nBody: {raw.text[:200]}')

elapsed = time.perf_counter() - start

usage = resp.get('usage')
if not usage:
    raise SystemExit(f"Missing 'usage' field in response: {resp}")

completion_tokens = usage['completion_tokens']
prompt_tokens = usage['prompt_tokens']

end_to_end_tps = completion_tokens / elapsed

print(f'Model: {PAYLOAD["model"]}')
print(f'Prompt tokens:     {prompt_tokens}')
print(f'Completion tokens: {completion_tokens}')
print(f'Wall time:         {elapsed:.2f}s')
print(f'End-to-end TPS:    {end_to_end_tps:.1f}  (includes TTFT; generation-only TPS is higher)')
    

Для справки, сравнимые модели с 27 миллиардами параметров при квантовании Q4_K_M / AWQ на RTX 4090 с контекстом 32K обычно достигают 20-35 токенов в секунду для генерации с помощью бэкэндов на базе llama.cpp. A100 80 ГБ при FP16 может выдавать более 60 токенов в секунду при непрерывной пакетной обработке через vLLM. Фактическая пропускная способность для этой конкретной модели должна быть проверена после подтверждения доступности модели.

Практические советы для более длинных контекстов и задач с изображениями

Масштабирование контекста без нехватки VRAM

KV-кэш линейно растет с длиной контекста. При Q4_K_M на карте с 24 ГБ веса модели потребляют около 18 ГБ, оставляя ~6 ГБ для KV-кэша. Каждый дополнительный 1K токенов контекста стоит 100-200 МБ памяти KV-кэша, в зависимости от конфигурации голов внимания. Для этой конкретной архитектуры модели измеряйте эмпирически, отслеживая nvidia-smi при увеличении num_ctx. Это делает 32K-48K токенов практическим пределом на GPU с 24 ГБ. Нативный контекст 262K и расширенный контекст YaRN 1M достижимы только на картах со значительно большей VRAM (80 ГБ+) или с помощью агрессивной оптимизации памяти.

Для vLLM масштабирование YaRN можно включить, передав соответствующую конфигурацию масштабирования RoPE. Например:


--rope-scaling '{"type":"yarn","factor":4.0,"original_max_position_embeddings":262144}'
    

Обратитесь к карточке модели для получения правильных значений factor и original_max_position_embeddings. Это позволяет модели экстраполировать за пределы контекста во время обучения, когда бюджет VRAM позволяет.

Подача изображений модели

Qwen3.8-27B принимает изображения JPEG и PNG. Визуальный энкодер внутренне изменяет размер входных данных, но подача изображений выше максимального входного разрешения энкодера (проверьте карточку модели для точного значения) увеличивает время предварительной обработки без пропорционального увеличения качества. Практическое применение включает рабочие процессы "скриншот-в-код", понимание диаграмм для генерации документации и анализ пользовательского интерфейса для аудита доступности.


IMAGE_B64=$(python3 -c \
  'import base64,sys; sys.stdout.write(base64.b64encode(open('landing-page-screenshot.png','rb').read()).decode())')

PAYLOAD=$(jq -n \
  --arg img '$IMAGE_B64' \
  '{
    model: 'qwen3.8-custom',
    messages: [{
      role: 'user',
      content: 'Generate a complete, responsive HTML and CSS implementation that faithfully reproduces this landing page design. Use semantic HTML5 elements and modern CSS (flexbox/grid).',
      images: [$img]
    }],
    stream: false
  }')

curl http://localhost:11434/api/chat \
  -H 'Content-Type: application/json' \
  -d '$PAYLOAD'
    

Это отправляет скриншот модели и запрашивает рабочую HTML/CSS-репродукцию, рабочий процесс, непосредственно применимый к быстрой разработке прототипов в веб-разработке.

Чек-лист реализации

  1. Подтвердите, что VRAM GPU составляет не менее 24 ГБ (или не менее 16 ГБ с Q3_K_M и компромиссами по контексту). Выполните nvidia-smi --query-gpu=memory.total --format=csv.
  2. Проверьте совместимость версии драйвера CUDA с требованиями выбранного инструмента развертывания.
  3. Подтвердите доступность модели: проверьте точный тег модели в библиотеке Ollama и/или точный ID репозитория HuggingFace на huggingface.co/Qwen перед продолжением.
  4. Выберите инструмент развертывания: Ollama для простоты, LM Studio для графического рабочего процесса, vLLM для пропускной способности и пакетного инференса.
  5. Загрузите правильный квантованный вариант модели (Q4_K_M GGUF для Ollama/LM Studio, AWQ или GPTQ для vLLM).
  6. Настройте длину контекста, соответствующую бюджету VRAM (начните с 32 768 токенов на картах с 24 ГБ).
  7. Протестируйте интерактивный чат с базовым запросом, чтобы подтвердить, что модель загружается и генерирует корректно.
  8. Проверьте конвейер обработки изображений, отправив пример изображения и проверив ответ.
  9. Запустите скрипт бенчмаркинга пропускной способности, чтобы установить базовый уровень токенов в секунду.
  10. Интегрируйте через REST API или API, совместимый с OpenAI, в целевое приложение.
  11. Отслеживайте использование VRAM под нагрузкой с помощью nvidia-smi -l 1 и корректируйте длину контекста или квантование, если появляется давление памяти.

Устранение распространенных проблем

Ошибки нехватки памяти (Out-of-Memory)

Сначала уменьшите длину контекста: понизьте num_ctx в Ollama, настройку контекста в LM Studio или --max-model-len в vLLM. Если этого недостаточно, переключитесь на меньшее квантование (Q3_K_M) или уменьшите количество слоев выгрузки на GPU, чтобы сбросить часть весов в системную ОЗУ. Если используете vLLM, попробуйте также снизить --gpu-memory-utilization до 0.80.

Медленная скорость генерации

Проверьте утилизацию GPU с помощью nvidia-smi. Если утилизация низкая, узким местом, вероятно, является выгрузка на CPU или ввод-вывод диска. Отключите частичную выгрузку на CPU и убедитесь, что файл модели находится на NVMe SSD. Для vLLM увеличьте --gpu-memory-utilization, чтобы выделить больше VRAM для KV-кэша.

Искаженный или бессвязный вывод

Наиболее распространенная причина — несоответствие между файлом GGUF и шаблоном чата, который применяет инструмент развертывания. Убедитесь, что квантованный файл соответствует ожидаемой архитектуре и что инструмент развертывания использует правильный шаблон подсказки (ChatML для моделей Qwen). Минимальный обмен данными в формате ChatML выглядит так:


<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
Hello!<|im_end|>
<|im_start|>assistant
    

В Ollama директива FROM в Modelfile должна указывать на точный тег модели, загруженный. Обратитесь к карточке модели Qwen для окончательной спецификации шаблона чата.