Данные делятся до обучения и связываются с конфигурацией
Train pipeline должен отвечать, какие samples использованы, как они разделены и какой config породил checkpoint. Случайное разбиение после chunking способно поместить соседние части одного документа и в train, и в validation. Поэтому устойчивый ключ строят из ID исходного объекта, а bucket вычисляют детерминированно. Встроенный hash() Python не подходит: его salt может меняться между процессами; криптографический SHA-256 даёт стабильный результат для тех же bytes.
Validation split остаётся закрытым от optimizer и выбора отдельных ответов. При повторном запуске те же IDs обязаны попасть в те же множества независимо от порядка входного списка. Checkpoint для продолжения включает weights, optimizer/scheduler state, step и RNG states, а manifest связывает его с hashes данных, tokenizer и config. Одних весов достаточно для inference, но недостаточно для точного resume.
Продолжение. Lineage view соединяет source version, фильтрацию, split, batches, config hash, optimizer steps и checkpoint digest. Изменение одного параметра создаёт новый run ID, а resume проверяет совместимость до загрузки state. Метрики подписываются split и step: число без этой пары нельзя однозначно связать с состоянием модели.
Граница применимости. Stable split не предотвращает semantic duplicates, contamination из внешних benchmark и дрейф данных. Один seed не обеспечивает bitwise reproducibility между разными kernels и hardware. Успешное уменьшение validation loss не доказывает factuality, безопасность или полезность; эти свойства проверяются отдельными наборами после заморозки кандидата.