【问题标题】:How to run authentication on a mlFlow server?如何在 mlFlow 服务器上运行身份验证?
【发布时间】:2020-03-16 07:05:49
【问题描述】:

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

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

mlflow server --host 0.0.0.0 --port 11111 完美运行,在我的浏览器中输入myip:11111,我看到了一切(这最终是问题所在)

如果我理解文档并且此处的https://groups.google.com/forum/#!topic/mlflow-users/E9QW4HdS8a8 链接正确,我应该使用 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 进入之前有一个身份验证窗口。

很乐意听到任何建议。

【问题讨论】:

  • 对于那些不想自己设置的读者,只需在 dagshub.com 上创建一个 repo 并使用用户名和密码开始登录到 https://dagshub.com/<user>/<repo>.mlflow

标签: nginx basic-authentication mlflow


【解决方案1】:

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

  1. 首先让我们处理 nginx:

    1.1 在 /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。重启nginxsudo 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)

nginx认证文档https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/的链接

【讨论】:

  • 感谢您的解决方案请替换您代码中的双引号。该字符在 linux 中无法识别并且正在引发错误。
  • 在设置跟踪 uri 之前,可以使用 os.environ['MLFLOW_TRACKING_USERNAME'] = 'userid' os.environ['MLFLOW_TRACKING_PASSWORD'] = 'password' 而不是更改 _get_rest_store
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    1. 应该是 nginx/nginx plus(但 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. 有时,尽管您按照程序做了所有事情,但身份验证可能无法反映。在这种情况下,您需要将身份验证文件的所有者从 root 更改为“www-data 用户”。

    希望这篇文章对第一次设置和调试时有所帮助。

    谢谢。

    【讨论】:

      【解决方案4】:

      我认为您在端口 80 进行身份验证后会转发到 11111。所以,您可以在浏览器中尝试 my_ip:80

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-08
        • 2019-11-06
        • 1970-01-01
        • 1970-01-01
        • 2013-09-20
        • 2018-05-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多