当前位置: 首页 > 科技观察

还在使用Github管理机器学习项目?您早该使用这些更专业的新工具了!

时间:2023-03-19 14:32:15 科技观察

大数据文摘编译:钱天培、胡佳“太复杂了!机器学习(ML)项目太复杂了!”听到这种抱怨,熟悉软件开发的朋友往往会嗤之以鼻。机器学习只不过是处理数据和软件。所以运行代码,迭代算法应该是一件简单的事情?一段时间后,我们将拥有一个经过完美训练的ML模型。有什么复杂的?然而,当你真正开始一个机器学习项目时,你会发现事情并没有那么简单!在项目中经过一段时间后,你的训练数据可能已经被更改或删除,你对训练脚本的理解可能已经很模糊了。回顾你训练好的模型,你可能不记得每个模型是如何训练的;或者,如果你想查看之前训练好的模型,你发现模型已经被覆盖了。更可怕的是团队合作。你想与同事分享你的工作,但他们无法重现你的成果,更谈不上参与协作。不要恐慌!今天,文摘菌带你系统学习如何正确管理机器学习(ML)项目。与一般的任何软件开发项目一样,您需要更好地管理代码版本和项目资产。在软件开发项目中,可能需要重新审视项目的先前状态。我们如何才能在机器学习项目中实现类似的评论?PullRequest的对应物是什么?就个人而言,我刚刚开始使用机器学习工具。在学习的过程中,我观看了一些教程视频。老师提到的一些问题让我想起了我早期在软件工程生涯中遇到的困难。例如,在1993-1994年,我是一个开发电子邮件用户代理的团队的高级工程师。我们没有任何源代码管理(SCM)系统。每天我都和其他团队成员商量,看他们当天做了什么改动,也就是在他们的源码树和主源码树之间运行一个diff操作,然后手动更改代码。稍后,团队成员从主源代码树手动更新他们的源代码树。在我们发现早期的SCM系统(CVS)之前,它是一团糟。SCM工具使项目运行更顺畅。当我了解机器学习和数据科学项目中使用的工具时,我发现机器学习过程如上所述。即使在今天,机器学习研究人员有时也会将实验(数据、代码等)存储在并行目录结构中,以便于差异审查,就像我在1993年所做的那样。那么,理想的机器学习项目管理应该是什么样子的呢?ML项目管理原则让我们从一些简要的ML项目管理原则开始。在任何ML项目中,程序员都会进行许多实验,以开发针对目标场景的最佳训练模型。实验一般包括:代码和配置:实验中使用的软件,以及配置参数Dataset:使用任何输入数据——这可以是千兆字节的数据,比如语音识别、图像识别项目中使用的数据输出:经过训练的ML模型和实验的任何其他输出机器学习项目的本质是软件操作。然而,与同事共享文件或复制结果并及时返回以评估项目通常很困难。我们需要更全面的管理工具。解决方案需要涵盖以下几点(摘自PatrickBall题为《原则性数据处理》的演讲):(1)透明度:方便检查ML项目的各个环节使用了哪些代码、配置和数据文件。(2)Auditability:方便检查pipeline的中间结果(3)Reproducibility:在开发的任何阶段准确重新执行项目的能力,以及同事准确记录的能力processingsteps,以便任何人都可以自动重新运行这些步骤以记录项目进展的状态。“状态”表示代码、配置和数据集重新创建项目历史上任意时刻可用的确切数据集的能力(4)可扩展性:支持多个同事同时从事一个项目的能力,以及能够同时处理多个项目。为什么不在机器学习项目中使用常规软件工程工具?不可否认,常规软件工程项目中使用的许多工具可能对机器学习研究人员有用。代码和实验配置可以在Git等传统源代码控制系统中轻松管理,并且可以使用拉取请求等技术来管理对这些文件的更新。CI/CD(Jenkins等)系统甚至可以用于自动化项目运行。然而,ML项目不同的是,通用的软件开发工具并不能满足所有需求。这里有一些重要的区别:指标驱动开发与特性驱动开发:在传统的软件工程中,“发布”的决定是基于团队是否已经完成了某些特性。相比之下,机器学习研究人员研究了一种完全不同的衡量标准——生成的机器学习模型的预测值。研究人员将迭代生成数十个(或更多)模型,测量每个模型的准确性。由于目标是找到最准确的模型,因此该项目以每个实验中取得的指标为指导。机器学习模型需要大量资源来训练:常规软件项目将文件组织在一起以编译软件产品,而机器学习项目则训练描述AI算法的“模型”。大多数情况下,编译一个软件产品只需要几分钟,速度非常快,所以很多团队都遵循持续集成(continuousintegration)的策略。训练机器学习模型需要很长时间。除非必要,否则避免持续集成。庞大的数据集和经过训练的模型:机器学习开发阶段几乎总是需要庞大的数据集,此外,经过训练的模型也可能非常庞大。常见的源代码控制工具(Git等)不能很好地处理大文件,并且像Git-lfs这样的附加组件不适合ML项目。工作流(管道):机器学习项目是一系列步骤——例如下载数据、准备数据、将数据分离到训练/验证集、训练模型和验证模型。许多人使用管道这个词来描述整个过程,意思是用每个步骤的离散命令来构建一个机器学习项目,而不是将所有内容都塞进一个程序中。专用硬件:软件开发人员可以在任何类型的服务器设备上托管他们的软件基础设施。如果他们想要云部署,他们可以从他们最喜欢的云提供商那里租用VPS。然而,机器学习研究人员有巨大的计算需求。高性能GPU不仅可以加速视频编辑,还可以加速ML算法“飞起来”,大大减少训练ML模型所需的时间。我们现在有了机器学习项目开发的原则列表,并了解了ML项目与普通软件开发项目的不同之处。接下来,让我们看看有哪些开源软件可以帮助我们实现这些原则。我们将特别讨论两种工具,MLFlow和DVC。当然,还有很多其他的软件可以达到类似的效果。机器学习项目中的数据和模型存储我们的讨论归结为:跟踪用于训练每一轮机器学习模型的数据文件跟踪经过训练的模型和评估指标通过任何形式的文件共享系统与同事共享数据文件的便利性方法通常,我们需要一个数据跟踪系统来透明地审计或重现结果。我们还需要一个数据共享系统来将项目团队扩展到多个同事。正如我们之前讨论的,使用Git或其他SCM(源代码管理系统)来存储机器学习项目中使用的数据文件是不切实际的。一些图书馆提供API来简化远程存储上的文件处理,并管理上传或获取文件到远程存储。虽然这有助于共享访问远程数据集,但无助于解决我们面临的问题。首先,它是一种嵌入式配置形式,因为文件名嵌入到软件中。任何在其源代码中嵌入配置设置的程序都更难重用。其次,它不会将脚本版本链接到它使用的数据文件。接下来我们看一下MLFlow的示例代码:mlflow.pytorch.load_model("runs://run-relative/path/to/model")这个支持多种文件访问“schemas”,包括S3云存储系统。此处的示例从“运行”区域加载文件,在本例中为经过训练的模型。每次执行一段代码时,MLFlow都会生成一次“运行”。您需要配置存储“运行”数据的位置,显然会为每次运行生成一个“运行ID”,用于索引到数据存储区域。这种方法有效地将数据与相应SCM源代码控制存储库中代码和配置文件的提交版本相关联。另外,MLFLowAPI有多种实现语言,并不局限于Python语言。DVC采用的是另一种方式。与上面将文件API集成到ML脚本中相比,您的脚本可以简单地使用通用文件系统API来实现输入和输出文件。例如:model=torch.load('path/to/model.pkl')通过上面的代码,路径名会通过这个命令传入。不需要特别修改代码,因为DVC可以对外传递训练代码或者验证模型代码需要的值。DVC使这一点变得透明——数据文件版本与代码的Git版本相匹配。您可以使用以下命令将文件或文件夹添加到DVC的版本管理中:$dvcaddpath/to/model.pkl数据存储在您的工作目录中。浏览每次运行的结果也很简单,浏览你的Git历史记录即可。查看特定结果就像gitcheckout一样简单,将调用DVC并确保将正确的数据文件附加到工作区。将创建一个“DVC文件”,跟踪每个文件和目录,并将其添加到工作区。这有两个目的,一个是跟踪数据和模型文件,另一个是记录工作流中的命令。我们将在下一节中介绍这一部分。这些DVC文件记录了文件和目录的MD5和校验码(MD5checksum)。它们被提交到git工作区,所以DVC文件记录了每个git提交的每个文件的校验码。DVC使用“DVC缓存目录”来存储每个文件的多个实例。文件实例由校验和索引,并使用引用链接或符号链接链接到工作区。当DVC响应gitcheckout命令时,可以根据DVC文件中的和校验码快速重新排列链接文件。DVC支持用于共享文件和模型的远程缓存目录。$dvcremoteaddremote1ssh://user@host.name/path/to/dir$dvcpush$dvcpullDVCremote是一个用于数据共享的存储池。它支持许多存储服务,包括S3、HTTP和FTP等。创建DVC遥控器非常简单。dvcpush和dvcpull命令高度模拟gitpush和gitpull命令。dvcpush用于发送数据到远端DVC的缓存中,dvcpull用于从远端DVC的缓存中拉取数据。机器学习项目中的工作流描述接下来,我们讨论如何更好地描述机器学习项目的工作流。我们应该把所有东西都堆成一个程序吗?还是我们应该使用多种工具?为了创造尽可能多的灵活性,我们可以通过管道或有向无环图(DAG)传递工作流,并采用命令行参数,因为这是通过配置选项实现的。这有点像Unix的小而精巧工具的理念——小但协同工作。它的行为可以由命令行选项或环境变量指定,并且可以根据需要以任意组合使用。相比之下,许多ML框架采用不同的方法。他们编写单独的程序来驱动特定项目的工作流程。该程序的第一步是将数据拆分为训练集和验证集,然后训练模型并验证模型。这整套单独的程序为代码重用提供了有限的机会。为ML项目构建管道具有以下优势:管理复杂性:将这些步骤作为单独的命令实施可以提高透明度并帮助您更加专注。优化执行:不修改、不需要返回值的步骤可以跳过。可重用性:同一个工具可以在多个项目中重复使用。可扩展性:不同的工具可以由不同的团队成员独立开发。在MLFlow中,您需要编写一个“驱动程序”。该程序包含所需的执行逻辑,例如处理和生成机器学习模型。在后台,MLFlowAPI向MLFlow服务器发送请求,通过该服务器生成指定的命令。以下多步工作流的MLFlow示例清楚地证明了这一点。...load_raw_data_run=_get_or_run("load_raw_data",{},git_commit)ratings_csv_uri=os.path.join(load_raw_data_run.info.artifact_uri,"ratings-csv-dir")etl_data_run=_get_or_run("etl_data",{"ratings_csv":ratings_csv_uri,"max_row_limit":max_row_limit},git_commit)...als_run=_get_or_run("als",{"ratings_data":ratings_parquet_uri,"max_iter":str(als_max_iter)},git_commit)..._get_or_run("train_keras",keras_params,git_commit),use_cache=False)..._get_or_run函数是mlflow.run的包装器。每个函数调用中的第一个参数是MLproject文件中定义的入口点。每个入口点都包含环境变量、要运行的命令以及传递给该命令的参数。例如:etl_data:parameters:ratings_csv:pathmax_row_limit:{type:int,default:100000}command:"pythonetl_data.py--ratings-csv{ratings_csv}--max-row-limit{max_row_limit}"乍一看,它感觉很好。但这里有几个问题值得思考:如果您的工作流程比直线流程更复杂怎么办?您可以将传递给mlflow.run的同步参数设置为false,然后等待SubmittedRun对象将任务标记为已完成。也就是说,可以在MLFlowAPI之上构建流程管道系统。为什么需要服务器?为什么不直接通过命令行执行命令呢?添加服务器及其配置会使MLFlow项目的设置更加复杂。你如何避免执行那些不必要的任务?在许多ML项目中,训练模型通常需要数天时间。资源应仅在需要时使用,例如替换数据、修改参数或算法。DVC可以使用常规的命令行工具,既不需要设置服务器也不需要编写驱动程序。DVC支持使用前面提到的,通过一组DVC文件将工作流定义为有向无环图(DAG)。正如我们之前提到的,DVC文件与添加到工作区的文件相关联。DVC文件还描述了要执行的命令:$dvcrun-dmatrix-train.p-dtrain_model.py\-omodel.p\pythontrain_model.pymatrix-train.p20180226model.p$dvcrun-dparsingxml.R-dPosts.xml\-oPosts.csv\Rscriptparsingxml.RPosts.xmlPosts.csvdvc运行命令定义了一个DVC文件,其中包含要执行的命令。-d参数记录了对文件的依赖关系,DVC会根据校验码检测文件的变化。-o参数表示命令输出设置。一个命令的输出也可以用作另一个命令的输入。通过查看依赖关系和输出,DVC可以确定执行命令的顺序。AI输出(包括训练模型)会自动记录在DVC缓存中,工作区中的其他数据文件也是如此。因为它计算校验和,所以DVC可以检测更改的文件。当用户请求DVC重新执行管道时,它只执行发生变化的部分。在输入文件不变的情况下,DVC可以节省大量模型训练任务所需的时间。所有执行都使用常规命令行,不需要服务器设置。如果你想在云计算环境或者挂接GPU的服务器上执行,只需要将代码和数据部署到服务器上,通过命令行执行DVC命令即可。总结在寻找改进机器学习实践的原则方面,我们已经取得了长足的进步。众所周知,机器学习领域需要更好的管理工具,以便机器学习团队能够更高效、更可靠地工作。可重现的结果意味着其他人可以评估您所做的工作,或合作进行进一步的开发。可重复性有很多先决条件,包括能够检查系统的每个部分以及能够重新运行软件和精确输入数据。在机器学习项目中,一些GUI工具的用户界面非常漂亮,比如JupyterNotebook。这些工具在机器学习的工作中占有一席之地。但是,GUI工具不太适合本文讨论的原则。命令行工具非常适合在后台运行的任务,并且可以轻松满足我们上述所有原则。通用GUI会妨碍这些原则。如本文所述,我们可以从传统软件工程中借鉴许多工具和实践。然而,机器学习项目的特殊性决定了我们需要使用更适合他们目标的工具。这些有价值的工具包括:MLFlow、DVC、ModelDb、Git-LFS等等。相关报道:https://dev.to/robogeek/principled-machine-learning-4eho【本文为专栏组织大数据文摘原创文章,微信公众号《大数据文摘(id:BigDataDigest)》】点此查看该作者更多好文