为了让机器学习为用户带来真正的价值,我们需要将其部署到生产系统中。人工智能销售软件开发公司 Toucan AI 的 ML 工程师 Marifel 介绍了他们在打造生成级机器学习时所考虑的一些问题,希望这些经验能为你的工作带来帮助。
选自toucanai.com。
机器之心编译,
参与:Panda、杜伟。
注:本文所提到的「创业公司」都是指有软件「产品」的公司;对于提供软件「服务」的公司,则会专门指明。软件产品公司的业务重心是开发自己的软件产品,而软件服务公司(如代理商或咨询公司)则是为客户开发软件。尽管这篇文章是根据作者在早期阶段的软件产品创业公司担任机器学习工程师的经历写的,但其中某些思考也适用于其它阶段的公司或其它公司类型。
机器学习软件的选择有很多,有开源的工具,比如 PyTorch、TensorFlow 和 scikit-learn;也有企业提供的机器学习服务,比如 Google AI Platform、Amazon SageMaker 和 Azure Machine Learning。光是 PyTorch 和 TensorFlow,就有很多开源的软件库可用,这些直接可用的模型可用作开发产品的起点。
-
文档的质量;
-
工具的开发情况(有的工具仍有人维护,有的则已经中止开发或已被启用,或者有严重的问题等等);
-
围绕该工具的其它工具所构成的生态系统;
-
参与该工具开发的开发者社区;
-
团队成员对该工具的熟悉程度;
-
将会使用该工具的团队的规模;
-
该工具所涉及的资金成本。
开发伊始,使用简单的基准模型是很好的做法。从更简单的模型开始操作能帮助你找出工作流程中的问题,还能帮你了解是否值得采用更耗时间的解决方案。那么,你该如何选用简单的基准模型呢?
在早期阶段的创业公司,你可能没有时间马上动手开发机器学习过程。通常而言,你的工作重心是早点做出一些有效的东西展示给你的投资者或客户。他们通常不是很关心过程的优化。所以不要在意你的初始部署完美与否;它们只需能得到有效的结果就行,即真实可见的最终产品。你可以在做好基础产品之后再去考虑机器学习过程的相关事项,这时候你会有更多的空闲时间,可以为你的机器学习过程应用小型的增量改进。
在机器学习工作中,实验管理并不轻松。当你正尽可能多地运行实验时,很容易就会把你的项目工作区搞得一团糟。但是,在早期阶段的创业公司,你没有办法投入几个月的时间来运行数百场实验。你只得必须关注更好的东西,然后尽可能快地进行更新。无论如何,在实验管理方面,有肯定比没有好。下面是在管理机器学习实验时需要考虑的一些地方。
我们 Toucan AI 使用 GitHub 来存储不同版本的代码。GitHub 很不错,但不适合对大型数据文件进行版本控制。尽管一个代码库可以高达 100GB,但 GitHub 建议将代码库的规模保持在 1GB 以下;此外,单个文件的大小也不能超过 100MB。
因此,我们选择了最自然的集成方案,其中组合了 Git 平台的最佳特性以及其它云存储选择的优势:数据版本控制(DVC,https://dvc.org/。该项目的宣传语是「用于机器学习项目的开源版本控制系统」。
如果你在调节超参数,可能很容易就会忘记你在特定时间运行过的某个模型的某种设置。为了为这个模型准备或预处理数据集,你可能还必须回顾一下你之前的工作。你的 Jupyter Notebook 可能具有大致了描述了其中内容的文件名,但你仍然需要些时间才知道当时做了什么——先做了 A 还 B?
此外,在为实验编写文档时,你还应关注逻辑结构和简洁性。对于一个又一个模型的笔记和训练脚本,你需要充分利用文件夹结构的命令规则来进行组织管理。假设有读者在阅读你的笔记本,他们通常会从上到下阅读,所以你要移除那些临时仓促添加的部分。根据过往经验,你应该为一个模型和一个数据集写一个笔记,如果当前的笔记过长,也要创建一个新笔记。你的最终版笔记不应该包含训练和推理过程的代码;这些应被放在另外的脚本中,然后你可以在笔记中调用它们。最后,当你在使用 MLflow 等软件来生成实验记录时,可以试试将运行实验的笔记自动引用到所生成的实验输出文件中。
在某个指标上得到更好的分数并不意味着你的模型能在真实世界样例上取得更好推理结果。此外,在生产级机器学习系统中,机器学习模型通常并不单独工作。举个例子,你的工作流程中可能包含探索方法、预处理和缓存的结果。因此,当你尝试改进你已有的机器学习模型时,你要意识到打造出适用于真实世界的推理样例需要大量时间。
为了真正实现模型提升,而不只是想出一些新的推理样例或改变生产流程中的某些东西,我们需要配置一个自动化系统或端到端的测试框架。
我们 Toucan AI 的主要产品是一款 AI 销售智能体,因此测试覆盖主要逻辑分支的示例对话就足够了,并且我们还提供了一种形式的回归测试。我们目前正在开发一款命令行工具(command-line interface,CLI),该工具可以基于一系列示例对话运行 pytest 审定: https://docs.pytest.org/en/latest/。只需一行命令就可以测试所有对话,如果有任何测试不过关,我们就会以人工方式更新该测试或评估我们的「更好」模型是否真的能更好地应对生产环境。
在我们的生产系统中,我们往往使用的是更老版本代码库的修改版;如果这个代码库正在快速演进,我们可能很难将新的改进整合到生产系统中。因此,对于正在快速演进的代码库,你该如何对其进行修改以满足自己的需求以及尽可能高效地应用其最新的更新呢?
当你关注的重点是获得结果时,你很容易就会忽视整洁性 。你会思考要运行的下一组实验及其超参数设置。出现了一个错误?没有问题,修改输出文件夹上的时间戳,然后再次运行实验。但是,你最后得到的不过是另一些由不完整实验生成的文件或文件夹。之后,查看实验记录的人会深感头痛,他们被迫在 MLflow 中查看长长的列表,搜寻那些完整运行了的实验。
为了改善你的模型,你会研究和尝试各种不同的机器学习项目,你会遇到一些互相冲突的 Python 软件包需求。一开始,你可能会使用在两个开发者之间共享的云服务器,但很快你就会发现这样很不方便,因为你的安装可能会覆盖己方团队的安装。
此外,你可能会疑惑为什么选 Docker 而不是 Conda,毕竟 Conda 让你能用不同的软件版本创建不同的环境?我们选择 Docker 的原因是其提供的工具更适合生产以及在云上操作。如果你要在一台远程机器上使用 Conda,就必须首先连接到该机器,然后处理文件传输问题。而在使用 Docker 时,只需要几行命令,就能将本地文件修改同步到远程机器的 Docker 容器中。