译者|朱宪忠评论|SunShujuan简介ML模型生命周期开发的每个阶段的基本活动之一是协作。从概念到部署ML模型需要参与构建模型的不同参与者之间的参与和交互。此外,ML模型开发的本质涉及实验、工件和指标跟踪、模型版本控制等,所有这些都需要高效的组织来正确维护ML模型生命周期。幸运的是,已经有像MLflow这样的工具来开发和维护模型生命周期。在本文中,我们将详细剖析MLflow,包括对其主要组件和功能的分析。此外,我们将提供示例来说明MLflow在实践中的工作原理。什么是机器学习流?MLflow是一种开源工具,用于在ML模型生命周期的每个阶段进行开发、维护和协作。此外,MLflow是一个与框架无关的工具;因此,任何ML/DL(机器学习/深度学习)框架都可以快速适应MLflow提出的生态系统。MLflow作为一个平台提供了一组用于跟踪指标、工件、元数据等的工具。此外,它还支持用于打包、分发和部署模型和项目的标准格式。MLflow还提供了用于管理模型版本的工具。这些工具封装在以下四个主要组件中:MLflowTracking(跟踪)MLflowModels(模型)MLflowProjects(项目)MLflowRegistry(注册表)MLflowTrackingMLflowTracking是一个基于API的工具,用于记录指标、参数、模型版本、代码版本和文件。MLflow跟踪与用于可视化和管理工件、模型、文件等的UI集成。其中,每个MLflowtracesession都是在run的概念下组织和管理的。Run是指代码的执行;显式执行工件日志记录部分的位置。MLflow跟踪允许您通过Python、R、Java和MLflow提供的RESTAPI等语言生成运行。默认情况下,运行存储在执行代码会话的目录中。但是,MLflow还允许在本地或远程服务器上存储工件。MLflow模型MLflow模型允许将机器学习模型打包成标准格式,以便通过RESTAPI、MicrosoftAzureML、AmazonSageMaker或ApacheSpark等不同服务直接使用。MLflow模型合约的优点之一是包装是多语言或多口味支持。【译者注】在MLflow中经常会遇到“风味”这个词,主要是指对多种语言、多种类型的组件和库的广泛支持,通过下图的配置文件不难看出。在这里,本文统一直译为“风味”。在打包方面,MLflow会生成一个包含两个文件的目录,一个用于模型,一个指定模型打包和加载的细节。例如,下面的代码片段显示了指定风味加载器的MLmodel文件和定义环境的“conda.yaml”文件的内容。artifact_path:modelflavors:python_function:env:conda.yamlloader_module:MLflow.sklearnmodel_path:model.pklpython_version:3.8.2sklearn:pickled_model:model.pklserialization_format:cloudpicklesklearn_version:0.24.2run_id:39c46969dc7b4154b8408a8f5dut0ctime-929-923:24:21.753565'MLflow项目MLflow项目为打包、共享和重用机器学习项目提供了一种标准格式。每个项目可以是远程存储库或本地目录。与MLflow模型不同,MLflow项目旨在实现机器学习项目的可移植性和分发。MLflow项目由名为“MLProject”的YAML声明文件定义,该文件公开了相应项目的一组规范内容。模型实现的关键特征在MLProject文件中指定,这些特征包括:模型接收的输入参数的数据类型,用于执行所述模型命令的参数,以及项目运行的环境代码下面的代码片段是一个MLProject文件的例子,要实现的模型是决策树的形式,它唯一的参数对应树的深度,默认值为2。name:example-decision-treeconda_env:conda.yamlentry_points:main:parameters:tree_depth:{type:int,default:2}command:"pythonmain.py{tree_depth}"同样,MLflow提供了一个CLI(命令行接口,命令行界面)来运行位于本地服务器或远程存储库上的项目。以下代码片段显示了如何从本地服务器或远程存储库运行项目的示例:$mlflowrunmodel/example-decision-tree-Ptree_depth=3$mlflowrungit@github.com:FernandoLpz/MLflow-example.git-Ptree_depth=3在这两个示例中,环境都是根据MLProject文件规范生成的。触发模型的命令将在命令行传递的参数下执行。由于模型允许输入参数,因此可以通过“-P”标志指定这些参数。在这两个例子中,模型参数指的是决策树的最大深度。默认情况下,示例中所示的运行会将工件存储在名为“.mlruns”的目录中。如何在MLflow服务器中存储工件?实现MLflow时最常见的用例之一是使用MLflow服务器记录指标和工件。MLflow服务器负责管理MLflow客户端生成的工件和文件。这些工件可以存储在从文件目录到远程数据库的不同存储方案中。例如,要在本地运行MLflow服务器,我们可以键入以下命令:$mlflowserver上面的命令将通过IP地址http://127.0.0.1:5000/启动MLflow服务。要存储工件和指标,请在客户端会话中定义服务器的跟踪URI。在下面的代码片段中,我们看到了MLflow服务器中工件存储的基本实现:importMLflowremote_server_uri="http://127.0.0.1:5000"log_param("test-param",1)MLflow.log_metric("test-metric",2)其中命令“MLflow.set_tracking_uri()”负责设置服务器的位置。如何在MLflow服务器中执行身份验证?在没有身份验证的情况下公开服务器可能会有风险。所以,添加鉴权是很有必要的,当然也很方便。身份验证将取决于您将在其中部署服务器的生态系统:在本地服务器上,添加基于用户和密码的基本身份验证就足够了在远程服务器上,必须使用相应的代理调整凭据数据。为了解决这些问题,让我们看一个使用基本身份验证(用户名和密码)部署的MLflow服务器的示例。此外,我们还将了解如何配置客户端以使用此服务器。示例:MLflow服务器身份验证在此示例中,我们通过Nginx反向代理将基本用户和密码身份验证应用于MLflow服务器。让我们从Nginx的安装开始,我们可以通过以下方式安装:#对于基于darwin的OS$brewinstallnginx#对于基于debian的OS$apt-getinstallnginx#对于基于redhat的OS$yuminstallnginx对于Windows操作系统,你必须使用本机Win32API。您可以按照链接(https://nginx.org/en/docs/windows.html)中的详细说明进行操作,此处省略介绍。安装结束后,我们继续使用“htpasswd”命令生成一个用户,对应密码如下:sudohtpasswd-c/usr/local/etc/nginx/.htpasswdMLflow-user上面的命令是“.htpasswd”为nginx服务生成文件中指定的名为“mlflow-user”的用户的凭据。稍后,要在创建的用户凭据下定义代理,请使用配置文件“/usr/local/etc/nginx/nginx.conf”定义它,默认情况下具有以下内容:server{listen8080;服务器名称本地主机;#字符集koi8-r;#access_loglogs/host.access.logmain;位置/{根html;indexindex.htmlindex.htm;}它必须看起来像这样:server{#listen8080;#server_name本地主机;#字符集koi8-r;#access_loglogs/host.access.logmain;位置/{proxy_passhttp://localhost:5000;auth_basic"限制内容";auth_basic_user_file/usr/local/etc/nginx/.htpasswd;在这里,我们通过端口5000为localhost定义了一个身份验证代理。这是默认部署MLflow服务器的IP地址和端口号。请注意,使用云类型提供商时,您必须配置实施所需的凭据和代理。接下来,开始初始化MLflow服务器,如以下代码片段所示:$MLflowserver--hostlocalhost当尝试在浏览器中访问http://localhost时,将通过创建的用户名和密码请求身份验证。图1:登录屏幕输入您的凭据后,您将被导航到MLflow服务器用户界面,如图2所示。图2:MLflow服务器UI要从客户端将数据存储在MLflow服务器中,您必须:定义一个环境变量,其中包含用于访问服务器的凭据设置存储工件的URI对于凭据,我们将导出以下环境变量:$exportMLflow_TRACKING_USERNAME=MLflow-user$exportMLflow_TRACKING_PASSWORD=MLflow-password一旦定义了环境变量,只需要定义工件存储的服务器URI。导入MLflow#定义MLflow服务器URIremote_server_uri="http://localhost"MLflow.set_tracking_uri(remote_server_uri)withMLflow.start_run():MLflow.log_param("test-param",2332)MLflow.log_metric("test-metric",1144)当执行上面的代码片段时,我们可以看到服务器上反映的测试指标和参数。图3:如何使用从客户端服务存储的指标和参数注册MLflow模型,并在服务器上进行身份验证?开发机器学习模型的日常要求是维护模型版本中的顺序。为此,MLflow提供了MLflowRegistry。MLflowRegistry是一个扩展,有助于:管理每个MLModel的版本,并记录每个模型在三个不同开发阶段的进度:存档、暂存和生产。它与Git中的版本系统非常相似。注册模型有四个选项:通过UI使用“MLflow.register_model()”方法作为“MLflow.
