Перейти к содержанию
Публикация AiManual

Заберите свой бесплатный AI-ассистент: Qwen2.5 на CPU за 15 минут

Пошаговый гайд по запуску AI-ассистента Qwen2.5-3B на CPU без GPU. Бесплатный хостинг на Hugging Face Spaces, квантование, Gradio интерфейс. Работает даже на Ra

Коротко

Что будет в материале

  1. 01

    Почему все гонятся за GPU, когда CPU хватает?

  2. 02

    Магия квантования: как 12 ГБ превращаются в 2 ГБ

  3. 03

    Hugging Face Spaces: бесплатный хостинг с подвохом

  4. 04

    Запускаем и сталкиваемся с реальностью

Почему все гонятся за GPU, когда CPU хватает?

Каждый второй гайд по запуску LLM начинается с "возьмите RTX 4090" или "арендуйте A100". Это смешно. Большинству не нужны 70 миллиардов параметров и генерация со скоростью света. Нужен рабочий инструмент, который отвечает на вопросы, помогает с кодом и не требует ипотеки на видеокарту.

Qwen2.5-3B-Instruct - это как раз такая модель. 3 миллиарда параметров, качество ответов на уровне GPT-3.5, и самое главное - она отлично работает на обычном процессоре. Особенно если применить квантование.

На февраль 2026 года Qwen2.5-3B остается одной из лучших маленьких моделей для CPU. Разработчики из Alibaba добавили улучшенное понимание контекста (до 32K токенов) и оптимизировали архитектуру для эффективного вывода на слабом железе.

Магия квантования: как 12 ГБ превращаются в 2 ГБ

Оригинальная модель Qwen2.5-3B весит около 12 ГБ в формате FP16. На обычном ноутбуке это уже проблема. Но есть трюк - квантование Q4_K_M.

Что это значит простыми словами? Мы уменьшаем точность чисел с 16 бит до 4 бит. Вместо 65,536 возможных значений оставляем 16. Потеря качества? Минимальная. Выигрыш в памяти? В 3-4 раза.

Формат Размер Качество Скорость на CPU
FP16 (оригинал) ~12 ГБ 100% 1-2 токена/сек
Q4_K_M (квантованная) ~2.1 ГБ 95-98% 10-15 токенов/сек

Разница в 10 раз по скорости - это не опечатка. Квантованная модель не только меньше, но и быстрее, потому что процессору проще работать с 4-битными числами.

Hugging Face Spaces: бесплатный хостинг с подвохом

Можно запустить модель на своем компьютере. Но зачем, если есть Hugging Face Spaces? Бесплатно, всегда онлайн, можно делиться ссылкой.

Подвох в одном: на бесплатном тарифе вам дают 2 CPU ядра и 16 ГБ RAM. Этого хватит для Qwen2.5-3B в квантованном виде, но придется оптимизировать.

Важно: бесплатные Spaces "засыпают" после 48 часов неактивности. Первый запрос после пробуждения займет 30-60 секунд (модель загружается в память). Если нужен 24/7 онлайн - рассмотрите Oracle Cloud или другой облачный провайдер.

1 Готовим рабочее пространство

Первое - создаем новый Space на Hugging Face:

  1. Зайдите на huggingface.co/spaces
  2. Нажмите "Create new Space"
  3. Выберите "Gradio" как SDK
  4. Название: qwen2.5-assistant (или свое)
  5. Visibility: Public (если хотите делиться)
  6. Нажмите "Create Space"

Теперь у вас есть пустой репозиторий с тремя файлами: README.md, app.py, requirements.txt. Последние два - наше все.

2 Пишем requirements.txt: что НЕЛЬЗЯ ставить

Самая частая ошибка - пытаться установить torch с CUDA. На Spaces нет GPU, только CPU. Вот правильный requirements.txt:

llama-cpp-python==0.2.77
gradio==4.31.0
huggingface-hub==0.24.0
numpy==1.26.4

Обратите внимание на версии. На февраль 2026 llama-cpp-python 0.2.77 - самая стабильная для CPU. Более новые версии могут иметь проблемы совместимости.

3 Сердце системы: app.py с оптимизациями

Вот полный код app.py с комментариями, где я объясняю каждый важный момент:

import os
import gradio as gr
from huggingface_hub import hf_hub_download
from llama_cpp import Llama
import time

# Константы - не меняйте без понимания последствий
MODEL_REPO = "Qwen/Qwen2.5-3B-Instruct-GGUF"
MODEL_FILE = "qwen2.5-3b-instruct-q4_k_m.gguf"

# Кэш для модели - чтобы не скачивать каждый раз
MODEL_PATH = hf_hub_download(
    repo_id=MODEL_REPO,
    filename=MODEL_FILE,
    cache_dir="./model_cache"
)

def load_model():
    """Загружаем модель с оптимизациями для CPU"""
    print(f"Загрузка модели из {MODEL_PATH}...")
    
    # Критические параметры для работы на 2 CPU ядрах
    n_threads = max(1, os.cpu_count() - 1)  # Оставляем одно ядро системе
    n_gpu_layers = 0  # Ноль! У нас нет GPU на Spaces
    
    llm = Llama(
        model_path=MODEL_PATH,
        n_ctx=4096,           # Контекст 4K - оптимально для памяти
        n_threads=n_threads,
        n_gpu_layers=n_gpu_layers,
        n_batch=512,          # Уменьшаем batch для CPU
        verbose=False,        # Убираем логи в продакшене
    )
    
    print(f"Модель загружена. Потоков: {n_threads}")
    return llm

# Глобальная переменная - модель загружается один раз
llm_instance = None

def generate_response(message, history):
    """Генерация ответа с системным промптом"""
    global llm_instance
    
    # Ленивая загрузка модели при первом запросе
    if llm_instance is None:
        llm_instance = load_model()
    
    # Системный промпт - можно кастомизировать
    system_prompt = "Ты - полезный AI ассистент. Отвечай подробно и вежливо."
    
    # Форматируем историю диалога для Qwen2.5
    messages = [
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": message}
    ]
    
    # Если есть история диалога, добавляем ее
    if history:
        for human, assistant in history[-3:]:  # Берем только последние 3 обмена
            messages.insert(-1, {"role": "user", "content": human})
            messages.insert(-1, {"role": "assistant", "content": assistant})
    
    start_time = time.time()
    
    # Генерация с ограничениями для CPU
    response = llm_instance.create_chat_completion(
        messages=messages,
        max_tokens=512,          # Не генерируем романы
        temperature=0.7,         # Баланс креативности и точности
        top_p=0.9,
        stop=["<|im_end|>", "\n\n"],  # Стоп-токены Qwen
        stream=False
    )
    
    elapsed = time.time() - start_time
    answer = response['choices'][0]['message']['content']
    
    # Добавляем метрики в ответ (опционально)
    tokens_used = response['usage']['total_tokens']
    speed = tokens_used / elapsed if elapsed > 0 else 0
    
    print(f"Сгенерировано {tokens_used} токенов за {elapsed:.2f}с ({speed:.1f} токенов/сек)")
    
    return answer

# Создаем Gradio интерфейс - простой и функциональный
demo = gr.ChatInterface(
    fn=generate_response,
    title="Qwen2.5-3B AI Assistant",
    description="Бесплатный AI ассистент на CPU. Модель: Qwen2.5-3B-Instruct (Q4_K_M)",
    examples=[
        "Напиши Python функцию для сортировки списка",
        "Объясни квантовую запутанность простыми словами",
        "Помоги составить план тренировок на неделю"
    ],
    cache_examples=False  # Не кэшируем - мало памяти
)

if __name__ == "__main__":
    # Запускаем с ограничениями для Spaces
    demo.launch(
        server_name="0.0.0.0",
        server_port=7860,
        share=False,           # Не создаем публичную ссылку - Spaces делает это сам
        max_threads=1          # Важно! Не создаем много потоков
    )
💡
Ключевой момент: n_gpu_layers=0. Если поставить любое число больше нуля, llama.cpp попытается найти CUDA и упадет с ошибкой. На Spaces нет GPU, только CPU.

4 Файл конфигурации: Space должен знать свои ограничения

Создайте файл Dockerfile (да, Spaces использует Docker под капотом):

FROM python:3.10-slim

WORKDIR /app

# Устанавливаем системные зависимости минимально
RUN apt-get update && apt-get install -y \
    build-essential \
    && rm -rf /var/lib/apt/lists/*

# Копируем requirements первыми для кэширования Docker
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Копируем весь код
COPY . .

# Запускаем приложение
CMD ["python", "app.py"]

И файл README.md для описания:

---
title: Qwen2.5-3B AI Assistant
emoji: 🤖
colorFrom: blue
colorTo: purple
sdk: gradio
sdk_version: 4.31.0
app_file: app.py
pinned: false
---

# Бесплатный AI ассистент на CPU

Запуск Qwen2.5-3B-Instruct на Hugging Face Spaces без GPU.

## Технические детали
- Модель: Qwen2.5-3B-Instruct (Q4_K_M квантование)
- Размер: ~2.1 ГБ
- Контекст: 4096 токенов
- Скорость: 10-15 токенов/сек на CPU

## Использование
Просто введите вопрос в чат и нажмите Enter.

Запускаем и сталкиваемся с реальностью

Нажмите Commit в интерфейсе Hugging Face. Пойдет сборка. Займет 5-10 минут. Первая загрузка модели - еще 2-3 минуты.

Что увидите:

  • Интерфейс Gradio с примерными вопросами
  • Первое поколение займет 15-30 секунд
  • Последующие ответы - 5-10 секунд
  • Потребление RAM: 3-4 ГБ (из 16 доступных)

Если все работает - поздравляю. Если нет - смотрите раздел ниже.

Типичные ошибки и как их исправить

Ошибка: "Killed" во время загрузки модели
Spaces убивает процесс, если он использует больше 10 ГБ RAM. Решение: убедитесь, что используете Q4_K_M квантование (не Q8 или FP16). Проверьте n_ctx - не ставьте больше 8192.

Ошибка: "CUDA not available"
Вы забыли поставить n_gpu_layers=0. Или пытаетесь использовать torch с CUDA. В requirements.txt не должно быть torch или transformers.

Ошибка: медленная генерация (1-2 токена/сек)
Проверьте n_threads. Должно быть os.cpu_count() - 1. На Spaces обычно 2 ядра, значит 1 поток. Также уменьшите n_batch до 256 или 128.

А что если хочется больше функциональности?

Базовый чат - это только начало. Вот что можно добавить:

  1. Поиск по документам: Загружайте PDF/текстовые файлы, модель будет отвечать на основе их содержания
  2. Голосовой интерфейс: Добавьте Whisper для транскрипции и Qwen3-ASR для синтеза речи
  3. Память между сессиями: Сохраняйте историю диалога в файл или базу данных
  4. Интеграция с API: Добавьте возможность вызывать внешние сервисы

Для серьезных проектов посмотрите построение AI-монстра - там полный стек технологий.

Почему именно Qwen2.5, а не что-то другое?

На февраль 2026 есть десятки маленьких моделей. Почему выбираю Qwen2.5-3B:

  • Качество кода: Лучше, чем у большинства моделей своего размера
  • Поддержка русского: Не идеальная, но лучше, чем у западных аналогов
  • Лицензия Apache 2.0: Можно использовать коммерчески
  • Сообщество: Активная разработка, регулярные обновления
  • Инструменты: Отличная поддержка в llama.cpp и других бэкендах

Для сравнения: Gemma 2B чуть быстрее, но хуже понимает контекст. Phi-3-mini (3.8B) требует больше памяти. Qwen2.5 - золотая середина.

Что делать, когда Spaces мало?

16 ГБ RAM и 2 CPU ядра - это ограничение. Если нужно:

  1. Больше памяти: Перейдите на PRO аккаунт ($9/месяц) - 32 ГБ RAM
  2. Свой сервер: Арендуйте VPS с 4-8 ядрами и 32 ГБ RAM ($20-40/месяц)
  3. Бесплатные облака: Oracle Cloud дает 4 ядра ARM и 24 ГБ RAM бесплатно
  4. Локальный запуск: На своем компьютере с 16+ ГБ RAM

Для локального запуска на слабом железе смотрите гайд по Tesla P100 или решение для Raspberry Pi.

💡
Секретный совет: если модель все равно не влезает в память, попробуйте квантование Q3_K_S. Размер около 1.5 ГБ, качество падает на 5-7%, но работает на любом железе. Или используйте Qwen2.5-1.5B - еще меньше, но для простых задач хватит.

Вместо заключения: что будет через год

Тренд очевиден: модели становятся меньше и умнее. Если сегодня Qwen2.5-3B - это минимум для полезной работы, то через год появятся 1.5B модели с качеством сегодняшних 7B.

Инфраструктура тоже эволюционирует. Llama.cpp уже сегодня показывает чудеса оптимизации. Через год, возможно, мы будем запускать 7B модели на смартфонах с той же скоростью, что сегодня 3B на CPU.

Ваш бесплатный ассистент на Spaces - это не финальный продукт. Это отправная точка. Добавляйте функциональность, экспериментируйте с промптами, тестируйте другие модели. Главное - начать.

P.S. Если сделали что-то крутое на основе этого гайда - поделитесь в комментариях. Лучшие идеи включу в следующую статью.