基于数据流客户端优化模型训练

译者 | 朱先忠

成都网站制作、网站建设中从网站色彩、结构布局、栏目设置、关键词群组等细微处着手,突出企业的产品/服务/品牌,帮助企业锁定精准用户,提高在线咨询和转化,使成都网站营销成为有效果、有回报的无锡营销推广。成都创新互联公司专业成都网站建设十余年了,客户满意度97.8%,欢迎成都创新互联客户联系。

审校 | 孙淑娟

作为数据科学家,我们通常都希望尽快开始训练模型。这不仅仅是因为人类具有天性急躁的特征。例如,我们可能希望测试某人的项目中的一个非常小的更改,并且我们希望避免为了测试这样的小修改而进行冗长的设置工作。

这种情况在处理计算机视觉和大型图像数据集时尤其明显。当你在训练你的模型之前必须提取一个庞大的数据集(使用DVC版本)时,你有过烦恼吗?或者,您可能需要拉动整个数据集来检查/修改单个图像或其中的一些图像?如果这听起来很熟悉;那么,接下来我将向您展示如何使用DagsHub公司开发的新数据流客户端解决这些潜在的瓶颈问题。

【译者注】DAGsHub是DAGsHub团队开发的用于数据科学家和机器学习工程师的数据版本控制和协作的开源免费Web平台(DAGsHub是DVC,Github是Git)。其中,DVC代表数据版本控制(Data Version Control),本质上与Git相似,但它是专门为数据而设计的。

什么是数据流客户端?

DagsHub的开源流媒体客户端被称为直接数据访问(DDA:Direct Data Access)。本质上,DDA允许从任何DagsHub存储库流入/流出数据。换句话说,我们的Python代码将表现为所有文件都存在于本地;但实际上,客户端将根据请求动态下载它们。此外,我们还可以将数据上传到DagsHub上托管的任何项目。但最重要的是,使用流媒体客户端不需要对代码库进行大量更改。一行或两行额外的代码通常足以充分享受新客户机的好处。

简而言之,DDA提供以下功能:

  • 能够从任何DagsHub存储库批量传输数据
  • 将新数据附加到现有数据集而不首先拉动整个数据集
  • 智能缓存:文件在流式传输后仍然可用
  • 节省时间、资源和内存

在对新客户端进行了高层次的概括了解之后,让我们更深入地了解一下它的实际工作方式。从幕后实现技术来分析,DDA中存在两个主要的实现技术。

第一个实现是使用了Python钩子机制,从而能够检测对Python内置文件操作(如打开、写入等)的任何调用,并修改它们,以便在本地找不到文件时从DagsHub存储库检索文件。这种方法的最大优点是大多数流行的Python库都会自动使用这种方法。

虽然这听起来很好,但我们应该意识到这种方法中存在的一些局限性:

  • 该方法不适用于依赖C/C++编写的I/O例程的框架,例如OpenCV。
  • 某些DVC命令(如dvc repro和dvc run)在deps中运行DCV跟踪文件的阶段将不起作用。

第二个实现称为挂载的文件系统(Mounted Filesystem),它基于FUSE(USErspace中的文件系统:​​https://en.wikipedia.org/wiki/Filesystem_in_Userspace?ref=hackernoon.com​​)。在底层实现上,客户端创建了一个反映DagsHub存储库的虚拟安装文件系统。该文件系统的行为类似于本地文件系统的一部分,例如我们可以看到目录中的所有文件,并且可以查看它们。

现在的迫切问题是:该使用哪种实现方案呢?DagsHub的数据流客户端有关文档建议,如果您在Windows或Mac上工作,并且没有任何依赖C的框架/库,那么建议您使用Python钩子方法;否则,请使用挂载的文件系统。请参阅​​文档​​来全面比较这两种方法各自的优劣。

流媒体客户端使用场景

我们已经知道流媒体客户端是什么以及它是如何工作的。现在,让我们介绍一下流媒体客户端的一些具体使用场景,从而展示我们该如何在工作流程中使用它。

首先,我们可以通过使用流媒体客户端来减少开始训练所需的时间。假设我们正在处理一个图像分类问题;那么,借助于流式客户端,我们不必在实际开始训练模型之前下载整个数据集,因为Python会“假装”文件已经可用,并立即开始训练模型。数据加载器经常被优化,从而实现在当前批次正在用于训练时提前加载下一个批次。在后台,流媒体客户端只需按要求批量下载图像进行训练,并将其缓存以供以后使用。通过这种方法,我们可以节省大量时间和资源。后者可以通过例如虚拟机的运行时来进行衡量。

其次,我们只能在整个数据集的子集上训练模型。想象一下,拥有一个包含数千个类的图像的数据集,但对于您的特定实验,您只需要使用几个选定类别进行训练。借助于流式客户端,Python代码将仅加载实际请求的数据来实现训练任务。

最后,我们还可以使用流媒体客户端将数据上传到DVC版本的存储库。在一个特别令人沮丧的应用场景中,我们的数据集中可能存在数以万计的图像,我们希望再添加10张我们收集的图像。通常,我们必须提取所有数据,添加新图像,并再次对整个修改后的数据集进行版本调整。这种情况下,借助于DDA(直接数据访问),我们可以直接添加10个新图像,而无需下载整个数据集。

一个实际的例子

我希望上面提到的场景能让您对使用流媒体客户端感到兴奋!为了使用流媒体客户端的优势,我们需要将我们的项目存储在DagsHub上,并使用DVC对数据进行版本化。

本教程的目标是展示如何快速地使用流媒体客户端启动和运行项目。这就是为什么我们复制(Fork)了一个已经存在的项目,我们将展示如何在云端快速启动神经网络的训练。为此,我们将使用GoogleColab云平台,当然您也可以使用类似于AWS等其他的云平台。

我们复制的项目是CheXNet的TensorFlow实现,它是一个121层的CNN(卷积神经网络),用于从胸部X光片检测肺炎。最初的实现是在ChestX-ray14数据集(可在Kaggle上获得:​​https://www.kaggle.com/datasets/paultimothymooney/chest-xray-pneumonia?ref=hackernoon.com​​)上训练的,该数据集是目前最大的公开可用的胸部X射线数据集,拥有超过100000张图像。该数据集超过45GB,分为14个不同的目录,每个目录专门针对不同的疾病。为了减少这个实验的训练时间,我们使用了数据集的二次采样版本,它只有1GB。

在开始之前,值得一提的是,使用DDA并不总是有益的。在开始这个项目之前,我试着在​​我的超级马里奥游戏​​分类器中使用DDA。就在此游戏对应的场景中,我遇到了一个边缘情况,在神经网络的训练过程中通过单个批次比按需下载批次更快。这使得第一个时期的训练比预先下载整个数据集然后正常运行训练步骤要长得多。因此,用于训练的图像必须足够大(就其分辨率/大小而言),以便单个批次的训练步骤比下载下一个批次的时间更长。

如果您接下来继续阅读本文的话,建议您下载并使用我在Google Colab中使用的​​笔记本文件​​。

设置项目

为了方便试验,我将项目复制到我自己的帐户下,以便使用MLflow的实验跟踪等功能。您也可以直接克隆代码仓库来训练模型,而无需创建另外的复制。

打开笔记本项目后,我们需要使用如下命令安装一些依赖库:

!pip install dagshub omegaconf mlflow

接下来,我们导入所需的库:

import datetime
import os
from IPython.display import display, Image

这些导入列表相当简短,因为大多数库(例如,用于训练神经网络的Keras框架)都已经加载在各个脚本中了。然后,我们定义一些包含值的常量,例如存储库的所有者、要克隆的存储库的名称以及要使用的分支等。

# 要使用的存储库
REPO_OWNER= "eryk.lewinson"
REPO_NAME= "CheXNet"
REPO_BRANCH= "streaming"

定义了所需的常量后,我们可以使用方便的init功能来初始化DagsHub存储库。然后,我们可以轻松地使用MLFlow记录实验,获取访问令牌等。我们运行以下代码段以便在Colab中设置项目:

import dagshub
dagshub.init(repo_name=REPO_NAME, repo_owner=REPO_OWNER)

运行该段代码后,将提示我们在浏览器中进行身份验证。然后,我们可以使用git clone命令克隆存储库:

!git clone https://{USER_NAME}:{dagshub.auth.get_token()}@dagshub.com/{REPO_OWNER}/{REPO_NAME}.git

下一步,我们将目录更改为CheXNet目录:

%cd /content/{REPO_NAME}

然后,我们将分支更改为包含可与流式客户端一起使用的代码库的分支:

!git checkout {REPO_BRANCH}

正如我们之前提到的,主分支使用完整的45GB数据集,而流分支在子采样数据集上训练神经网络。

至此,我们已经完成了设置,并准备好使用流媒体客户端。

检查数据集

首先,让我们来看看我们的数据集。克隆代码库后,我们可以看到数据是用DVC进行版本控制的,因为我们可以看到相应的跟踪文件。然而,我们实际上无法从Colab检查它。至少现在还没有:

我们的示例项目的目录结构

接下来,让我们使用流媒体客户端来完成任务。在本教程中,我们使用DDA的Python钩子技术来实现。因此,我们需要运行以下两行代码:

from dagshub.streaming import install_hooks
install_hooks()

此时,我们可以使用代码检查图像,即使文件夹在目录树中不可见。由于我们知道包含图像的目录的结构;所以,我们可以使用具有相对路径的以下代码段来打印请求目录中的所有图像:

os.listdir("data_labeling/data/images_001/images")

如您所见,这是常规的Python代码,流式客户端在后台为我们处理一切。执行代码段将打印以下列表:

['00000417_005.png',
'00000583_047.png',
'00000683_002.png',
'00000796_001.png',
'00001088_024.png',
'00000013_006.png',
'00000547_009.png',
'00000640_000.png',
'00000732_004.png',
…]

我们还可以使用以下代码段显示图像:

display(Image(filename="data_labeling/data/images_001/images/00000417_005.png"))

胸部X射线数据集的示例图像

正如我们之前提到的,流媒体客户端根据请求下载数据并缓存数据以供以后使用。因此,我们显示的图像实际上是下载的,我们可以在目录树中看到它:

下载第一张图像后的目录

现在,我们可以采取下一步行动:开始训练神经网络了!

训练神经网络

正如我们已经提到的,我们不必花费时间修改用于训练神经网络的代码。我们只需要将已经熟悉的两行代码添加到train.py脚本中。你可能会问:当我们之前已经执行过那一部分代码,为什么还要再次执行?这是因为当我们从Colab调用脚本时,脚本在单独的Python上下文中运行。因此,流设置不再应用于那一部分代码了。

为了使代码库更加通用,我们可以将以下条件语句与install_hooks设置结合使用:

if "STREAM" in sys.argv:
from dagshub.streaming.filesystem import install_hooks
install_hooks()

sys.argv本质上是一个包含命令行参数的数组,即调用脚本时传递的值。为了说明问题,我们可以使用以下代码段运行训练脚本:

%run modeling/src/train.py STREAM

如果想在不使用流客户端的情况下运行脚本,我们只需删除STREAM参数。

一旦运行该命令,我们将看到目录树将开始填充为特定批处理请求的图像。就这样!通过只添加两行代码,我们可以利用流媒体客户端开始按需下载版本化的数据。

此外,您可能希望使用MLflow跟踪您的实验。你要使用DagsHub的设置来执行此操作,而且还需要修改src/const.yaml文件中的MLFLOW_TRACKING_URL常量。

总结

在本文中,我们演示了如何使用DagsHub的流媒体客户端按需下载数据集。这样一来,我们几乎可以立即开始训练我们的模型,而无需首先将所有版本化的数据拉到我们的机器上,无论是在本地还是在云端。正如您所看到的,流媒体客户端确实适合应用于计算机视觉等领域的任务,但是它也可以在解决其他问题时派上用场。

你可以在链接​​https://github.com/erykml/medium_articles/blob/master/Misc/dda_streaming_client.ipynb?ref=hackernoon.com处​​​找到本文中使用的笔记本文件。该项目的代码库可下载的地址是​​https://dagshub.com/eryk.lewinson/CheXNet?ref=hackernoon.com​​。

译者介绍

朱先忠,社区编辑,专家博客、讲师,潍坊一所高校计算机教师,自由编程界老兵一枚。

原文标题:​​Optimize Model Training with a Data Streaming Client​​,作者:Eryk Lewinson

本文名称:基于数据流客户端优化模型训练
网页路径:http://www.shufengxianlan.com/qtweb/news2/250102.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联