Почему все гонятся за 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:
- Зайдите на huggingface.co/spaces
- Нажмите "Create new Space"
- Выберите "Gradio" как SDK
- Название: qwen2.5-assistant (или свое)
- Visibility: Public (если хотите делиться)
- Нажмите "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 # Важно! Не создаем много потоков
)
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.
А что если хочется больше функциональности?
Базовый чат - это только начало. Вот что можно добавить:
- Поиск по документам: Загружайте PDF/текстовые файлы, модель будет отвечать на основе их содержания
- Голосовой интерфейс: Добавьте Whisper для транскрипции и Qwen3-ASR для синтеза речи
- Память между сессиями: Сохраняйте историю диалога в файл или базу данных
- Интеграция с 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 ядра - это ограничение. Если нужно:
- Больше памяти: Перейдите на PRO аккаунт ($9/месяц) - 32 ГБ RAM
- Свой сервер: Арендуйте VPS с 4-8 ядрами и 32 ГБ RAM ($20-40/месяц)
- Бесплатные облака: Oracle Cloud дает 4 ядра ARM и 24 ГБ RAM бесплатно
- Локальный запуск: На своем компьютере с 16+ ГБ RAM
Для локального запуска на слабом железе смотрите гайд по Tesla P100 или решение для Raspberry Pi.
Вместо заключения: что будет через год
Тренд очевиден: модели становятся меньше и умнее. Если сегодня Qwen2.5-3B - это минимум для полезной работы, то через год появятся 1.5B модели с качеством сегодняшних 7B.
Инфраструктура тоже эволюционирует. Llama.cpp уже сегодня показывает чудеса оптимизации. Через год, возможно, мы будем запускать 7B модели на смартфонах с той же скоростью, что сегодня 3B на CPU.
Ваш бесплатный ассистент на Spaces - это не финальный продукт. Это отправная точка. Добавляйте функциональность, экспериментируйте с промптами, тестируйте другие модели. Главное - начать.
P.S. Если сделали что-то крутое на основе этого гайда - поделитесь в комментариях. Лучшие идеи включу в следующую статью.