Kernel learning#225
Conversation
… forecasting estimator, and benchmark diagnostics
…rk modules and group experiments
Обзор KL-изменений перед вливанием в
|
| Область | Оценка | Почему |
|---|---|---|
| Постановка задачи, цели и ограничения | 8/10 | У серии KL понятные цели - убрать старую структуру бенчмарков, ввести типизированный запуск, открыть модели Kernel Learning и сделать примеры воспроизводимыми. |
| Риски | 6/10 | Риски бенчмарков и артефактов частично закрыты статусами запусков, журналами ошибок и политикой архивов. |
| Предыдущие решения и сравнения | 9/10 | В витрине сравниваются текущий Industrial, старый Industrial, SoTA-результаты, простые базовые модели и варианты Kernel Learning. Для прогнозирования пока нет полноценного SoTA-источника в основной витрине. |
| Метрики и измерение качества | 8/10 | Метрики задач и направление оптимизации явно заданы в типизированных конфигурациях и манифестах результатов. Доверительные интервалы, разброс и пороги приемки пока не стали частью контракта. |
| Данные, разметка и признаки | 7/10 | Корни данных, манифесты, наборы генераторов и каталоги артефактов видимы. Ссылки на внешнее хранилище пока частично заглушены, а часть локальных сценариев не имеет опубликованного пути получения данных. |
| Проверка качества и утечки данных | 6.5/10 | Публичные разбиения бенчмарков и типизированные адаптеры данных снижают риск ошибок. Для пользовательских и локальных наборов данных нужен явный чек-лист против утечек между обучением и проверкой. |
| Разбор ошибок | B | В пакетах результатов появились покрытие, приросты/просадки, средние ранги, лучших k, диагностика, частоты генераторов, изменение параметров и история эволюции. Разбор доменных ошибок пока неоднороден. |
| Обучение и воспроизводимость | B+ | Типизированные конфигурации, JSON-настройки, возобновляемые артефакты, зарегистрированные запуски и точечные тесты сильно лучше разрозненных скриптов. Полный перезапуск ноутбуков все еще зависит от локальных данных и окружения. |
| Интеграция и выпуск | 5.5/10 | Публичные адаптеры бенчмарков, теплый старт для FedotIndustrial и слой инструментов для внешних агентов уже есть. Промышленный выпуск, требования к задержкам и план раскатки не входят в этот PR. |
| Сопровождение и владение | 6/10 | Инструкции по запуску и команды проверки есть, но нет легкой таблицы владельцев, правила обновления результатов и цикла контроля свежести бенчмарков и примеров. |
Главное исправление перед вливанием - сделать отдельный проход по документации. Надо перенаправить или архивировать материалы про benchmark.v2, обновить старые быстрые инструкции и заполнить реальные ссылки на внешние данные или DVC-хранилище. Рефакторинг бенчмарков вызывает доверие тогда, когда код,
метрики, результаты запусков и примеры смотрят в один и тот же типизированный контракт. После KL-серии этот контракт появился, но его нужно поддерживать в документации и данных.
Резюме
Серия KL переводит IndustrialTS из состояния «много полезных, но разрозненных
скриптов и локальных артефактов» в более явную ML-систему:
benchmark.industrialстал основным исполняемым слоем для бенчмарков.fedot_ind.core.kernel_learningстал публичной подсистемой Kernel Learning:
в нем есть модули оценки, ядра, генераторы признаков, sparse MKL, кеш,
отчеты и интеграция с теплым стартом.- Эксперименты по бенчмаркам теперь задаются через типизированные сущности:
BenchmarkSuiteConfig,DatasetSpec,ModelSpec,RunSpec,ArtifactSpec. - Анализ результатов вынесен из ноутбуков и ручной обработки CSV в общие
модули агрегации и визуализации. - В папке
examplesпоявились понятные роли: утилиты текущего API,
прикладные сценарии, инструменты для внешних агентов и единая папка для
артефактов. - Исторические результаты больше не выглядят как исполняемый код. Они
индексируются как справочные данные через манифесты и витрины результатов.
Это крупное архитектурное улучшение. Что надо доделать - навигацию для нового разработчика: в репозитории все еще есть старые материалы про benchmark.v2, ссылки на внешние данные частично остаются
заглушками, а новая поверхность API достаточно широка, чтобы устаревшая
документация могла сбить с толку.
Что было проверено
Код и документация:
docs/dev_guide/benchmark_infrastructure.md:9задаетbenchmark.industrial
как основной исполняемый пакет бенчмарков.docs/dev_guide/benchmark_infrastructure.md:44описывает контракт
типизированных конфигураций.docs/dev_guide/benchmark_infrastructure.md:124описывает ответственность
за хранение результатов.docs/dev_guide/benchmark_infrastructure.md:201описывает правила агрегации
и визуализации.docs/dev_guide/benchmark_infrastructure.md:315перечисляет, чего не стоит
делать в новых изменениях.docs/dev_guide/kernel_learning_benchmark_runbook.md:31задает правила
конфигурации запусков Kernel Learning.docs/dev_guide/kernel_learning_benchmark_runbook.md:63и
docs/dev_guide/kernel_learning_benchmark_runbook.md:108описывают первый и
второй этап Kernel Learning.examples/README.md:7описывает текущее назначение подпапок вexamples.examples/tools_example/README.md:15описывает каталог инструментов для MCP
и внешних агентов.examples/artifacts/README.md:8описывает общий центр артефактов.benchmark/results/showcase/README.md:14описывает публичные направления
бенчмарков.
Сводка изменений относительно origin/main:
- изменено 789 файлов;
- добавлено 104 638 строк;
- удалено 198 171 строка;
- большой объем удалений связан в основном с очисткой старых примеров,
локальных фикстур данных,benchmarking_utils,benchmark/v2и устаревших
ноутбуков.
Цепочка связанных issues:
- начальные коммиты с реализацией Kernel Learning;
KL-101: реорганизация модуля бенчмарков;KL-102: единые типизированные конфигурации запусков;KL-103: переработка примеров, прикладных сценариев и центра артефактов;KL-104: витрина результатов бенчмарков;KL-105: инфраструктурные контракты бенчмарков;KL-106: единый слой агрегации результатов;KL-201: упрощение и типизация контрактов Kernel Learning;KL-202: контракт генераторов признаков и крайние случаи;KL-301: кеш, диагностика и обработка ошибок второго этапа;KL-302: настройки запусков по умолчанию и удобство пользовательских данных;KL-401: разделение адаптеров генераторов по тематическим модулям.
Было и стало
| Область | Было | Стало |
|---|---|---|
| Исполняемый слой бенчмарков | Одновременно существовали benchmark/v2, корневые скрипты бенчмарков и benchmarking_utils. Было трудно понять, какой путь считать основным. |
benchmark.industrial стал основным пакетом. Старые обертки, где они еще нужны, живут в benchmark.industrial.legacy; исполняемый benchmark.v2 удален. |
| Точки запуска экспериментов | Скрипты были разбросаны и часто смешивали константы, описания моделей, сохранение результатов и сам запуск. | Эксперименты сгруппированы по типу задач в benchmark/experiments/kernel_learning/{classification,regression,forecasting,analysis} и используют типизированные конфигурации. |
| Настройки по умолчанию | Списки моделей, метрики, наборы данных и шаблоны выходных папок часто были зашиты в Python-файлы. | Настройки вынесены в JSON, например benchmark/experiments/kernel_learning/defaults.json и benchmark/industrial/experiments/preset_defaults.json. |
| Агрегация результатов | Ноутбуки и отдельная CSV-логика каждый раз заново собирали сравнения. | benchmark.industrial.evaluation.aggregation и result_analysis дают общий путь чтения, проверки покрытия, ранжирования, подсчета приростов, диагностики и сборки отчетов. |
| Витрина результатов | benchmark/results смешивал архивы, SoTA-таблицы, текущие результаты и локальные артефакты. |
benchmark/results/showcase дает манифестную витрину текущего Industrial, старого Industrial и SoTA-таблиц. |
| Примеры | automl_example, benchmark_v2, data, outdated_examples, rkhs_okhs и real_world_examples пересекались по назначению. |
examples/utils, examples/tools_example, examples/real_world_examples и examples/artifacts получили явные роли. |
| Kernel Learning | Направление уже развивалось, но уровень публичного API был менее явным. | fedot_ind.core.kernel_learning открывает оцениватели, контракты, ядра, генераторы, методы выбора, отчеты, кеш и интеграцию с теплым стартом. |
| Двухэтапная эволюция | Артефакты первого и второго этапа, а также состояния ошибок было трудно переиспользовать. | Первый и второй этап имеют API-классы экспериментов, загружаемые артефакты, диагностику, статусы пропуска/ошибок и ленивые предположения PipelineBuilder. |
| Инструменты для агентов | Примеры в основном были скриптами или ноутбуками. | examples/tools_example дает сервисный слой с JSON-запросами и ответами для загрузки данных, обучения, эволюции, PDL и детекции аномалий. |
| Правила разработки | Архитектурные правила жили в обсуждениях и ревью. | FEDOT-навыки и документация бенчмарков фиксируют локальность реализаций, типизированные конфигурации, вынесение констант в JSON, инвариантные тесты и короткие публичные индексы. |
Что изменилось в работе фреймворка
1. Запуск бенчмарков стал типизированным и привязанным к реестру
Новые запуски должны сводиться к схеме:
typed_config.build_suite_config() -> run_registered_suite(...)Это важно, потому что BenchmarkSuiteConfig теперь несет тип задачи, наборы
данных, модели, метрики, параметры запуска и правила сохранения артефактов как
один проверяемый объект. Разработчику больше не нужно искать константы по
нескольким скриптам, чтобы понять, что именно будет запущено.
Ключевые файлы:
benchmark/industrial/core.pybenchmark/industrial/experiments/registry.pybenchmark/industrial/experiments/manifests.pybenchmark/industrial/experiments/presets.pybenchmark/experiments/kernel_learning/configs.pybenchmark/experiments/kernel_learning/defaults.json
Практический эффект для разработчика:
- использовать
ModelSpecиDatasetSpecвместо ручных словарей параметров; - добавлять новые наборы настроек через JSON рядом с тематическим модулем;
- использовать манифесты для воспроизводимых запусков;
- запускать сохранение через
run_registered_suiteили
run_registered_manifest_path.
2. Стало ясно, где живет код бенчмарков
benchmark.industrial теперь единственный правильный исполняемый пакет для
нового кода бенчмарков. Старый пакет benchmarking_utils удален, а benchmark/v2
перенесен и переработан в benchmark/industrial.
Публичный пакет использует ленивые экспорты: легкие импорты вроде ModelSpec
не должны сразу подтягивать необязательные зависимости для прогнозирования или
глубокого обучения.
Ключевые файлы:
benchmark/industrial/__init__.pybenchmark/industrial/classification.pybenchmark/industrial/regression.pybenchmark/industrial/forecasting.pybenchmark/industrial/datasets/local_io.pybenchmark/industrial/legacy/*
Практический эффект для разработчика:
- новый исполняемый код должен жить в тематическом подпакете
benchmark.industrial; __init__.pyдолжен оставаться коротким публичным указателем;- старые корневые классы бенчмарков допустимы только как совместимые обертки;
- исторические пути
v2_kernel_learningявляются источниками данных, а не
импортируемыми модулями.
3. Результаты запусков стали полноценными входными данными анализа
Запуски теперь сохраняют достаточно информации, чтобы пересобрать таблицы без
повторного обучения:
records/
runs.jsonl
metrics.jsonl
predictions.jsonl
kernel_diagnostics.jsonl
kernel_selection.jsonl
aggregate/
runs.csv
metrics.csv
predictions.csv
leaderboard.csv
run_metadata.json
summary.md
resolved_config.json
resolved_manifest.json
run_summary.json
artifact_manifest.json
Это важное изменение для всей системы: анализ результатов больше не привязан к
состоянию ноутбука или локальному Python-объекту.
Ключевые файлы:
benchmark/industrial/experiments/artifacts.pybenchmark/industrial/evaluation/aggregation.pybenchmark/industrial/evaluation/result_analysis.pybenchmark/industrial/visualization/benchmark_results.pybenchmark/industrial/visualization/forecast_comparison.py
Практический эффект для разработчика:
- ошибки и пропущенные запуски остаются видимыми в записях;
- основные сравнительные таблицы используют успешные строки метрик, если отчет
явно не посвящен ошибкам; - покрытие, список отсутствующих наборов данных, метаданные источников,
диагностику, изменение параметров, приросты и лучших k можно пересобрать единым
способом.
4. Kernel Learning стал отдельной подсистемой фреймворка
fedot_ind.core.kernel_learning теперь выглядит не как набор экспериментальных
скриптов, а как публичная подсистема.
Основные части:
contracts.py: тип задачи, нормализация, исправление PSD, аппроксимация,
набор признаков, набор ядер, отчет о выборе.estimators/:KernelEnsembleClassifier,KernelEnsembleRegressor,
KernelEnsembleForecaster.generators/: базовые контракты, адаптеры репозитория, легкие генераторы,
спецификации операций, реестр.kernels/: сборка матриц ядер, оценка сложности, аппроксимация Нистрема.selection/: sparse MKL, целевые ядра, отчеты о важности.integration/: определение задачи теплого старта и сборка начальных популяций.experiments_api/: загружаемые артефакты первого и второго этапа, а также
классы запуска.cache.py: детерминированный кеш ядер по отпечаткам массива и конфигурации.
Практический эффект для разработчика:
- прямые пользователи могут импортировать оцениватели из
fedot_ind.core.kernel_learning; - пользователи бенчмарков получают те же оцениватели через адаптеры моделей
benchmark.industrial; - расширение генераторов теперь идет через реестр и спецификации операций, а не
через один большой файлadapters.py; - второй этап эволюционной оптимизации может использовать генераторы,
выбранные на первом этапе, как ленивые предположения теплого старта
PipelineBuilder.
5. Генераторы признаков разложены по тематическим модулям
После KL-401 старый крупный файл адаптеров генераторов разделен:
fedot_ind/core/kernel_learning/generators/
base.py общие контракты, нормализация, преобразование входов FEDOT
repository.py адаптеры репозитория и политики вычислительного бюджета
lightweight.py identity, shapelet, random projection embedding
specs.py спецификации операций и параметры по умолчанию
registry.py реестр генераторов и разрешение спецификаций операций
adapters.py фасад совместимости
Публичные импорты при этом сохранены, но будущие изменения генераторов стало
намного проще читать и проверять.
Практический эффект для разработчика:
- новая реализация генератора должна жить в тематическом модуле, который
отвечает за ее поведение; adapters.pyдолжен оставаться фасадом совместимости;registry.pyотвечает за публичные имена вродеwavelet_extractor,
embedding_extractorилиtabular_extractor;- политики бюджета и запасные варианты выполнения изолированы в
repository.py.
6. Эксперименты Kernel Learning используют актуальные модели Industrial
Стандартный набор бенчмарков Kernel Learning теперь включает:
- классификация:
KernelEnsembleClassifier_score_baseline_summary;KernelEnsembleClassifier_adaptive_all_non_topological;KernelEnsembleClassifier_shapelet_motif_rbf;KernelEnsembleClassifier_embedding_nystrom;
- регрессия:
KernelEnsembleRegressor_score_linear_summary;KernelEnsembleRegressor_adaptive_rbf_summary;KernelEnsembleRegressor_shapelet_rbf;KernelEnsembleRegressor_embedding_nystrom;
- прогнозирование:
NaiveLastValue;LaggedRidgeForecaster;KernelEnsembleForecaster_identity_shapelet;KernelEnsembleForecaster_embedding_nystrom_okhs.
Настройки по умолчанию также задают:
- наборы нетопологических генераторов;
- метрики для конкретных задач;
- шаблоны выходных папок;
- поведение возобновляемых запусков;
- поиск последнего первого этапа для двухэтапных запусков;
custom_dataset_policyдля поведения на UCR и пользовательских данных.
7. Первый и второй этап Kernel Learning стали восстанавливаемыми процессами
Первый этап теперь записывает диагностику ядер и артефакты выбранных
генераторов. Их можно загрузить позже. Второй этап может либо запустить первый
этап, либо взять уже существующий запуск. Если второй этап не может собрать
начальную популяцию, он записывает структурированный статус пропуска или ошибки,
а не теряет состояние.
Ключевые файлы:
fedot_ind/core/kernel_learning/experiments_api/stage1.pyfedot_ind/core/kernel_learning/experiments_api/stage2.pybenchmark/experiments/kernel_learning/classification/run_ucr_two_stage.pybenchmark/industrial/evaluation/kernel_learning.py
Практический эффект для разработчика:
- использовать
KernelLearningStage1Runnerдля первого этапа на UCR; - использовать
KernelLearningStage2Runnerдля эволюции FEDOT с теплым стартом; - не задавать
stage1_run_id, если нужен автоматический поиск последнего
первого этапа; - использовать функции анализа, чтобы смотреть выбор генераторов до запуска
второго этапа.
8. Витрина результатов стала публичным окном состояния моделей
benchmark/results/showcase теперь отвечает на вопрос: «Как сейчас выглядят
модели Industrial по сравнению с SoTA и предыдущими версиями Industrial?»
Витрина индексирует:
- UCR/UEA univariate classification;
- multivariate classification;
- TSER regression;
- M4 monthly forecasting.
Она также формирует:
- опись источников;
- обзор бенчмарков;
- лучшие результаты по наборам данных;
- кандидатов на архивирование;
- сводные пакеты по каждому направлению.
Практический эффект для разработчика:
- использовать
python -m benchmark.results.showcaseдля пересборки основной
витрины; - добавлять новые публичные сравнения через
showcase_manifest.json; - не включать сырые исторические папки в публичные таблицы, если манифест явно
не называет их источниками.
9. Примеры переорганизованы по роли в воспроизводимости
Структура examples теперь основана на назначении:
examples/
utils/ утилиты текущего API и маленькие фикстуры
tools_example/ сервисный слой для MCP и внешних агентов
real_world_examples/ бенчмарковые и прикладные сценарии
artifacts/ каталог артефактов, облачный пакет, локальная витрина
Удалены или выведены из основной структуры:
examples/benchmark_v2;examples/outdated_examples;- старый сырой вид
examples/data; - отдельная верхнеуровневая папка
examples/rkhs_okhs; - старое название
automl_example.
Практический эффект для разработчика:
- начинать с
python -m examples.utils.current_api; - использовать
python -m examples.artifactsдля пересборки описи артефактов и
локальной витрины; - использовать
examples/tools_exampleдля MCP или адаптеров внешних агентов; - использовать
examples/real_world_examplesдля прикладных ноутбуков и
доменных сценариев.
10. Инструменты подготовлены для интеграции с внешними агентами
examples/tools_example больше не является набором тонких оберток над
примерами текущего API. Это сервисный слой Python со следующими частями:
contracts.py:ToolRequest,ToolResponse,ToolArtifact,ToolError;registry.py: описания инструментов, JSON-схемы, маршрутизация вызовов;services/data.py: список, загрузка и просмотр наборов данных;services/training.py: конфигурации обучения и необязательное выполнение;services/evolution.py: конфигурация двухэтапной оптимизации Kernel Learning;services/pdl.py: конфигурация PDL-обучения;services/anomaly.py: контекст и процесс детекции аномалий.
Все тяжелые инструменты по умолчанию работают в режиме предварительной проверки
и требуют execute=true для запуска обучения или оптимизации.
Практический эффект для разработчика:
- внешний MCP-сервер может напрямую отразить описания из реестра в набор
инструментов; - каждый ответ имеет структуру и может включать сведения об артефактах;
- политика локальных данных описана в README и
tool_defaults.json.
Как работать с обновленным репозиторием
Добавить новое направление бенчмарка
- Добавить исполняемую логику в
benchmark/industrial/<domain>. - Добавить или переиспользовать
BenchmarkSuiteConfig. - Положить таблицы моделей и настройки по умолчанию в JSON рядом с тематическим
пакетом. - Добавить тонкий запуск в
benchmark/experiments/<family>/<task>. - Сохранять результаты через
run_registered_suiteили помощники реестра
манифестов. - Подключить агрегацию и визуализацию через общие функции
benchmark.industrial. - Добавить источник в
benchmark/results/showcase/showcase_manifest.json, если
результат должен стать публичным доказательством. - Добавить тесты на нормализацию конфигурации, проверку манифеста, агрегацию и
короткий короткий проверочный запуск.
Добавить новый генератор Kernel Learning
- Писать общий контракт в
generators/base.pyтолько если он действительно
нужен нескольким генераторам. - Класть адаптеры репозитория или изменения политики бюджета в
generators/repository.py. - Класть маленькие только на numpy генераторы в
generators/lightweight.py. - Описывать спецификации операций и параметры по умолчанию в
generators/specs.py. - Регистрировать публичное имя генератора в
generators/registry.py. - Держать
generators/adapters.pyтолько как фасад совместимости. - Добавлять тесты в
tests/unit/core/kernel_learning/test_generators.py.
Добавить новый пример
- Сначала выбрать роль:
- маленький воспроизводимый короткий проверочный пример:
examples/utils/current_api; - инструмент для внешнего агента:
examples/tools_example; - прикладной сценарий:
examples/real_world_examples; - сгенерированные отчетные артефакты:
examples/artifacts.
- маленький воспроизводимый короткий проверочный пример:
- Использовать типизированные конфигурации бенчмарков или актуальные
оцениватели Kernel Learning. - Держать каталогоподобные константы и настройки в JSON рядом с примером.
- Не коммитить сырые локальные наборы данных и чекпойнты.
- В README описывать локальные входы и ожидаемые выходы.
- Если пример создает переиспользуемые графики или таблицы, регистрировать их
в каталоге артефактов.
Обновить результаты бенчмарков
- Запустить или возобновить бенчмарк в
benchmark/results/kernel_learning/.... - Убедиться, что папки
recordsиaggregateсозданы. - Обновить манифест витрины, если источник должен попасть в публичное сравнение.
- Выполнить:
python -m benchmark.results.showcase
python -m examples.artifacts- Проверить опись источников, покрытие, лучшие результаты по наборам данных и
кандидатов на архивирование.
|
Закрыл финальный cleanup по замечаниям перед merge. Что поправлено по инфраструктурным пунктам:
Что поправлено по комментариям Lopa10ko:
Что сознательно не стал превращать в большой refactor внутри этого cleanup:
Проверено локально:
|
|
Что сделал в последних 2 коммитах
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #225 +/- ##
==========================================
+ Coverage 65.08% 70.27% +5.18%
==========================================
Files 145 250 +105
Lines 13945 24398 +10453
==========================================
+ Hits 9076 17145 +8069
- Misses 4869 7253 +2384
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
| def parse_args() -> argparse.Namespace: | ||
| defaults = KernelLearningTwoStageUCRExperimentConfig() | ||
| parser = argparse.ArgumentParser(description="Run the two-stage UCR kernel-learning experiment.") | ||
| parser.add_argument( | ||
| "--run-stage-1", | ||
| action="store_true", | ||
| help="Run stage 1 before stage 2. By default stage 1 is loaded from saved artifacts.", | ||
| ) | ||
| parser.add_argument( | ||
| "--stage1-run-id", | ||
| default=defaults.stage1_run_id, | ||
| help="Existing stage 1 run id to load when --run-stage-1 is not set. Defaults to latest discovery.", | ||
| ) | ||
| parser.add_argument( | ||
| "--stage1-run-policy", | ||
| default=defaults.stage1_run_policy, | ||
| choices=("latest",), | ||
| help="How to resolve stage 1 when --stage1-run-id is omitted.", | ||
| ) | ||
| parser.add_argument( | ||
| "--datasets", | ||
| nargs="*", | ||
| default=None, | ||
| help="UCR dataset names for stage 1. Pass no names after the flag to use all local datasets.", | ||
| ) | ||
| parser.add_argument( | ||
| "--stage1-output-dir", | ||
| type=Path, | ||
| default=defaults.stage1_output_dir, | ||
| help="Directory containing or receiving stage 1 runs.", | ||
| ) | ||
| parser.add_argument( | ||
| "--stage2-output-dir", | ||
| type=Path, | ||
| default=defaults.stage2_output_dir, | ||
| help="Directory receiving stage 2 optimization artifacts.", | ||
| ) | ||
| parser.add_argument( | ||
| "--timeout-minutes", | ||
| type=int, | ||
| default=defaults.timeout_minutes, | ||
| help="FEDOT optimization timeout per dataset for stage 2.", | ||
| ) | ||
| parser.add_argument( | ||
| "--pop-size", | ||
| type=int, | ||
| default=defaults.pop_size, | ||
| help="FEDOT population size for stage 2.", |
There was a problem hiding this comment.
nit-pick: здесь и везде в Fedot.Industrial - парсинг CLI вызовов через argparse обычно не очень хорошая идея в бенчмаркинге, достаточно устаревший подход, который хотелось бы в дальнейшем переписать на hydra yaml конфиги
при очередном запуске примера, бенча или просто тестирования хочется иметь какой-то артефакт этого запуска не только в логах, но и непосредственно рядом с файлом запуска
| if TYPE_CHECKING: | ||
| from benchmark.industrial.experiments.registry import BenchmarkRunBundle | ||
|
|
||
| PROJECT_ROOT = Path(__file__).resolve().parents[3] |
There was a problem hiding this comment.
здесь и везде PROJECT_ROOT и другие пути до каких-либо директорий обычно должны прописываться единожды на уровне фреймворка (например, в fedot_ind/tools/serialisation/path_lib.py) и везде при необходимости можно прописывать from fedot_ind.tools.serialisation.path_lib import PROJECT_PATH или подобное, а не завязваться на конкретную файловую организацию в бенчмаркинг слое
если в дальнейшем бенчмаркинг будет изменяться, файлы будут переноситься и так далее, возможны проблемы с путями
| def print_benchmark_run_bundle(bundle: "BenchmarkRunBundle") -> None: | ||
| print(f"Run ID: {bundle.result.run_id}") | ||
| print(f"Output dir: {bundle.result.config.artifact_spec.output_dir}") | ||
| print(f"Run dir: {bundle.run_dir}") | ||
| print(f"Registry entry: {bundle.registry_entry_path}") |
There was a problem hiding this comment.
здесь и везде вместо print в консоль лучше логировать и сохранять лог запуска
| from .stage1 import DEFAULT_STAGE_METRICS | ||
|
|
||
| DEFAULT_STAGE2_OUTPUT_DIR = Path("benchmark") / "results" / "v2_kernel_learning" / "ucr_two_stage_optim_140526" | ||
| DEFAULT_STAGE2_OUTPUT_DIR = Path("benchmark") / "results" / "kernel_learning" / "ucr_two_stage_optim_140526" |
There was a problem hiding this comment.
привязываться к конкретной дате бенчмаркинга ucr_two_stage_optim_140526 - code smell
| @@ -136,6 +131,8 @@ def run_registered_manifest_path(path: str | Path) -> BenchmarkRunBundle: | |||
|
|
|||
|
|
|||
| def run_registered_manifest(payload: dict[str, Any]) -> BenchmarkRunBundle: | |||
| from benchmark.industrial.experiments.manifests import render_resolved_manifest, run_manifest | |||
|
|
|||
| resolved_payload = render_resolved_manifest(payload) | |||
| result = run_manifest(payload) | |||
| return persist_run_bundle( | |||
| @@ -148,10 +145,16 @@ def run_registered_manifest(payload: dict[str, Any]) -> BenchmarkRunBundle: | |||
|
|
|||
| def run_registered_suite(config: BenchmarkSuiteConfig) -> BenchmarkRunBundle: | |||
| if config.task_type is TaskType.FORECASTING: | |||
| from benchmark.industrial.api import run_forecasting_benchmark_suite | |||
|
|
|||
| result = run_forecasting_benchmark_suite(config) | |||
| elif config.task_type is TaskType.TS_CLASSIFICATION: | |||
| from benchmark.industrial.api import run_tsc_benchmark_suite | |||
|
|
|||
| result = run_tsc_benchmark_suite(config) | |||
| elif config.task_type is TaskType.TS_REGRESSION: | |||
| from benchmark.industrial.api import run_tser_benchmark_suite | |||
|
|
|||
| result = run_tser_benchmark_suite(config) | |||
| else: # pragma: no cover | |||
| raise ValueError(f'Unsupported task type: {config.task_type}') | |||
| @@ -175,6 +178,8 @@ def run_registered_preset( | |||
| include_optional_external: bool = False, | |||
| models=None, | |||
| ) -> BenchmarkRunBundle: | |||
| from benchmark.industrial.experiments.presets import run_local_benchmark_preset | |||
|
|
|||
| result = run_local_benchmark_preset( | |||
There was a problem hiding this comment.
зачем здесь используются nested imports внутри методов?
| class Either: | ||
| def __init__(self, value: Any, is_right: bool): | ||
| self.value = value | ||
| self._is_right = is_right | ||
|
|
||
| def is_left(self) -> bool: | ||
| return not self._is_right | ||
|
|
||
| def is_right(self) -> bool: | ||
| return self._is_right | ||
|
|
||
| def either(self, left: Callable[[Any], Any], right: Callable[[Any], Any]) -> Any: | ||
| return right(self.value) if self._is_right else left(self.value) | ||
|
|
||
|
|
||
| def Left(value: Any) -> Either: | ||
| return Either(value, is_right=False) | ||
|
|
||
|
|
||
| def Right(value: Any) -> Either: | ||
| return Either(value, is_right=True) |
There was a problem hiding this comment.
зачем каждый раз вводить either? можно пользоваться pymonad
| @lru_cache(maxsize=1) | ||
| def load_real_world_defaults(path: str | Path = DEFAULTS_PATH) -> dict[str, Any]: | ||
| defaults_path = Path(path) | ||
| payload = json.loads(defaults_path.read_text(encoding="utf-8")) | ||
| if not isinstance(payload, dict): | ||
| raise ValueError(f"Real-world example defaults root must be a mapping: {defaults_path}") | ||
| version = str(payload.get("version", "")) | ||
| if version != DEFAULTS_VERSION: | ||
| raise ValueError(f"Unsupported real-world example defaults version: {version}") | ||
| return payload |
There was a problem hiding this comment.
везде встречаются похожие методы load_*_defaults, можно единожды реализовать в утилитах бенчмаринга или примеров и переиспользовать везде, они отличаются только названием метода в сигнатуре и в ошибке ValueError
применимо и к остальным методам, которые по какой-то причине не переиспользуются, а пишутся заново под конкретный скрипт
| from .current_api import main | ||
|
|
||
| if __name__ == "__main__": | ||
| raise SystemExit(main()) |
There was a problem hiding this comment.
проверить, используется ли это вообще? если нет, то удалить или все же применить
если я верно понимаю, cwrapped нужен для реализации метода tessellate, который используется в fedot_ind.tools.explain.pcd.numpy2stl, который используется в fedot_ind/core/operation/transformation/representation/topological/topological_extractor._generate_pcd, но закомментирован (вместо этого используется какая-то эвристика)
There was a problem hiding this comment.
зачем добавлен lock?
убрать poetry.lock, добавить в .gitignore
|
Что вошло в cleanup commit:
|
Коммит развивает трек Kernel Learning / Kernel Ensemble и переводит текущий модуль от MVP-каркаса к более строгой архитектуре:
PR-001: Harden Kernel Contracts And Matrix Semantics
Изменены:
Что сделано:
Содержательное влияние:
PR-002: Replace Heuristic Selector With Sparse Adaptive MKL Objective
Изменены:
Что сделано:
Содержательное влияние:
PR-003: Stabilize Classifier/Regressor And FEDOT Warm Start
Изменены:
Что сделано:
Содержательное влияние:
PR-004: Topological Kernel Generator Under Budget Control
Изменены:
Что сделано:
Содержательное влияние:
PR-005: Shapelet And Local Pattern Kernel Generators
Изменены:
Что сделано:
Содержательное влияние:
PR-006: Embedding And Foundation Feature Kernel Adapters
Изменены:
Что сделано:
Содержательное влияние:
PR-007: Forecasting Target Kernels And OKHS Adapter
Изменены:
Что сделано:
Содержательное влияние:
PR-008: KernelEnsembleForecaster Public Estimator
Изменены:
Что сделано:
Содержательное влияние:
PR-009: Cache, Approximation, Reports, Benchmarks, Legacy Cleanup
Добавлены:
Изменены:
Что сделано:
Содержательное влияние:
Tests
Добавлены:
Изменены:
Проверено:
Тесты запускались через локальное окружение venv_3.9_new с PYTEST_DISABLE_PLUGIN_AUTOLOAD=1,