Восстановить флаги удалённого доступа в start_ui.sh (allowed-hosts, cors, serve-artifacts, dev)

This commit is contained in:
2026-07-21 00:16:01 +03:00
parent 9c3321b3a7
commit e0ddc9c53b
2 changed files with 23 additions and 12 deletions
+1
View File
@@ -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). - **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 '<class 'torch.Tensor'>'`. В `train_gpu.py` передаётся `np.random.rand(1,1,28,28).astype(np.float32)`. Аналогично для других flavor'ов — пример должен быть DataFrame/ndarray/dict/list/скаляр. - **`input_example` для `mlflow.pytorch.log_model` — только numpy**, не `torch.Tensor`: MLflow 3.x валидирует пример входа и падает с `MlflowException ... but got '<class 'torch.Tensor'>'`. В `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+) — стороннее шумовое предупреждение, к проекту отношения не имеет; не подавляем (чтобы не прятать реальные предупреждения). - **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=<server-ip>: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://<host>:5555` (например, при логировании на удалённый сервер). - **Архитектура хранения (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://<host>:5555` (например, при логировании на удалённый сервер).
- `mlruns/`, `artifacts/*`, `data/MNIST/`, `mlflow.db` — в `.gitignore`, - `mlruns/`, `artifacts/*`, `data/MNIST/`, `mlflow.db` — в `.gitignore`,
в репозиторий не попадают. в репозиторий не попадают.
+22 -12
View File
@@ -2,30 +2,35 @@
# ============================================================ # ============================================================
# Запуск MLflow Tracking Server # Запуск MLflow Tracking Server
# Откройте в браузере: http://localhost:5555 # Откройте в браузере: http://localhost:5555
# С другой машины: http://<server-ip>:5555
# #
# Backend store = SQLite (mlflow.db) — recommended MLflow backend. # Backend store = SQLite (mlflow.db) — recommended MLflow backend.
# Скрипты в src/ логируют на этот сервер (http://localhost:5555) через # Скрипты в src/ логируют на этот сервер (http://localhost:5555) через
# mlflow.set_tracking_uri(...) — поэтому UI и скрипты работают с одной # mlflow.set_tracking_uri(...) — UI и скрипты работают с одной базой.
# базой, и эксперименты сразу видны в UI.
# #
# ⚠️ file-store как tracking backend в новых MLflow (3.x) переведён в # Доступ к UI с других машин (браузером по IP сервера) — включён:
# maintenance mode и запрещён (ошибка и на сервере, и у клиента-скрипта). # --host 0.0.0.0 слушать на всех интерфейсах
# Поэтому используем sqlite. Артефакты при этом лежат на локальном диске # --allowed-hosts "*" разрешить любой Host-заголовок (иначе MLflow
# в ./artifacts (file-based artifact repository — он НЕ в maintenance mode). # режет запросы с Host=<server-ip>: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 set -e
cd "$(dirname "$0")" cd "$(dirname "$0")"
PORT="${MLFLOW_PORT:-5555}" PORT="${MLFLOW_PORT:-5555}"
export MLFLOW_ALLOW_ORIGIN="*"
echo "🚀 Запускаем MLflow Tracking Server..." echo "🚀 Запускаем MLflow Tracking Server..."
echo " UI: http://localhost:${PORT}" echo " UI: http://localhost:${PORT} (с других машин: http://<server-ip>:${PORT})"
echo " Backend: sqlite:///${PWD}/mlflow.db" echo " Backend: sqlite:///${PWD}/mlflow.db"
echo " Artifacts: file://${PWD}/artifacts" echo " Artifacts: file://${PWD}/artifacts (serve-artifacts включён)"
echo "" echo ""
echo " Скрипты логируют сюда через MLFLOW_TRACKING_URI=http://localhost:${PORT}" echo " Скрипты логируют сюда через MLFLOW_TRACKING_URI=http://localhost:${PORT}"
echo " (можно переопределить: export MLFLOW_TRACKING_URI=http://<host>:${PORT})" echo " (можно переопределить: export MLFLOW_TRACKING_URI=http://<host>:${PORT})"
@@ -36,5 +41,10 @@ echo ""
mlflow server \ mlflow server \
--backend-store-uri "sqlite:///${PWD}/mlflow.db" \ --backend-store-uri "sqlite:///${PWD}/mlflow.db" \
--default-artifact-root "file://${PWD}/artifacts" \ --default-artifact-root "file://${PWD}/artifacts" \
--serve-artifacts \
--artifacts-destination "file://${PWD}/artifacts" \
--allowed-hosts "*" \
--cors-allowed-origins "*" \
--host 0.0.0.0 \ --host 0.0.0.0 \
--port "${PORT}" --port "${PORT}" \
--dev