Как хранить артефакты на сервере под управлением MLflow - PullRequest
0 голосов
/ 14 сентября 2018

Я определяю следующий образ докера:

FROM python:3.6

RUN pip install --upgrade pip
RUN pip install --upgrade mlflow

ENTRYPOINT mlflow server --host 0.0.0.0 --file-store /mnt/mlruns/

и создаю образ с именем mlflow-server.Затем я запускаю этот сервер с локального компьютера:

docker run --rm -it -p 5000:5000 -v ${PWD}/mlruns/:/mnt/mlruns mlflow-server

Затем я определяю следующую функцию:

def foo(x, with_af=False):
    mlflow.start_run()
    mlflow.log_param("x", x)
    print(x)
    if with_af:
        with open(str(x), 'wb') as fout:
            fout.write(os.urandom(1024))
        mlflow.log_artifact(str(x))
        mlflow.log_artifact('./foo.data')
    mlflow.end_run()

Из того же каталога я запускаю foo(10) и параметрзарегистрирован правильно.Однако foo(10, True) выдает следующую ошибку: PermissionError: [Errno 13] Permission denied: '/mnt'.Похоже, log_artifact пытается сохранить файл в локальной файловой системе напрямую.

Есть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 16 сентября 2018

Хороший вопрос. Просто чтобы убедиться, звучит так, как будто вы уже настраиваете MLflow для связи с сервером отслеживания при запуске скрипта, например, через MLFLOW_TRACKING_URI=http://localhost:5000 python my-script.py.

Хранение артефактов в MLflow

Артефакты незначительно отличаются от других данных выполнения (метрик, параметров, тегов) тем, что клиент, а не сервер, отвечает за их сохранение. Текущий поток (по состоянию на MLflow 0.6.0):

  • Код звонка пользователя mlflow.start_run
  • Клиент MLflow делает запрос API к серверу отслеживания для создания прогона
  • Сервер отслеживания определяет соответствующий URI корневого артефакта для прогона (в настоящее время: корни артефактов прогонов являются подкаталогами корневых каталогов артефактов их родительского эксперимента)
  • Сервер отслеживания сохраняет метаданные выполнения (включая его корень артефакта) и возвращает клиенту объект Run
  • Код звонка пользователя log_artifact
  • Клиент регистрирует артефакты под корнем артефакта активного запуска

выпуск

Когда вы запускаете сервер MLflow через mlflow server --host 0.0.0.0 --file-store /mnt/mlruns/, сервер регистрирует метрики и параметры в /mnt/mlruns в контейнере Docker, а также возвращает пути артефактов в /mnt/mlruns клиенту. Затем клиент пытается зарегистрировать артефакты в /mnt/mlruns в локальной файловой системе , которая завершается ошибкой с PermissionError, с которым вы столкнулись.

Исправление

Наилучшим способом хранения артефактов на удаленном сервере отслеживания является настройка сервера для использования корня артефакта, доступного как для клиентов, так и для сервера (например, корзины S3 или URI хранилища BLOB-объектов Azure). Вы можете сделать это через mlflow server --default-artifact-root [artifact-root].

Обратите внимание, что сервер использует этот корень артефакта только при назначении корней артефактов для вновь созданных экспериментов - прогоны, созданные в существующих экспериментах, будут использовать корневой каталог артефакта в корне артефакта существующего эксперимента. См. Руководство по отслеживанию MLflow для получения дополнительной информации о настройке сервера отслеживания.

...