MLflow 身份驗證¶
Note
此功能仍處於實驗階段,可能會在未來版本中更改。
概述¶
若要啟用 MLflow 身份驗證,請使用下列命令啟動 MLflow UI:
MLflow Tracking service 管理員可以隨時透過重新啟動 tracking service 來選擇停用此功能。建立的任何使用者和權限都將保留在 SQL 資料庫中,並在重新啟用該功能後重新投入使用。
由於 HTTP 身份驗證的性質,它僅支持 Remote Tracking Server,其中用戶透過 REST API 向伺服器發送請求。
運作設計¶
權限¶
可用的權限有:
Permission | Can read | Can update | Can delete | Can manage |
---|---|---|---|---|
READ | Yes | No | No | No |
EDIT | Yes | Yes | No | No |
MANAGE | Yes | Yes | Yes | Yes |
NO_PERMISSIONS | No | No | No | No |
所有使用者的預設權限都是 READ。這個預設的設定可以在設定檔中更改。
可以為每個使用者授予對單獨資源的權限。支援的資源包括 Experiment
和 Registered Model
。要存取 API 端點,使用者必須擁有所需的權限。否則,將傳回 403 Forbidden 回應。
存取 Experiment
所需的權限:
API | Endpoint | Method | Required permission |
---|---|---|---|
Create Experiment | 2.0/mlflow/experiments/create | POST | None |
Get Experiment | 2.0/mlflow/experiments/get | GET | can_read |
Get Experiment By Name | 2.0/mlflow/experiments/get-by-name | GET | can_read |
Delete Experiment | 2.0/mlflow/experiments/delete | POST | can_delete |
Restore Experiment | 2.0/mlflow/experiments/restore | POST | can_delete |
Update Experiment | 2.0/mlflow/experiments/update | POST | can_update |
Search Experiments | 2.0/mlflow/experiments/search | POST | None |
Search Experiments | 2.0/mlflow/experiments/search | GET | None |
Set Experiment Tag | 2.0/mlflow/experiments/set-experiment-tag | POST | can_update |
Create Run | 2.0/mlflow/runs/create | POST | can_update |
Get Run | 2.0/mlflow/runs/get | GET | can_read |
Update Run | 2.0/mlflow/runs/update | POST | can_update |
Delete Run | 2.0/mlflow/runs/delete | POST | can_delete |
Restore Run | 2.0/mlflow/runs/restore | POST | can_delete |
Search Runs | 2.0/mlflow/runs/search | POST | None |
Set Tag | 2.0/mlflow/runs/set-tag | POST | can_update |
Delete Tag | 2.0/mlflow/runs/delete-tag | POST | can_update |
Log Metric | 2.0/mlflow/runs/log-metric | POST | can_update |
Log Param | 2.0/mlflow/runs/log-parameter | POST | can_update |
Log Batch | 2.0/mlflow/runs/log-batch | POST | can_update |
Log Model | 2.0/mlflow/runs/log-model | POST | can_update |
List Artifacts | 2.0/mlflow/artifacts/list | GET | can_read |
Get Metric History | 2.0/mlflow/metrics/get-history | GET | can_read |
存取 Registered Model
所需的權限:
API | Endpoint | Method | Required permission |
---|---|---|---|
Create Registered Model | 2.0/mlflow/registered-models/create | POST | None |
Rename Registered Model | 2.0/mlflow/registered-models/rename | POST | can_update |
Update Registered Model | 2.0/mlflow/registered-models/update | PATCH | can_update |
Delete Registered Model | 2.0/mlflow/registered-models/delete | DELETE | can_delete |
Get Registered Model | 2.0/mlflow/registered-models/get | GET | can_read |
Search Registered Models | 2.0/mlflow/registered-models/search | GET | None |
Get Latest Versions | 2.0/mlflow/registered-models/get-latest-versions | POST | can_read |
Get Latest Versions | 2.0/mlflow/registered-models/get-latest-versions | GET | can_read |
Set Registered Model Tag | 2.0/mlflow/registered-models/set-tag | POST | can_update |
Delete Registered Model Tag | 2.0/mlflow/registered-models/delete-tag | DELETE | can_update |
Set Registered Model Alias | 2.0/mlflow/registered-models/alias | POST | can_update |
Delete Registered Model Alias | 2.0/mlflow/registered-models/alias | DELETE | can_delete |
Get Model Version By Alias | 2.0/mlflow/registered-models/alias | GET | can_read |
Create Model Version | 2.0/mlflow/model-versions/create | POST | can_update |
Update Model Version | 2.0/mlflow/model-versions/update | PATCH | can_update |
Transition Model Version Stage | 2.0/mlflow/model-versions/transition-stage | POST | can_update |
Delete Model Version | 2.0/mlflow/model-versions/delete | DELETE | can_delete |
Get Model Version | 2.0/mlflow/model-versions/get | GET | can_read |
Search Model Versions | 2.0/mlflow/model-versions/search | GET | None |
Get Model Version Download Uri | 2.0/mlflow/model-versions/get-download-uri | GET | can_read |
Set Model Version Tag | 2.0/mlflow/model-versions/set-tag | POST | can_update |
Delete Model Version Tag | 2.0/mlflow/model-versions/delete-tag | DELETE | can_delete |
MLflow 身份驗證引入了幾個新的 API 端點來管理使用者和權限。
API | Endpoint | Method | Required permission |
---|---|---|---|
Create User | 2.0/mlflow/users/create | POST | None |
Get User | 2.0/mlflow/users/get | GET | Only readable by that user |
Update User Password | 2.0/mlflow/users/update-password | PATCH | Only updatable by that user |
Update User Admin | 2.0/mlflow/users/update-admin | PATCH | Only admin |
Delete User | 2.0/mlflow/users/delete | DELETE | Only admin |
Create Experiment Permission | 2.0/mlflow/experiments/permissions/create | POST | can_manage |
Get Experiment Permission | 2.0/mlflow/experiments/permissions/get | GET | can_manage |
Update Experiment Permission | 2.0/mlflow/experiments/permissions/update | PATCH | can_manage |
Delete Experiment Permission | 2.0/mlflow/experiments/permissions/delete | DELETE | can_manage |
Create Registered Model Permission | 2.0/mlflow/registered-models/permissions/create | POST | can_manage |
Get Registered Model Permission | 2.0/mlflow/registered-models/permissions/get | GET | can_manage |
Update Registered Model Permission | 2.0/mlflow/registered-models/permissions/update | PATCH | can_manage |
Delete Registered Model Permission | 2.0/mlflow/registered-models/permissions/delete | DELETE | can_manage |
有一些 API 權限會被幾個 API 觸發的結果而被修改。例如,Experiment
的創建者將自動被授予對該實驗的 MANAGE 權限,以便創建者可以授予或撤銷其他使用者對該 Experiment
的存取權限。
API | Endpoint | Method | Effect |
---|---|---|---|
Create Experiment | 2.0/mlflow/experiments/create | POST | 自動向建立者授予 MANAGE 權限。 |
Create Registered Model | 2.0/mlflow/registered-models/create | POST | 自動向建立者授予 MANAGE 權限。 |
Search Experiments | 2.0/mlflow/experiments/search | POST | 僅傳回使用者具有 READ 權限的實驗。 |
Search Experiments | 2.0/mlflow/experiments/search | GET | 僅傳回使用者具有 READ 權限的實驗。 |
Search Runs | 2.0/mlflow/runs/search | POST | 僅傳回使用者具有 READ 權限的實驗。 |
Search Registered Models | 2.0/mlflow/registered-models/search | GET | 僅傳回使用者具有 READ 權限的註冊模型。 |
Search Model Versions | 2.0/mlflow/model-versions/search | GET | 僅傳回使用者具有 READ 權限的註冊模型。 |
權限資料庫¶
所有使用者和權限都儲存在 basic_auth.db
中的資料庫中,相對於 MLflow 伺服器啟動的目錄。可以在設定檔中變更該位置。若要執行 db migration,請使用下列命令:
Tip
由於 MLflow 使用 sqlalchemy 來存取資料庫, 因此 <database_url>
需要根據不同的後端資料庫來進行定義與安裝相關連接資料庫的套件。 參考: SqlAlchemy - Database URLs 文件
Admin Users¶
Admin 使用者可以不受限制地存取所有 MLflow 資源,包括建立或刪除使用者、更新其他使用者的密碼和管理狀態、授予或撤銷其他使用者的權限以及管理所有 MLflow 資源的權限,即使為該管理員明確設定 NO_PERMISSIONS 也是如此帳戶。
MLflow 有一個內建管理員用戶,該用戶將在首次啟用 MLflow 身份驗證功能時建立。
Note
建議您在建立後儘快更新預設管理員密碼。
預設管理員使用者憑證如下:
Username | Password |
---|---|
admin | password |
透過使用 2.0/mlflow/users/update-admin
端點可將其他使用者提升為管理員,MLflow 可以存在多個管理員使用者。
環境變數:
# 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()
。
環境變數:
# authenticate as built-in admin user
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 不顯示有關目前使用者的任何資訊。用戶登入後,登出的唯一方法是關閉瀏覽器。
使用環境變數¶
MLflow 提供兩個用於驗證的環境變數:MLFLOW_TRACKING_USERNAME
和 MLFLOW_TRACKING_PASSWORD
。若要使用 basic authentication 模組,您必須設定這兩個環境變數。
環境變數:
# authenticate as built-in admin user
export MLFLOW_TRACKING_USERNAME=admin
export MLFLOW_TRACKING_PASSWORD=password
程式範例:
import mlflow
mlflow.set_tracking_uri("https://<mlflow_tracking_uri>/")
with mlflow.start_run():
...
使用憑證文件¶
您可以將憑證保存在文件中,從而無需每次都設定環境變數。憑證應使用 INI 格式儲存在 ~/.mlflow/credentials
中。請注意,密碼將以未加密的方式儲存在磁碟上,並且僅受檔案系統權限的保護。
如果配置了環境變數 MLFLOW_TRACKING_USERNAME
和 MLFLOW_TRACKING_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"),
)
建立新用戶¶
Info
若要建立新用戶,您需要使用管理員權限進行身份驗證。
使用 MLflow UI¶
MLflow UI 提供了一個簡單的頁面,用於在 <tracking_uri>/signup
處建立新使用者。
使用 REST API¶
或者,您可以將 POST 請求傳送到追蹤伺服器端點 2.0/users/create
。
在 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 身份驗證模組的配置檔案位於 mlflow/server/auth/basic_auth.ini:
[mlflow]
default_permission = READ
database_uri = sqlite:///basic_auth.db
admin_username = admin
admin_password = password
authorization_function = mlflow.server.auth:authenticate_request_basic_auth
Variable | Description |
---|---|
default_permission | 所有資源的預設權限, 從 MLflow 源始設定檔可得知預設權限的設定是 READ。 對於多團隊共同使用同一個 Tracking Service 的情境, 建議設定為 NO_PERMISSIONS。 |
database_uri | 儲存權限和使用者資料的資料庫位置, 參考: SqlAlchemy - Database URLs |
admin_username | 預設管理員使用者名稱 |
admin_password | 預設管理員使用者密碼 |
authorization_function | 驗證請求的配置函數 |
Tip
PostgreSQL PostgreSQL dialect 使用 psycopg2
作為預設 DBAPI。建議先進行下列套件的安裝:
連接字串範例:
# default
engine = create_engine("postgresql://scott:tiger@localhost/mydatabase")
# psycopg2
engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/mydatabase")
有關連接到 PostgreSQL 的更多說明,請參閱 PostgreSQL。
MySQL MySQL dialect 使用 mysqlclient
作為預設 DBAPI。建議先進行下列套件的安裝:
連接字串範例:
或者,指派環境變數 MLFLOW_AUTH_CONFIG_PATH 以指向您的自訂設定檔。
如果您想要使用 HTTP basic auth 之外的其他的身份驗證方法,則 authorization_function
設定支援可插入客制化的身份驗證方法。該值的設定結構是 module_name:function_name
。此函數具有以下 input/oput 參數與回傳結果:
如果請求經過驗證,函數應傳回 werkzeug.datastructs.Authorization
物件;如果請求未經過驗證,則該函數應傳回 Response 物件(通常為 401:未經授權
)。有關如何實作自訂驗證方法的範例,請參閱 tests/server/auth/jwt_auth.py。注意:此範例不適用於生產用途。
連接到資料庫¶
預設情況下,MLflow 身份認證模組使用本機 SQLite 資料庫來儲存使用者和權限資料。在多節點部署的情況下,建議使用集中式資料庫來儲存這些資料。
若要連接到集中式資料庫,您可以將 database_uri
配置變數設定為資料庫 URL。
Example: /path/to/my_auth_config.ini
然後,啟動 MLflow Tracking Service,並將 MLFLOW_AUTH_CONFIG_PATH
環境變數設定為設定檔的路徑。
必須在啟動 MLflow Tracking Service 之前先建立好資料庫。資料庫 schema 則會在 Tracking Service 啟動時自動建立。
客制化身份認證¶
MLflow 身份驗證設計為可擴充的。如果您的組織需要更進階的身份驗證邏輯(例如基於 token 的身份驗證),可以安裝第三方外掛程式或建立您自己的外掛程式。
您的插件應該是可安裝的 Python 套件。它應該包括一個擴展 MLflow 應用程式的應用程式工廠,並且可以選擇實現一個客戶端來管理權限。應用程式工廠函數名稱將傳遞給 Flask CLI 中的 --app
參數。請參閱 Flask application-discovery 以了解更多資訊。
Example: 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 環境中:
然後,在 mlflow/setup.py
中註冊您的外掛程式:
setup(
...,
entry_points="""
...
[mlflow.app]
my-auth=my_auth:create_app
[mlflow.app.client]
my-auth=my_auth:MyAuthClient
""",
)
然後,您可以啟動 MLflow 伺服器: