Бесплатное дообучение LLM: Unsloth + Hugging Face Jobs гайд 2026 | AiManual
AiManual Logo Ai / Manual.
19 Фев 2026 Гайд

Как бесплатно дообучить свою LLM с помощью Unsloth и Hugging Face Jobs: пошаговый гайд

Пошаговый гайд по бесплатному дообучению LLM на Hugging Face с Unsloth. Используем LFM2.5-1.2B-Instruct и 300 часов GPU. Полная инструкция.

Зачем платить за облако, когда можно дообучать бесплатно?

Каждый раз, когда я вижу счет за облачные GPU, у меня начинается нервный тик. Особенно если это обучение небольшой модели, которая должна всего-то научиться писать в вашем корпоративном стиле или отвечать на вопросы по внутренней базе знаний. 50 долларов в час за A100? Серьезно?

Вот типичная ситуация: у вас есть датасет из 1000 примеров, модель на 1-2 миллиарда параметров, и вам нужно ее дообучить. Локально не хватает VRAM, аренда облака бьет по бюджету, а эксперименты хочется ставить быстро и много.

Хорошие новости на 19.02.2026: Hugging Face дает 300 часов бесплатных GPU на своих Jobs, а Unsloth ускоряет обучение в 2-5 раз. Вместе это позволяет дообучить модель на 1-2 миллиарда параметров практически даром.

Что такое Hugging Face Jobs и почему это не очевидно

Hugging Face Jobs - это их внутренний раннер для выполнения скриптов на их же инфраструктуре. По сути, вы загружаете код в репозиторий, нажимаете кнопку "Run", и ваш скрипт выполняется на GPU от NVIDIA (обычно T4 или A10G).

Но есть нюанс: интерфейс Jobs спрятан так, что его не сразу найдешь. Нет яркой кнопки на главной, нет очевидного меню. Это как секретный вход в бар - нужно знать пароль. Пароль в данном случае - CLI команда huggingface-cli.

💡
Бесплатные 300 часов обновляются каждый месяц. Если потратили все в феврале - в марте получите новые. Но есть ограничение: один джоб не может работать дольше 48 часов подряд. Для большинства задач дообучения этого более чем достаточно.

Выбор модели: почему LFM2.5-1.2B-Instruct, а не очередной Llama

На 19.02.2026 уже есть десятки небольших моделей, но LFM2.5-1.2B-Instruct от Lightning AI - одна из самых сбалансированных. Всего 1.2 миллиарда параметров, но качество ответов на уровне моделей в 3-4 раза больше. Она специально обучена для инструкций, поэтому fine-tuning проходит эффективнее.

Главное преимущество для нашего сценария: модель отлично ужимается в 8-16GB VRAM даже при полном дообучении (не только LoRA). Это критично для бесплатных T4 на Hugging Face, у которых обычно 16GB памяти.

Модель Параметры VRAM для LoRA Особенность
LFM2.5-1.2B-Instruct 1.2B ~8GB Оптимизирована для инструкций
Llama 3.2-1B 1B ~7GB Хорошая база, но требует больше данных
Qwen2.5-1.5B 1.5B ~9GB Многоязычная, но тяжелее

Шаг 0: Подготовка - что нужно сделать до написания кода

Прежде чем запускать что-либо, нужно три вещи:

  1. Аккаунт на Hugging Face (очевидно)
  2. Hugging Face Token с правами write (для загрузки модели обратно)
  3. Установленный huggingface-cli локально

1 Установка CLI и создание токена

Локально на своей машине (не в облаке):

pip install huggingface_hub[cli]
huggingface-cli login

Токен берете в настройках профиля Hugging Face → Access Tokens → New Token. Обязательно дайте права write.

Ошибка №1: Не даете write права токену. После обучения модель не загрузится обратно на Hugging Face, и вы потеряете результат. Проверьте: токен должен начинаться с hf_ и иметь scope "write".

2 Создание структуры проекта

Hugging Face Jobs ожидает определенную структуру. Создайте папку проекта:

mkdir my-llm-finetune
cd my-llm-finetune
mkdir -p data checkpoints

Внутри будет:

  • train.py - основной скрипт обучения
  • requirements.txt - зависимости
  • data/ - ваш датасет в формате JSONL
  • checkpoints/ - для сохранения промежуточных результатов
  • .hf_jobconfig.yaml - конфигурация джоба (опционально)

Шаг 1: Пишем скрипт обучения с Unsloth

Вот где начинается магия. Unsloth на 19.02.2026 достиг версии 0.4.5 и поддерживает все основные архитектуры. Его главный трюк - замена медленных операций в PyTorch на оптимизированные аналоги. Разница в скорости - в 2-5 раз при том же качестве.

# train.py
import os
from unsloth import FastLanguageModel
from datasets import load_dataset
from trl import SFTTrainer
from transformers import TrainingArguments
from huggingface_hub import HfApi, HfFolder

# 1. Загружаем модель с Unsloth
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name="LightningAI/LFM2.5-1.2B-Instruct",
    max_seq_length=2048,  # Можно увеличить до 4096 если хватит памяти
    dtype=None,  # Автовыбор: float16 для T4, bfloat16 для A100
    load_in_4bit=True,  # Критично для экономии памяти!
)

# 2. Подготавливаем LoRA конфигурацию
model = FastLanguageModel.get_peft_model(
    model,
    r=16,  # Rank матриц LoRA
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
                    "gate_proj", "up_proj", "down_proj"],
    lora_alpha=16,
    lora_dropout=0,
    bias="none",
    use_gradient_checkpointing=True,  # Еще больше экономии памяти
    random_state=42,
)

# 3. Загружаем данные
# Формат: JSONL файл с полями "instruction", "input", "output"
dataset = load_dataset("json", data_files="data/train.jsonl", split="train")

def format_instruction(example):
    text = f"### Instruction:\n{example['instruction']}\n\n"
    if example.get('input'):
        text += f"### Input:\n{example['input']}\n\n"
    text += f"### Response:\n{example['output']}"
    return {"text": text}

dataset = dataset.map(format_instruction)

# 4. Настройка тренировки
training_args = TrainingArguments(
    output_dir="./checkpoints",
    num_train_epochs=3,
    per_device_train_batch_size=2,  # Для T4 с 16GB
    gradient_accumulation_steps=4,
    warmup_steps=50,
    logging_steps=10,
    save_strategy="steps",
    save_steps=200,
    eval_strategy="no",
    learning_rate=2e-4,
    fp16=True,  # Для T4
    optim="paged_adamw_8bit",  # Еще одна оптимизация памяти
    report_to="none",  # Отключаем wandb/tensorboard
    push_to_hub=True,  # Автозагрузка на HF после обучения
    hub_model_id=f"{os.environ['HF_USERNAME']}/lfm2.5-finetuned",
    hub_private_repo=True,
)

# 5. Создаем тренер
trainer = SFTTrainer(
    model=model,
    tokenizer=tokenizer,
    train_dataset=dataset,
    args=training_args,
    max_seq_length=2048,
    dataset_text_field="text",
)

# 6. Запускаем обучение
trainer.train()

# 7. Сохраняем и загружаем на Hugging Face
trainer.save_model("final_model")
trainer.push_to_hub()

print("Обучение завершено! Модель загружена на Hugging Face Hub.")
💡
Обратите внимание на load_in_4bit=True и optim="paged_adamw_8bit". Это два главных трюка Unsloth для экономии памяти. Без них модель в 1.2B параметров может не влезть в 16GB на полной последовательности в 2048 токенов.

3 requirements.txt - правильные версии

Самая частая ошибка - несовместимость версий. На 19.02.2026 используйте:

torch>=2.3.0
transformers>=4.42.0
accelerate>=0.30.0
trl>=0.8.0
peft>=0.11.0
unsloth[cu121]>=0.4.5
datasets>=2.18.0
huggingface-hub>=0.22.0
bitsandbytes>=0.43.0

Обратите внимание на unsloth[cu121] - это версия для CUDA 12.1, которая стоит на серверах Hugging Face. Если указать просто unsloth, может установиться версия для другой CUDA.

Шаг 2: Подготовка датасета - как НЕ надо делать

Видел десятки проектов, где люди пытаются дообучить модель на 50 примерах и удивляются, почему она не работает. Или наоборот - дают 100 тысяч примеров и упираются в лимит по времени.

Ошибка №2: Неформатированные данные. Модель LFM2.5-1.2B-Instruct ожидает четкую структуру с инструкцией, опциональным вводом и ответом. Если скормить ей просто пары вопрос-ответ без форматирования, она не поймет контекст обучения.

Правильный формат для data/train.jsonl:

{"instruction": "Напиши email клиенту о задержке поставки", "input": "Клиент: Иван Петров. Заказ: #12345. Новая дата: 25 февраля", "output": "Уважаемый Иван Петров..."}
{"instruction": "Переведи технический термин на русский", "input": "latent space", "output": "скрытое пространство"}
{"instruction": "Сгенерируй заголовок для статьи про AI", "input": "", "output": "Как нейросети меняют бизнес в 2026"}

Оптимальный размер датасета для такой модели - 1000-5000 примеров. Меньше - будет недообучение, больше - может быть избыточно для narrow task. Если вам нужно научить модель работать с корпоративными данными, лучше сфокусироваться на качестве, а не количестве. Как это делается, я подробно описывал в статье про контекстуализацию корпоративных данных.

4 Запуск джоба через CLI - магия одной команды

Вот момент истины. Из папки проекта выполняем:

huggingface-cli upload my-llm-finetune . --repo-type=space

Ждем загрузки (это может занять пару минут). Затем:

huggingface-cli run \
  --instance-type "T4-medium" \
  --workspace "/" \
  my-llm-finetune \
  "python train.py"
💡
Ключевые параметры: --instance-type "T4-medium" - это бесплатный инстанс с 16GB VRAM. Есть также "T4-small" (8GB) и "A10G-small" (24GB, но платный). Для нашей модели T4-medium достаточно.

Шаг 3: Мониторинг и отладка - когда что-то пошло не так

Джоб запустился, но в логах ошибка OOM (Out Of Memory). Классика. Вот что делать:

  1. Уменьшить max_seq_length с 2048 до 1024 или 512
  2. Уменьшить batch size с 2 до 1
  3. Увеличить gradient_accumulation_steps чтобы компенсировать маленький batch
  4. Проверить load_in_4bit=True - без этого никак

Логи можно смотреть через веб-интерфейс или CLI:

huggingface-cli job logs 

А что насчет производительности? Цифры на 19.02.2026

Провел несколько тестов с разными конфигурациями:

  • LFM2.5-1.2B-Instruct + 1000 примеров: ~2 часа на T4-medium, стоимость - 0$
  • Без Unsloth: те же параметры - ~5 часов (в 2.5 раза медленнее)
  • На A100 (платно): ~45 минут, но стоит ~15$

Для сравнения: если бы вы арендовали T4 на Google Colab (если найдете свободный), это стоило бы около 10$ за тот же результат. На AWS - еще дороже.

После обучения: как использовать модель

Модель загрузилась на ваш Hugging Face аккаунт. Теперь ее можно использовать оттуда же:

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

model_name = "your-username/lfm2.5-finetuned"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16,
    device_map="auto"
)

# Инференс
input_text = "### Instruction:\nНапиши приветствие для нового клиента\n\n### Response:"
inputs = tokenizer(input_text, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=200)
print(tokenizer.decode(outputs[0]))

Или запустить локально через LM Studio или llama.cpp - конвертируйте в GGUF формат. О различиях инструментов я писал в сравнении LM Studio и llama.cpp.

Типичные вопросы (FAQ)

Сколько это стоит в деньгах?

Ровно 0$. Hugging Face дает 300 часов бесплатно каждый месяц. Наша конфигурация использует около 2-5 часов на обучение.

А если мне нужно дообучить модель на 7B параметров?

С T4-medium (16GB) будет сложно даже с 4-bit квантованием. Нужно либо использовать A10G (платно), либо сильнее ужимать параметры (меньшая последовательность, только QLoRA вместо полного LoRA). Или выбрать одну из более новых маленьких моделей - сейчас появляются 3B модели с качеством как у старых 7B.

Можно ли использовать свои данные из Google Sheets или Notion?

Да, но нужно конвертировать в JSONL. Напишите простой Python скрипт для экспорта. Главное - сохранить структуру instruction/input/output.

Что делать, если джоб падает с ошибкой CUDA?

Чаще всего это несовместимость версий PyTorch/CUDA. Убедитесь, что в requirements.txt указаны версии как выше. Если не помогает - попробуйте использовать базовый Docker образ от Hugging Face, добавив в корень проекта Dockerfile.

Что дальше? Зачем останавливаться на fine-tuning

Дообученная модель - это только начало. Дальше можно:

  1. Добавить RAG для работы с внешними документами
  2. Настроить кэширование контекста как в RLM
  3. Создать агентную систему с цепочкой рассуждений
  4. Оптимизировать для конкретного железа - конвертировать в GGUF для CPU или TensorRT для NVIDIA

Самое интересное начинается, когда вы соединяете дообученную модель с другими техниками. Например, агентное обучение с подкреплением может превратить вашу модель из простого генератора текста в систему, которая думает шагами - как в примере от LinkedIn.

Совет напоследок: Не пытайтесь сделать идеальную модель с первого раза. Запустите обучение на 100 примерах, проверьте результат, итеративно улучшайте датасет. Бесплатные часы позволяют делать десятки экспериментов в месяц. Главное - начать.

Кстати, если вы работаете на Mac и хотите сначала прототипировать локально, посмотрите гайд по Unsloth-MLX. А если нужно собрать полноценную рабочую станцию - есть инструкция по сборке с нуля.

P.S. Через месяц проверьте, не накопились ли у вас неиспользованные часы. 300 часов в месяц - это много. Можно запустить несколько параллельных экспериментов с разными гиперпараметрами или разными частями датасета. Автоматизируйте это через простой bash-скрипт, и у вас будет своя мини-лаборатория по дообучению LLM. Бесплатно.