当前位置: 首页 > 科技观察

在MLFlowinAction中打包和部署机器学习模型_0

时间:2023-03-15 15:00:12 科技观察

译者|朱宪忠评论|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..log_model()”的参数,或使用“create_registered_model()”客户端API。在以下示例中,“MLflow..log_model()”方法用于注册模型:withMLflow.start_run():model=DecisionTreeModel(max_depth=max_depth)model.load_data()model.train()模型.evaluate()MLflow.log_param("tree_depth",max_depth)MLflow.log_metric("precision",model.precision)MLflow.log_metric("recall",model.recall)MLflow.log_metric("accuracy",model.accuracy)#注册模型MLflow.sklearn.log_model(model.tree,"MyModel-dt",registered_model_name="DecisionTree")如果是新模型,MLFlow将其初始化为版本1。如果模型是版本化的,则为初始化为版本2(或更高版本)。默认情况下,注册模型时,分配的状态为无。要将状态分配给已注册的模型,我们可以通过以下方式完成:client=MLflowClient()client.transition_model_version_stage(name="DecisionTree",version=2,stage="Staging")在上面的代码片段中,决策版本2的树模型被分发到仿真环境(staging)。在服务器UI中,我们可以看到如图4所示的状态:图4:注册模型为了实现模型服务,我们可以使用MLflowCLI。为此,我们只需要服务器URI、模型名称和模型状态等信息,如下:$exportMLflow_TRACKING_URI=http://localhost$mlflowmodelsserve-m"models:/MyModel-dt/Production"model服务和发帖请求$curlhttp://localhost/Invocations-H'content-type:application/json'-d'{“inputs”:在上面的代码片段中,向服务模型的地址发出了POST请求。请求中传递了一个五元素数组,这是模型期望作为推理输入的内容。在这种情况下,预测结果为1。需要指出的是,MLFlow允许通过实现签名在“MLmodel”文件中定义用于推理的数据结构。另外,通过请求传递的数据可以是不同类型的,可以参考链接(https://www.mlflow.org/docs/latest/_modules/mlflow/models/signature.html)。前面示例的完整实现可以在以下链接找到:https://github.com/FernandoLpz/MLFlow-exampleMLflow插件是由于MLflow框架的不可知性,导致了MLflow插件的出现.该插件的主要功能是将MLflow的功能以自适应的方式扩展到不同的框架中。MLflow插件允许针对特定平台自定义和调整工件的部署和存储。例如,以下是用于特定平台部署的插件:MLflow-redisai:它允许创建和部署在MLflow中创建和管理的模型到RedisAI(https://oss.redislabs.com/redisai/)MLflow-torchserve:启用PyTorch模型可以直接部署到torchserve(https://github.com/pytorch/serve)MLflow-algorithmia:允许将使用MLflow创建和管理的模型部署到Algorithmia(https://algorithmia.com/)基础设施MLflow-ray-serve:支持部署MLflow模型到Ray(https://docs.ray.io/en/master/serve/)基础设施另一方面,为了管理MLflow项目,我们还提供了MLflow-yarn,它是一个管理MLProject的插件,支持Hadoop/Yarn。对于MLflow跟踪的自定义,我们有MLflow-elasticsearchstore,它允许在Elasticsearch环境中管理MLflow跟踪扩展。同样,提供了特定的插件来支持部署到AWS和Azure等平台,它们是:MLflow.sagemaker和MLflow.azureml必须提到的是,MLflow提供了根据需要创建和自定义插件的能力。MLflow和Kubeflow的比较由于对开发和维护机器学习模型生命周期的工具的需求越来越大,出现了不同的管理方案,例如MLflow和KubeFlow等。正如我们在本文中看到的,MLflow是一个工具它允许在开发机器学习模型的生命周期中进行协作,主要关注跟踪工件(MLflowTracking)、协作、维护和项目版本控制。另一方面,类似的工具是Kubeflow,它和MLflow一样,是开发具有特定差异的机器学习模型的工具。Kubeflow是一个运行在Kubernetes集群上的平台;也就是说,Kubeflow利用了Kubernetes的容器化特性。此外,Kubeflow还提供了Kubeflow管道等工具,旨在通过SDK扩展生成和自动化管道(DAG)。此外,Kubeflow还提供了Katib,这是一种用于大规模优化超参数的工具,并为Jupyter笔记本提供管理和协作服务。具体来说,MLflow是一个专注于机器学习项目开发的管理和协作工具。另一方面,Kubeflow是一个专注于通过Kubernetes集群和使用容器开发、训练和部署模型的平台。这两个平台都具有明显的优势,并且是开发、维护和部署机器学习模型的选择。然而,在开发团队中使用、实施和集成这些技术时,必须考虑相应的技术障碍。由于Kubeflow需要连接到Kubernetes集群以进行实施和集成,因此建议专家管理该技术。同样,开发和配置管道自动化是一项挑战,需要学习曲线,并且在特定情况下可能对公司不利。总之,MLflow和Kubeflow都是专注于机器学习模型生命周期特定阶段的平台。MLflow是一个面向协作的工具,而Kubeflow更倾向于使用Kubernetes集群来生成机器学习任务。但是,Kubeflow需要MLOps部分的经验。您需要了解Kubernetes中的服务部署,这可能是尝试使用Kubeflow时需要考虑的因素。译者介绍朱宪忠,社区编辑,专家博主,讲师,潍坊某高校计算机教师,自由编程资深人士。早期专注于各种微软技术(编译成三本与ASP.NETAJX和Cocos2d-X相关的技术书籍)。/ESP32/RaspberryPi等物联网开发技术和Scala+Hadoop+Spark+Flink等大数据开发技术。原标题:HowtoPackageandDistributeMachineLearningModelswithMLFlow,作者:FernandoLópez