Эффективное дообучение Qwen3-14B на Google Colab с Unsloth AI и оптимизацией LoRA
В этом руководстве показано, как эффективно дообучить модель Qwen3-14B на Google Colab с помощью Unsloth AI, используя 4-битную квантзацию и LoRA для экономии памяти при обучении на смешанных наборах данных.
Упрощение дообучения больших языковых моделей с помощью Unsloth AI
Дообучение больших языковых моделей, таких как Qwen3-14B, обычно требует значительных ресурсов, памяти и времени. Unsloth AI решает эти проблемы, позволяя быстро и эффективно дообучать модели с использованием передовых методов, таких как 4-битная квантзация и LoRA (адаптация низкого ранга).
Установка необходимых библиотек на Google Colab
В начале устанавливаются необходимые библиотеки с условием проверки среды, чтобы оптимизировать производительность и совместимость. В установку входят bitsandbytes для 4-битного обучения, trl для утилит обучения и unsloth_zoo для доступа к моделям.
%%capture
import os
if "COLAB_" not in "".join(os.environ.keys()):
!pip install unsloth
else:
!pip install --no-deps bitsandbytes accelerate xformers==0.0.29.post3 peft trl==0.15.2 triton cut_cross_entropy unsloth_zoo
!pip install sentencepiece protobuf "datasets>=3.4.1" huggingface_hub hf_transfer
!pip install --no-deps unslothЗагрузка и подготовка модели Qwen3-14B
Модель Qwen3-14B загружается с 4-битной точностью и максимальной длиной последовательности 2048 токенов с помощью FastLanguageModel из библиотеки Unsloth. Полное дообучение отключено для использования эффективных методов с малым количеством обучаемых параметров, таких как LoRA.
from unsloth import FastLanguageModel
import torch
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/Qwen3-14B",
max_seq_length = 2048,
load_in_4bit = True,
load_in_8bit = False,
full_finetuning = False,
)Применение LoRA для эффективного дообучения
В модель внедряются адаптеры LoRA в определённые слои трансформера для эффективного обучения с минимальным количеством обучаемых параметров. Включается градиентный чекпоинтинг для уменьшения использования памяти.
model = FastLanguageModel.get_peft_model(
model,
r = 32,
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"],
lora_alpha = 32,
lora_dropout = 0,
bias = "none",
use_gradient_checkpointing = "unsloth",
random_state = 3407,
use_rslora = False,
loftq_config = None,
)Подготовка смешанных датасетов для дообучения
Загружаются два датасета: с задачами на рассуждение (OpenMathReasoning-mini) и с инструкциями для выполнения (FineTome-100k). Эти данные преобразуются в формат диалогов, подходящий для обучения.
from datasets import load_dataset
reasoning_dataset = load_dataset("unsloth/OpenMathReasoning-mini", split="cot")
non_reasoning_dataset = load_dataset("mlabonne/FineTome-100k", split="train")Форматирование данных в диалоговый формат
Функция преобразует пары вопрос-ответ в структуру диалога пользователь-ассистент. Токенизатор применяет шаблоны чата для правильного форматирования.
def generate_conversation(examples):
problems = examples["problem"]
solutions = examples["generated_solution"]
conversations = []
for problem, solution in zip(problems, solutions):
conversations.append([
{"role": "user", "content": problem},
{"role": "assistant", "content": solution},
])
return {"conversations": conversations}
reasoning_conversations = tokenizer.apply_chat_template(
reasoning_dataset["conversations"],
tokenize=False,
)
from unsloth.chat_templates import standardize_sharegpt
dataset = standardize_sharegpt(non_reasoning_dataset)
non_reasoning_conversations = tokenizer.apply_chat_template(
dataset["conversations"],
tokenize=False,
)Объединение и выборка данных
Датасеты объединяются в соотношении 75% рассуждений и 25% инструкций, что обеспечивает баланс между логическим мышлением и общими задачами. Итоговый набор данных перемешивается для обучения.
import pandas as pd
chat_percentage = 0.75
non_reasoning_subset = pd.Series(non_reasoning_conversations).sample(
int(len(reasoning_conversations) * (1.0 - chat_percentage)),
random_state=2407,
)
data = pd.concat([
pd.Series(reasoning_conversations),
pd.Series(non_reasoning_subset)
])
data.name = "text"
from datasets import Dataset
combined_dataset = Dataset.from_pandas(pd.DataFrame(data))
combined_dataset = combined_dataset.shuffle(seed=3407)Настройка и запуск тренировки
Инициализируется тренер с параметрами обучения, оптимизированными для эффективного дообучения с помощью библиотеки trl.
from trl import SFTTrainer, SFTConfig
trainer = SFTTrainer(
model=model,
tokenizer=tokenizer,
train_dataset=combined_dataset,
eval_dataset=None,
args=SFTConfig(
dataset_text_field="text",
per_device_train_batch_size=2,
gradient_accumulation_steps=4,
warmup_steps=5,
max_steps=30,
learning_rate=2e-4,
logging_steps=1,
optim="adamw_8bit",
weight_decay=0.01,
lr_scheduler_type="linear",
seed=3407,
report_to="none",
)
)
trainer.train()Сохранение дообученной модели
Обученная модель и токенизатор сохраняются локально для дальнейшего использования или публикации.
model.save_pretrained("qwen3-finetuned-colab")
tokenizer.save_pretrained("qwen3-finetuned-colab")Подход Unsloth AI позволяет дообучать крупные модели, такие как Qwen3-14B, на обычном оборудовании, сочетая эффективную квантзацию, адаптацию LoRA и смешение датасетов. Этот туториал показывает полный цикл — от установки до обучения, давая возможность создавать кастомные модели и ассистентов с ограниченными ресурсами.
Switch Language
Read this article in English