如何使用MinIO和LakeFS实现人工智能训练的可重现性?
此外,尽管 lakeFS 只处理 MLOps 流的一部分,但它通过与下面显示的所有工具(尤其是数据质量工具)进行交互,努力成为 MLOPs 生态系统中的好公民。在上面的存储库中,每次执行模型训练脚本时,都会对存储库进行新的提交,并且提交消息会指定确切的运行编号。版本控制是记录和控制对项目(如代码、数据、标签、模型、超参数、试验、依赖项、文档以及用于训练和推理的环境)的更改的过程。在数据上下文中,可
创作声明:这篇文章是与 lakeFS 的 Amit Kesarwani 合作撰写的。
运行多个机器学习实验的现实情况是,管理它们可能会变得不可预测和复杂,尤其是在团队环境中。经常发生的情况是,在研究过程中,团队在实验之间不断更改配置和数据。例如,尝试多个训练集和多个超参数值,并且 - 当涉及大型数据集时 - 分布式计算引擎(如 Apache Spark)的不同配置。
ML工程师的部分工作需要在这些实验之间来回切换,以便进行比较和优化。当工程师手动管理所有这些实验时,他们的工作效率会降低。
工程师如何自信、高效地运行机器学习实验?
在本文中,我们将深入探讨可重复性,向您展示为什么值得您花时间,以及如何使用 lakeFS 和 MinIO 实现它。
为什么数据从业者需要可重复性
什么是再现性?
可重复性确保团队可以使用相同的程序重复实验并获得相同的结果。它是科学方法的基础,因此是 ML 中的一种方便的方法。
在数据上下文中,可重复性意味着您拥有重新创建模型及其结果所需的一切,例如数据、工具、库、框架、编程语言和操作系统。这样,您可以产生相同的结果。
为什么数据团队需要可重复性?
ML 流程不是线性的。工程师通常会迭代和增量地试验各种 ML 方法和参数,以得出更准确的 ML 模型。由于开发的迭代性质,ML 中最困难的挑战之一是确保工作的可重复性。例如,如果使用的所有输入和系统都相同,则训练用于检测癌症的 ML 模型应返回相同的模型。
此外,可重复性是法规遵从性、审计和验证的关键因素。它还可以提高团队生产力,改善与非技术利益相关者的协作,并提高 ML 产品和服务的透明度和信心。
如前所述,ML 管道可能会变得复杂。您必须管理代码、数据集、模型、超参数、管道、第三方包和特定于环境的配置。准确地重复实验是具有挑战性的。您需要重新创建用于生成模型的确切条件。
可重复数据的好处
一致性
给定相同的数据,您希望模型提供相同的结果。通过这种方式,您可以建立对数据产品的信心。如果通过重复实验获得相同的结果,则用户体验也将是一致的。
此外,作为研究过程的一部分,您希望能够更新单个元素(例如模型的核心),同时保持其他所有元素不变,然后查看结果如何变化。
安全性与合规性
另一个考虑因素是安全性和合规性。在银行、医疗保健和安全等许多垂直业务中,组织需要维护和报告导致给定模型及其结果的确切过程。确保可重复性是这些垂直行业的常见做法。
为此,您需要对 ML 管道的所有输入进行版本控制,以便恢复到以前的版本会重现之前的结果。法规通常要求您重新创建管道的先前状态。这包括模型、数据和以前的结果。
更轻松地管理更改数据
数据总是在变化。这使得很难跟踪其随时间推移的确切状态。人们通常只保留其数据的一种状态:当前状态。
这会对工作产生负面影响,因为它使以下任务变得异常困难:
- 调试数据问题。
- 验证机器学习训练的正确性(在不同的数据上重新运行模型会产生不同的结果)
- 观察数据审计
如何实现可重复性?
为了实现可重复性,数据从业者通常会保留 ML 管道和数据的多个副本。但是,每次您希望探索它们时都复制巨大的训练数据集是昂贵的,而且不可扩展。
此外,没有方法可以保存许多模型工件及其随附的训练数据的原子副本。此外,还要处理多种类型的有组织、半结构化和非结构化训练数据,例如视频、音频、IoT 传感器数据、表格数据等。
最后,当 ML 团队为协作制作相同数据的副本时,很难实施数据隐私最佳实践和数据访问限制。
您需要的是一个具有零拷贝机制的数据版本控制工具,可让您创建和跟踪数据的多个版本。版本控制是记录和控制对项目(如代码、数据、标签、模型、超参数、试验、依赖项、文档以及用于训练和推理的环境)的更改的过程。
你能用 Git 对数据进行版本控制吗?这听起来是个好主意,但 Git 既不安全、不充分,也不具有数据可扩展性。
数据科学的版本控制组件比软件项目的版本控制组件更复杂,这使得可重复性更具挑战性。此外,由于原始训练数据通常存储在云对象存储(S3、GCS、Azure Blob)中,因此团队需要一个适用于就地(对象存储)数据的版本控制解决方案。
幸运的是,有一个开源工具可以做到这一点:lakeFS。
使用 lakeFS 进行数据版本控制
lakeFS 是一个开源工具,使团队能够使用类似 Git 的过程(提交、合并、分支)管理他们的数据,支持数十亿个文件和 PB 级数据。lakeFS 将管理层添加到您的对象存储(如 S3)中,并将整个存储桶转换为类似于代码存储库的内容。此外,尽管 lakeFS 只处理 MLOps 流的一部分,但它通过与下面显示的所有工具(尤其是数据质量工具)进行交互,努力成为 MLOPs 生态系统中的好公民。
可重复性意味着团队成员能够在多个版本的数据之间进行时间旅行,在不同时期拍摄数据快照,并进行不同程度的修改。
为了确保数据的可重现性,我们建议在每次 lakeFS 存储库中的数据发生更改时提交一个 lakeFS 存储库。只要已进行提交,复制给定状态就就像从包含为提交生成的唯一commit_id的路由中读取数据一样简单。
获取存储库的当前状态非常简单。我们使用带有存储库名称和分支名称的静态路由。例如,如果有一个名为 example 的存储库,其中包含一个名为 main 的分支,则将此数据的最新状态读入 Spark Dataframe 如下所示:
df = spark.parquet("s3://play.minio.org.cn/main/")
df = spark.parquet(“s3://play.minio.org.cn/main/”)
注意:此代码片段假定此路径下的存储库中的所有项目均采用 Parquet 格式。如果使用的是其他格式,请使用相应的 Spark 读取方法。
但是,我们也可以查看 lakeFS 存储库中的任何先前提交。任何提交都可以重现。如果可以重现提交,则结果是可重复的。
![](https://files.mdnice.com/u
ser/41350/63d1c08a-fc1e-4a51-a902-af1d6fefe878.png)
在上面的存储库中,每次执行模型训练脚本时,都会对存储库进行新的提交,并且提交消息会指定确切的运行编号。如果我们想重新运行模型训练脚本并从之前的运行中获得相同的结果,该怎么办?例如,假设我们想要重现运行 #435 的结果。为此,我们只需复制与运行关联的提交 ID,并将数据读入数据帧,如下所示:
df = spark.parquet("s3://example/296e54fbee5e176f3f4f4aeb7e087f9d57515750e8c3d033b8b841778613cb23/training_dataset/")
df = spark.parquet(“s3://example/296e54fbee5e176f3f4f4aeb7e087f9d57515750e8c3d033b8b841778613cb23/training_dataset/”)
在代码中引用单个commit_id的功能有助于复制数据集合或多个集合的特定状态的过程。这有几个典型的数据开发用途,例如历史调试、发现数据收集中的增量、审核合规性等。
使用 MinIO 的对象存储
MinIO 是一个高性能、兼容 S3 的对象存储。它专为大规模 AI/ML、数据湖和数据库工作负载而构建。它可以在本地和任何云(公共或私有云)上运行,从数据中心到边缘。MinIO 是 GNU AGPL v3 下的软件定义和开源。企业使用 MinIO 来交付 ML/AI、分析、备份和归档工作负载 - 所有这些都来自一个平台。MinIO 的安装和管理非常简单,提供了一套丰富的企业功能,旨在实现安全性、弹性、数据保护、可扩展性和身份管理。在此介绍的端到端演示中,MinIO 用于存储客户的文档。
lakeFS 以类似 Git 的操作形式为基于对象存储的数据湖提供版本控制功能。它可以在您的 MinIO 存储环境之上工作,并与所有现代数据框架(如 Apache Spark、Hive、Presto、Kafka、R 和 Native Python 等)集成。
在 MinIO 之上使用 lakeFS,您可以:
- 创建跟踪试验的开发环境
- 高效地修改数据并对其进行版本控制,每个实验的副本分支和提交均为零。
- 构建强大的数据管道,将新数据交付到生产环境。
以下是如何在 MinIO 上设置 lakeFS 并简化数据处理。
先决条件
- 安装MinIO 服务器
- 安装mc
- 安装docker
让我们首先在计算机上本地安装 lakeFS。lakeFS 文档中提供了更多安装选项。
适合生产环境的安装需要持久的 PostgreSQL 安装。但在此示例中,我们将在 Docker 容器中使用本地键值存储。
运行以下命令,将 替换为 MinIO 安装中的值:
docker run --name lakefs \
--publish 8000:8000 \
-e LAKEFS_BLOCKSTORE_TYPE=s3 \
-e LAKEFS_BLOCKSTORE_S3_FORCE_PATH_STYLE=true \
-e LAKEFS_BLOCKSTORE_S3_ENDPOINT= \
-e LAKEFS_BLOCKSTORE_S3_CREDENTIALS_ACCESS_KEY_ID= \
-e LAKEFS_BLOCKSTORE_S3_CREDENTIALS_SECRET_ACCESS_KEY= \
treeverse/lakefs:latest \
run --local-settings
配置
转到 lakeFS 并创建一个管理员用户:http://127.0.0.1:8000/setup
记下生成的访问密钥和密钥。
使用访问和密钥登录到 lakeFS:http://127.0.0.1:8000
我们将使用 lakectl 二进制文件来执行 lakeFS 操作。您需要在此处找到适合您的操作系统的发行版,并从 tar.gz 存档中提取 lakectl 二进制文件。在$PATH中的某个位置找到它,然后运行 lakectl --version 进行验证。
然后运行以下命令,使用之前在设置中获取的凭据配置 lakectl:
lakectl config
# output:
# Config file /home/janedoe/.lakectl.yaml will be used
# Access key ID:
# Secret access key:
# Server endpoint URL: http://127.0.0.1:8000/api/v1
确保 lakectl 可以使用以下命令访问 lakeFS:
lakectl repo list
如果没有收到任何错误通知,则已准备好为 lakeFS 设置 MinIO 别名:
mc alias set lakefs http://s3.local.lakefs.io:8000
mc alias set myminio
如果还没有,请同时为 MinIO 存储设置 MinIO 别名:
现在,我们已经了解了基本概念并安装了所有内容,让我们通过一个端到端示例来演示将其整合到您的 AI/ML 工程工作流程中是多么容易。您还会注意到,使用 lakeFS 非常类似于 git。如果你的工程师了解 git,他们将很容易学习 lakeFS。
零克隆拷贝和可重现性示例
将 MinIO 与 lakeFS 相结合的主要优势之一是能够在不产生额外存储成本的情况下实现并行性。lakeFS 利用一种独特的方法(零克隆副本),在不复制数据的情况下有效管理不同版本的 ML 数据集和模型。此功能将在本节中演示。
让我们从在 MinIO 中创建一个存储桶开始吧!
请注意,此存储桶将直接在 MinIO 安装中创建。稍后,我们将使用 lakeFS 在此存储桶上启用版本控制。
mc mb myminio/example-bucket
因此,让我们从在 lakeFS 中创建一个存储库开始:
lakectl repo create lakefs://example-repo s3://example-bucket
生成两个示例文件:
echo "my first file" > myfile.txt
echo "my second file" > myfile2.txt
创建一个名为 experiment1 的分支,将文件复制到其中并提交:
lakectl branch create lakefs://example-repo/experiment1 --source lakefs://example-repo/main
mc cp ./myfile.txt lakefs/example-repo/experiment1/
lakectl commit lakefs://example-repo/experiment1 -m "my first experiment"
让我们在 experiment1 分支中为提交的数据创建一个标签(您的 ML 模型稍后可以通过标签访问您的数据):
lakectl tag create lakefs://example-repo/my-ml-experiment1 lakefs://example-repo/experiment1
现在,让我们将分支合并回 main:
lakectl merge lakefs://example-repo/experiment1 lakefs://example-repo/main
创建一个名为 experiment2 的分支,将文件复制到其中,提交并标记它:
lakectl branch create lakefs://example-repo/experiment2 --source lakefs://example-repo/main
mc cp ./myfile2.txt lakefs/example-repo/experiment2/
lakectl commit lakefs://example-repo/experiment2 -m "my second experiment"
lakectl tag create lakefs://example-repo/my-ml-experiment2 lakefs://example-repo/experiment2
现在,让我们将分支合并回 main:
lakectl merge lakefs://example-repo/experiment2 lakefs://example-repo/main
使用标记列出不同实验的数据:
mc ls lakefs/example-repo/my-ml-experiment1
# only myfile.txt should be listed
mc ls lakefs/example-repo/my-ml-experiment2
# both files should be listed
总结
通过将 lakeFS 和 MinIO 结合在一起,您可以利用 Git 分支的强大功能来创建可重复的实验。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)