• Русский
  • Тонкая настройка LLM с помощью Training Hub

    Введение

    training_hub — это библиотека на Python, предоставляющая единый высокоуровневый API для запуска Supervised Fine-Tuning (SFT) и Orthogonal Subspace Fine-Tuning (OSFT) на больших языковых моделях. Она абстрагирует сложность настройки распределённого обучения, управления памятью и оркестрации бэкенда, позволяя сосредоточиться на параметрах эксперимента.

    Основные преимущества:

    • Единый API: один вызов функции (sft(...) или osft(...)) поддерживает обучение на одной GPU, нескольких GPU и в многозадачной среде без изменения кода.
    • Автоматическое управление памятью: параметр max_tokens_per_gpu ограничивает использование памяти GPU и автоматически вычисляет размер микробатча и накопление градиентов для поддержания заданного effective_batch_size.
    • OSFT для непрерывного обучения: функция osft реализует Nayak et al. (2025), arXiv:2504 .07097, которая ограничивает обновления весов ортогональными подпространствами — предотвращая катастрофическое забывание без использования буферов повторного воспроизведения или дополнительных датасетов.
    • Готовность к промышленному использованию: встроенное сохранение контрольных точек, отслеживание экспериментов и поддержка ядра Liger для повышения пропускной способности.

    SFT vs OSFT

    АспектSFTOSFT
    Сценарий использованияНачальная настройка инструкций, базовая тонкая настройка моделиНепрерывная адаптация модели к домену после настройки
    Катастрофическое забываниеТребует смешанных/повторных данных для смягченияПредотвращается алгоритмически
    Ключевой параметрСтандартные гиперпараметрыunfreeze_rank_ratio (0.0–1.0)
    Бэкендinstructlab-trainingmini-trainer

    Требования

    • В вашем кластере должны быть установлены Alauda AI и Alauda AI Workbench.
    • Инстанс Workbench (Notebook) с:
      • Доступом к установке Python-пакетов из интернета (или настроенным внутренним зеркалом PyPI).
      • Подключёнными GPU-ресурсами (минимум одна NVIDIA GPU).
      • Достаточным общим хранилищем для контрольных точек модели.
    • Модель HuggingFace (локальный путь или имя модели, доступное из инстанса).
    • Данные для обучения в формате JSONL (см. раздел Формат данных ниже).

    Формат данных

    Данные для обучения должны быть в формате JSON Lines (.jsonl), где каждая строка — это диалог:

    {"messages": [{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "What is machine learning?"}, {"role": "assistant", "content": "Machine learning is a subset of AI..."}]}

    Поддерживаемые значения role: system, user, assistant, pretraining.

    Поведение маскировки:

    • SFT (по умолчанию) — в функцию потерь включаются только ответы ассистента. Добавьте "unmask": true в пример, чтобы включить весь контент, кроме system (стиль pretraining).
    • OSFT — контролируется параметром unmask_messages (по умолчанию False; установите в True для стиля pretraining).

    Также поддерживаются предварительно обработанные датасеты с полями input_ids и labels через use_processed_dataset=True.

    Загрузка ноутбуков и примеры запуска

    Предоставлены два подробных учебных ноутбука. Скачайте их в ваш инстанс Workbench и выполняйте по ячейкам.

    НоутбукАлгоритмСкачать
    SFT Comprehensive TutorialSupervised Fine-TuningDownload sft_comprehensive_tutorial.ipynb
    OSFT Comprehensive TutorialOrthogonal Subspace Fine-TuningDownload osft_comprehensive_tutorial.ipynb

    Шаг 1 — Установка зависимостей

    Откройте терминал в вашем инстансе Workbench и установите training-hub:

    pip install training-hub

    Шаг 2 — Загрузка или подготовка данных

    Поместите ваш .jsonl файл с данными для обучения в путь, доступный ноутбуку, например /data/train.jsonl.

    Шаг 3 — Открытие и настройка ноутбука

    Откройте скачанный ноутбук в вашем инстансе Workbench. Основные ячейки для настройки:

    Выбор модели (в обоих ноутбуках):

    # Замените на имя модели HuggingFace или локальный путь
    model_path = "Qwen/Qwen2.5-7B-Instruct"

    В комплекте есть пресеты моделей Qwen 2.5 7B, Llama 3.1 8B, Phi 4 Mini и универсальные модели 7B/малые.

    Укажите необходимые пути (в обоих ноутбуках):

    data_path       = "/path/to/your/training_data.jsonl"
    ckpt_output_dir = "/path/to/checkpoints/my_experiment"

    Только для OSFT — настройка коэффициента ортогональности:

    unfreeze_rank_ratio = 0.25  # 0.1–0.3 консервативно, 0.3–0.5 сбалансировано

    Выбор распределённой конфигурации:

    selected_distributed = "single_node_8gpu"  # или "single_gpu_dev", "multi_node_master" и т.д.

    Шаг 4 — Запуск обучения

    Выполните все ячейки последовательно. Финальная ячейка запускает либо:

    # SFT
    from training_hub import sft
    result = sft(
        model_path=model_path,
        data_path=data_path,
        ckpt_output_dir=ckpt_output_dir,
        effective_batch_size=128,
        max_tokens_per_gpu=20000,
        max_seq_len=16384,
        learning_rate=1e-5,
        num_epochs=3,
        nproc_per_node=8,
        ...
    )
    
    # OSFT
    from training_hub import osft
    result = osft(
        model_path=model_path,
        data_path=data_path,
        ckpt_output_dir=ckpt_output_dir,
        unfreeze_rank_ratio=0.25,
        effective_batch_size=128,
        max_tokens_per_gpu=10000,
        max_seq_len=8192,
        learning_rate=5e-6,
        num_epochs=1,
        nproc_per_node=8,
        ...
    )

    Контрольные точки сохраняются в ckpt_output_dir после каждой эпохи (настраивается параметром checkpoint_at_epoch).

    Ключевые параметры

    Общие параметры (SFT и OSFT)

    ПараметрОбязательныйОписание
    model_pathДаИмя модели HuggingFace или локальный путь
    data_pathДаПуть к JSONL данным для обучения
    ckpt_output_dirДаКаталог для сохранения контрольных точек
    effective_batch_sizeДаГлобальный эффективный размер батча
    max_tokens_per_gpuДаЛимит токенов на GPU; контролирует память и автоматически вычисляет размер микробатча
    max_seq_lenДаМаксимальная длина последовательности
    learning_rateДаСкорость обучения оптимизатора
    num_epochsНетКоличество эпох обучения (по умолчанию: 1)
    lr_schedulerНетТип планировщика, например "cosine"
    warmup_stepsНетКоличество шагов линейного разогрева (по умолчанию: 0)
    use_ligerНетВключить ядра Liger для эффективности (по умолчанию: True для OSFT)
    seedНетСлучайное зерно (по умолчанию: 42)
    data_output_dirНетКаталог кеша обработанных данных; используйте "/dev/shm" для скорости RAM-диска
    use_processed_datasetНетПропустить токенизацию, если данные содержат input_ids/labels
    checkpoint_at_epochНетСохранять контрольную точку после каждой эпохи (по умолчанию: True)
    save_final_checkpointНетСохранять итоговую контрольную точку после обучения (по умолчанию: True)
    nproc_per_nodeНетКоличество GPU на узел
    nnodesНетОбщее количество узлов (по умолчанию: 1)
    node_rankНетРанг данного узла (по умолчанию: 0)
    rdzv_idНетИдентификатор rendezvous задачи
    rdzv_endpointНетhost:port мастер-узла для многозадачной работы

    Параметры, специфичные для OSFT

    ПараметрОбязательныйОписание
    unfreeze_rank_ratioДаДоля каждой матрицы весов, доступная для обновления (0.0–1.0). Меньше — больше сохранения.
    unmask_messagesНетЕсли True, обучение на всём контенте, кроме system (стиль pretraining)
    target_patternsНетПодстроки для ограничения OSFT на конкретные слои (по умолчанию: None, все слои)

    Обучение в многозадачной среде

    Для многозадачных заданий запускайте ноутбук (или эквивалентный скрипт) на каждом узле одновременно с одинаковыми rdzv_id и rdzv_endpoint, меняя только node_rank для каждого узла:

    # Мастер-узел (node_rank=0)
    nproc_per_node = 8
    nnodes         = 2
    node_rank      = 0
    rdzv_id        = 42
    rdzv_endpoint  = "10.0.0.1:29500"
    
    # Рабочий узел (node_rank=1)
    node_rank = 1  # все остальные параметры идентичны

    Все узлы должны иметь сетевое соединение с rdzv_endpoint до начала обучения.