news 2026/1/28 22:27:25

MLOps – 使用 MLflow 和 Hydra Sweeps 进行超参数调整

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MLOps – 使用 MLflow 和 Hydra Sweeps 进行超参数调整

原文:towardsdatascience.com/hyperparameters-tuning-with-mlflow-and-hydra-sweeps-7253d97d7897

简介

当我们开发机器学习模型时,我们通常需要运行大量的实验来确定给定算法的最佳超参数设置。这往往会导致代码混乱,并且难以追踪哪个结果对应哪个设置。我经常看到人们将超参数硬编码,启动实验,并在 Excel 文件中记录结果。我相信我们可以改进这个工作流程。

在我的上一篇文章中,我谈到了使用 MLflow 进行流水线化。

MLOps – Mlflow Pipelines 的简单介绍

今天我想增加一层复杂性,并解释如何集成 Hydra,这是一个非常出色的开源工具,它允许您使用不同的模型设置运行测试。

我使用 Deepnote 运行这篇文章的脚本:这是一个基于云的笔记本,非常适合协作数据科学项目和原型设计。

让我们开始编码!

因此,让我们开始编写第一个 Python 文件来训练一个简单的机器学习模型,比如随机森林。我们可以使用泰坦尼克号数据集,并通过 Seaborn 库导入它。

泰坦尼克号数据集有一个开源的 (MIT 许可证) 许可。您可以在 GitHub 上通过这个 URL 找到它。

因此,在我们的项目中,让我们创建一个子文件夹,它将成为 MLflow 流水线的一部分,并将其命名为 “random_fortest”。然后在这个组件内部,我们创建名为 “run.py” 的脚本,并编写用于模型训练的代码。

在这个片段中,我们将实现标准的预处理和训练步骤,我认为这些步骤不需要解释。

Deepnote

您可能已经注意到,随机森林接受许多超参数作为输入,我们现在已经将它们硬编码。为了改进我们的代码,我们可以将这些参数作为 go() 函数的参数。然后我们可以创建一个 YAML 文件,在其中指定这些超参数。之后,我们将要求用户通过 CLI 传递给我们他/她想要使用的 YAML 文件路径,并从中读取模型设置。

这就是我们修改脚本的方法。我们将利用 argparse 库来允许用户从 CLI 指定一些输入参数(如模型配置文件)。

Deepnote

如您在我的关于 MLflow 管道的上一篇文章中所学,MLflow 组件也需要一个 conda.yaml 文件,在其中我们指定开发环境。所以这就是我们可以使用的 yaml 文件:

name:random_forest channels:-conda-forge-defaults dependencies:-pandas-pip-scikit-learn-matplotlib-plotly-pillow-mlflow-seaborn-pip:-omegaconf

但我们也知道,MLflow 组件还需要一个 MLproject 文件:

name:random_forest conda_env:conda.yml entry_points:main:parameters:model_config:description:JSON blurb containing the configurationforthe decision treetype:strcommand:>-python run.py--model_config{model_config}

在这个 MLproject 中,我们命名组件,定义要使用的 conda 文件,并接收模型配置的输入参数。

现在在组件外部,作为主要入口,我们创建其他文件:

  • 另一个 conda.yaml 文件用于指定入口组件的环境

  • 一个 MLproject 来定义 MLflow 管道步骤

  • 一个配置文件,我们在这里输入要使用的超参数

  • 一个 main.py 脚本,我们的项目从这里开始

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b0a3c8e1aa93ac6bf83c3c4cb33f4197.png

项目结构

让我们首先定义 config.yaml 文件。有许多超参数您可以尝试。我只选择了一些,您可以自由地尝试其他参数。

random_forest:n_estimators:100criterion:"gini"max_depth:null min_samples_split:2min_samples_leaf:1

现在我们指定这个入口点的 conda 文件。

name:main_component channels:-conda-forge-defaults dependencies:-requests-pip-mlflow-hydra-core-pip:-wandb-hydra-joblib-launcher

现在我们最终定义 main.py 应该如何编写,以便轻松使用 Hydra。

要在 Python 代码中使用配置文件,我们只需使用 Hydra 装饰器,指定配置文件的名称,Python 将自动读取它。让我们看看一个例子。

Deepnote

如您所见,配置文件是通过装饰器读取的。之后,我现场创建了一个名为 _random_forestconfig.yml的新 yaml 文件,将其传递给run.py脚本。如果您还记得,这个脚本期望一个包含随机森林配置的 yaml 文件。

那为什么还要创建第二个 yaml 文件,而不是直接将config.yaml传递给它呢?简单来说,因为在config.yaml中,我可能还有除了随机森林之外的其他设置。在这种情况下,没有其他设置,因为这是一个玩具示例,所以我们完全可以跳过这一步。

我们使用*mlflow.run()*命令启动管道的"random_forest"组件

现在我们可以使用从 Hydra 派生的特殊命令来运行main.py脚本,以轻松地更改随机森林配置文件中的某些设置,快速进行实验。

但我们非常清楚我们不会手动运行 “python main.py” 命令,而会在 MLproject 中定义这个命令。所以,在 MLproject 中,我们必须说 “python main.py” 命令可能伴随着 Hydra 接受的其他参数。

name:run_pipeline conda_env:conda.yaml entry_points:main:parameters:hydra_options:description:Hydra parameters to overridetype:strdefault:""command:>-python main.py $(echo{hydra_options})

如果你实际上看到我们运行的命令有一个额外的代码片段:

python main.py $(echo{hydra_options}).

以这种方式,我们向 Hydra 接受的命令中添加了小的更改。我们将在稍后看到示例。

现在,如果我们使用 “mlflow run .” 启动整个流程,整个管道将被启动。

mlflow run.

这将需要一些时间,因为 MLflow 将必须生成conda.yaml文件中指定的必要环境。

第二次启动管道将会更快,因为 MLflow 足够智能,能够弄清楚该环境已经存在,无需再次创建。

正如你所见,在我的情况下,一切顺利,没有错误,并且我可以看到模型达到的准确率。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b8bb64147c6da7870aac1c14e12d654a.png

图片由作者提供

有这样的管道非常方便,因为现在我可以通过更改 yaml 文件来测试具有不同超参数的模型。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/76ed654ffd279a30aae55957e4206932.png

config.yaml (图片由作者提供)

Hydra Sweeps

让我们利用我们编写的代码以简单的方式启动更多实验。在入口点的 MLproject 中,我们说我们接受对 Hydra 行为有用的输入参数。

我们可以直接从 CLI 修改配置文件中的某些字段。如果你仔细阅读 MLproject,你会看到我们可以修改一个名为 “hydra_options” 的参数。所以我们做的是在这个参数内定义我们想要调用的配置文件中的值。

例如,如果我想进行一次测试,使用 30 个估计量,我可以按照以下方式运行 Mlflow 管道。

mlflow run.-P hydra_options="random_forest.n_estimators=30"

当然,我们可以同时指定多个参数更改。在下一个示例中,我更改了 _nestimators和 _min_samplesplit

mlflow run.-P hydra_options="random_forest.n_estimators=100 random_forest.min_samples_split=5"

简单吗?现在要启动各种实验,只需从 CLI 更改一个字符串!

然而,我们还没有看到这如何能极大地加快超参数调整阶段。假设每个实验的结果都保存到一个文件中,而不是仅仅在控制台打印出来(你可以尝试自己实现这一点)。

我们可以通过 CLI 告诉 Hydra,使用一条命令尝试每个参数的不同值的组合。之后,我们将检查结果的日志并选择最佳超参数。

要做到这一点,我们使用 Hydra 的 多运行 函数,因为对于每个超参数组合,都需要启动多个运行。

对于每个单独的参数要测试的各个值应该用逗号分隔。在字符串的末尾,我们添加一个 “-m” 来表示这是一个多运行。以下是一个实际示例:

mlflow run.-P hydra_options="random_forest.n_estimators=10,50,100 random_forest.min_samples_split=3,5,7 -m"

我们终于推出了使用 Hydra 的超参数调整功能!🥳

如果我们想尝试从 x1 到 x2 的所有数字,我们可以使用函数 range(x1,x2)。例如,如果我想尝试 min_samples_split 的所有数字从 1 到 5,我可以使用如下命令:

mlflow run.-P hydra_options="random_forest.n_estimators=10,50,100 random_forest.min_samples_split=range(1,5) -m"

结论

MLflow 和 Hydra 是进行数据科学项目的绝佳工具。经过一些初始努力,它们然后允许我们无承诺地启动实验。这样我们就可以专注于理解为什么某些实验比其他实验效果更好,并根据自己的结论进行总结,而无需每次都去调整代码。

在未来的教程中,我还会展示如何将实验结果保存到外部工具以跟踪它们。我通常使用 Weight & Biases,但 MLflow 本身也提供了这项功能。

如果你对这篇文章感兴趣,请关注我的 Medium! 😁

💼 领英 ️| 🐦 X (Twitter) | 💻 网站

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/17 20:46:55

Markdown Footnote脚注用法:补充说明技术细节

Markdown 脚注与 AI 开发环境的高效协同:从文档清晰性到工程实践 在人工智能项目开发中,我们常常面临两个看似不相关的挑战:一是如何让技术文档既简洁又详尽;二是如何确保团队成员在不同机器上运行代码时“结果一致”。前者关乎知…

作者头像 李华
网站建设 2026/1/26 12:51:09

基于Vitis的AI模型量化与编译深度剖析

深度拆解Vitis AI:从模型量化到FPGA部署的全链路实战你有没有遇到过这样的场景?训练好的YOLOv5模型在服务器上跑得飞快,但一搬到边缘设备就卡成幻灯片;明明FPGA资源还有富余,推理延迟却始终压不下去;INT8量…

作者头像 李华
网站建设 2026/1/25 2:45:48

Linux平台vivado2021.1安装入门教程

从零搭建FPGA开发环境:手把手教你搞定 Linux 下 Vivado 2021.1 安装 你是不是也经历过这样的时刻?刚入手一块Zynq UltraScale开发板,满心期待地打开电脑准备“大展拳脚”,结果第一步就被卡在了 Vivado安装 上——命令行报错、图…

作者头像 李华
网站建设 2026/1/22 8:33:27

PyTorch-CUDA镜像文档编写规范

PyTorch-CUDA 镜像设计与工程实践:从环境隔离到高效开发 在深度学习项目中,最让人头疼的往往不是模型结构本身,而是“为什么代码在我机器上跑得好好的,换台设备就报错?”——这个问题背后,通常是 CUDA 版本…

作者头像 李华
网站建设 2026/1/27 11:52:54

Markdown生成幻灯片展示PyTorch项目汇报

PyTorch-CUDA容器化开发与自动化汇报实践 在深度学习项目日益复杂的今天,一个常见的困境是:研究人员花费大量时间在环境配置上,而非真正的模型创新。你是否经历过这样的场景?明明代码逻辑清晰、实验设计合理,却因为 t…

作者头像 李华
网站建设 2026/1/19 4:54:08

Docker Compose配置健康检查确保PyTorch服务可用性

Docker Compose 配置健康检查确保 PyTorch 服务可用性 在构建现代 AI 推理系统时,一个常见的尴尬场景是:容器明明已经“运行中”,但首次请求却返回 503 错误。排查后发现,模型还在加载——这正是典型的“容器已启动,服…

作者头像 李华