diff --git a/AGENTS.md b/AGENTS.md index 4fb9a2b..81d37ce 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -142,6 +142,7 @@ mlflow run . -P epochs=10 -P batch_size=256 -P lr=0.001 --entry-point gpu - `train_gpu.py` передаёт `input_example` → сигнатура авто-infer'ится. - `autolog_demo.py` намеренно отключает сигнатуры (`log_model_signatures=False`) как демо опций autolog — там warning ожидаем. - **INFO про переменные окружения** (`OPENAI_API_KEY` и т.п.) при логировании подавлено через `MLFLOW_RECORD_ENV_VARS_IN_MODEL_LOGGING=false` в скриптах, логирующих модели. +- **File-store как СЕРВЕРНЫЙ бэкенд в maintenance mode (MLflow 3.x)**: `mlflow server --backend-store-uri file://...` по умолчанию падает с `MlflowException ... filesystem tracking backend is in maintenance mode`. Официальный opt-out — `export MLFLOW_ALLOW_FILE_STORE=true` (уже выставлено в `start_ui.sh` перед file-блоком). Это касается ТОЛЬКО сервера; клиентский file store (как пишут скрипты в `./mlruns`) работает без opt-out. Альтернатива без opt-out — SQLite-бэкенд (закомментированный блок в `start_ui.sh`), но тогда скрипты должны логировать на сервер через `mlflow.set_tracking_uri('http://localhost:5555')`. - **`input_example` для `mlflow.pytorch.log_model` — только numpy**, не `torch.Tensor`: MLflow 3.x валидирует пример входа и падает с `MlflowException ... but got ''`. В `train_gpu.py` передаётся `np.random.rand(1,1,28,28).astype(np.float32)`. Аналогично для других flavor'ов — пример должен быть DataFrame/ndarray/dict/list/скаляр. - **urllib3 `NotOpenSSLWarning`** на macOS (системный `ssl` собран с LibreSSL 2.8.3, urllib3 v2 просит OpenSSL 1.1.1+) — стороннее шумовое предупреждение, к проекту отношения не имеет; не подавляем (чтобы не прятать реальные предупреждения). - **«Эксперимент не виден в UI» (главная причина)**: скрипты по умолчанию пишут в локальный file store `./mlruns`, а `start_ui.sh` раньше поднимал сервер на **SQLite** (`mlflow.db`) — два разных хранилища, UI ничего не показывал. Теперь `start_ui.sh` использует `--backend-store-uri file://${PWD}/mlruns` — **то же хранилище, что и скрипты**, поэтому всё видно без настройки tracking URI. Альтернатива (SQLite-бэкенд) оставлена закомментированной в `start_ui.sh`; при её включении в скриптах нужно задать `mlflow.set_tracking_uri('http://localhost:5555')` (или `MLFLOW_TRACKING_URI`). diff --git a/start_ui.sh b/start_ui.sh index 0033470..654afca 100755 --- a/start_ui.sh +++ b/start_ui.sh @@ -7,9 +7,14 @@ # пишут по умолчанию). Поэтому UI видит все эксперименты/запуски # без доп. настройки tracking URI в скриптах. # -# Альтернатива — SQLite-бэкенд (нужен, только если хотите SQL-запросы -# к запускам). Тогда раскомментируйте блок SQLITE ниже и закомментируйте -# FILE, а в скриптах задайте mlflow.set_tracking_uri("http://localhost:5555") +# ВАЖНО: file-store как СЕРВЕРНЫЙ бэкенд в новых MLflow (3.x) переведён в +# maintenance mode и по умолчанию запрещён. Официальный opt-out — +# MLFLOW_ALLOW_FILE_STORE=true (его и выставляем ниже). Это касается только +# `mlflow server`; клиентский file store (как пишут скрипты) работает и без него. +# +# Альтернатива — SQLite-бэкенд (recommended MLflow, без opt-out). Тогда +# раскомментируйте блок SQLITE ниже и закомментируйте FILE, а в скриптах +# задайте mlflow.set_tracking_uri("http://localhost:5555") # (или export MLFLOW_TRACKING_URI=http://localhost:5555). # ============================================================ set -e @@ -26,6 +31,8 @@ echo " Нажмите Ctrl+C для остановки" echo "" # ─── FILE backend (по умолчанию — единое хранилище со скриптами) ─── +# MLFLOW_ALLOW_FILE_STORE=true — opt-out из maintenance mode file-store бэкенда. +export MLFLOW_ALLOW_FILE_STORE=true mlflow server \ --backend-store-uri "file://${PWD}/mlruns" \ --default-artifact-root "file://${PWD}/artifacts" \