XGBoost Example
XGBoost Example
Файл: examples/xgboost/example.py. Самый полный и надёжный пример в репозитории — единственный, где корневой README и код полностью совпадают.
✅ Проверено на локальном Docker-стеке: и
run_example(), иrun_example_ray()отрабатывают до конца, финальная модель логируется в MLflow и реально попадает в S3 на MinIO (подтверждено напрямую черезmc ls).
Данные: examples/xgboost/data/train_xgboost.csv и test_xgboost.csv (оба файла присутствуют в репозитории — пример готов к запуску "из коробки"). Конфигурация берётся из configs/settings.yaml через mlumina.core.MLuminaConfig.
Что делает скрипт
if __name__ == "__main__":
run_example() # локальный цикл: обучение + тюнинг без Ray
run_example_ray() # распределённый цикл: обучение + тюнинг через Ray
run_example() — локальный путь
get_config()— читает уже проинициализированныйMLuminaConfig(инициализация происходит автоматически при импортеmlumina.core.config, см. страницу Getting Started в книге «Документация MLumina»).xgboost_load_dataset(train_path=config.data.train_file, eval_path=config.data.eval_file, ray_data=False)— загружаетxgb.DMatrixиз CSV, путь к файлам берётся изconfigs/settings.yaml(data.train_file/data.eval_file).XGBoostModel(mlflow_uri=config.cluster.mlflow_uri).train(dtrain, deval, **config.training.xgboost.model_dump())— обучает модель с фиксированными параметрами из секцииtraining.xgboostконфига (objective,tree_method,subsample,colsample_bytree,num_boost_round,error_func).XGBoostTuningModel(...).run_optimization(dtrain, deval)— подбирает гиперпараметры локальным Optuna (диапазоны — из секцииtune.xgboostконфига).- Переобучает модель на лучших параметрах (
xgboost_tuning_model.train(...)) — отдельно от автоматического переобучения, котороеrun_optimizationуже делает сама внутри себя при включённом MLflow.
run_example_ray() — распределённый путь
То же самое, но:
ray.init(address=f"ray://{config.cluster.head_host}")— подключение к Ray-кластеру по адресу из конфига (cluster.head_host, напримерhead:10001внутри Docker-сети).xgboost_load_dataset(..., ray_data=True)(по умолчанию) — данные загружаются какRayDMatrix.XGBoostModel.train_ray(...)иXGBoostTuningModel.run_optimization_ray(...)— распределённое обучение/тюнинг черезxgboost_rayиray.tune.
Как запустить
Внутри контейнера с доступом к Ray-кластеру (например, docker compose exec head bash, либо через сервис scheduler):
python examples/xgboost/example.py
Перед запуском убедитесь, что configs/settings.yaml указывает на существующие файлы (data.train_file/data.eval_file — тип pydantic.FilePath, при отсутствии файла на диске конфигурация не проинициализируется вовсе, упадёт при импорте mlumina.core).
На что обратить внимание
- В
run_example()xgboost_tuning_model.train(...)в конце вызывается на экземпляре, хотяXGBoostModel.train—@staticmethod(Python это допускает); работает корректно, просто нетипичный стиль вызова. - При включённом
mlflow_uri(он передаётся автоматически изconfig.cluster.mlflow_uri)run_optimization/run_optimization_rayтеперь сами логируют финальную модель в MLflow — соответственно, ручное переобучение в концеrun_example()/run_example_ray()частично дублирует эту работу (не ошибка, просто модель обучается дважды: один раз внутри тюнинга для лога в MLflow, второй раз — явно в самом скрипте).
Исправленный баг: XGBoostTuningModel.__init__() missing num_boost_round
Изначально оба вызова XGBoostTuningModel(...) (в run_example() и run_example_ray()) падали с
TypeError: XGBoostTuningModel.__init__() missing 1 required positional argument: 'num_boost_round'
Причина: конструктор передавал параметры через **config.tune.xgboost.model_dump(), а config.tune.xgboost (XGBoostTuneSettings) не содержит поля num_boost_round — оно есть только в config.training.xgboost (XGBoostTrainSettings). Исправлено — в оба вызова добавлен num_boost_round=config.training.xgboost.num_boost_round.
MLflow: версия клиента и сервера
Логирование модели в run_optimization/run_optimization_ray требует, чтобы версия пакета mlflow у клиента (в этом образе) и у mlflow-server совпадала — до фикса сервер был закреплён на mlflow==2.21.1 (mlflow/requirements.txt), а клиент ставился без пина и получал 3.16.1. MLflow 3.x использует новый API логирования моделей (/api/2.0/mlflow/logged-models), которого нет на сервере 2.x — mlflow.xgboost.log_model(...) падал с 404. Сервер обновлён до 3.16.1, версии синхронизированы.