AI & GPU
如何在Databricks上轻松利用MLflow

如何在Databricks上轻松利用MLflow

介绍MLflow

A. MLflow概述

1. MLflow的定义和目的

MLflow是一个开源平台,用于管理端到端的机器学习生命周期,包括实验、可重现性、部署和中央模型注册表。它帮助数据科学家和工程师跟踪他们的机器学习实验、打包和部署模型,并在ML项目上进行共享和协作。

2. MLflow的关键组件

a. MLflow Tracking

MLflow Tracking是一个组件,允许您记录和跟踪机器学习实验的参数、度量和工件。它提供了一个集中的方式来跟踪您的实验并比较结果。

b. MLflow Models

MLflow Models是一个组件,提供了一个用于打包机器学习模型的标准格式,使得更容易将模型部署到各种服务平台。

c. MLflow Projects

MLflow Projects是一个组件,提供了一个标准格式来打包可重复使用的数据科学项目,使得在不同平台上共享和运行它们更容易。

d. MLflow Registry

MLflow Registry是一个组件,提供了一个中央模型存储库,允许您将模型从不同阶段(例如暂存、生产)过渡并跟踪其血统。

B. 使用MLflow的好处

1. 可重复性和版本控制

MLflow通过跟踪与每个实验相关的所有相关信息(如代码、数据和环境)来确保机器学习实验的可重复性。这使得重现和比较结果更容易。

2. 协作和共享

MLflow为机器学习项目提供了一个集中的协作平台,允许团队成员共享实验、模型和项目配置。

3. 模型部署和管理

MLflow通过提供标准格式和工具来打包和部署机器学习模型,简化了模型的部署和管理过程。

MLflow Tracking

A. MLflow Tracking概念

1. 实验

MLflow中的实验表示一组运行(run),其中每个运行对应于机器学习脚本或工作流的单次执行。

2. 运行

MLflow中的运行表示机器学习脚本或工作流的单次执行,包括与该执行相关的参数、度量和工件。

3. 参数和度量

参数是机器学习实验的输入变量,而度量是要跟踪和优化的性能指标。

4. 工件

MLflow中的工件是与运行相关联的任何文件或数据,例如模型文件、图表或数据集样本。

B. MLflow Tracking API

1. 记录实验和运行

a. 记录参数

您可以使用mlflow.log_param()函数将参数记录到MLflow运行中。例如:

import mlflow
 
mlflow.start_run()
mlflow.log_param("learning_rate", 0.01)
mlflow.log_param("num_epochs", 10)

b. 记录度量

您可以使用mlflow.log_metric()函数将度量记录到MLflow运行中。例如:

mlflow.log_metric("accuracy", 0.92)
mlflow.log_metric("f1_score", 0.88)

c. 记录工件

您可以使用mlflow.log_artifact()函数将工件记录到MLflow运行中。例如:

mlflow.log_artifact("model.pkl")
mlflow.log_artifact("plots/feature_importance.png")

2. 查询和查看实验和运行

a. Tracking UI

MLflow提供了一个基于Web的Tracking UI,允许您查看和比较实验和运行。您可以通过运行mlflow ui命令来访问Tracking UI。

b. MLflow CLI

您还可以使用MLflow命令行界面(CLI)与MLflow Tracking系统进行交互。例如,您可以使用mlflow experiments list命令列出MLflow实例中的所有实验。

c. MLflow Python API

除了CLI之外,您还可以使用MLflow Python API以编程方式与Tracking系统进行交互。例如,您可以使用mlflow.search_runs()函数查询特定实验中的所有运行。

C. 将MLflow Tracking与Databricks集成

1. 在Databricks中启用MLflow Tracking

要在Databricks中启用MLflow Tracking,您需要配置Databricks工作区以使用MLflow Tracking Server。这可以通过在Databricks工作区中设置相应的配置参数来完成。

2. 在Databricks上跟踪实验和运行

启用Databricks中的MLflow Tracking后,您可以使用MLflow Python API从Databricks笔记本或作业中记录实验和运行。该过程与上一节中的示例类似。

3. 在Databricks中访问MLflow Tracking数据

您可以使用MLflow Python API或Databricks UI访问存储在Databricks工作区中的MLflow Tracking数据。这样可以在Databricks生态系统内查看和比较实验和运行。

MLflow Models

A. MLflow模型概念

1. 模型格式和风格

MLflow Models提供了一个标准格式,用于打包机器学习模型,使您能够将其部署到各种服务平台。每个模型可以有一个或多个“风格”,这些风格是表示模型的不同方式(例如TensorFlow、scikit-learn、PyTorch)。

2. 模型版本控制

MLflow Models还提供了一个版本控制系统,允许您跟踪模型的不同版本并管理其生命周期。

B. 记录和注册模型

1. 使用MLflow记录模型

a. 使用MLflow API记录模型

您可以使用mlflow.log_model()函数将模型记录到MLflow。例如:

import mlflow.sklearn
from sklearn.linear_regress
or import LinearRegression
 
model = LinearRegression()
model.fit(X_train, y_train)
 
mlflow.log_model(model, "linear-regression")

b. 从常见的机器学习框架中记录模型

MLflow提供内置支持,可从各种机器学习框架(如scikit-learn、TensorFlow和PyTorch)记录模型。

2. 在MLflow注册模型

a. 模型版本控制

当您在MLflow Registry中注册模型时,可以为该模型指定版本号。这允许您随时间跟踪同一模型的不同版本。

b. 模型阶段

MLflow Registry还允许您通过将模型转换为不同的阶段(例如“暂存”、“生产”和“归档”)来管理模型的生命周期。

C. 将MLflow Models与Databricks集成

1. 在Databricks上部署模型

您可以通过在MLflow Registry中注册模型,然后使用Databricks Model Serving功能将其部署到Databricks上。

2. 使用Databricks Model Serving提供模型

Databricks Model Serving提供一个可扩展和托管的平台,用于为您的MLflow模型提供服务,使您能够轻松部署和管理生产中的模型。

3. 在Databricks上监控和管理模型

Databricks UI提供了用于监控和管理部署的MLflow模型的工具,包括跟踪模型性能、回滚到以前版本以及自动化模型推广和部署的功能。

MLflow Projects

A. MLflow Projects概念

1. 项目结构和配置

MLflow Projects定义了一个用于打包可重复使用的数据科学项目的标准格式。这包括项目目录结构和一个配置文件(MLproject),该文件指定了项目的依赖关系和入口点。

2. 依赖关系管理

MLflow Projects使用环境文件(例如conda.yaml)来管理项目的依赖关系,确保您的实验和工作流在不同环境中可以进行复制。

B. 运行MLflow Projects

1. 在本地运行项目

您可以使用mlflow run命令在本地运行MLflow项目。这将创建一个新的MLflow运行并执行项目的入口点。

mlflow run my-project-dir

2. 在Databricks上运行项目

您还可以通过将MLflow Projects作为作业提交或在Databricks笔记本中执行来在Databricks上运行MLflow Projects。这使您可以利用Databricks提供的可扩展计算资源。

C. 将MLflow Projects与Databricks集成

1. 在Databricks上执行MLflow Projects

要在Databricks上运行MLflow Project,您可以使用Databricks Jobs UI或Databricks CLI将项目作为作业提交。Databricks将创建一个新的MLflow运行并执行项目的入口点。

2. 在Databricks上调度和自动化MLflow Projects

Databricks还提供了用于调度和自动化MLflow Projects执行的功能,使您可以设置定期工作流程或基于特定事件或条件触发项目运行。

MLflow Registry

A. MLflow Registry概念

1. 模型版本控制和阶段

MLflow Registry提供了一个集中的模型存储库,允许您跟踪模型的不同版本,并通过在“暂存”、“生产”和“归档”等不同阶段之间过渡来管理它们的生命周期。

2. 模型血统和元数据

MLflow Registry还跟踪与每个已注册模型关联的血统和元数据,包括用于训练模型的代码、参数和度量。

B. 与MLflow Registry交互

1. 注册模型

您可以使用mlflow models register命令或MLflow Python API在MLflow Registry中注册模型。

mlflow.register_model("runs:/run_id/model", "my-model")

2. 查看和管理模型Databricks UI 提供了一个基于 web 的界面,用于查看和管理在 MLflow Registry 中注册的模型,包括浏览模型版本、比较模型性能以及在不同阶段之间转换模型的功能。

3. 升级和转换模型阶段

您可以使用 MLflow Python API 或 Databricks UI 来以编程方式在 MLflow Registry 中的不同阶段之间升级模型,自动化模型部署过程。

from mlflow.tracking.client import MlflowClient
 
client = MlflowClient()
client.transition_model_version_stage(
    name="my-model",
    version=1,
    stage="Production"
)

C. 将 MLflow Registry 与 Databricks 集成

1. 从 Databricks 访问 MLflow Registry

当您在 Databricks 中启用 MLflow Tracking 时,MLflow Registry 将自动与您的 Databricks 工作区集成,使您能够直接从 Databricks UI 或通过 MLflow Python API 访问和管理已注册的模型。

2. 在 Databricks 上自动化模型升级和部署

Databricks 提供了用于自动化升级和部署在 MLflow Registry 中注册的模型的功能,例如设置触发器,以自动将新的模型版本部署到生产环境,或在出现问题时回滚到之前的版本。

高级主题

A. MLflow 生命周期管理

1. 监控和报警

您可以设置监控和报警系统,跟踪您使用 MLflow 的机器学习工作流的性能和健康状况,确保及时发现和解决任何问题。

2. 自动化模型升级和部署

通过将 MLflow 与其他工具和平台集成,在端到端的工作流中自动升级和部署新的模型版本到生产环境,减少手动管理机器学习模型所需的工作量。

B. 在 Databricks 上扩展 MLflow

1. 分布式训练和实验

Databricks 提供了运行分布式机器学习训练和实验工作流的功能,充分利用 Databricks 平台的可扩展计算资源来加速您使用 MLflow 的实验。

2. 并行模型评估和部署

Databricks 还支持并行模型评估和部署,允许您快速测试和部署多个模型版本到生产环境,进一步提高使用 MLflow 的机器学习流程的效率。

C. MLflow 治理和安全

1. 访问控制和权限

您可以为使用 MLflow 的机器学习工作流配置访问控制和权限,确保只有授权用户可以访问和修改您的实验、模型和其他敏感数据。

2. 审计日志和合规性

Databricks 提供了日志记录和审计 MLflow 工作流中活动的功能,帮助您满足机器学习系统的监管和合规性要求。

结论

A. 关键概念摘要

在本教程中,我们介绍了 MLflow 的关键组件,包括 Tracking、Models、Projects 和 Registry,以及如何将它们与 Databricks 平台集成。我们探讨了使用 MLflow 的益处,例如可复现性、协作和模型部署。

卷积神经网络 (CNN)

卷积神经网络 (CNN) 是一种特别适用于处理和分析视觉数据(如图像和视频)的深度学习架构。CNN 受到人脑视觉皮层结构的启发,旨在自动学习和提取输入数据中的相关特征。

卷积层

CNN 的核心构建块是卷积层。在这个层中,一组可学习的滤波器(也称为内核)与输入图像进行卷积运算,产生一个特征图。滤波器被设计用于检测输入图像中的特定特征,如边缘、形状或纹理。卷积过程使网络能够捕捉输入数据中的空间关系,这对于图像分类和物体检测等任务至关重要。

以下是 PyTorch 中卷积层的示例:

import torch.nn as nn
 
# 定义卷积层
conv_layer = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)

在这个示例中,卷积层有 16 个滤波器,每个滤波器的大小是 3x3 像素。in_channels 参数指定输入通道的数量(在本例中为 3,表示 RGB 图像),out_channels 参数指定输出通道的数量(在本例中为 16)。

池化层

在卷积层之后,CNN 通常包括池化层,用于减小特征图的空间维度,同时保留最重要的信息。最常见的池化操作是最大池化,它在指定的窗口内选择最大值。

以下是 PyTorch 中最大池化层的示例:

import torch.nn as nn
 
# 定义最大池化层
pool_layer = nn.MaxPool2d(kernel_size=2, stride=2)

在这个示例中,最大池化层的卷积核大小为 2x2,步幅为 2,这意味着它在每次移动窗口时从一个 2x2 的窗口中选择最大值。

全连接层

在卷积和池化层之后,CNN 通常具有一个或多个全连接层,这与传统神经网络中使用的层类似。这些层接收来自前面层的扁平化特征图,并使用它们进行最终预测,例如图像分类任务中的类标签。

以下是 PyTorch 中全连接层的示例:

import torch.nn as nn
 
# 定义全连接层
fc_layer = nn.Linear(in_features=1024, out_features=10)

在这个示例中,全连接层有 1024 个输入特征和 10 个输出特征,这可以用于一个包含 10 个类别的分类问题。

CNN 架构

在深度学习领域,已经开发了几种著名的 CNN 架构,并且在各种深度学习应用中得到广泛应用。其中一些最流行的包括:

  1. LeNet:是最早和最有影响力的 CNN 架构之一,由 Yann LeCun 在 1990 年代开发,旨在手写数字识别。

  2. AlexNet:由 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 在 2012 年开发。AlexNet 在图像分类领域取得了突破性的成就,在 ImageNet 数据集上明显优于传统方法。

  3. VGGNet:由 Karen Simonyan 和 Andrew Zisserman 在 2014 年提出。VGGNet 以其简单一致的架构而闻名,仅使用 3x3 的卷积滤波器。

  4. GoogLeNet:由 Christian Szegedy 和他的同事在 2014 年介绍。GoogLeNet 引入了 "Inception 模块" 的概念,可以实现高效的计算和性能改进。

  5. ResNet:由 Kaiming He、Xiangyu Zhang、Shaoqing Ren 和 Jian Sun 在 2015 年开发。ResNet 引入了残差连接的概念,帮助解决了非常深的神经网络中梯度消失的问题。

这只是许多已开发并广泛应用于各种深度学习应用中的 CNN 架构的一小部分。

递归神经网络 (RNN)

递归神经网络 (RNN) 是一种特别适用于处理序列数据(如文本、语音和时间序列)的深度学习架构。与前馈神经网络不同,前者独立处理输入,RNN 具有维护先前输入 "记忆" 的能力,从而更好地捕捉数据中的上下文信息。

基本 RNN 结构

RNN 的基本结构包括一个隐藏状态,它根据当前输入和先前隐藏状态在每个时间步更新。这使得 RNN 能够学习序列数据中的模式和依赖关系。

以下是 PyTorch 中一个简单的 RNN 单元的示例:

import torch.nn as nn
 
# 定义一个 RNN 单元
rnn_cell = nn.RNNCell(input_size=10, hidden_size=32)

在这个示例中,RNN 单元接受大小为 10 的输入,并具有大小为 32 的隐藏状态。

长短期记忆 (LSTM)

基本 RNN 的一个关键问题是梯度消失问题,即梯度在网络中反向传播时可能变得非常小。这使得 RNN 很难学习数据中的长期依赖关系。

为了解决这个问题,引入了一种更高级的 RNN 类型,称为长短期记忆 (LSTM)。LSTM 使用更复杂的单元结构,包括门控模块,来控制信息的流动,从而更好地掌握长期依赖关系。

以下是 PyTorch 中 LSTM 层的示例:

import torch.nn as nn
 
# 定义一个 LSTM 层
lstm_layer = nn.LSTM(input_size=10, hidden_size=32, num_layers=2, batch_first=True)

在这个示例中,LSTM 层接受大小为 10 的输入,具有大小为 32 的隐藏状态,并包含 2 层。batch_first 参数指示输入张量的第一个维度为批次维度。

门控循环单元 (GRU)

RNN 的另一个变种是门控循环单元 (GRU),它与 LSTM 类似,但结构更简单。GRU 在各种任务中表现良好,并且在计算上比 LSTM 更高效。

以下是 PyTorch 中 GRU 层的示例:

import torch.nn as nn
 
# 定义一个 GRU 层
gru_layer = nn.GRU(input_size=10, hidden_size=32, num_layers=2, batch_first=True)

在这个例子中,GRU层的输入大小为10,隐藏状态的大小为32,由2层组成。batch_first参数设置为True,与LSTM的例子类似。

循环神经网络 (RNN) 应用

RNN已成功地应用于广泛的任务中,包括:

  1. 自然语言处理 (NLP):RNN广泛应用于语言建模、文本生成和机器翻译等任务。
  2. 语音识别:RNN可用于将口语转录成文本,利用其处理序列数据的能力。
  3. 时间序列预测:RNN可用于对时间序列数据进行预测,例如股票价格或天气模式。
  4. 视频处理:RNN可用于视频分类和动作识别等任务,其中视频中的时序信息至关重要。

生成对抗网络 (GAN)

生成对抗网络 (GAN) 是一种深度学习结构,旨在生成类似于训练数据的新数据,例如图像或文本。GAN由两个神经网络组成,它们以对抗的方式进行训练:生成器网络和判别器网络。

GAN 架构

生成器网络负责生成新的数据,而判别器网络被训练用于区分生成的数据和训练集中的真实数据。这两个网络以竞争的方式进行训练,生成器试图欺骗判别器,而判别器试图准确识别生成的数据。

以下是一个在PyTorch中的GAN架构的简单示例:

import torch.nn as nn
 
# 定义生成器网络
generator = nn.Sequential(
    nn.Linear(100, 256),
    nn.ReLU(),
    nn.Linear(256, 784),
    nn.Tanh()
)
 
# 定义判别器网络
discriminator = nn.Sequential(
    nn.Linear(784, 256),
    nn.LeakyReLU(0.2),
    nn.Linear(256, 1),
    nn.Sigmoid()
)

在这个示例中,生成器网络接受一个100维的输入(通常是一个随机噪声向量),并生成一个784维的输出(一个28x28像素的图像)。判别器网络接收一个784维的输入(一张图像),并输出一个介于0和1之间的单个值,表示输入是来自训练集中的真实图像的概率。

GAN 训练

GAN的训练过程涉及交替训练生成器和判别器。生成器被训练以最小化损失函数,这鼓励它生成判别器错误分类为真实数据的数据。判别器被训练以最大化损失函数,这鼓励它正确分类真实和生成的数据。

以下是在PyTorch中GAN训练循环的简单示例:

import torch.optim as optim
 
# 为生成器和判别器定义优化器
g_optimizer = optim.Adam(generator.parameters(), lr=0.0002)
d_optimizer = optim.Adam(discriminator.parameters(), lr=0.0002)
 
for epoch in range(num_epochs):
    # 训练判别器
    d_optimizer.zero_grad()
    real_data = get_real_data()
    real_output = discriminator(real_data)
    real_loss = criterion(real_output, torch.ones_like(real_output))
    
    noise = get_noise(batch_size, 100)
    fake_data = generator(noise)
    fake_output = discriminator(fake_data.detach())
    fake_loss = criterion(fake_output, torch.zeros_like(fake_output))
    d_loss = (real_loss + fake_loss) / 2
    d_loss.backward()
    d_optimizer.step()
    
    # 训练生成器
    g_optimizer.zero_grad()
    noise = get_noise(batch_size, 100)
    fake_data = generator(noise)
    fake_output = discriminator(fake_data)
    g_loss = criterion(fake_output, torch.ones_like(fake_output))
    g_loss.backward()
    g_optimizer.step()

在这个示例中,判别器同时在真实数据和生成数据上进行训练,而生成器被训练以生成判别器将分类为真实的数据。

GAN 应用

GAN已成功应用于各种应用领域,包括:

  1. 图像生成:GAN可用于生成逼真的图像,例如人脸、风景或艺术品。
  2. 文本生成:GAN可用于生成连贯自然的文本,例如新闻文章或创意写作。
  3. 超分辨率:GAN可用于从低分辨率输入中生成高分辨率图像,有效地“缩放”图像。
  4. 领域转换:GAN可用于将图像或文本从一个领域转换到另一个领域,例如将草图转换为逼真的绘画。

总结

在本教程中,我们介绍了深度学习的关键概念和架构,包括前馈神经网络、卷积神经网络 (CNN)、循环神经网络 (RNN) 和生成对抗网络 (GAN)。我们提供了具体示例和代码片段,以说明如何使用PyTorch实现这些模型。

深度学习是一个快速发展的领域,在各个领域中都有许多应用,从计算机视觉和自然语言处理到机器人技术和医疗保健。随着该领域的不断发展,保持与最新发展保持同步,并不断探索应用这些技术解决问题的新方法是很重要的。