为了让机器学习真正为用户带来价值,我们需要将其部署到生产系统中。人工智能销售软件开发公司ToucanAI的ML工程师Marifel介绍了他们在构建生成式机器学习时考虑的一些问题。希望这些经验能对您的工作有所帮助。近年来,随着数据和计算技术的发展,“机器学习”和“深度学习”成为热门的研究领域。虽然公司很流行使用机器学习,但他们首先需要评估他们的业务是否可以从中受益。如果你的公司已经确定机器学习对于公司下一步的发展是必要的,那么作为机器学习工程师的你应该思考如何为生产环境构建机器学习流程。我希望本文能阐明您需要考虑的一些事项。注:本文所说的“创业公司”是指有软件“产品”的公司;提供软件“服务”的公司将被特别指定。软件产品公司专注于开发自己的软件产品,而软件服务公司(如经销商或咨询公司)则为客户开发软件。尽管本文基于作者在早期软件产品初创公司担任机器学习工程师的经验,但其中一些考虑因素也适用于其他阶段或类型的公司。本文的作者是ToucanAI的ML工程师Marifel。寻找适合您的工具机器学习软件有很多选择,从PyTorch、TensorFlow和scikit-learn等开源工具到企业提供的机器学习服务,例如GoogleAIPlatform、AmazonSageMaker和AzureMachineLearning.仅就PyTorch和TensorFlow而言,就有许多可用的开源软件库,这些即用型模型可以作为开发产品的起点。此外,每年都有大量不同领域的机器学习研究论文发表,部分研究人员还以开源形式提供代码。https://paperswithcode.com/该网站可用于查找带有代码的论文资源。选择合适的工具时要考虑的关键因素包括:文档的质量;工具的开发情况(有的工具还在维护中,有的已经停产或启用,或存在严重问题等);其他工具的生态系统;参与工具开发的开发者社区;团队成员对该工具的熟悉程度;将使用该工具的团队规模;该工具涉及的资本成本。在我个人看来,如果你处于早期创业阶段,你不必弄清楚所有这些因素。您可以从选择一个强大的工具开始,然后从那里开始。另外,一开始使用企业提供的机器学习服务是完全可以的,只要你觉得这样做带来的收益能够超过你的投资即可。在进行机器学习和围绕机器学习的开发过程时,最好从一个简单的基线模型开始。从更简单的模型开始可以帮助您识别工作流程中的问题,还可以帮助您了解更耗时的解决方案是否值得。那么如何选择一个简单的基线模型呢?首先,“简单”是相对的。在某些情况下,简单意味着模型简单,例如硬编码一些直观的结果。在其他情况下,模型本身可能很复杂但易于应用。一些广泛使用的数据集具有开源的最先进模型,您可以在研究论文或排行榜等地方找到这些模型;例如,斯坦福问答数据集(SQuAD)就有这样的排行榜。您可以寻找一些最先进的解决方案,然后寻找与该研究论文相关的代码。这可以给你一个很好的起点。在初创公司的早期阶段,您可能没有时间立即动手开发机器学习流程。一般来说,你的重点是尽早做出有效的东西并将其展示给你的投资者或客户。他们通常不太关心流程的优化。所以不要在意你的初始部署是否完美;他们只需要产生有效的结果,真实可见的最终产品。有了好的基础产品之后,就可以考虑机器学习过程相关的东西了。此时,您将有更多空闲时间对您的机器学习过程应用小的增量改进。相反,如果您是代理机构,则出错的空间较小,因为您已经将成品提供给不同的客户并事先修复了所有错误。将产品运送给客户后,您将继续执行下一份客户合同,因此通常没有资源进行进一步改进。尽管如此,作为一个机构,你仍然必须快速行动。为了更快地做到这一点,拥有更精细的机器学习工作流程是有益的。所以对于代理模式来说,如果前期把更多的时间花在精细化和自动化上,可能会为更长期的业务节省时间。实验管理需要考虑的事项在机器学习工作中,实验管理并不容易。当您运行尽可能多的实验时,很容易弄乱您的项目工作区。但是,在早期阶段的初创公司中,您无法花费数月时间来运行数百个实验。你只需要专注于更好的东西并尽可能快地更新它。无论如何,在实验管理方面,有总比没有好。以下是管理机器学习实验时需要考虑的一些事项。模型版本控制我们ToucanAI使用GitHub来存储不同版本的代码。GitHub不错,但不适合大数据文件的版本控制。虽然存储库可以大到100GB,但GitHub建议将存储库的大小保持在1GB以下;此外,单个文件的大小不能超过100MB。您可以使用其他云存储服务,例如GoogleCloudStorage或AmazonS3。对象(文件或文件夹)的版本控制可以通过使用云提供商的命令行工具或Web用户界面简单地创建存储空间(文件夹)来实现。但是,如果您希望将云存储与GitHub项目存储库同步,则需要进行一些额外的手动操作。因此,我们选择了最自然的集成解决方案,它结合了Git平台的最佳特性和其他云存储选项的优势:数据版本控制(DVC,https://dvc.org/。该项目的标语是“AnOpenSourceVersionControlSystemforMachineLearningProjects”。DVC是一个命令行工具,其子命令与Git子命令非常相似。在设置好Git平台和云存储后,可以运行DVC的add和push命令,将不同的版本以如下形式保存云存储中的文件或文件夹。同时,您还可以通过DVC文件的引用功能跟踪Git项目代码库中更大的数据文件。DVC的一大优点是只需要少量的Git-like命令所以你不会与现有的Git工作流程断开连接。记录你的实验如果你正在调整超参数,很容易忘记你在特定时间运行了某个模型。你可能还需要查看你的prev为了准备或预处理该模型的数据集而进行的大量工作。你的JupyterNotebook的文件名可能大致描述了其中的内容,但你仍然需要一段时间才能弄清楚做了什么——先做A还是先做B?这个问题的一个解决方案是在你的笔记文件名中包含排序数字(我喜欢使用步骤01_),你也可以稍后重新排序它们。使用清晰的命名约定和笔记文件的排序可以让您的团队(以及未来的您)快速准确地理解您是如何进行实验的,从而对他们有很大帮助。除了在实践中整理笔记文件,我们还可以使用开源平台MLflow(https://mlflow.org(https://mlflow.org/)),它提供了一个可以用来查看实验超参数的网络和测量结果界面。此外,在编写实验文档时,还应注重逻辑结构和简洁性。对于一个又一个模型的笔记和训练脚本,需要充分利用文件夹结构的命令规则进行组织管理。假设有读者阅读你的笔记本,他们通常会从上到下阅读,所以你想删除匆忙添加的部分。根据经验,您应该为模型和数据集编写注释,如果当前注释太长,则创建一个新注释。您的最终笔记不应包含用于训练和推理的代码;这些应该放在单独的脚本中,然后您可以从笔记中调用它们。最后,当你在使用MLflow等软件生成实验记录时,可以尝试将运行实验的笔记自动参考到生成的实验输出文件中。测试框架在某个指标上的更好分数并不意味着你的模型可以更好地推断真实世界的例子。此外,在生产级机器学习系统中,机器学习模型通常不能单独工作。例如,您的工作流程可能包括探索方法、预处理和缓存结果。因此,当您尝试改进现有的机器学习模型时,您需要意识到在现实世界中创建一个合适的推理示例需要花费大量时间。您需要深入了解更大的生产代码,以了解您要改进的模型何时在现实世界中被调用。不能只检查输入输出,只了解模型本身,而是检查机器学习系统的整个工作过程。您的改进模型将如何影响整个系统?是好是坏?要真正实现模型改进,而不是仅仅提出一些新的推理示例或更改生产管道中的某些内容,我们需要配置一个自动化系统或端到端测试框架。ToucanAI的主要产品是AI销售代理,因此测试涵盖主要逻辑分支的示例对话就足够了,我们还提供了一种回归测试的形式。我们目前正在开发一个命令行界面(CLI)工具,可以基于一系列示例对话框运行pytest评论:https://docs.pytest.org/en/latest/。所有对话都可以用一行命令进行测试,如果任何测试失败,我们将手动更新该测试或评估我们的“更好”模型是否在生产中实际运行得更好。简而言之,重要的是要有一个测试框架,以便了解您当前的实验模型在生产机器学习系统中的表现。有了良好的测试框架,您的模型改进工作流程可以更高效地运行,让您可以运行比以前更多的实验。使用快速发展的工具在我们的生产系统中,我们倾向于使用旧代码库的修改版本;如果这个代码库正在快速发展,我们可能很难将新的改进集成到生产系统中。那么,您如何修改快速发展的代码库以满足您的需求并尽可能高效地应用其最新更新呢?我认为这个问题没有单一的正确答案,而是有许多不同的路径可以遵循。一种方法是将他们的部分代码与您的部分代码结合起来,以构建一个工作系统;另一种方法是拿他们的代码;并彻底升级你的旧版本,但这种方法需要更长的时间。简而言之,您要仔细考虑重新开发需要多少时间,以及您的优先事项是什么。专注于您的优先事项,然后再考虑进行全面重构;您可以在自己的代码库之后执行此操作,并且这个快速发展的工具更加稳定。实验清理当您专注于获得结果时,很容易忽视清洁度。您考虑下一组要运行的实验及其超参数设置。有错误吗?没问题,修改输出文件夹上的时间戳,然后再次运行实验。然而,您最终得到的只是由不完整的实验生成的另一个文件或文件夹。之后,查看实验日志的人会非常头疼,不得不翻阅MLflow中的长列表,寻找完全运行的实验。解决方法很简单,自动删除那些你不想保存的实验运行。例如,最好删除在第一次训练迭代之前失败的实验。为了团队的未来,我们应该尽最大努力保持实验记录的整洁和干净。隔离问题在研究和尝试各种机器学习项目以改进模型时,您会遇到相互冲突的Python包要求。起初,您可能会使用两个开发人员共享的云服务器,但您很快就会发现这很不方便,因为您的安装可能会覆盖您自己团队的安装。使用Docker!它是一个轻量级的容器化软件平台,可用于管理您的项目环境和依赖项。您应该为每个ML模型和应用程序服务器使用不同的Docker容器,这将主动减少“这只适用于我的机器”问题并防止项目之间的依赖冲突。您和您的团队可以在同一台共享服务器上分别设置自己的Docker容器,而不是设置更多的开发服务器,这通常也更具成本效益。此外,您可能想知道为什么是Docker而不是Conda,毕竟Conda允许您使用不同的软件版本创建不同的环境?我们之所以选择Docker,是因为它提供了更适合云上生产和运行的工具。如果你想在远程机器上使用Conda,你必须先连接到那台机器,然后处理文件传输。使用Docker时,只需要几行命令就可以将本地文件的修改同步到远程机器上的Docker容器中。此外,运行项目所需的一切都在Dockerfile或DockerCompose文件中进行了描述。而且在使用Conda的时候,不参考README,不知道是否需要额外的步骤。最后,借助DockerCompose,如果一个机器学习项目需要运行其他服务,你可以在其他Docker容器中运行这些额外的服务,然后让这些容器根据DockerCompose文件设置进行通信。据我所知,Conda无法进行跨环境通信。准备好在需要时扩展当初创公司处于早期阶段时,它不需要扩展,但值得考虑您将用来实现它的技术。其中之一是Celery:http://www.celeryproject.org/。这是一个异步任务队列系统,可以将任务分发给多个worker进行处理。我们目前为每种服务(服务器、客户端、嵌入式模型)使用一个worker,但是为相同的服务设置更多的worker不应该花费太多的精力。这里有一个问题,是通过嵌入扩展瓶颈进行缓存吗?没问题,我们可以再做一个嵌入式Celeryworker或者增加当前worker的并发度,这样你就可以并行运行多个子进程。我们的ToucanAI配置是在Docker容器中运行单个Celeryworker,这也允许隔离。Celery不仅可以扩展您的生产系统,还非常适合长时间运行的任务,例如机器学习模型推理。除了允许服务器响应挂起之外,服务器响应(代理的回复)可以立即返回给与ToucanAI代理对话的最终用户,同时异步任务(例如缓存机制)可以在后台安静地运行。此外,我们使用Celerybeat来运行我们每天安排的分析工作任务。Celerybeat有助于使用cron安排工作任务。与你的团队和你未来的自己合作机器学习研究论文正在大量发表,作为一名机器学习工程师,你需要知道你的团队正在开发和尝试哪些模型和技术。那你该怎么办?你没有任何捷径可以获取他们的知识、经验和见解,但你可以与他们建立联系,并进行大量交流。尽可能保持联系,尤其是书面形式。很多时候,你正在做自己的项目,而你目前正在做的事情可能与你的团队正在做的事情完全无关。不过,也许在未来的某个时候,他们需要审查或扩展您已经实施的内容。也许在你完成那个任务几个月后,你需要对你自己的项目做一些改变,到这个时候你可能已经忘记了你做了什么。所以记得要文件,文件,文件!重复三篇文章,现在你知道文档的重要性了吧?还要注意,有时笔记是不够的。你也需要让你的团队知道你在做什么。如果您不确定,当您需要他们的诚实意见,或者当您觉得口头语言是更有效的沟通媒介时,您可以与他们讨论您的项目的进展情况。注意沟通从一开始就明确,防止误会、徒劳、担心和后悔是非常重要的。一个机器学习工程师的内心挣扎作为一个机器学习工程师,你要学会调整自己的思维,停止想着填空,把事情做得比实际需要的更好。你必须学会??接受不完美,把重要的时间花在完成最紧迫的任务上。例如,我喜欢花时间改进第三方训练/评估代码,但此时我可能只是需要尽快知道推理结果是否有所改进。我有web开发的背景,我基本上必须完全自己编写代码,但在机器学习工程中,我必须学习如何应用其他人的代码。当你不断地和别人的代码打交道时(通常是花费数月甚至数年的时间在上面工作的学生和研究人员),有时难免会感到失落,觉得自己的工作不完整,尤其是当你过于仔细地试图去理解时该代码的每个方面。然而,这是不必要的,您所要做的就是将他们的模型成功部署到您的生产系统中。无论如何,我们天生就是好奇的生物,想要了解比实际需要更多的东西是很自然的。如果您想进行一些探索,最好让您的团队也知道。如果你能及时完成你的目标工作,相互理解的工作环境可以为你提供更多学习的机会。只要您知道自己的优先事项是什么,就不必担心太多,尽情探索吧。结论为生产系统构建机器学习过程并不容易。由于本文列出了所有需要考虑的事项,有时您所要做的就是做出决定。如果这条路不同,就走另一条路。话虽如此,我希望本文能帮助您了解这些需要考虑的事情。
