diff --git a/AGENTS.md b/AGENTS.md index 945b1fe..ecb753c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -146,6 +146,7 @@ mlflow run . -P epochs=10 -P batch_size=256 -P lr=0.001 --entry-point gpu - **File-store как tracking backend запрещён в MLflow 3.x** (maintenance mode): падает и `mlflow server --backend-store-uri file://...`, и клиент-скрипт с дефолтным `./mlruns` — оба с `MlflowException ... in maintenance mode`. Поэтому проект использует **SQLite** (`sqlite:///mlflow.db`) как tracking backend, а скрипты логируют на сервер по HTTP. Опциональный opt-out `MLFLOW_ALLOW_FILE_STORE=true` НЕ используем (он может быть убран в будущем). Артефакты при этом лежат на локальном диске (`./artifacts`, file artifact repository — он НЕ в maintenance mode). - **`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 с других машин (браузером по IP сервера)** — НЕ удалять флаги в `start_ui.sh`: `--host 0.0.0.0`, `--allowed-hosts "*"`, `--cors-allowed-origins "*"`, `export MLFLOW_ALLOW_ORIGIN="*"`, `--serve-artifacts` + `--artifacts-destination`, `--dev`. Без `--allowed-hosts "*"` MLflow режет запросы с `Host=:5555` (UI не открывается удалённо); без `--serve-artifacts` UI на удалённой машине не скачает артефакты (model/графики) по file://-путям. Эти флаги были в исходном проекте и случайно потерялись при миграции — восстановлены. - **Архитектура хранения (SQLite + HTTP-клиенты)**: `start_ui.sh` поднимает сервер с `--backend-store-uri sqlite:///${PWD}/mlflow.db`. Все скрипты в `src/` содержат `mlflow.set_tracking_uri(os.environ.get("MLFLOW_TRACKING_URI", "http://localhost:5555"))` — пишут на сервер. UI и скрипты работают с **одной** sqlite-базой → эксперименты сразу видны. **Сервер должен быть запущен до запуска скриптов** (иначе `ConnectionError` к localhost:5555). Переопределить адрес: `export MLFLOW_TRACKING_URI=http://:5555` (например, при логировании на удалённый сервер). - `mlruns/`, `artifacts/*`, `data/MNIST/`, `mlflow.db` — в `.gitignore`, в репозиторий не попадают. diff --git a/start_ui.sh b/start_ui.sh index daec880..486626d 100755 --- a/start_ui.sh +++ b/start_ui.sh @@ -2,30 +2,35 @@ # ============================================================ # Запуск MLflow Tracking Server # Откройте в браузере: http://localhost:5555 +# С другой машины: http://:5555 # # Backend store = SQLite (mlflow.db) — recommended MLflow backend. # Скрипты в src/ логируют на этот сервер (http://localhost:5555) через -# mlflow.set_tracking_uri(...) — поэтому UI и скрипты работают с одной -# базой, и эксперименты сразу видны в UI. +# mlflow.set_tracking_uri(...) — UI и скрипты работают с одной базой. # -# ⚠️ file-store как tracking backend в новых MLflow (3.x) переведён в -# maintenance mode и запрещён (ошибка и на сервере, и у клиента-скрипта). -# Поэтому используем sqlite. Артефакты при этом лежат на локальном диске -# в ./artifacts (file-based artifact repository — он НЕ в maintenance mode). +# Доступ к UI с других машин (браузером по IP сервера) — включён: +# --host 0.0.0.0 слушать на всех интерфейсах +# --allowed-hosts "*" разрешить любой Host-заголовок (иначе MLflow +# режет запросы с Host=:5555) +# --cors-allowed-origins "*" разрешить кросс-доменные API-запросы +# MLFLOW_ALLOW_ORIGIN="*" то же через env (совместимость) +# --serve-artifacts сервер сам отдаёт артефакты (иначе UI на +# --artifacts-destination удалённой машине не скачает model/графики +# по file://-путям) +# --dev dev-режим (релиакс host-проверок) # -# Запустите сервер ДО запуска скриптов обучения: -# ./start_ui.sh # в одном терминале -# python src/train_simple.py ... # в другом (нужен работающий сервер) +# Запустите сервер ДО запуска скриптов обучения. # ============================================================ set -e cd "$(dirname "$0")" PORT="${MLFLOW_PORT:-5555}" +export MLFLOW_ALLOW_ORIGIN="*" echo "🚀 Запускаем MLflow Tracking Server..." -echo " UI: http://localhost:${PORT}" +echo " UI: http://localhost:${PORT} (с других машин: http://:${PORT})" echo " Backend: sqlite:///${PWD}/mlflow.db" -echo " Artifacts: file://${PWD}/artifacts" +echo " Artifacts: file://${PWD}/artifacts (serve-artifacts включён)" echo "" echo " Скрипты логируют сюда через MLFLOW_TRACKING_URI=http://localhost:${PORT}" echo " (можно переопределить: export MLFLOW_TRACKING_URI=http://:${PORT})" @@ -36,5 +41,10 @@ echo "" mlflow server \ --backend-store-uri "sqlite:///${PWD}/mlflow.db" \ --default-artifact-root "file://${PWD}/artifacts" \ + --serve-artifacts \ + --artifacts-destination "file://${PWD}/artifacts" \ + --allowed-hosts "*" \ + --cors-allowed-origins "*" \ --host 0.0.0.0 \ - --port "${PORT}" + --port "${PORT}" \ + --dev