MLflow 认证

备注

此功能仍处于实验阶段,可能在未来的版本中无预警地进行更改。

MLflow 支持基本的HTTP认证,以实现对实验和注册模型的访问控制。一旦启用,任何访问者都需要登录后才能查看跟踪服务器中的任何资源。

MLflow 认证提供了用于管理用户和权限的 Python 和 REST API。

概述

要启用MLflow身份验证,请使用以下命令启动MLflow UI:

mlflow server --app-name basic-auth

服务器管理员可以随时通过不带 app-name 标志重启服务器来禁用此功能。任何创建的用户和权限将持久化在SQL数据库中,一旦功能重新启用,这些用户和权限将恢复服务。

由于HTTP认证的性质,它仅在远程跟踪服务器上受支持,用户通过REST API向服务器发送请求。

工作原理

权限

可用的权限包括:

权限

可以读取

可以更新

可以删除

可以管理

READ

编辑

MANAGE

NO_PERMISSIONS

所有用户的默认权限是 READ。可以在 配置文件 中更改。

可以为每个用户单独授予资源的权限。支持的资源包括 ExperimentRegistered Model。要访问API端点,用户必须具有所需的权限。否则,将返回 403 Forbidden 响应。

访问实验所需的权限:

API

端点

方法

所需权限

创建实验

2.0/mlflow/experiments/create

POST

获取实验

2.0/mlflow/experiments/get

GET

可以读取

按名称获取实验

2.0/mlflow/experiments/get-by-name

GET

可以读取

删除实验

2.0/mlflow/experiments/delete

POST

可以删除

恢复实验

2.0/mlflow/experiments/restore

POST

可以删除

更新实验

2.0/mlflow/experiments/update

POST

可以更新

搜索实验

2.0/mlflow/experiments/search

POST

搜索实验

2.0/mlflow/experiments/search

GET

设置实验标签

2.0/mlflow/experiments/set-experiment-tag

POST

可以更新

创建运行

2.0/mlflow/runs/create

POST

可以更新

获取运行

2.0/mlflow/runs/get

GET

可以读取

更新运行

2.0/mlflow/runs/update

POST

可以更新

删除运行

2.0/mlflow/runs/delete

POST

可以删除

恢复运行

2.0/mlflow/runs/restore

POST

可以删除

搜索运行

2.0/mlflow/runs/search

POST

设置标签

2.0/mlflow/runs/set-tag

POST

可以更新

删除标签

2.0/mlflow/runs/delete-tag

POST

可以更新

记录指标

2.0/mlflow/runs/log-metric

POST

可以更新

日志参数

2.0/mlflow/runs/log-parameter

POST

可以更新

日志批次

2.0/mlflow/runs/log-batch

POST

可以更新

日志模型

2.0/mlflow/runs/log-model

POST

可以更新

列出工件

2.0/mlflow/artifacts/list

GET

可以读取

获取指标历史

2.0/mlflow/metrics/get-history

GET

可以读取

访问已注册模型的所需权限:

API

端点

方法

所需权限

创建注册模型

2.0/mlflow/registered-models/create

POST

重命名已注册模型

2.0/mlflow/registered-models/rename

POST

可以更新

更新注册模型

2.0/mlflow/registered-models/update

PATCH

可以更新

删除已注册模型

2.0/mlflow/registered-models/delete

DELETE

可以删除

获取注册模型

2.0/mlflow/registered-models/get

GET

可以读取

搜索已注册模型

2.0/mlflow/registered-models/search

GET

获取最新版本

2.0/mlflow/registered-models/get-latest-versions

POST

可以读取

获取最新版本

2.0/mlflow/registered-models/get-latest-versions

GET

可以读取

设置已注册模型标签

2.0/mlflow/registered-models/set-tag

POST

可以更新

删除已注册模型标签

2.0/mlflow/registered-models/delete-tag

DELETE

可以更新

设置注册模型别名

2.0/mlflow/registered-models/alias

POST

可以更新

删除注册模型别名

2.0/mlflow/registered-models/alias

DELETE

可以删除

通过别名获取模型版本

2.0/mlflow/registered-models/alias

GET

可以读取

创建模型版本

2.0/mlflow/模型版本/创建

POST

可以更新

更新模型版本

2.0/mlflow/模型版本/更新

PATCH

可以更新

过渡模型版本阶段

2.0/mlflow/模型版本/过渡阶段

POST

可以更新

删除模型版本

2.0/mlflow/model-versions/delete

DELETE

可以删除

获取模型版本

2.0/mlflow/模型版本/获取

GET

可以读取

搜索模型版本

2.0/mlflow/模型版本/搜索

GET

获取模型版本下载URI

2.0/mlflow/model-versions/get-download-uri

GET

可以读取

设置模型版本标签

2.0/mlflow/模型版本/设置标签

POST

可以更新

删除模型版本标签

2.0/mlflow/model-versions/delete-tag

DELETE

可以删除

MLflow 认证引入了几个新的 API 端点来管理用户和权限。

API

端点

方法

所需权限

创建用户

2.0/mlflow/users/create

POST

获取用户

2.0/mlflow/users/get

GET

仅该用户可读

更新用户密码

2.0/mlflow/users/update-password

PATCH

仅可由该用户更新

更新用户管理

2.0/mlflow/users/update-admin

PATCH

仅限管理员

删除用户

2.0/mlflow/users/delete

DELETE

仅限管理员

创建实验权限

2.0/mlflow/experiments/permissions/create

POST

可以管理

获取实验权限

2.0/mlflow/experiments/permissions/get

GET

可以管理

更新实验权限

2.0/mlflow/experiments/permissions/update

PATCH

可以管理

删除实验权限

2.0/mlflow/experiments/permissions/delete

DELETE

可以管理

创建注册模型权限

2.0/mlflow/registered-models/permissions/create

POST

可以管理

获取注册模型权限

2.0/mlflow/registered-models/permissions/get

GET

可以管理

更新注册模型权限

2.0/mlflow/registered-models/permissions/update

PATCH

可以管理

删除已注册模型权限

2.0/mlflow/registered-models/permissions/delete

DELETE

可以管理

一些API的行为也将被修改。例如,实验的创建者将自动被授予对该实验的 MANAGE 权限,以便创建者可以授予或撤销其他用户对该实验的访问权限。

API

端点

方法

效果

创建实验

2.0/mlflow/experiments/create

POST

自动授予创建者 MANAGE 权限。

创建注册模型

2.0/mlflow/registered-models/create

POST

自动授予创建者 MANAGE 权限。

搜索实验

2.0/mlflow/experiments/search

POST

仅返回用户具有 READ 权限的实验。

搜索实验

2.0/mlflow/experiments/search

GET

仅返回用户具有 READ 权限的实验。

搜索运行

2.0/mlflow/runs/search

POST

仅返回用户具有 READ 权限的实验。

搜索已注册模型

2.0/mlflow/registered-models/search

GET

仅返回用户具有 READ 权限的已注册模型。

搜索模型版本

2.0/mlflow/模型版本/搜索

GET

仅返回用户具有 READ 权限的已注册模型。

权限数据库

所有用户和权限都存储在 basic_auth.db 数据库中,相对于启动 MLflow 服务器的目录。位置可以在 配置 文件中更改。要运行迁移,请使用以下命令:

python -m mlflow.server.auth db upgrade --url <database_url>

管理员用户

管理员用户对所有 MLflow 资源拥有无限制的访问权限,包括创建或删除用户、更新其他用户的密码和管理员状态、授予或撤销其他用户的权限,以及管理所有 MLflow 资源的权限, 即使 NO_PERMISSIONS 明确设置给该管理员账户。

MLflow 有一个内置的管理员用户,该用户将在首次启用 MLflow 认证功能时创建。

备注

建议在创建后尽快更新默认管理员密码。

默认的管理员用户凭证如下:

用户名

密码

admin

password

通过使用 2.0/mlflow/users/update-admin 端点,可以将其他用户提升为管理员,从而存在多个管理员用户。

示例
# authenticate as built-in admin user
export MLFLOW_TRACKING_USERNAME=admin
export MLFLOW_TRACKING_PASSWORD=password
from mlflow.server import get_app_client

tracking_uri = "http://localhost:5000/"

auth_client = get_app_client("basic-auth", tracking_uri=tracking_uri)
auth_client.create_user(username="user1", password="pw1")
auth_client.update_user_admin(username="user1", is_admin=True)

管理权限

MLflow 提供了 REST API 和一个客户端类 AuthServiceClient 来管理用户和权限。要实例化 AuthServiceClient,建议使用 mlflow.server.get_app_client()

示例
export MLFLOW_TRACKING_USERNAME=admin
export MLFLOW_TRACKING_PASSWORD=password
from mlflow import MlflowClient
from mlflow.server import get_app_client

tracking_uri = "http://localhost:5000/"

auth_client = get_app_client("basic-auth", tracking_uri=tracking_uri)
auth_client.create_user(username="user1", password="pw1")
auth_client.create_user(username="user2", password="pw2")

client = MlflowClient(tracking_uri=tracking_uri)
experiment_id = client.create_experiment(name="experiment")

auth_client.create_experiment_permission(
    experiment_id=experiment_id, username="user2", permission="MANAGE"
)

验证到 MLflow

使用 MLflow UI

当用户首次在浏览器中访问MLflow UI时,系统会提示他们登录。登录尝试次数没有限制。

目前,MLflow UI 不显示任何关于当前用户的信息。一旦用户登录,唯一的注销方式是关闭浏览器。

../_images/auth_prompt.png

使用环境变量

MLflow 提供了两个用于认证的环境变量:MLFLOW_TRACKING_USERNAMEMLFLOW_TRACKING_PASSWORD。要使用基本认证,您必须设置这两个环境变量。

export MLFLOW_TRACKING_USERNAME=username
export MLFLOW_TRACKING_PASSWORD=password
import mlflow

mlflow.set_tracking_uri("https://<mlflow_tracking_uri>/")
with mlflow.start_run():
    ...

使用凭证文件

您可以将凭证保存在文件中,以避免每次都需要设置环境变量。凭证应使用 INI 格式保存在 ~/.mlflow/credentials 中。请注意,密码将以未加密的形式存储在磁盘上,仅受文件系统权限保护。

如果环境变量 MLFLOW_TRACKING_USERNAMEMLFLOW_TRACKING_PASSWORD 已配置,它们将覆盖凭据文件中提供的任何凭据。

凭证文件格式
[mlflow]
mlflow_tracking_username = username
mlflow_tracking_password = password

使用 REST API

用户可以使用 HTTP Authorization 请求头进行身份验证。更多信息请参见 https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication

在 Python 中,你可以使用 requests 库:

import requests

response = requests.get(
    "https://<mlflow_tracking_uri>/",
    auth=("username", "password"),
)

创建新用户

重要

要创建新用户,您需要使用管理员权限进行身份验证。

使用 MLflow UI

MLflow UI 提供了一个简单的页面用于创建新用户,位于 <tracking_uri>/signup

../_images/auth_signup_form.png

使用 REST API

或者,您可以向 Tracking Server 端点 2.0/users/create 发送 POST 请求。

在 Python 中,你可以使用 requests 库:

import requests

response = requests.post(
    "https://<mlflow_tracking_uri>/api/2.0/mlflow/users/create",
    json={
        "username": "username",
        "password": "password",
    },
)

使用 MLflow AuthServiceClient

MLflow AuthServiceClient 提供了一个轻松创建新用户的功能。

import mlflow

auth_client = mlflow.server.get_app_client(
    "basic-auth", tracking_uri="https://<mlflow_tracking_uri>/"
)
auth_client.create_user(username="username", password="password")

配置

认证配置位于 mlflow/server/auth/basic_auth.ini:

变量

描述

default_permission

所有资源的默认权限

database_uri

存储权限和用户数据的数据库位置

admin_username

如果管理员尚未创建,默认的管理员用户名

admin_password

如果管理员尚未创建,默认管理员密码

authorization_function

验证请求的函数

或者,将环境变量 MLFLOW_AUTH_CONFIG_PATH 指定为指向您的自定义配置文件。

authorization_function 设置支持可插拔的认证方法,如果你想使用除HTTP基本认证之外的其他认证方法。该值指定 module_name:function_name。该函数具有以下签名:

def authenticate_request() -> Union[Authorization, Response]:
    ...

如果请求已认证,函数应返回一个 werkzeug.datastructures.Authorization 对象;如果请求未认证,则应返回一个 Response 对象(通常是 401: 未授权)。有关如何实现自定义认证方法的示例,请参见 tests/server/auth/jwt_auth.py注意: 此示例不适用于生产环境。

连接到集中式数据库

默认情况下,MLflow 认证使用本地 SQLite 数据库来存储用户和权限数据。在多节点部署的情况下,建议使用集中式数据库来存储这些数据。

要连接到集中式数据库,可以将 database_uri 配置变量设置为数据库URL。

示例: /path/to/my_auth_config.ini
[mlflow]
database_uri = postgresql://username:password@hostname:port/database

然后,启动 MLflow 服务器,并将 MLFLOW_AUTH_CONFIG_PATH 环境变量设置为您的配置文件路径。

MLFLOW_AUTH_CONFIG_PATH=/path/to/my_auth_config.ini mlflow server --app-name basic-auth

在启动 MLflow 服务器之前,必须先创建数据库。数据库模式将在服务器启动时自动创建。

自定义认证

MLflow 认证设计为可扩展的。如果你的组织需要更高级的认证逻辑(例如,基于令牌的认证),可以安装第三方插件或创建自己的插件。

你的插件应该是一个可安装的Python包。它应该包含一个扩展MLflow应用的应用工厂,并且可以选择性地实现一个管理权限的客户端。应用工厂函数的名称将被传递给Flask CLI中的``–app``参数。更多信息请参见https://flask.palletsprojects.com/en/latest/cli/#application-discovery。

示例: my_auth/__init__.py
from flask import Flask
from mlflow.server import app


def create_app(app: Flask = app):
    app.add_url_rule(...)
    return app


class MyAuthClient:
    ...

然后,插件应该安装在你的 Python 环境中:

pip install my_auth

然后,在 mlflow/setup.py 中注册你的插件:

setup(
    ...,
    entry_points="""
        ...

        [mlflow.app]
        my-auth=my_auth:create_app

        [mlflow.app.client]
        my-auth=my_auth:MyAuthClient
    """,
)

然后,您可以启动 MLflow 服务器:

mlflow server --app-name my-auth