Qwen: скачать, установить, дообучить и применять
Введение
Qwen — это семейство открытых моделей (open-weight LLM) от Alibaba
(QwenLM). Актуальные поколения — Qwen3 / Qwen3.5 (новые) и
Qwen2.5 (широко используется в продакшене). Веса публикуются на
Hugging Face (Qwen/Qwen3-8B,
Qwen/Qwen2.5-7B-Instruct и другие) и на ModelScope.
Это руководство проходит весь цикл:
- Выбрать размер модели.
- Скачать и установить её (Ollama, Transformers, vLLM или llama.cpp).
- Пользоваться ей (чат, Python, HTTP API).
- Дообучить её на своих данных (LoRA / QLoRA) и запустить результат.
«Скачать» и «установить» для LLM означают разное: вы один раз скачиваете веса (десятки гигабайт) и устанавливаете среду выполнения (Ollama, vLLM, transformers, llama.cpp), которая их загружает.
Какую версию Qwen скачать
Имена в Ollama (самый простой путь):
- qwen3:0.6b
- qwen3:1.7b
- qwen3:4b
- qwen3:8b
- qwen3:14b
- qwen3:32b
Имена на Hugging Face:
- Qwen/Qwen3-0.6B
- Qwen/Qwen3-8B
- Qwen/Qwen2.5-7B-Instruct
Простые правила выбора:
- Чат / RAG / инструменты: берите чекпойнт с суффиксом -Instruct.
- Продолжение предобучения / база для собственного SFT: берите базовый (без Instruct) чекпойнт.
- Программирование: берите чекпойнт Qwen2.5-Coder- или Qwen3-.
- Зрение: берите чекпойнт Qwen2.5-VL- / Qwen3-VL-, а не текстовый.
Перед коммерческим использованием проверьте лицензию в карточке модели. Большинство весов Qwen распространяется по Apache 2.0, но подтвердите это на странице конкретного репозитория (huggingface.co/Qwen, github.com/QwenLM/Qwen3).
Требования к железу
Примерный объём VRAM для вывода в полной точности (bf16), контекст 4-8k:
| Модель | VRAM в bf16 | 4 бита (GGUF / AWQ / GPTQ) |
|---|---|---|
| 0.6B - 1.7B | 2-5 ГБ | идёт на CPU и на ноутбуке |
| 4B - 8B | 10-20 ГБ | 6-10 ГБ VRAM |
| 14B | ~30 ГБ | 10-12 ГБ VRAM |
| 32B | ~65 ГБ | 20-24 ГБ VRAM |
Дообучение требует больше ресурсов, чем вывод. Полное дообучение модели на 7-8B требует около 60 ГБ VRAM; LoRA — примерно 16-24 ГБ; QLoRA (4-битная база плюс LoRA-адаптеры) помещает 7-8B на одну карту с 16 ГБ. Обучение только на CPU годится лишь для игрушечных тестов.
Понадобятся: Linux / macOS / WSL2 на Windows, Python 3.10+, драйверы NVIDIA + CUDA для запуска на GPU, 30-80 ГБ свободного диска (веса и кеш).
Быстрый старт: Ollama
Ollama скачивает веса и ставит среду выполнения одной командой. Лучший вариант, если нужно «просто начать чат прямо сейчас».
1. Установите Ollama (Linux / macOS / WSL2)
curl -fsSL https://ollama.com/install.sh | sh
2. Скачайте Qwen (один раз, потом можно работать офлайн)
ollama pull qwen3:8b
3. Начните чат
ollama run qwen3:8b
Варианты поменьше и побольше:
ollama pull qwen3:4b
ollama pull qwen3:14b
Ollama также отдаёт HTTP API, совместимый с OpenAI, на порту 11434:
Список моделей:
curl http://localhost:11434/api/tags
Чат через API:
curl http://localhost:11434/api/chat -d '{"model": "qwen3:8b", "messages": [{"role": "user", "content": "Hello, Qwen!"}]}'
Обновить веса позже можно повторной командой ollama pull qwen3:8b. Удалить — командой ollama rm qwen3:8b.
Установка через Hugging Face Transformers
Этот путь нужен, когда требуется контроль на уровне Python (скрипты, обучение, эмбеддинги).
1. Окружение Python
python3 -m venv qwen-env
source qwen-env/bin/activate
pip install -U pip
pip install -U transformers accelerate torch --index-url https://download.pytorch.org/whl/cu121
Необязательно: flash attention для длинного контекста и скорости
pip install -U flash-attn --no-build-isolation
2. Один раз войдите в аккаунт, если попались закрытые репозитории или лимиты запросов
pip install -U huggingface_hub
hf auth login
3. При первом использовании скачивание идёт автоматически (кеш в ~/.cache/huggingface). Или скачайте заранее явно:
hf download Qwen/Qwen3-8B
from transformers import AutoModelForCausalLM, AutoTokenizer MODEL_ID = "Qwen/Qwen3-8B" # or "Qwen/Qwen2.5-7B-Instruct" tok = AutoTokenizer.from_pretrained(MODEL_ID) model = AutoModelForCausalLM.from_pretrained( MODEL_ID, dtype="auto", # bf16 on GPU, fp32 fallback on CPU device_map="auto", # spread across GPU/CPU automatically ) messages = [{"role": "user", "content": "Write a haiku about the Volga."}] text = tok.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) inputs = tok([text], return_tensors="pt").to(model.device) out = model.generate(**inputs, max_new_tokens=256) # type: ignore[misc] print(tok.decode(out[0][len(inputs.input_ids[0]) :], skip_special_tokens=True))
Qwen3 может выводить переключатель /think / /no_think
в шаблонах чата. Передайте enable_thinking=False в
apply_chat_template, если нужны прямые ответы без
цепочки рассуждений.
Комментарий # type: ignore[misc] на строке
generate заглушает известное ложное срабатывание mypy
в заглушках transformers 5.x (объявленный тип возврата
from_pretrained не совпадает с типом
self у generate);
сам вызов при работе корректен.
Запуск через vLLM (API, совместимый с OpenAI)
vLLM нужен для обслуживания с высокой пропускной способностью и эндпоинтом, совместимым с OpenAI. При первом запуске он сам скачивает веса с Hugging Face.
pip install -U vllm
Запуск Qwen3-8B на одной GPU:
python -m vllm.entrypoints.openai.api_server --model Qwen/Qwen3-8B --dtype auto --max-model-len 8192 --port 8000
Проверка:
curl http://localhost:8000/v1/models
curl http://localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{"model": "Qwen/Qwen3-8B", "messages": [{"role": "user", "content": "What is Qwen?"}]}'
Клиент на Python (тот же код работает с настоящим OpenAI, если поменять base_url):
from openai import OpenAI client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY") resp = client.chat.completions.create( model="Qwen/Qwen3-8B", messages=[{"role": "user", "content": "Explain LoRA in one paragraph."}], ) print(resp.choices[0].message.content)
Запуск на CPU с llama.cpp
На машинах без GPU используйте квантованную сборку GGUF:
Ollama уже делает это за вас; ручной путь:
1. Возьмите файл GGUF, например Qwen3-8B-Q4_K_M.gguf из GGUF-репозитория
hf download Qwen/Qwen3-8B-GGUF --include "*Q4_K_M*.gguf"
2a. Сервер llama.cpp (совместимый с OpenAI на :8080)
llama-server -m Qwen3-8B-Q4_K_M.gguf -c 4096 --port 8080
2b. или обычный чат в терминале
llama-cli -m Qwen3-8B-Q4_K_M.gguf -c 4096 -n 512 -p "You are helpful. User: Hi! Assistant:"
Как пользоваться Qwen
- Шаблон чата важен. Всегда форматируйте промпты через apply_chat_template (Transformers) или API messages (Ollama / vLLM). Простая склейка строк ухудшает качество Instruct-моделей.
- Системный промпт задаёт поведение, например You are a concise senior Python reviewer. Answer with code first.
- Сэмплирование: для чата начните с temperature 0.7, top_p 0.8; для фактических задач и программирования — temperature 0.0-0.2.
- RAG: подведите модель к своим документам через LangChain / LlamaIndex и совместимый с OpenAI эндпоинт выше — переобучение для проблемы даты отсечения знаний не нужно.
- Инструменты / вызов функций: Qwen поддерживает вызов инструментов через свой шаблон чата и через параметр tools, совместимый с OpenAI, в vLLM / Ollama.
Дообучение Qwen (LoRA / QLoRA)
Не делайте полное дообучение на одной GPU — используйте LoRA (маленькие обучаемые адаптеры) или QLoRA (4-битная замороженная база плюс LoRA). Типичный рецепт для адаптации Qwen3-8B или Qwen2.5-7B под чат, поддержку или вопросы по своей предметной области на одной GPU с 16-24 ГБ:
1. Подготовьте данные в формате chat JSONL (один объект на строку):
{"messages": [ {"role": "system", "content": "You are a bike-shop assistant."}, {"role": "user", "content": "Which brake pads fit model X?"}, {"role": "assistant", "content": "Resin pads, type B. ..."}]}
2. Установите стек для обучения:
source qwen-env/bin/activate
pip install -U trl peft bitsandbytes datasets
3. Обучайте (QLoRA, примерно подходит для 7-8B на 16 ГБ VRAM):
import torch from datasets import load_dataset from peft import LoraConfig from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig from trl import SFTConfig, SFTTrainer MODEL_ID = "Qwen/Qwen3-8B" # or "Qwen/Qwen2.5-7B-Instruct" ds = load_dataset("json", data_files="train.jsonl", split="train") tok = AutoTokenizer.from_pretrained(MODEL_ID, use_fast=True) if tok.pad_token is None: tok.pad_token = tok.eos_token bnb = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16, ) model = AutoModelForCausalLM.from_pretrained( MODEL_ID, quantization_config=bnb, device_map="auto", ) model.config.use_cache = False peft_cfg = LoraConfig( r=16, lora_alpha=32, lora_dropout=0.05, target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], task_type="CAUSAL_LM", ) args = SFTConfig( output_dir="qwen-lora", num_train_epochs=2, per_device_train_batch_size=2, gradient_accumulation_steps=8, learning_rate=2e-4, logging_steps=10, save_steps=200, bf16=True, packing=True, max_length=2048, ) trainer = SFTTrainer( model=model, train_dataset=ds, processing_class=tok, peft_config=peft_cfg, args=args, ) trainer.train() trainer.save_model("qwen-lora") tok.save_pretrained("qwen-lora")
4. Практические правила:
- Начните с 1-3 эпох, lr 1e-4 - 2e-4, ранга 8-32.
- Оставьте 5-10% данных как отложенную выборку для оценки; следите за eval loss, а не только за train loss.
- 500-5000 хороших примеров лучше 100k шумных.
- Альтернативы с меньшим объёмом кода: LLaMA-Factory (веб-интерфейс и конфиги YAML) или Unsloth (самые быстрые ядра QLoRA для одной GPU).
- Для пользователей ModelScope (зеркало для Китая): замените Qwen/Qwen3-8B на идентификатор ModelScope и выполните pip install modelscope.
Экспорт и запуск дообученной модели
Результат LoRA — это только адаптеры. Для обслуживания их нужно слить с базовой моделью:
import torch from peft import PeftModel from transformers import AutoModelForCausalLM, AutoTokenizer BASE = "Qwen/Qwen3-8B" tok = AutoTokenizer.from_pretrained(BASE) model = AutoModelForCausalLM.from_pretrained(BASE, dtype=torch.bfloat16, device_map="cpu") peft_model = PeftModel.from_pretrained(model, "qwen-lora") merged = peft_model.merge_and_unload() merged.save_pretrained("qwen-merged") tok.save_pretrained("qwen-merged")
Дальше либо запустите qwen-merged через vLLM / Transformers, либо сконвертируйте в GGUF с помощью llama.cpp (llama-quantize / convert_hf_to_gguf.py) и запускайте через llama-server или импортируйте в Ollama через Modelfile (FROM ./qwen-merged.gguf плюс ollama create my-qwen -f Modelfile).
Что делать при сбоях
- CUDA out of memory: перейдите на модель поменьше (8b -> 4b), сократите --max-model-len / max_length, используйте QLoRA вместо LoRA, поставьте размер батча 1 с большим числом шагов накопления.
- Медленный вывод на CPU: так и должно быть — возьмите GGUF поменьше (Q4_K_M) и меньше токенов контекста (-c 2048).
- Бессмыслица / нет ответа: вы пропустили шаблон чата. Используйте apply_chat_template / messages, а не сырые строки.
- Модель не найдена на HF: опечатка в идентификаторе или закрытый репозиторий — выполните hf auth login и примите лицензию на веб-странице.
- Не тот язык / стиль после SFT: обучающие данные слишком узкие — добавьте 10-20% примеров обычного чата, чтобы не было катастрофического забывания.
Официальные источники:
- github.com/QwenLM/Qwen3
- huggingface.co/Qwen
- ollama.com/library/qwen3
- docs.vllm.ai
Автор статьи: Клавдия Кондакова