如何在 mlFlow 服务器上进行 运行 身份验证?

How to run authentication on a mlFlow server?

当我将我的整个模型和参数记录到 mlflow 中时,我认为用用户名和密码保护它是个好主意。

我使用以下代码运行 mlflow 服务器

mlflow server --host 0.0.0.0 --port 11111 工作完美,在我的浏览器中我输入 myip:11111 并且我看到了所有内容(这最终是问题所在)

如果我理解文档和以下 https://groups.google.com/forum/#!topic/mlflow-users/E9QW4HdS8a8 link 正确,我应该使用 nginx 来创建身份验证。

我安装了 nginx open sourcreapache2-utils

创建了 sudo htpasswd -c /etc/apache2/.htpasswd user1 个用户和密码。

我将 /etc/nginx/nginx.conf 编辑为以下内容:

server {
        listen 80;
        listen 443 ssl;

        server_name my_ip;
        root NOT_SURE_WHICH_PATH_TO_PUT_HERE, THE VENV?;
        location / {
            proxy_pass                      my_ip:11111/;
            auth_basic                      "Restricted Content";
            auth_basic_user_file /home/path to the password file/.htpasswd;
        }
    }

但没有显示身份验证。

如果我更改 conf 以收听 listen 11111 我得到一个端口已被使用的错误(当然,被 mlflow 服务器....)

我希望在任何人使用浏览器通过 mlflow 进入之前进行身份验证 window。

很乐意听到任何建议。

我认为你在 80 端口验证后转发到 11111。所以,你可以在浏览器中尝试my_ip:80

这里的问题是 mlflownginx 都试图 运行 在 同一个端口 ...

  1. 首先让我们来处理nginx:

    1.1 in /etc/nginx/sites-enable 创建一个新文件 sudo nano mlflow 并删除现有的默认值。

    mlflow 文件中的 1.2:

server {
    listen YOUR_PORT;
    server_name YOUR_IP_OR_DOMAIN;
    auth_basic           “Administrator’s Area”;
    auth_basic_user_file /etc/apache2/.htpasswd; #read the link below how to set username and pwd in nginx

    location / {
        proxy_pass http://localhost:8000;
        include /etc/nginx/proxy_params;
        proxy_redirect off;
    }
}

1.3。重启 nginx sudo systemctl restart nginx

  1. 在你的服务器上 运行 mlflow mlflow server --host localhost --port 8000

现在,如果您尝试在浏览器中访问 YOUR_IP_OR_DOMAIN:YOUR_PORT,则会出现一个身份验证弹出窗口,输入您的主机并通过,现在您将进入 mlflow

  1. 现在有 2 个选项可以告诉 mlflow 服务器:

    3.1 设置用户名和密码为环境变量 export MLFLOW_TRACKING_USERNAME=user export MLFLOW_TRACKING_PASSWORD=pwd

    3.2 在你的 /venv/lib/python3.6/site-packages/mlflowpackages/mlflow/tracking/_tracking_service/utils.py 函数中编辑

def _get_rest_store(store_uri, **_):
    def get_default_host_creds():
        return rest_utils.MlflowHostCreds(
            host=store_uri,
            username=replace with nginx user
            password=replace with nginx pwd
            token=os.environ.get(_TRACKING_TOKEN_ENV_VAR),
            ignore_tls_verification=os.environ.get(_TRACKING_INSECURE_TLS_ENV_VAR) == 'true',
        )

在您使用 mlflow 的 .py 文件中:

import mlflow
remote_server_uri = "YOUR_IP_OR_DOMAIN:YOUR_PORT" # set to your server URI
mlflow.set_tracking_uri(remote_server_uri)
mlflow.set_experiment("/my-experiment")
with mlflow.start_run():
    mlflow.log_param("a", 1)
    mlflow.log_metric("b", 2)

一个link到nginx认证文档https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/

如果您只想安装带有一些基本身份验证的 MLFlow,您可以使用 mlflow-easyauth 获得一个集成了 HTTP 基本身份验证 (username/password) 设置的 Docker 容器。它在引擎盖下使用 Nginx。使用环境变量配置身份验证详细信息。

免责声明:我是该项目的维护者

为了使用 nginx 为 mlflow 跟踪服务器设置身份验证,您基本上需要执行以下操作;

  1. 应该是nginx/nginx加上(但nginx会达到这个目的)
  2. 你需要打开两个端口,一个用于跟踪服务器到 运行 默认情况下(在你的情况下是 11111)另一个到 运行 带有密码保护的气流(比如 8080,它可以是任何必须由防火墙打开的端口)
  3. 使用命令 sudo htpasswd -c /etc/nginx/.htpasswd user_name/etc/nginx 目录下使用 htpasswd 实用程序创建 auth 文件,并在出现提示时输入密码。
  4. 确保您已将此文件的权限更改为 644,否则您的代理重定向将起作用,但您可能会在输入用户名和密码后遇到 500 错误,这是因为 auth 文件无法访问服务。

现在,您可以去sudo nano /etc/nginx/sites-enabled/default文件注释文件中的所有内容并创建一个单独的服务器块并放下以下配置,您想知道为什么需要单独编辑这个文件吗?那么我强烈建议您查看此讨论 Difference between sites-enabled and sites-available? 进行更改后,您的配置文件通常如下所示

server {
    listen 8080;

    location / {
        proxy_pass http://localhost:11111;

        auth_basic           "Administrator’s Area";
        auth_basic_user_file /etc/nginx/.htpasswd;

    }
}

完成上述操作后,您可以检查配置诊断,然后需要重新启动nginx服务器

sudo nginx -t
sudo service nginx restart

现在,您可以检查您的新端口,在您的情况下是 8080,希望它能正常工作。

您还必须为 mlflow 设置环境变量,以便在您 运行 训练作业时使用更新的凭据。 在您的代码中添加以下行,

import os

# Set username and password when authentication was added
os.environ['MLFLOW_TRACKING_USERNAME'] = <MLFLOW_TRACKING_USERNAME>
os.environ['MLFLOW_TRACKING_PASSWORD'] = <MLFLOW_TRACKING_PASSWORD> 

补充提示:

  1. 您还可以在配置中添加 ssl,这样您就可以使用 https 协议而不是 http,假设您有证书。如果你没有,你可以创建一个自签名的或使用一些免费工具,如 certibot 等..

那么你的配置会像这样,你必须在端口侦听部分下面添加这个证书;

listen 8080 ssl;

#server_name YOUR_IP_OR_DOMAIN;
ssl_certificate /etc/nginx/certificate/certificate.crt;
ssl_certificate_key /etc/nginx/certificate/certificate.key;
  1. 有时候,虽然你按照程序做了所有的事情,但认证可能没有反应。在这种情况下,您需要将 auth 文件的所有者从 root 更改为 'www-data user'。

希望这个 post 对首次设置和调试有所帮助。

谢谢。