Qwen: скачать, установить, дообучить и применять

Введение

Qwen — это семейство открытых моделей (open-weight LLM) от Alibaba (QwenLM). Актуальные поколения — Qwen3 / Qwen3.5 (новые) и Qwen2.5 (широко используется в продакшене). Веса публикуются на Hugging Face (Qwen/Qwen3-8B, Qwen/Qwen2.5-7B-Instruct и другие) и на ModelScope.

Это руководство проходит весь цикл:

  1. Выбрать размер модели.
  2. Скачать и установить её (Ollama, Transformers, vLLM или llama.cpp).
  3. Пользоваться ей (чат, Python, HTTP API).
  4. Дообучить её на своих данных (LoRA / QLoRA) и запустить результат.

«Скачать» и «установить» для LLM означают разное: вы один раз скачиваете веса (десятки гигабайт) и устанавливаете среду выполнения (Ollama, vLLM, transformers, llama.cpp), которая их загружает.

Какую версию Qwen скачать

Имена в Ollama (самый простой путь):

Имена на Hugging Face:

Простые правила выбора:

Перед коммерческим использованием проверьте лицензию в карточке модели. Большинство весов Qwen распространяется по Apache 2.0, но подтвердите это на странице конкретного репозитория (huggingface.co/Qwen, github.com/QwenLM/Qwen3).

Требования к железу

Примерный объём VRAM для вывода в полной точности (bf16), контекст 4-8k:

МодельVRAM в bf164 бита (GGUF / AWQ / GPTQ)
0.6B - 1.7B2-5 ГБидёт на CPU и на ноутбуке
4B - 8B10-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

Дообучение 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. Практические правила:

Экспорт и запуск дообученной модели

Результат 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).

Что делать при сбоях

Официальные источники:

Автор статьи: Клавдия Кондакова