朱宪忠审稿人|孙淑娟作为数据科学家,我们通常希望尽快开始训练模型。这不仅仅是因为人类天生没有耐心。例如,我们可能想测试某人项目中的一个非常小的更改,并且我们希望避免为了测试这么小的修改而进行冗长的设置工作。在处理计算机视觉和大型图像数据集时尤其如此。当您在训练模型之前必须提取一个巨大的数据集(使用DVC版本)时,您是否曾经感到恼火?或者您可能需要拉取整个数据集来检查/修改单个图像或其中的一些图像?如果这听起来很熟悉;好吧,接下来我将向您展示如何使用DagsHub公司开发的新数据流客户端来解决这些潜在的瓶颈。【译者注】DAGsHub是DAGsHub团队开发的一个开源免费的网络平台,用于数据科学家和机器学习工程师之间的数据版本控制和协作(DAGsHub是DVC,Github是Git)。其中,DVC全称DataVersionControl(DataVersionControl),本质上类似于Git,但它是专门为数据而设计的。什么是数据流客户端?DagsHub开源的流媒体客户端叫做直接数据访问(DDA:DirectDataAccess)。本质上,DDA允许数据从任何DagsHub存储库流入/流出。换句话说,我们的Python代码将表现得好像所有文件都存在于本地;但实际上,客户端会根据请求动态下载它们。此外,我们可以将数据上传到DagsHub上托管的任何项目。但最重要的是,使用流式客户端不需要对代码库进行大量更改。一两行额外的代码通常足以充分享受新客户端的好处。简而言之,DDA提供以下功能:能够从任何DagsHub存储库批量传输数据无需先拉取整个数据集即可将新数据附加到现有数据集智能缓存:流式处理后文件仍然可用节省时间、资源和内存现在我们有了新客户端的高级概述,让我们更深入地了解它的实际工作原理。从背后的实现技术分析,DDA中主要有两种实现技术。第一个实现使用Python挂钩机制,能够检测任何对Python内置文件操作(如打开、写入等)的调用,如果在本地找不到文件,则修改它们以从DagsHub存储库中检索文件。这种方法的最大优点是大多数流行的Python库都会自动使用它。虽然这听起来不错,但我们应该意识到这种方法的一些局限性:这种方法不适用于依赖于用C/C++编写的I/O例程的框架,例如OpenCV。在deps中运行DCV跟踪文件的阶段,某些DVC命令(例如dvcrepro和dvcrun)将不起作用。第二种实现称为MountedFilesystem,它基于FUSE(USErspace中的文件系统:https://en.wikipedia.org/wiki/Filesystem_in_Userspace?ref=hackernoon.com)。在后台,客户端创建了一个镜像DagsHub存储库的虚拟挂载文件系统。该文件系统的行为类似于本地文件系统的一部分,例如我们可以看到目录下的所有文件,并且可以查看。现在最紧迫的问题是:我应该使用哪个实现?DagsHub的数据流客户端的文档建议,如果你在Windows或Mac上工作并且没有任何依赖C的框架/库,那么建议你使用Pythonhook方法;否则,使用挂载的文件系统。请参阅文档以全面比较这两种方法的优缺点。流式客户端使用场景我们已经知道流式客户端是什么以及它是如何工作的。现在,让我们通过流式客户端的一些具体使用场景来展示我们如何在我们的工作流程中使用它。首先,我们可以通过使用流式客户端减少开始训练所需的时间。假设我们正在处理图像分类问题;然后,使用流式客户端,我们不必在实际开始训练模型之前下载整个数据集,因为Python会“假装”文件可用并立即开始训练模型。数据加载器通常经过优化,可以在当前批次用于训练时提前加载下一批次。在后台,流媒体客户端只需按需下载批量图像进行训练,并将它们缓存起来以备后用。通过这种方法,我们可以节省大量时间和资源。后者可以通过例如虚拟机的运行时间来衡量。其次,我们只能在整个数据集的一个子集上训练模型。想象一下有一个包含数千个类别的图像数据集,但对于您的特定实验,您只需要使用几个选定的类别进行训练。使用流式客户端,Python代码将仅加载实际请求的数据以实现训练任务。最后,我们还可以使用流式客户端将数据上传到DVC版本的存储库。在一个特别令人沮丧的应用场景中,我们的数据集中可能有数万张图像,我们想再添加10张图像到我们的集合中。通常,我们必须提取所有数据、添加新图像并再次对整个修改后的数据集进行版本控制。在这种情况下,借助DDA(直接数据访问),我们可以直接添加10张新图像,而无需下载整个数据集。一个实际示例我希望上面提到的场景让您对使用您的流媒体客户端感到兴奋!为了利用流媒体客户端,我们需要将项目存储在DagsHub上并使用DVC对数据进行版本控制。本教程的目的是展示如何使用流式客户端快速启动和运行项目。这就是我们分叉现有项目的原因,我们将展示如何在云中快速开始训练神经网络。为此,我们将使用GoogleColab云平台,当然你也可以使用AWS等其他云平台。我们复制的项目是CheXNet的TensorFlow实现,CheXNet是一个121层的CNN(卷积神经网络),用于从胸部X光片检测肺炎。最初的实现是在ChestX-ray14数据集(可在Kaggle上获得:https://www.kaggle.com/datasets/paultmothymooney/chest-xray-pneumonia?ref=hackernoon.com)上训练的,这是目前最大的公开可用的胸部X光数据集,包含超过100,000张图像。该数据集超过45GB,分为14个不同的目录,每个目录对应一种不同的疾病。为了减少这个实验的训练时间,我们使用了数据集的二次采样版本,它只有1GB。在我们开始之前,值得一提的是使用DDA并不总是有益的。在开始这个项目之前,我试图在我的超级马里奥游戏分类器中使用DDA。就在这个游戏的背景下,我遇到了一个边缘案例,在神经网络训练期间通过单个批次比按需下载批次要快。这使得第一个时期的训练比预先下载整个数据集然后正常运行训练步骤要长得多。因此,用于训练的图像必须足够大(就其分辨率/大小而言),以便单个批次的训练步骤比下载下一批次的时间更长。如果您继续阅读本文,我建议您下载并使用我在GoogleColab中使用的笔记本文件。设置项目为了方便实验,我将项目复制到自己的账号下,以使用MLflow的实验跟踪等功能。您也可以直接克隆存储库来训练模型,而无需创建另一个克隆。打开notebook项目后,我们需要使用以下命令安装一些依赖库:!pipinstalldagshubomegaconfmlflow接下来我们导入需要的库:importdatetimeimportosfromIPython.displayimportdisplay,Image导入列表比较短,因为大多数库(例如,用于训练神经网络的Keras框架)已经加载到每个脚本中。然后我们定义一些常量,其中包含存储库的所有者、要克隆的存储库的名称、要使用的分支等值。="streaming"定义了所需的常量后,我们可以使用方便的init函数来初始化DagsHub存储库。然后我们可以轻松地使用MLFlow来记录实验、获取访问令牌等。我们运行以下代码段以在Colab中设置项目:importdagshubdagshub.init(repo_name=REPO_NAME,repo_owner=REPO_OWNER)在浏览器中进行身份验证。然后我们可以使用gitclone命令克隆存储库:目录更改为CheXNet目录:%cd/content/{REPO_NAME}然后我们将分支更改为包含可与流式客户端一起使用的代码库的分支:!gitcheckout{REPO_BRANCH}正如我们之前提到的,master分支使用完整的45GB数据集,而流分支在子采样数据集上训练神经网络。在这一点上,我们都已设置并准备好使用我们的流媒体客户端。检查数据集首先,让我们看一下我们的数据集。克隆代码库后,我们可以看到数据是使用DVC进行版本控制的,因为我们可以看到相应的跟踪文件。但是,我们实际上无法从Colab中检查它。至少现在还没有:我们的示例项目的目录结构接下来,让我们使用流式客户端来完成任务。在本教程中,我们使用DDA的Python挂钩技术来实现这一点。因此,我们需要运行以下两行代码:fromdagshub.streamingimportinstall_hooksinstall_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','000095.','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"insys.argv:fromdagshub.streaming.filesystemimportinstall_hooksinstall_hooks()linearguments调用脚本时传递的值的数组。为了说明,我们可以使用以下片段运行训练脚本:%runmodeling/src/train.pySTREAM如果我们想在不使用流客户端的情况下运行脚本,我们只需删除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。译者介绍朱宪忠,社区编辑,专家博主,讲师,潍坊某高校计算机教师,自由编程资深人士。原标题:OptimizeModelTrainingwithaDataStreamingClient,作者:ErykLewinson
