<НА ГЛАВНУЮ

Эффективное дообучение 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

Switch to English