原文:
towardsdatascience.com/complete-mlops-cycle-for-a-computer-vision-project-b2821d9c6fc3
深入了解 MLOPS 基础知识,以提高您设计、开发和部署面向现实世界、工业应用的计算机视觉项目的能力
这些天,我们遇到了(也许我们自己也在生产)许多计算机视觉项目,其中 AI 是新技术领域最热门的话题。微调预训练的图像分类、目标检测或其他任何计算机视觉项目并不是什么大问题。但正确创建和部署用于工业使用的 AI 项目的方式是什么呢?
MLOps(机器学习运营)是一套旨在自动化生产环境中机器学习模型开发、部署、监控和管理实践的流程、工具和框架。它弥合了研发环境之间的差距,并帮助我们提高这两个阶段。
作者提供的图片
在这个完整的教程集中,我们将涵盖计算机视觉项目 MLOPS 周期的每个步骤。
以下是 AI 项目的完整 MLOPS 周期,以及我们将用来完成相关步骤的示例工具:
-
数据版本控制与管理(DVC)
-
实验跟踪(MLFlow)
-
模型优化(ONNX)
-
模型打包与部署(Docker)
-
CI/CD for ML Pipelines(Git)
-
监控与反馈循环(Grafana)
在我们的教程中,我们将检查针对目标检测或图像分类模型的所有这些步骤(有时两者都会涉及)!
让我们直接从这里开始,探索什么是 DVC,为什么我们需要它,以及我们如何轻松地使用它!
数据版本控制与管理(DVC)
想象一下,你在一个工业项目中工作,你期望定期更新数据集版本,即添加新产品,你需要重新训练你的模型以跟上 AI 模型应检测的最新对象。
将数据集存储在单独的文件夹中,如 dataset_v1、dataset_v2、…dataset_vx,就像为我们的代码更新创建新文件夹并将它们命名为 project_v1、project_v2、…project_vx 一样糟糕。幸运的是,我们的代码跟踪和版本控制是通过 Git 完成的,Git 是开发者中非常常见的框架。DVC 来到我们的身边,就像 Git 一样,这次是为了跟踪我们的数据集并对它们进行版本控制,而无需每次更新数据集时都创建新文件夹!
因此,在本教程结束时,我们将学习如何将我们的数据集环境从非专业转换为以下图示中的适当环境:
作者提供的图片
假设你已经在项目文件夹中初始化了 Git,你可以按照以下步骤操作;否则,首先初始化一个 Git 仓库,因为 DVC 与 Git 协作以跟踪你的数据集!
下载并初始化 DVC(Linux)
如果你是一名 Linux 用户,请使用以下命令下载 DVC,如果不是,请从官方仓库中找到适合你的正确命令。
snap install dvc --classic
前往你的项目环境并初始化 DVC。我们假设你的项目结构如下:
project
|__ data
|__ cfg
|__ models
|__ weights
...
So basically you have a main project folder and everything arranged
inside as subfolders, as well as the data folder
cd project
dvc init
开始版本化
将你的第一个版本数据集放入"data/"文件夹中。在我的情况下,它被称为 dataset_v2,因为我丢失了 dataset_v1,这是我只有本地的一个旧项目。
mv dataset_v2/* data/
将此更改添加到你的 DVC 跟踪历史中。
dvc add data
确保 Git 也不会跟踪你的数据,这完全是多余的,也是 Git 的糟糕使用方式,因为 Git 负责跟踪开发代码,而不是数据集!
.gitignore
data/*
将 DVC 日志添加到 Git 跟踪中,以及.gitignore,因为我们已经更新了它,并通过 git 提交这个更改。
git add data.dvc .gitignore
git commit -m "dataset version 2"
确定本地存储为 DVC 在不同版本之间存储数据的地方。我将其命名为"local_onedrive_remote",因为在接下来的步骤中,我们将学习如何在我们 OneDrive 云存储之间推送或拉取数据。
dvc remote add -d local_onedrive_remote ~/dvc_onedrive_remote
是时候将我们的第一个数据集推送到我们的本地存储了!
dvc push
在我们重复这些步骤直到将不同文件夹中存储的所有数据集版本化之前,我们将看看如何将这种版本化保存在云存储中。如果你想要任何备份,或者想要在云上与同事协作,这是一个重要的步骤。此外,你还可以从任何其他你需要本地数据集的机器上拉取包含所有可用版本的整个数据集。
作者图片
Rclone:连接本地和远程存储的桥梁
Rclone 是一个帮助你在本地和远程路径之间推送和拉取数据的工具。它成为填补我们数据版本化管道空缺的桥梁。
将 Rclone 安装到你的本地机器上:
sudo apt update
sudo apt install rclone
为你的云存储创建一个新的 Rclone 配置,在我的情况下是我的个人 OneDrive,但你可以选择 Rclone 列出的任何类型的云存储:
rclone config
按n创建一个新的配置,输入你想要给配置的名称,并选择类型。对我来说,是 21 引用 OneDrive 从提供的列表中。
如果一切正常,你应该能够在再次运行rclone config命令时看到你的新存储:
作者图片
此外,通过rclone ls onedrive:/命令进行双重检查将是一个好主意,以查看它是否开始列出你的远程存储中的所有内容,这样你就可以确保远程链接是正确的,并且已经很好地挂载在你称为"onedrive"(或任何你喜欢的个人云存储)的存储对象中。
推送到远程存储的最后一个命令:
rclone sync ~/dvc_onedrive_remote onedrive:/DVC_STORAGE
我们执行这一行操作基本上是将我们的本地存储(~/dvc_onedrive_remote)与远程存储(onedrive:/DVC_STORAGE)同步,其中onedrive是我配置时选择的 rclone 远程仓库的名称,而DVC_STORAGE是我创建在 Onedrive 中以存储我的数据的文件夹。
那就是设置我们的数据版本化环境的全部内容!
现在,我将应用相同的命令将我的数据集的新版本添加到我的版本历史中,并逐个删除所有分离的文件夹。
以下 bash 脚本在复制粘贴数据集文件夹的新版本(dataset_v3、dataset_v4 等)后非常有用,可以一次性完成所有附加步骤。
#!/bin/bash
# Step 1: Automatically determine the dataset version
# Count previous commits containing "dataset version"
previous_version=$(git log --oneline | grep -c "dataset version")
# Increment the dataset version
new_version=$((previous_version + 1))
# Step 2: Add the dataset to DVC
echo "Adding dataset to DVC..."
dvc add data
# Step 3: Stage the updated DVC metadata
echo "Staging DVC metadata..."
git add data.dvc
# Step 4: Commit with the new dataset version
commit_message="dataset version $new_version"
echo "Committing with message: $commit_message"
git commit -m "$commit_message"
# Step 5: Push to DVC remote
echo "Pushing dataset to DVC remote..."
dvc push
# Step 6: Sync with OneDrive via Rclone
echo "Syncing DVC cache with OneDrive..."
rclone sync ~/dvc_onedrive_remote onedrive:/DVC_STORAGE
echo "Dataset version $new_version successfully pushed and synced!"
现在一切都已经完成,我在 DVC 存储中有一个包含 7 个不同版本的数据集,而我的项目目录中只有最后一个版本,是时候看看我们如何在不同版本之间旅行,以防我们需要使用数据集的旧版本。
拉取数据集的旧版本
我项目文件夹中当前和最新的数据集看起来如下,在 classes.txt 中写了 56 个类别,1072 个训练图像和 256 个验证图像。
作者图片
检查你需要回退到特定版本的提交:
git log --oneline
作者图片
假设我需要我的数据集版本 5,我选择8f8de95作为我想要进入的提交,然后我从 DVC 存储库中拉取数据回到我的项目文件夹。
git checkout 8f8de95
dvc pull
现在我项目文件夹中的当前数据集看起来如下,在 classes.txt 中写了 39 个类别,662 个训练图像和 152 个验证图像。我可以看到,即使是 distribution.png 也被 DVC 跟踪并更新到了旧版本。
作者图片
回到最新的数据集版本
假设我们完成了对旧数据集的使用,并想要回到最新版本,两行我们就完成了!
git checkout master #or main according to your repo
dvc pull
从云端拉取数据到新机器
我们使用rclone sync ~/dvc_onedrive_remote onedrive:/DVC_STORAGE命令来同步我们的本地远程仓库与云端远程仓库。当我们需要相反方向(从远程到本地)时,它只是相同命令的反向!所以命令rclone sync onedrive:/DVC_STORAGE ~/dvc_onedrive_remote将同步远程存储与我们的本地存储,并且可以用于任何你想要拉取的新机器。
如果我们同一个项目中有多数据集怎么办?
在实际应用中,你可能会有一个以上与同一项目相关的子任务。例如,一个目标检测模型和一个图像分类模型可以并行或顺序工作,这需要用不同的数据集进行训练。这不过是将我们的项目文件夹整理好,并相应地设计我们的 DVC 系统:
作者图片
由于现在我们的主要工作空间包含多个子任务文件夹,如分类和检测,我们将 data.dvc 重命名为 _datadetection.dvc 并放置在我们主要文件夹的根目录下,同时创建一个新的名为 _dataclassification.dvc。
由于我们进行了替换,因此我们也应该更新 .dvc 文件中写明的路径:
重复之前的步骤,我们为分类子任务配置 DVC:
dvc add classification/data
git add data_classification.dvc
dvc remote add -d local_onedrive_remote_classification ~/dvc_onedrive_remote_classification
dvc push -r local_onedrive_remote_classification data_classification.dvc
rclone config # create a new cloud storage for classification dataset
rclone sync ~/dvc_onedrive_remote_classification onedrive:/DVC_STORAGE_CLASSIFICATION
就这样!在整理工作空间并添加新的子任务到 DVC 系统后,如果需要,更新先前任务的 .dvc 文件或路径,其余的就没有什么不同了。你唯一需要注意的事情是运行正确的命令,以进行正确的数据集更新。例如,在我们的设置中:
- 如果分类数据集有更新:
dvc add classification/data
git add data_classification.dvc
dvc push -r local_onedrive_remote_classification data_classification.dvc
rclone sync ~/dvc_onedrive_remote_classification onedrive:/DVC_STORAGE_CLASSIFICATION
- 如果检测数据集有更新:
dvc add detection/data
git add data_detection.dvc
dvc push -r local_onedrive_remote data_detection.dvc
rclone sync ~/dvc_onedrive_remote onedrive:/DVC_STORAGE
我们已经完成了项目 MLOPS 循环的第一步,要了解设置数据版本化环境后的下一步,请继续阅读本教程的以下内容!
7万+

被折叠的 条评论
为什么被折叠?



