Сибирь AI

Документация Сибирь.ИИ 1.0.1

Описание функциональных характеристик программы для ЭВМ, информация, необходимая для установки, информация, необходимая для эксплуатации, и описание процессов, обеспечивающих поддержание жизненного цикла программного обеспечения. Документы размещены в открытом доступе, регистрация не требуется.

Подготовлено правообладателем - ООО «ФИИ», ИНН 5402076457. Редакция от .

33файла, 6 916 строк Python 3.12язык реализации 1.0.1версия экземпляра
Часть 1

Описание функциональных характеристик

Программа для ЭВМ «Сибирь.ИИ» (Siberia AI), версия 1.0.1. Правообладатель - ООО «ФИИ».

1. Назначение

Программа предназначена для построения русскоязычных языковых моделей с воспроизводимым обучением: подготовки обучающего набора, обучения нейросетевой модели архитектуры «трансформер» на одном или нескольких графических ускорителях, точного возобновления обучения после остановки, измерения качества и фиксации происхождения результата. Область применения - научные исследования и разработка систем обработки естественного языка.

Отличие от типовых средств обучения нейронных сетей - в воспроизводимости прогона. Каждое возобновление сверяет модель, настройки, обучающий набор, словарь и версию исходного текста с манифестом, записанным до первого шага, и отказывается продолжать при расхождении. Многодневное обучение, прерываемое отказами оборудования, становится воспроизводимым по факту, а не по обещанию.

2. Функциональные характеристики

2.1. Описание архитектуры моделей: реестр конфигураций с автоматическим расчетом числа параметров (с разделением на слои и представление словаря) и вычислительной стоимости одного токена.

2.2. Обучение нейросетевой языковой модели архитектуры «трансформер» (декодер) с настраиваемым числом параметров: распределение на несколько графических ускорителей, накопление градиента, пересчет активаций для экономии памяти, сохранение контрольных точек с заданной частотой, удержание ограниченного числа скользящих точек и постоянных рубежей.

2.3. Детерминированная выборка обучающих данных: состав пакета на шаге вычисляется из номера шага и начального значения генератора, а не из истории запусков. Порядок выдачи данных не зависит от того, шло обучение непрерывно или возобновлялось.

2.4. Смешивание тематических классов обучающего набора в заданных долях с контролем состава по контрольным суммам.

2.5. Контроль целостности данных: поименная и побайтовая сверка частей обучающего набора с манифестом перед началом обучения и при каждом возобновлении. Обнаружение пересечения обучающего набора с набором для оценки.

2.6. Запись неизменяемого манифеста прогона до первого шага: контрольные суммы исходного текста, обучающего набора и словаря, параметры модели и обучения, сведения об оборудовании и о происхождении данных.

2.7. Точное возобновление обучения с проверкой неизменности кода, данных, настроек и словаря по манифесту. При любом расхождении возобновление отклоняется с указанием расхождения.

2.8. Проверка прав на используемые данные: карточка источника с указанием лицензии и происхождения обязательна. Источник без подтвержденных прав в обучающий набор не допускается.

2.9. Гейты качества обучающего набора: удаление точных и близких повторов, поиск персональных данных и раскрытых секретов, проверка на пересечение с проверочными наборами.

2.10. Измерение качества на замороженных проверочных наборах по метрике «биты на байт» с разбивкой по тематическим классам и с проверкой неизменности набора по контрольным суммам.

2.11. Расчет вычислительной сложности, потребности в памяти и ожидаемых сроков обучения для заданной конфигурации модели и оборудования. Подгонка степенного закона зависимости качества от вычислительных затрат и предсказание для следующей ступени.

2.12. Безопасное чтение контрольных точек без исполнения постороннего кода, содержащегося в файле.

2.13. Применение обученной модели для порождения текста: продолжение текста с управлением случайностью выбора, доступ через программный интерфейс по протоколу HTTP.

3. Отличительная особенность

Доказуемость происхождения результата. Обучение ведется с нулевой инициализации: путей загрузки сторонних весов, преобразователей чужих форматов контрольных точек и совместимости с ними в программе нет. Происхождение обученной модели подтверждается манифестом прогона, контрольные суммы в котором связывают веса с конкретной версией исходного текста, обучающего набора и словаря.

4. Сведения об экземпляре

Версия1.0.1
Состав экземпляра38 файлов экземпляра, из них 33 файла исходного текста, 6 916 строк
Архив экземпляраsibir-ii-1.0.1.zip, 144 669 байт
Контрольная сумма архива (SHA-256)248ab6b77ecdf958d1d8d12c946680854d1de598313302985c1abbc9ac126d97
Язык программированияPython 3.12
Год создания2026

С 29 сентября 2026 года по ссылке для экспертной проверки размещена исправленная сборка 1.0.1. Версия и состав файлов не изменились. Исправлено:

  • Возобновление обучения по ключу --resume отклонялось и при неизменных условиях: параметры обучения сверялись с манифестом прогона без приведения к виду, в котором они хранятся в манифесте (siberia/manifest.py).
  • Справка модуля обучения по ключу --help завершалась ошибкой разбора текста справки (siberia/train.py).
  • Служба применения модели при поврежденной контрольной точке отвечала так же, как при отсутствии обученной модели. Теперь она отвечает кодом 503 с указанием причины (siberia/serve.py).
  • В описании зависимостей указана минимальная версия PyTorch 2.5, необходимая для безопасного чтения контрольных точек (siberia/train.py, model.py, serve.py, evaluate.py, safeload.py).

Контрольная сумма исправленной сборки (SHA-256): 248ab6b77ecdf958d1d8d12c946680854d1de598313302985c1abbc9ac126d97. Сборка, поданная 24 сентября 2026 года, SHA-256 6a8cc5c671518c747e41646e45be9ed08763381f56b80ce7e86e9128a768d8f6, выдается по запросу.

5. Среда функционирования

Операционные системы семейства Linux. Разработка и прогоны велись на Ubuntu 26.04 LTS с ядром 7.0. Интерпретатор Python версии не ниже 3.12. Требуется графический ускоритель с поддержкой программной платформы CUDA. Прогоны выполнялись на NVIDIA GeForce RTX 3090 с 24 ГБ видеопамяти, версия драйвера 595.84. Обучение моделей крупнее 300 млн параметров требует ускорителя с 24 ГБ видеопамяти либо распределения на несколько ускорителей.

Внешние библиотеки - свободные, с открытым исходным текстом: PyTorch (вычисления на ускорителе, лицензия BSD-3-Clause), NumPy (числовые массивы, BSD-3-Clause), Tokenizers (словарь и разбиение текста, Apache-2.0), PyArrow (чтение обучающих наборов в колоночном формате, Apache-2.0), bitsandbytes (необязательный компонент экономии памяти, MIT). Проприетарные иностранные компоненты не используются. Обращений к зарубежным сетевым службам в ходе работы программа не выполняет: обучающий набор, словарь и контрольные точки хранятся у пользователя.

Часть 2

Информация, необходимая для установки

Экземпляр поставляется архивом по лицензионному договору вместе с контрольной суммой SHA-256.

1. Проверка экземпляра

Экземпляр поставляется архивом sibir-ii-1.0.1.zip. До установки сверить контрольную сумму:

sha256sum sibir-ii-1.0.1.zip

Ожидаемое значение: 248ab6b77ecdf958d1d8d12c946680854d1de598313302985c1abbc9ac126d97.

2. Требования к окружению

ПоказательМинимальноРекомендуется
Операционная системаUbuntu 22.04Ubuntu 24.04 и новее
ИнтерпретаторPython 3.12Python 3.12
Оперативная память16 ГБ32 ГБ
Графический ускоритель12 ГБ видеопамяти24 ГБ и более
Свободное место на диске100 ГБпо объему набора и точек

3. Порядок установки

unzip sibir-ii-1.0.1.zip -d sibir-ii && cd sibir-ii
python3.12 -m venv .venv && . .venv/bin/activate
pip install "torch>=2.5" --index-url https://download.pytorch.org/whl/cu126

Требуется PyTorch версии не ниже 2.5: с более ранней версией не читаются контрольные точки.

pip install numpy tokenizers pyarrow

Адрес указателя пакетов для библиотеки PyTorch выбирается по версии программной платформы установленного ускорителя. Библиотека bitsandbytes устанавливается дополнительно и только при использовании режима экономии памяти.

4. Проверка установки

Работоспособность установки подтверждается расчетом конфигурации модели - операцией, не требующей ни обучающего набора, ни продолжительных вычислений:

python -c "from siberia.config import REGISTRY; print(sorted(REGISTRY))"

Команда выводит перечень доступных конфигураций моделей. Наличие графического ускорителя проверяется командой:

python -c "import torch; print(torch.cuda.is_available())"
Часть 3

Информация, необходимая для эксплуатации

Штатный порядок работы после установки: подготовка обучающего набора, запуск и возобновление обучения, измерение качества, применение обученной модели.

5. Подготовка обучающего набора

Порядок операций: проверка набора, выделение замороженного проверочного набора, удаление из обучающего набора текстов, попавших в проверочный, обучение словаря, сборка смеси тематических классов с упаковкой в двоичные части. Каждая следующая операция принимает то, что создала предыдущая. Образцы реестра источников и планов смеси входят в экземпляр: sources.example.json, mixture-plan-20m.json, mixture-plan-100m.json. Ответы программы на команды приведены в разделе 11.

5.1. Проверка набора: права на источники по реестру, персональные данные и секреты, повторы, совпадающие по регистру имена файлов.

python tools/check_corpus.py --input corpus/enc --registry sources.json --report qa-report.json

5.2. Выделение замороженного проверочного набора из текстов источника, отсутствующих в обучающей выборке. После заморозки набор не изменяется.

python tools/make_heldout.py --pool corpus/ruwiki.jsonl.gz --train corpus/enc/wiki.jsonl \
    --out heldout --name ru-wiki --count 1000

5.3. Удаление из обучающего набора текстов, попавших в проверочный, по заголовку, по контрольной сумме текста и по начальному фрагменту. Операция обязательна: без нее измеренное качество будет завышено, а сравнение с другими моделями потеряет смысл. После очистки проверка набора повторяется с ключом --eval.

python tools/decontaminate.py --corpus corpus/enc --heldout heldout/ru-wiki.jsonl \
    --pool corpus/ruwiki.jsonl.gz --out clean/enc --report decont-report.json
python tools/check_corpus.py --input clean/enc --registry sources.json --eval heldout/ru-wiki.jsonl

5.4. Обучение словаря на очищенном наборе и замер словаря на проверочном наборе.

python tools/train_tokenizer.py --input clean/ --out tokenizer/ --vocab 64000
python tools/train_tokenizer.py --measure tokenizer/tokenizer.json --input heldout/

5.5. Сборка смеси тематических классов. План смеси задает для каждого класса каталог, вес и идентификаторы источников из реестра. Класс, источник которого не одобрен в реестре, не упаковывается, и сборка отменяется. Каждый класс упаковывается в двоичные части со своим манифестом, спецификация смеси записывается в data/mixture.json, связь «класс, источники, контрольные суммы частей» записывается в data/mixture-manifest.json. Ключ --dry-run выполняет только проверку прав и показывает план.

python tools/build_mixture.py --plan mixture-plan.json --registry sources.json \
    --tokenizer tokenizer/tokenizer.json --vocab 64000 --out data/

5.6. Упаковка одного каталога без смеси выполняется средством tools/pack_tokens.py. Этот путь используется, если обучение идет на одном классе данных.

python tools/pack_tokens.py --input clean/enc --tokenizer tokenizer/tokenizer.json \
    --out data/enc --vocab 64000

6. Запуск обучения

python -m siberia.train --data data/ --mixture data/mixture.json \
    --tokenizer tokenizer/tokenizer.json --model siberia-100m \
    --run-dir runs/opyt-1 --micro-bs 4 --grad-accum 16

Допустимые значения --model: siberia-20m, siberia-100m, siberia-1b, siberia-seed-1_3b, siberia-ladder-s1, siberia-ladder-s2, siberia-ladder-s3. Перечень всех аргументов выводит команда python -m siberia.train --help. При обучении без смеси --data указывает на каталог, созданный pack_tokens.py, а ключ --mixture не задается. Для нескольких ускорителей запуск выполняется через torchrun с указанием их числа, каталог прогона при этом задается ключом --run-dir. До первого шага программа записывает в каталог прогона неизменяемый манифест с контрольными суммами исходного текста, набора и словаря.

7. Возобновление после остановки

python -m siberia.train ... --resume

Возобновление берет последнюю контрольную точку и сверяет манифест прогона. При расхождении модели, набора, словаря или версии исходного текста продолжение отклоняется с указанием расхождения - это защита от незаметной подмены условий опыта.

8. Измерение качества

python tools/evaluate.py --checkpoint runs/opyt-1/checkpoints/<точка>.pt \
    --eval heldout --name ru-wiki --tokenizer tokenizer/tokenizer.json --device cuda

Результат - количество информации на байт текста (биты на байт) по проверочному набору, указанному ключом --name. Для разбивки по тематическим классам проверочный набор замораживается отдельно для каждого класса (п. 5.2 с разными значениями --name), и измерение выполняется по каждому набору. Неизменность проверочного набора подтверждается контрольной суммой. При расхождении измерение не выполняется.

9. Планирование следующей ступени

python tools/fit_scaling.py --points tochki.json --target siberia-1b

Существенное ограничение, установленное измерениями правообладателя: предсказание надежно внутри отрезка, покрытого имеющимися точками, и систематически смещено за его пределами. Доверительный интервал, выдаваемый средством, отражает разброс подгонки на имеющихся точках и занижает действительную неопределенность. Предсказание следует применять для планирования порядка величин, а не для обязательств по точному значению.

10. Применение обученной модели

python -m siberia.serve --run runs/opyt-1 --tokenizer tokenizer.json --port 8848

Поднимается служба, отвечающая по протоколу HTTP и порождающая продолжение поданного текста собственной обученной моделью. Обращений к сторонним службам служба не выполняет. Остановка - прекращением работы процесса. Контрольные точки и манифест прогона сохраняются в каталоге прогона.

11. Ответы программы на команды

11.1. Команды выполняются из корневого каталога распакованного экземпляра при активированном окружении .venv (часть 2, п. 3). Загрузка программы выполняется интерпретатором Python: составные части siberia.train и siberia.serve запускаются как модули (python -m), средства подготовки данных и измерения запускаются как файлы (python tools/<имя>.py). Отдельного процесса загрузки, службы или демона, кроме службы применения модели (п. 11.10), программа не создает.

11.2. Общие правила ответа:

  • Ход работы печатается в стандартный вывод, отказы и предупреждения печатаются в поток ошибок.
  • Код возврата 0 означает успешное выполнение. Ненулевой код означает отказ, значения для каждой команды приведены в таблице п. 11.3.
  • Неверный вызов (нет обязательного аргумента, неизвестное значение) отклоняется до начала работы: печатается строка использования usage и сообщение error, код возврата 2. Пример: check_corpus.py: error: the following arguments are required: --input.
  • Справка по ключу --help выводится всеми средствами tools/ и модулями siberia.train и siberia.serve, код возврата 0. Основные аргументы siberia.train приведены также в п. 11.7.
  • Непредусмотренная ошибка окружения (отсутствующий файл, занятый сетевой порт) выводится трассировкой Python с именем исключения в последней строке, код возврата 1.
  • Чтение контрольных точек (возобновление, измерение качества, служба применения) требует PyTorch версии 2.5 и новее. С более ранней версией эти операции завершаются ошибкой AttributeError: module 'torch.serialization' has no attribute 'safe_globals'. Минимальная версия указана в описании зависимостей модулей, установка по части 2, п. 3 ставит подходящую версию.

11.3. Последовательность действий и коды возврата. Порядок строк соответствует зависимости по входным файлам: каждое следующее средство принимает то, что создало предыдущее.

Шаг и командаОбязательные аргументыСоздаетКоды возврата
1. tools/check_corpus.py--input <каталог класса>. Необязательные: --registry sources.json, --eval <проверочный .jsonl>, --report <файл>отчет JSON при --report0 все проверки пройдены, 1 в каталоге нет документов, 2 не пройдена проверка прав, персональных данных, повторов или пересечения
2. tools/make_heldout.py--pool <источник кандидатов .jsonl> --train <обучающий .jsonl>. Необязательные: --out, --name, --count<out>/<name>.jsonl и <name>.meta.json с SHA-2560 набор заморожен, 1 не отобрано ни одного текста, 2 найдено пересечение, заморозка отменена
3. tools/decontaminate.py--corpus <каталог класса> --heldout <проверочный .jsonl> --out <каталог>. Необязательные: --pool, --reportочищенные .jsonl в --out, отчет JSON при --report0 выполнено, 1 в каталоге нет .jsonl или по --pool не восстановлено ни одного заголовка
4. tools/train_tokenizer.py--input <каталог текстов>. Необязательные: --out, --vocab (64000), --min-frequency. Замер: --measure <tokenizer.json>tokenizer.json и tokenizer.sha2560 выполнено, 1 нет каталога, нет текстов или словарь не набрал заданного размера, 2 при замере ниже 3,6 символа на токен
5. tools/build_mixture.py--plan <план смеси> --registry sources.json --tokenizer tokenizer.json --vocab 64000 --out <каталог>. Необязательные: --dry-run, --jobs, --shard-tokens<out>/<класс>/shard-*.bin, corpus-manifest.json каждого класса, mixture.json, mixture-manifest.json0 выполнено, 1 пустой план, сбой упаковки или класс без токенов, 2 класс не прошел проверку прав, упаковка отменена
6. python -m siberia.train--data <каталог> --run-dir <каталог прогона> --tokenizer tokenizer.json. Остальные в п. 11.7run-manifest.json, run-manifest.sha256, train-log.jsonl, checkpoints/*.pt0 выполнено, 1 отказ проверки или ошибка, ненулевой при остановке оператором (п. 12)
7. tools/evaluate.py--checkpoint <точка .pt> --eval <каталог проверочного набора> --tokenizer tokenizer.json. Необязательные: --name, --device, --limit, --outотчет JSON при --out0 выполнено, 1 нет пакета tokenizers, 2 проверочный набор изменен после заморозки или словари не совпадают, 3 не пройдены проверки здравого смысла результата
8. tools/fit_scaling.py--points <точки.json>. Необязательные: --target (имя конфигурации), --target-tokens, --outотчет JSON при --out0 выполнено, 1 задано меньше трех точек
9. python -m siberia.serve--run <каталог прогона>. Необязательные: --checkpoint, --tokenizer, --device, --host, --port (8848)файлов не создает0 после остановки оператором, 1 если порт занят

Упаковка одного каталога без смеси выполняется средством tools/pack_tokens.py (--input, --tokenizer, --out, --vocab обязательны). Оно создает shard-*.bin и corpus-manifest.json, при несовпадении размера словаря с --vocab отказывает с кодом 1: tokenizer vocab=400, а --vocab=64000. Упаковка запрещена.

Примеры ответов в п. 11.4 - 11.10 и 12 получены прогоном исправленной сборки 1.0.1 от 29 сентября 2026 года на малом тестовом наборе. Числа в примерах зависят от набора, пути сокращены до относительных, идентификаторы тестовых источников заменены обозначениями в угловых скобках.

11.4. Проверка набора

python tools/check_corpus.py --input corpus/enc --registry sources.json \
    --eval heldout/ru-wiki.jsonl --report qa-report.json

Ответ при успешной проверке, код возврата 0:

документов: 9
права: одобрено 2 из 2
PII/секреты: помечено документов 0
дедуп: осталось 9 из 9 (exact 0, near 0)
контаминация train × eval: 0
качество: без замечаний, доля кириллицы 100.00%
отчёт: qa-report.json

все гейты пройдены

Ответ при отказе, код возврата 2. Показаны только строки отказа двух случаев, сведенные в один блок: источник не одобрен в реестре, набор пересекается с проверочным:

права: одобрено 1 из 2
  ОТКАЗ <id источника>: status='yellow' — в train допускаются только green
контаминация train × eval: 2

ГЕЙТ НЕ ПРОЙДЕН:
  - права: 1 источников не прошли гейт
  - контаминация: 2 документов совпадают с held-out

Пустой каталог дает строку в corpus/empty нет документов и код возврата 1.

11.5. Проверочный набор и очистка от пересечений

python tools/make_heldout.py --pool corpus/ruwiki.jsonl.gz \
    --train corpus/enc/wiki.jsonl --out heldout --name ru-wiki --count 1000

Ответ, код возврата 0:

индексирую обучающую выборку corpus/enc/wiki.jsonl…
  8 документов, 8 заголовков
отбираю кандидатов из corpus/ruwiki.jsonl.gz…

просмотрено 12; отклонено: по заголовку 8, по хешу 0, по длине 0
контаминация train × held-out: 0 совпадений

заморожено: 3 записей, 2,625 байт
SHA-256: 9114e64fed3fa5e35cc4ccbfcc0ddb720f8fd740bb98b2aa9e95ee861e721a2a
права: 0o600 (ок)

Этот набор заморожен ДО обучения. Менять его после старта нельзя: holdout, подогнанный под результат, ничего не доказывает.

Строка «права» приведена по исходному тексту для Linux (siberia/evaluate.py, строки 50 - 66): файл набора получает права 0600, при невозможности выставить их печатается «НЕ 0600» и предупреждение в поток ошибок. Если в источнике не хватило подходящих текстов, печатается набрано только 4 из 10, набор замораживается из отобранного, код возврата 0. Если не отобрано ни одного текста, код возврата 1.

python tools/decontaminate.py --corpus corpus/enc-new --heldout heldout/ru-wiki.jsonl \
    --pool corpus/ruwiki.jsonl.gz --out clean/enc --report decont-report.json

Ответ, код возврата 0. Строка на каждый файл, затем сводный отчет JSON:

held-out: 3 хешей, 3 зачинов, 3 заголовков
{"файл": "wiki.jsonl", "оставлено": 9, "убрано": 3, "по_признакам": {"заголовок": 3, "хеш": 2, "зачин": 3}, "$пояснение": "признаки независимы; сумма по ним ≥ «убрано»"}

В примере одна из трех статей была отредактирована после заморозки: проверка по хешу ее не находит, по заголовку и начальному фрагменту находит. Если не убрано ни одного документа, работа завершается с кодом 0, а в поток ошибок печатается предупреждение «[!!] не убрано ни одного документа». Если --pool указан, но заголовки по нему не восстановлены, печатается «[!!] из пула не восстановлено ни одного заголовка», код возврата 1.

11.6. Словарь и сборка смеси

python tools/train_tokenizer.py --input corpus/ --out tokenizer/ --vocab 64000

Ответ, код возврата 0. Файлы tokenizer/tokenizer.json и tokenizer/tokenizer.sha256:

обучение BPE на corpus, vocab=64000
вход: <N> документов, <M> символов
записан tokenizer/tokenizer.json
SHA-256: <контрольная сумма словаря>
Зафиксировать этот хеш в run-manifest. Менять токенайзер после старта нельзя.

Если объема текстов не хватает для словаря заданного размера, словарь не сохраняется: получен vocab=499, ожидался 64000. Токенайзер не сохранён, код возврата 1. Замер словаря (--measure tokenizer/tokenizer.json --input heldout/) печатает отчет JSON с полями chars_per_token и passes_gate. При значении ниже 3,6 символа на токен печатается «ГЕЙТ НЕ ПРОЙДЕН», код возврата 2.

python tools/build_mixture.py --plan mixture-plan.json --registry sources.json \
    --tokenizer tokenizer/tokenizer.json --vocab 64000 --out data/

Ответ, код возврата 0:

проверка прав по классам:
  [OK] encyclopedia: 1 источников одобрено
  [OK] legal: 1 источников одобрено

сумма весов: 1.0000

[..] encyclopedia: упаковка из clean/enc

[..] legal: упаковка из corpus/legal
[OK] encyclopedia: 9 документов, 2,823 токенов
[OK] legal: 4 документов, 968 токенов

класс               вес        токенов    эпох
encyclopedia     70.00%          2,823     5.0
legal            30.00%            968     6.2  ← запоминание

всего уникальных токенов: 3,791
спецификация: data/mixture.json
манифест:     data/mixture-manifest.json

Класс, который пройдет больше пяти раз, отмечается словом «запоминание» и предупреждением в поток ошибок, на код возврата это не влияет. Ключ --dry-run выполняет только проверку прав и печатает план без упаковки. Если источник класса не одобрен в реестре, упаковка не начинается:

  [!!] legal: 1 из 1 источников не прошли
        <id источника>: status='yellow' — в train допускаются только green

УПАКОВКА ОТМЕНЕНА: классы ['legal'] не прошли гейт прав.
Класс без доказанных прав не попадает в обучающие данные — это условие, а не пожелание.

Код возврата в этом случае 2.

11.7. Обучение

Аргументы модуля siberia.train:

АргументЗначение по умолчаниюНазначение
--dataобязателенкаталог частей набора (*.bin с corpus-manifest.json) или корень смеси при --mixture
--run-dir, --runобязателенкаталог прогона. При запуске через torchrun указывается --run-dir
--tokenizerобязателенtokenizer.json. Размер словаря и SHA-256 сверяются с манифестом набора
--modelsiberia-20mодна из конфигураций: siberia-20m, siberia-100m, siberia-1b, siberia-seed-1_3b, siberia-ladder-s1, siberia-ladder-s2, siberia-ladder-s3
--mixtureнетmixture.json, созданный build_mixture.py
--micro-bs, --grad-accum32 и 4размер микропакета и число шагов накопления градиента
--total-tokens, --max-steps1 000 000 000 и 0объем обучения. --max-steps больше нуля перекрывает --total-tokens
--checkpoint-every, --keep-rolling500 и 3частота записи контрольной точки в шагах и число хранимых скользящих точек
--seed20260728начальное значение генератора
--device, --fp32, --deterministiccuda при наличии, bf16устройство, отключение смешанной точности, детерминированные алгоритмы
--optimizeradamwadamw или adamw8bit (требует bitsandbytes)
--grad-checkpointing, --loss-chunk, --optimizer-shardвыключенырежимы экономии памяти
--resumeвыключенпродолжение прогона из последней контрольной точки (п. 12.5)
--init-fromнетновая линия прогона с весами из указанной точки
--peak-tflopsпо имени ускорителяпиковая производительность для расчета доли использования
python -m siberia.train --data data/ --mixture data/mixture.json \
    --tokenizer tokenizer/tokenizer.json --model siberia-20m --run-dir runs/opyt-1 \
    --micro-bs 1 --grad-accum 2 --max-steps 1000 --device cpu --fp32

Ответ при запуске. До первого шага записываются run-manifest.json и run-manifest.sha256, затем каждые 10 шагов печатается запись журнала, она же дописывается в train-log.jsonl:

смесь: {'encyclopedia': 0.7, 'legal': 0.3}
  legal: 634.7 эпох  ← много проходов, модель будет запоминать
  encyclopedia: 507.8 эпох  ← много проходов, модель будет запоминать
манифест записан: runs/opyt-1/run-manifest.json
siberia-20m: 52,042,240 параметров, 1,000 шагов по 2,048 токенов
пик устройства неизвестен: MFU не считается (задайте --peak-tflops)
{"step": 0, "loss": 11.145428, "lr": 2e-06, "grad_norm": 11.892229080200195, "tokens": 2048, "tokens_per_s": 206.2, "elapsed_s": 9.9}

На графическом ускорителе известной модели вместо строки «пик устройства неизвестен» печатается пик устройства: <N> TFLOPS — MFU пишется в лог, а записи журнала дополняются полями achieved_tflops, mfu, world_size и eta_h (оценка оставшегося времени в часах). Эти строки приведены по исходному тексту (siberia/train.py, строки 449 - 455 и 515 - 523), на ускорителе не выполнялись.

Контрольные точки записываются в runs/opyt-1/checkpoints/ под именами step-<номер шага>.pt каждые --checkpoint-every шагов и на последнем шаге. Старые скользящие точки удаляются, остаются --keep-rolling последних. Каждые 2000 шагов записывается постоянная точка perm-<номер шага>.pt, она не удаляется. По окончании печатается готово: <число шагов> шагов, <время> с, код возврата 0.

Отказы при запуске:

  • Неизвестная конфигурация модели: error: argument --model: invalid choice с перечнем допустимых, код возврата 2.
  • Каталог прогона уже содержит манифест: FileExistsError: runs/opyt-1/run-manifest.json уже существует — манифест неизменяем; для нового прогона нужен новый run_dir, код возврата 1.
  • Словарь набора не совпадает с моделью: siberia.data.CorpusError: data/encyclopedia/corpus-manifest.json: vocab=400, а модель требует 64000, код возврата 1. Тем же исключением отклоняются несовпадение SHA-256 словаря, частей набора и их числа с манифестом набора.
  • Режим adamw8bit без библиотеки bitsandbytes: RuntimeError: optimizer=adamw8bit требует bitsandbytes; поставьте его или запускайте с --optimizer adamw, код возврата 1.
  • Нечисловое значение функции потерь останавливает обучение сообщением шаг <N>: loss=nan — обучение остановлено с рекомендацией откатиться на две контрольные точки, код возврата 1. Приведено по исходному тексту (siberia/train.py, строки 497 - 501), не воспроизводилось.
  • Число шагов накопления не делится на число ускорителей при запуске через torchrun: «grad_accum=<N> не делится на world_size=<M>», код возврата 1. Приведено по исходному тексту (siberia/train.py, строки 375 - 379), не выполнялось.

11.8. Измерение качества

python tools/evaluate.py --checkpoint runs/opyt-1/checkpoints/step-00000060.pt \
    --eval heldout --name ru-wiki --tokenizer tokenizer/tokenizer.json --out eval-report.json

Ответ, код возврата 0 (отчет JSON сокращен):

held-out проверен: 3 записей, sha 9114e64fed3fa5e3…
checkpoint шаг 60, модель <конфигурация>, <N> параметров
{
  "schema": "siberia.eval-report/1",
  "step": 60,
  "eval_set": {"name": "ru-wiki", "sha256": "9114e64f…", "records": 3},
  "bits_per_byte": 2.876627,
  "nats_per_token": 5.770733,
  "sanity_problems": []
}

BPB = 2.8766. Абсолютное значение на этом масштабе ни с чем не сравнивается и в партнёрские материалы не выносится.

Результат выдается одним значением по набору, указанному в --name. Для разбивки по тематическим классам проверочный набор замораживается отдельно для каждого класса (make_heldout.py с разными --name), и измерение выполняется по каждому. Если набор изменен после заморозки, измерение не выполняется: held-out ru-wiki НЕ совпадает с зафиксированным SHA-256. Оценка отменена, код возврата 2. При несовпадении словаря модели и tokenizer.json печатается словарь модели 400 != словаря токенайзера 64000 — оценка бессмысленна, код возврата 2.

11.9. Планирование следующей ступени

python tools/fit_scaling.py --points tochki.json --target siberia-1b --out scaling-report.json

Ответ, код возврата 0 (точки в примере условные, вывод сокращен: опущены предупреждение о числе точек, условие подтверждения и оговорка об интервале):

подгонка по 4 точкам: L(C) = 2.6197 + 593.9·C^(-0.15124)
R² = 0.99994, RMSE = 0.00196

предсказание для siberia-1b на 60,000,000,000 токенов:
  loss = 3.0616, интервал 90%: [3.0375, 3.0850]
  экстраполяция на 2.04 порядка

ВНИМАНИЕ: Экстраполяция на 2.04 порядка. Точки ladder покрывают до 4.42e+18 FLOP, цель — 4.85e+20. Между ними нет ни одного измерения; это главный непокрытый риск предсказания.

отчёт: scaling-report.json

При числе точек меньше трех печатается нужно минимум 3 точки, дано 2, код возврата 1. Отсутствующий файл точек дает трассировку FileNotFoundError, код возврата 1.

11.10. Служба применения модели

python -m siberia.serve --run runs/opyt-1 --tokenizer tokenizer/tokenizer.json --port 8848

Ответ при запуске, если в каталоге прогона есть контрольная точка:

[serve] загружен step-00000060.pt: <конфигурация>, шаг 60, device=cpu
[serve] Siberia на http://127.0.0.1:8848 — ready

Если контрольной точки нет, служба поднимается в режиме training: [serve] чекпоинта нет в runs/opyt-1/checkpoints — режим training. Если точка есть, но не читается (файл поврежден или обрезан, нет словаря, неподходящая версия PyTorch), служба поднимается и на все запросы к модели отвечает ошибкой 503 с причиной:

[serve] не удалось загрузить модель (step-00000060.pt: PytorchStreamReader failed reading zip archive: failed finding central directory) — служба отвечает ошибкой 503
[serve] Siberia на http://127.0.0.1:8848 — ОШИБКА: модель не загрузилась

Ответы службы:

ЗапросКод HTTPТело ответа
GET /health200{"status": "ready", "model": "<конфигурация>", "step": 60, "device": "cpu"}, без весов "status": "training"
POST /generate200{"text": "<продолжение>", "ready": true, "model": "siberia"}. Поля запроса: prompt, max_new_tokens (200), temperature (0.8), top_p (0.95)
GET /health, точка не читается503{"status": "error", "error": "step-00000060.pt: PytorchStreamReader failed reading zip archive: failed finding central directory"}
POST /generate, точка не читается503{"error": "model not loaded: step-00000060.pt: ..."}
POST /generate в режиме training200{"text": "Модель Siberia ещё обучается — первый чекпоинт не готов. ...", "ready": false}
POST /generate с пустым prompt400{"error": "empty prompt"}
POST /generate с неверным JSON400{"error": "bad json"}
Другой адрес404{"error": "not found"}
Сбой порождения500{"error": "generation failed: <причина>"}, по исходному тексту (siberia/serve.py, строка 210)

Если порт занят, служба завершается трассировкой OSError при привязке адреса, код возврата 1.

12. Завершение работы

12.1. Штатное завершение обучения. Обучение завершается само после последнего шага: на нем всегда записывается контрольная точка, печатается строка «готово», процесс завершается с кодом 0. Средства подготовки данных и измерения завершаются сами после выполнения, в том числе при отказе, с кодом возврата по таблице п. 11.3.

12.2. Остановка оператором. Обучение и служба применения останавливаются нажатием Ctrl+C в терминале (сигнал SIGINT). Программа прерывает работу после текущей вычислительной операции.

  • Обучение печатает трассировку с последней строкой KeyboardInterrupt и завершается с ненулевым кодом возврата. Контрольная точка в момент остановки не записывается. На диске остаются манифест прогона, журнал train-log.jsonl и все контрольные точки, записанные до остановки. Шаги после последней записанной точки при продолжении выполняются заново.
  • Служба применения закрывает сетевой порт и завершается без сообщений с кодом возврата 0. Контрольные точки и манифест прогона не изменяются.

12.3. Принудительное завершение. Собственных обработчиков сигналов программа не устанавливает, поэтому сигнал SIGTERM, команда kill и отключение питания прекращают процесс сразу, без вывода. Запись контрольной точки защищена от обрыва: точка пишется во временный файл step-<номер>.pt.tmp и только после полной записи переименовывается в step-<номер>.pt. Недописанный временный файл при продолжении не используется: берется последняя полная точка. Чтобы не повторять шаги, обучение останавливают сразу после появления очередной точки в каталоге checkpoints, а частоту --checkpoint-every выбирают по допустимой потере времени.

12.4. Многопроцессный запуск. При обучении через torchrun останавливается весь запуск torchrun. Контрольную точку записывает только процесс с номером 0, состояние оптимизатора перед записью собирается со всех процессов. Приведено по исходному тексту (siberia/train.py, строки 529 - 535), многопроцессный запуск не выполнялся.

12.5. Продолжение после остановки. Команда повторяется с теми же аргументами, что при первом запуске, и дополняется ключом --resume. Все параметры обучения, включая --max-steps или --total-tokens, --micro-bs, --grad-accum, --checkpoint-every, --keep-rolling, --seed и --optimizer, сверяются с манифестом прогона, поэтому их нельзя опускать или менять.

python -m siberia.train --data data/ --mixture data/mixture.json \
    --tokenizer tokenizer/tokenizer.json --model siberia-20m --run-dir runs/opyt-1 --resume

Сверка выполняется в таком порядке: контрольная сумма самого манифеста, затем параметры модели, параметры обучения, набор, словарь, исходный текст программы. Первое расхождение прекращает работу с кодом возврата 1:

RuntimeError: run-manifest не сходится с записанной контрольной суммой
RuntimeError: resume запрещён: train отличается от неизменяемого run-manifest
RuntimeError: resume запрещён: code_files отличается от неизменяемого run-manifest

В сообщении называется расходящееся поле: model, train, corpus, tokenizer_sha256 или code_files. Первое сообщение означает, что сам манифест изменен после записи. Если в каталоге прогона нет манифеста, работа завершается трассировкой FileNotFoundError по файлу run-manifest.sha256. Если манифест сошелся, а контрольных точек нет (обучение остановлено до первой записи), печатается нечего продолжать: в runs/opyt-1/checkpoints пусто, код возврата 1.

Ответ при успешной сверке, код возврата 0. Обучение продолжается с шага последней точки, записи журнала дописываются в train-log.jsonl:

смесь: {'encyclopedia': 0.7, 'legal': 0.3}
продолжение с шага 30 из step-00000030.pt
<конфигурация>: <N> параметров, 60 шагов по 512 токенов
пик устройства неизвестен: MFU не считается (задайте --peak-tflops)
{"step": 30, "loss": 5.969666, "lr": 6.199999999999999e-05, ...}
{"step": 40, "loss": 5.916109, "lr": 8.199999999999999e-05, ...}
{"step": 50, "loss": 5.855441, "lr": 0.000102, ...}
{"step": 59, "loss": 5.767454, "lr": 0.00011999999999999999, ...}
готово: 60 шагов, 1.9 с

Продолжение точное: при проверке прогон, прерванный после точки шага 30 и продолженный с ключом --resume, пришел к шагу 60 с весами и состоянием оптимизатора, побитно совпадающими с непрерывным прогоном тех же настроек.

12.6. Новая линия от готовых весов. Ключ --init-from <точка> с новым каталогом прогона берет из точки только веса: счет шагов и расписание скорости обучения начинаются с нуля, состояние оптимизатора не переносится, родительская точка записывается в манифест новой линии по контрольной сумме. Это не продолжение прогона, а новый опыт от известных весов:

веса взяты из runs/opyt-1/checkpoints/step-00000040.pt (шаг родителя 40); это НОВАЯ линия: шаг с нуля, расписание с нуля, состояние оптимизатора не перенесено
Часть 4

Процессы, обеспечивающие поддержание жизненного цикла

Устранение неисправностей, совершенствование программы и сведения о персонале, необходимом для обеспечения такой поддержки.

1. Общие сведения

1.1. Документ описывает процессы поддержания жизненного цикла программы «Сибирь.ИИ» (Siberia AI): устранение неисправностей, совершенствование, персонал сопровождения.

1.2. Правообладатель и разработчик - Общество с ограниченной ответственностью «Финансовый искусственный интеллект». Исходный текст ведется в системе управления версиями. Каждый выпуск фиксируется версией и контрольной суммой архива экземпляра.

2. Устранение неисправностей

2.1. Обращения принимаются по адресам info@siberia-ai.ru и support@siberia-ai.ru. Обращение регистрируется, воспроизводится на стенде правообладателя, исправление проходит набор автоматических проверок и выпускается исправительной версией с новой контрольной суммой архива.

2.2. Набор автоматических проверок ведется в хранилище исходного текста правообладателя и в экземпляр программы не входит: он относится к средствам разработки, а не к самой программе. Изменение, не прошедшее проверки, в основную ветвь не включается.

2.3. Приоритетно устраняются неисправности, затрагивающие воспроизводимость: запись манифеста прогона, сверку контрольных сумм при возобновлении и неизменность проверочных наборов при измерении качества. Такие неисправности обесценивают результат обучения, а не только затрудняют работу.

3. Совершенствование

3.1. Развитие ведется составными частями (конфигурации моделей, цикл обучения, работа с обучающим набором, измерение качества, планирование бюджета, порождение текста). Изменения, затрагивающие формат контрольных точек или манифеста, сопровождаются средствами чтения прежнего формата: ранее полученные результаты обучения должны оставаться проверяемыми.

3.2. Новые возможности выпускаются очередными версиями. Изменения фиксируются в перечне изменений с указанием версии и контрольной суммы архива.

4. Персонал

4.1. Сопровождение обеспечивает разработчик программы. Численность персонала, обеспечивающего жизненный цикл, соответствует объему программы (38 файлов экземпляра, из них 33 файла исходного текста, 6 916 строк) и текущему числу эксплуатантов. При росте числа эксплуатантов предусмотрено выделение ролей разработчика и инженера технической поддержки.

4.2. Требования к персоналу: высшее техническое образование, владение языком Python, знание основ машинного обучения и администрирования операционных систем семейства Linux, навык работы с графическими ускорителями.

5. Данные эксплуатанта

5.1. Обучающие наборы, словари, контрольные точки и обученные модели размещаются в инфраструктуре эксплуатанта и правообладателю не передаются. Программа не выполняет обращений к внешним службам и не обрабатывает персональные данные. Средства поиска персональных данных в обучающем наборе применяются для их исключения из обучения.

Контакты технической поддержки - в разделе «Компания и поддержка» на главной странице.