本文介绍了构建消费系统所需的机器学习流程的多个方面,内容均来自实际经验。
机器学习软件的选择多种多样,包括开源工具如PyTorch、TensorFlow和scikit-learn,以及管理机器学习服务的平台如Google AI平台、亚马逊SageMaker和Azure机器学习平台。这些工具中,有许多现成的模型库,如Hugging Face的transformers,可以快速获取预训练模型。此外,每年都有大量研究论文发表,并附带开源代码。Papers With Code是一个很好的资源,可以查找带有代码的研究论文。
在选择工具时,需要考虑以下因素: - 文档质量 - 工具的维护状态 - 社区支持情况 - 开发者社区的积极性 - 对工具的熟悉程度 - 团队规模 - 成本
个人认为,对于初创公司来说,不必一开始就评估所有这些因素。可以先从一个强大的候选工具开始,然后逐步完善。如果收益大于成本,也可以从一开始就使用托管的机器学习服务。
初次构建机器学习模型时,最好从简单的基线模型开始。这样可以帮助你调试管道中的问题,并判断更复杂的解决方案是否值得投入时间。简单模型可能是一个简单的启发式算法,或者是一个复杂的模型但易于使用。顶级的数据集和模型通常是开源的,可以通过研究论文或排行榜找到。可以查看顶级解决方案,看是否有相关的代码可以使用。
在初创阶段,你可能没有时间立即构建完整的机器学习流程。通常情况下,你需要专注于快速展示成果。优化过程很少出现在投资者和客户的脑海里。因此,不要担心最初的部署是否完美,只要有一个可用的结果即可。在基本产品构建之后,可以更多地关注机器学习流程,因为这通常需要更多的停机时间来进行小的改进。
相反,如果你是一家代理公司,出错的空间较小,因为你需要向不同的客户交付成品,并提前修复所有的bug。在交付一个或一组客户端产品后,你将转移到下一个合同,通常没有足够的时间进行进一步的改进。尽管如此,你仍需迅速行动。为了更快地推进,最好有更精细的机器学习流程。因此,对于代理公司来说,提前花费更多时间进行优化和自动化可能是值得的。
在机器学习中管理实验是一项挑战,特别是在运行大量实验时,项目工作区容易变得混乱。然而,在初创阶段,你没有几个月的时间来做数百个实验。你只需要推动一些更好的东西,然后尽快更新。无论如何,进行某种形式的实验管理总比什么都不做要好。以下是管理机器学习实验时需要考虑的一些事项:
在Toucan AI,我们使用GitHub来管理代码版本。虽然GitHub不适合管理大型数据文件,但它是一个强大的工具。可以使用其他云存储选项,如谷歌云存储或Amazon S3,来管理大型数据文件。我们选择了数据版本控制(DVC),这是一个开源的版本控制系统,专门针对机器学习项目设计。DVC可以与Git和云存储集成,方便管理和跟踪大型数据文件。
如果你正在进行超参数调优,很容易忘记记录某个模型在特定日期的运行情况。你还需要回顾为准备或预处理模型所需的数据集所做的工作。为了更好地管理实验,可以为Notebooks编号,并使用MLflow等工具来记录实验的超参数和度量结果。确保实验记录清晰、有序,避免临时插入的“草稿”单元格。每个Notebook上的实验应限制在一个模型和一个数据集上,避免笔记本过长。最后,当使用像MLflow这样的工具生成实验记录时,尝试将实验笔记本自动引用到生成的实验输入文件中。
更好的度量结果并不总是与真实样本中的推理性能相关。在消费ML系统中,模型并不是独立操作的,还涉及到启发式、预处理和缓存等。因此,当尝试改进现有的ML模型时,你需要深入了解整个消费代码,以发现模型实际被调用的地方。然后,不仅需要检查模型的输入和输出,还需要检查整个ML系统的管道。你的“更好”模型如何影响整个系统,是更好还是更坏?
为了专注于模型改进,而不是生成推理样本或担心破坏消费管道中的某些内容,我们需要一个自动化的系统或端到端测试框架。在Toucan AI,我们使用pytest来测试样本对话,提供了一种回归测试的方式。我们正在开发一个命令行工具,可以在一系列示例对话中运行pytest断言。通过一个命令,可以测试所有的对话,如果测试用例失败,我们可以手动更新测试或认为“更好的”模型并不适合生产。
从快速发展的库中提取代码并将其写入消费系统中,可能会遇到困难。如何在满足需求的同时高效地利用最新的库更新?
我认为没有标准答案,只有多种不同的路径。一种方法是将库代码和你的代码结合在一起,使其工作。另一种方法是完全升级旧版本的库,但这通常需要更多时间。简而言之,考虑你有多少时间进行重构,以及重构的优先级是什么。在你的代码库和快速发展的工具变得更加稳定后,应关注优先级,并考虑不完全的重构。
当你专注于取得成果时,往往会忽略整洁。考虑下一组要运行的实验及其超参数集。如果出现错误,只需更改输入文件夹的时间戳并重新运行实验。但是,最终可能会生成额外的文件或文件夹,导致实验记录混乱。为了解决这个问题,应自动删除不需要保存的所有试运行。例如,在第一次训练迭代完成之前,应删除失败的运行。
当你研究和尝试各种ML项目以改进模型时,可能会遇到互相冲突的Python包需求。共享一个云服务器可能会很快变得不方便,因为你的安装可能会覆盖同事的环境。
进入Docker生态系统,这是一个轻量级的容器化软件平台,用于管理项目环境和依赖项。通过为每个ML模型和服务使用单独的Docker容器,我们可以减少“它在我的机器上工作”的问题,并避免项目之间的依赖冲突。每个同事可以在单个共享服务器上设置自己的Docker容器,这比设置更多的开发服务器更经济。此外,Docker Compose的强大功能可以让你在其他Docker容器中单独运行其他服务,并根据Docker Compose文件设置相互通讯。
作为一个处于早期阶段的初创公司,你现在可能不需要大规模扩展,但最好开始思考可以扩展的技术。其中一种技术是Celery,这是一个异步任务队列系统,可以将任务分配给多个工作者。目前,我们为每种类型的服务(服务器、客户端、嵌入模型等)都有一个单独的工作者,但如果有需要,为相同的服务启动更多的工作者应该不难。通过嵌入进行缓存可能会成为瓶颈吗?没问题,我们可以启动另一个嵌入的Celery工作者,或者增加当前工作者的“并发”计数,允许多个子进程并行运行。在我们的Toucan AI配置中,一个Celery工作者在一个Docker容器中运行,因此也遵循关注点分离的原则。
随着机器学习研究的不断发布,作为机器学习工程师,如何让你的团队成员保持一个从尝试到应用的模型或技术的循环?没有什么魔法可以将他们获得的所有知识、经验和见解传授给你。但你可以通过交流来实现这一点。尽可能多地交流,特别是在撰写文档时。通常情况下,你是在做自己的项目,所以你现在做的事情可能与你的同事无关。但是,未来他们可能需要审查或扩展你已经完成的内容。即使是你几个月后,不得不对自己之前的项目做出改变,而你已经忘记了关键部分。文档,文档,文档。无论怎么强调都不为过。
作为一名机器学习工程师,你必须学会权衡你想要修复的东西和使流程变得更好以满足当前需求之间的关系。你必须学会接受采取最直接的方式来完成工作。例如,我很想花时间改进第三方的训练/评估代码,但当时,我只需要采用最短路径来查看我们的推理结果是否会得到改进。
由于我有Web开发的背景,大多数情况下我必须编写自己的代码,但在机器学习工程中,我必须学会如何使用他人的代码。当你经常使用的代码不是你自己的——通常是博士生和研究人员花了几个月或几年时间研究出来的代码——有时会觉得很挫败,特别是当你试图理解那些不直接部署到生产系统中的代码时。
在一天结束的时候,只要记住我们是天生好奇的生物,想学习比你实际需要学习的更多是可以的。如果有你想探索的路径,与你的队友保持透明是关键。一个好的工作环境不会因为你想要学习更多而批评你,只要你足够及时地完成目标。只要优先考虑的事情,尽量少担心,多享受。
构建消费系统的机器学习流程并不简单。虽然本文涵盖了所有内容,有时最好的决定就是简单地做出决定。如果没有成功,那就继续前进。无论如何,希望这篇文章能帮助我们更好地了解各种不同的想法。