Files
2026-07-13 13:22:34 +08:00

67 lines
1.8 KiB
Python

import os
import uuid
import mlflow.server
class User:
MLFLOW_TRACKING_USERNAME = "MLFLOW_TRACKING_USERNAME"
MLFLOW_TRACKING_PASSWORD = "MLFLOW_TRACKING_PASSWORD"
def __init__(self, username, password) -> None:
self.username = username
self.password = password
self.env = {}
def _record_env_var(self, key):
if key := os.environ.get(key):
self.env[key] = key
def _restore_env_var(self, key):
if value := self.env.get(key):
os.environ[key] = value
else:
del os.environ[key]
def __enter__(self):
self._record_env_var(User.MLFLOW_TRACKING_USERNAME)
self._record_env_var(User.MLFLOW_TRACKING_PASSWORD)
os.environ[User.MLFLOW_TRACKING_USERNAME] = self.username
os.environ[User.MLFLOW_TRACKING_PASSWORD] = self.password
return self
def __exit__(self, *_exc):
self._restore_env_var(User.MLFLOW_TRACKING_USERNAME)
self._restore_env_var(User.MLFLOW_TRACKING_PASSWORD)
self.env.clear()
tracking_uri = "http://localhost:5000"
mlflow.set_tracking_uri(tracking_uri)
client = mlflow.server.get_app_client("basic-auth", tracking_uri)
A = User("user_a", "password_a")
B = User("user_b", "password_b")
with A:
exp_a = mlflow.set_experiment(uuid.uuid4().hex)
with mlflow.start_run():
mlflow.log_metric("a", 1)
with B:
mlflow.set_experiment(exp_a.name)
try:
with mlflow.start_run(): # not allowed
mlflow.log_metric("b", 2)
except Exception as e:
print(str(e))
# Grant B permission to edit A's experiment
with A:
client.create_experiment_permission(str(exp_a.experiment_id), B.username, "EDIT")
# B can edit now, should be able to log a metric
with B:
mlflow.set_experiment(exp_a.name)
with mlflow.start_run():
mlflow.log_metric("b", 2)