fnn
Описание
Развитие проекта fast-nn с уклоном удобство запуска и воспроизводимость экспериментов
Языки
- Python99,4%
- Jupyter Notebook0,4%
- Dockerfile0,2%
FNN
Репозиторий для запуска воспроизводимых экспериментов с моделью и связанным training workflow.
Основной сценарий проекта:
- Описать эксперимент в JSON-конфиге.
- Запустить обучение через
.main.py - Получить артефакты эксперимента в отдельной папке.
- При необходимости продолжить обучение из checkpoint или запустить инференс через
.chat.py
Что есть в репозитории
— CLI для запуска эксперимента обучения.main.py— CLI для инференса по сохранённым артефактам эксперимента.chat.py— реализация моделиsrc/fnn.py.FNN— orchestration: загрузка конфига, подготовка датасета, создание модели, trainer, сохранение артефактов.src/runner.py— Pydantic-схемы конфигурации эксперимента.src/configs.py— примеры конфигов.configs/— результаты запусков.experiments/— автотесты.tests/
Требования
- Python 3.12+
как package manager и runneruv- PyTorch-совместимое окружение
Установка зависимостей:
Быстрый старт
Запуск эксперимента:
Или через переменную окружения:
Запуск инференса по сохранённому эксперименту:
Как запускается эксперимент
Команда:
принимает один обязательный параметр:
— путь к JSON-конфигу эксперимента.config
Пример:
Во время запуска делает следующее:
- Загружает
из JSON.ExperimentConfig - Фиксирует
для Python и Torch.seed - Создаёт директорию эксперимента
.<experiments_root>/<config.name> - Копирует туда:
- исходный config.json
- tokenizer.json
- snapshot исходников src.zip
- исходный
- Собирает train/val датасеты.
- Создаёт модель
по секцииFNN.model - Если существует
, автоматически загружает checkpoint в модель.model/chkpt.pth - Создаёт
по секцииTrainer.training - Запускает обучение и валидацию.
- Сохраняет итоговые метрики в
.metrics.json
Параметры запуска и поведение runner
CLI main.py
Параметр CLI:
— путь к JSON-файлу конфигурации эксперимента.config
Если параметр CLI не передан, использует .
Если заданы оба источника, CLI имеет приоритет.
Переменные окружения
Поддерживается переменная окружения:
— корневая папка для артефактов экспериментов.FNN_EXP_FOLDER— путь к JSON-конфигу эксперимента, если он не передан через CLI.FNN_EXP_CONFIG
По умолчанию все результаты сохраняются в .
Пример сохранения запусков в :
Тогда артефакты попадут в:
Важно: этот же путь используется и для автоматического resume из checkpoint.
Docker
В репозитории добавлены:
- Dockerfile — образ приложения для запуска эксперимента на CUDA GPU
- docker-compose.yml — основной compose-файл для запуска контейнера приложения и optional ClearML-режима
Основной сервис использует:
- FNN_EXP_CONFIG=/workspace/configs/example_config.json
- FNN_EXP_FOLDER=/workspace/experiments
- FNN_DATA_FOLDER=/workspace/data
Тома в compose:
- ./experiments -> /workspace/experiments
- ./configs -> /workspace/configs
- ./data -> /workspace/data
Запуск эксперимента в контейнере:
Контейнер запускает:
При этом читает конфиг из , артефакты пишет в , а данные должны быть доступны внутри контейнера по пути .
GPU
В для основного сервиса задано:
- gpus: all
- NVIDIA_VISIBLE_DEVICES=all
- NVIDIA_DRIVER_CAPABILITIES=compute,utility
Для запуска нужен и рабочий Docker runtime с поддержкой GPU.
Optional ClearML
По умолчанию контейнер использует локальный logger backend и пишет артефакты только в папку эксперимента.
Если нужен ClearML, используйте профиль :
В этом режиме:
- FNN_USE_CLEARML=1
- FNN_CLEARML_PROJECT=fnn
- CLEARML_API_HOST
- CLEARML_WEB_HOST
- CLEARML_FILES_HOST
По умолчанию compose ожидает, что ClearML server доступен с хоста через . При необходимости эти адреса можно переопределить через переменные окружения shell перед запуском .
Конфигурация эксперимента
Полная схема задаётся моделями в src/configs.py.
Подробная справка по полям и практическим ограничениям: docs/experiment-config-reference.md.
Корневой объект:
Корневые поля
— уникальное имя эксперимента; имя папки с артефактами.name— произвольное текстовое описание.description— параметры моделиmodel.FNN— параметры обучения.training— опциональные входные преобразования.transforms— параметры датасета и токенизатора.data
Секция model
Поля:
— имя модели, используется в логах и артефактах.name— длина входного окна модели. Должна быть положительной степенью двойки.input_size— размер токенных эмбеддингов.emb_size— размер словаря.vocab_size— число каналов вchannelsблоках.FastNN— размер ядра внутренних преобразований.kernel_size— число повторений блокаlayers.FastNN— id pad-токена.pad_token_id
Замечания:
критичен: модель валидирует, что это степень двойки.input_sizeдолжен соответствовать реальному размеру токенизатора.vocab_sizeдолжен совпадать сpad_token_id.tokenizer.json
Секция training
Поля:
— learning rate optimizer.learning_rate— коэффициент регуляризации модели.theta— weight decay optimizer.weight_decay— поле присутствует в конфиге, но текущийdropoutнапрямую его не использует.runner— размер batch.batch_size— количество эпох.epochs— устройство для обучения, напримерdevice,cpu,cuda. Еслиcuda:0, выбор остаётся заnull.Trainer— перемешивать ли train dataset.shuffle— как часто сохранять checkpoint по шагам;save_on_stepотключает периодическое сохранение.null— поле в конфиге есть, но текущийmodel_folderсохраняет checkpoint вrunnerи не использует это значение как источник пути.<experiment_dir>/model— включает mixed precision там, где это поддерживаетautocast.Trainer— поле в схеме присутствует, но текущийload_checkpointего не читает; resume сейчас происходит автоматически изrunner.<experiment_dir>/model/chkpt.pth— включить лиcompile_model, если это поддержано средой.torch.compile— число шагов gradient accumulation.accumulation_steps— частота step-level логирования.log_on_step— seed для воспроизводимости.seed
Практически важные параметры для первого запуска:
- device
- batch_size
- epochs
- learning_rate
- save_on_step
- compile_model
- autocast
Секция transforms
Поля:
— включает входное преобразование.use_transforms— позиция, до которой применяетсяzeroize_to_pos.ZeroizeLeft— использовать ли случайность при zeroize.zeroize_rand
Если , секция фактически игнорируется.
Секция data
Поля:
— путь кtokenizer_path.tokenizer.json— путь к train-корпусу или директории с данными.train_data_path— путь к validation-корпусу; еслиval_data_path, validation будет получен split-ом train dataset.null— зарезервировано в схеме, текущийtest_data_pathне использует.runner— разделитель между текстовыми sample-ами.separator— размер чанка при чтении корпуса.chunk_size— ограничение на объём считываемых данных.limit— длина target-окна.output_size— доля train dataset, выделяемая под validation, еслиval_splitне задан.val_data_path
Практические замечания:
должен указывать на токенизатор, совместимый сtokenizer_pathиvocab_size.pad_token_id- Если
не указан,val_data_pathавтоматически делает split train dataset с использованиемrunner.seed - Если dataset слишком мал или
, validation dataset может не создаться.val_split <= 0
Пример рабочего конфига
Артефакты эксперимента
После запуска в директории эксперимента появляются:
Назначение файлов:
— сохранённая копия фактически использованного конфига.config.json— копия токенизатора для воспроизводимости.tokenizer.json— snapshot каталогаsrc.zipна момент запуска.src— итоговые метрики обучения.metrics.json— checkpoint модели.model/chkpt.pth
Resume обучения
автоматически пытается загрузить checkpoint из:
Это означает:
- повторный запуск эксперимента с тем же
подхватит существующие веса автоматически;name - если checkpoint битый или несовместимый,
пишет warning и продолжает с новой моделью.runner
Если нужен полностью новый запуск, безопаснее использовать новый в конфиге.
Инференс после обучения
Для генерации текста используется :
Поддерживаемые параметры:
— путь кconfigэксперимента.config.json— prompt.text— сколько токенов сгенерировать.--max-new-tokens— температура семплирования.--temperature— top-k filtering.--top-k— override устройства для инференса.--device
ищет рядом с конфигом:
- tokenizer.json
- model/chkpt.pth
Если рядом их нет, модуль пытается найти артефакты в стандартной папке экспериментов по .
Полезные команды разработки
Запуск всех тестов:
Запуск отдельного файла тестов:
Линтер:
Проверка типов:
Типичные ошибки
Причина:input_size must be a positive power of twoне является степенью двойки.model.input_sizeПричина: неверныйTokenizer file not foundили отсутствует копияdata.tokenizer_pathв папке эксперимента.tokenizer.json- checkpoint не подхватывается
Причина: нет файла
или имя эксперимента изменилось.<experiments_root>/<name>/model/chkpt.pth - OOM на GPU
Причина: слишком большой
,batch_size,input_sizeили включён тяжёлыйkernel_size.compile_model