为了让机器学习真正为用户创造价值,我们必须将其部署到实际的消费系统中。Toucan AI 公司的机器学习工程师 Marifel 分享了一些他们在构建生成级机器学习过程中积累的经验,希望能为你的工作提供帮助。
近年来,随着数据和计算技术的进步,“机器学习”和“深度学习”成为了热门的研究领域。尽管应用机器学习变得流行,但公司首先需要评估自己的业务是否可以从这项技术中获益。如果你的公司已经确定机器学习对未来发展至关重要,那么作为机器学习工程师,就需要考虑如何为生产环境构建机器学习流程。本文旨在帮助你理清这一过程中需要考虑的一些关键问题。
虽然这篇文章主要基于作者在初创软件产品公司担任机器学习工程师的经验,但其中的一些思考同样适用于其他发展阶段的公司或其他类型的公司。软件产品公司专注于开发自己的软件产品,而软件服务公司(例如代理商或咨询公司)则为客户开发软件。
机器学习软件的选择多样,既有开源工具,如 PyTorch、TensorFlow 和 scikit-learn,也有商业化的机器学习服务,如 Google AI Platform、Amazon SageMaker 和 Azure Machine Learning。PyTorch 和 TensorFlow 提供了大量的开源库,这些可以直接使用的模型可以作为开发产品的起点。
选择合适的工具时,需要考虑的因素包括文档质量、工具的开发状态、相关工具形成的生态系统、开发者社区的活跃度、团队成员对工具的熟悉程度、团队规模以及工具的成本。
在早期阶段的创业公司中,你不必立即掌握所有这些因素。可以选择一种强大的工具开始,并随着项目的进展逐渐优化。初期阶段,使用企业提供的机器学习服务也是一个可行的选择,只要它带来的收益超过了成本。
在项目初期,使用简单的基准模型是个好办法。从简单的模型开始可以帮助你发现工作流程中的问题,并判断是否需要采用更复杂的解决方案。选择简单的基准模型时,要注意“简单”是相对的,可能指的是模型本身的简单性,也可能是模型的易用性。
在早期阶段的创业公司中,你可能没有时间立即开发完整的机器学习流程。通常,你的首要任务是尽早交付一些有效的产品给投资者或客户。他们通常不太关心流程优化。因此,不必过分追求初始部署的完美,只要能产出实际效果即可。在完成基础产品后,可以逐步优化机器学习流程。
对于软件服务公司而言,由于已经将成品提供给了不同的客户,并且已经修复了所有漏洞,因此出错的空间较小。在向客户交付产品后,你可能会转向下一个项目,因此通常没有资源进行进一步的改进。然而,对于这些公司来说,快速行动仍然很重要。拥有一个更加细化的机器学习工作流程会带来更大的好处。因此,提前投入更多精力进行细化和自动化,也许能为长期业务节省时间。
在机器学习工作中,实验管理是一项挑战。当你尽可能多地运行实验时,很容易使项目工作区变得混乱。然而,在早期阶段的创业公司中,你可能没有时间花费数月来运行数百次实验。你必须关注更有价值的事情,并尽快更新。无论如何,有一点比没有好。
我们使用 GitHub 来存储代码的不同版本。虽然 GitHub 对于大型数据文件的版本控制并不理想,但它非常适合代码版本控制。你可以使用其他云存储服务,如 Google Cloud Storage 或 Amazon S3,来管理数据文件的版本。通过这些服务,你可以轻松地创建存储空间(文件夹),并实现对文件的版本控制。结合 Git 和云存储,可以更高效地管理代码和数据。
在调整超参数时,很容易忘记你曾经运行过的某个模型的具体设置。为了准备或预处理数据集,你可能需要回顾之前的工作。尽管 Jupyter Notebook 的文件名可以大致描述内容,但你仍然需要花时间去理解当时的操作步骤。为此,可以在文件名中加入排序号,如“step 01_”,并使用清晰的命名规则和排序方式来管理文件。此外,可以使用开源平台 MLflow 来查看实验的超参数和度量结果。
在撰写实验文档时,要注重逻辑结构和简洁性。对于每个模型和数据集,应该撰写单独的笔记,并尽量避免包含过多的临时内容。可以将训练和推理代码放在单独的脚本中,以便在笔记中调用。使用 MLflow 等工具生成实验记录时,可以尝试将实验笔记自动引用到生成的实验输入文件中。
在某个指标上取得更好的分数并不意味着模型在实际环境中会有更好的表现。在生产级别的机器学习系统中,模型通常与其他组件协同工作。因此,当你试图改进现有模型时,需要充分了解整个系统的运作方式。
为了确保模型改进的有效性,需要配置一个自动化系统或端到端的测试框架。例如,我们使用 CLI 工具基于一系列示例对话运行 pytest,以确保所有对话都符合预期。如果测试失败,可以通过手动更新测试或评估新的模型来解决问题。
在生产系统中,我们经常使用较旧版本的代码库,并对其进行修改以满足自身需求。对于那些快速发展的代码库,你需要找到一种方法来利用最新更新,同时保持系统的稳定性。
对于快速发展的代码库,可以考虑将部分代码与自己的代码结合起来,形成可用的系统,或者完全升级旧版本。关键是要权衡重新开发所需的时间和优先事项。可以先集中精力解决优先事项,然后再考虑重构。
在追求结果的过程中,很容易忽视整洁性。频繁的实验会导致工作区变得混乱。为了避免这种情况,可以自动删除不需要保存的实验结果。例如,可以删除那些在第一次训练迭代之前就失败的实验,以保持实验记录的整洁。
为了改善模型,你可能会研究和尝试多种不同的机器学习项目,这可能会导致 Python 包的需求冲突。使用 Docker 可以很好地解决这个问题。Docker 是一种轻量级的容器化平台,可以管理项目环境和依赖关系。每个机器学习模型和服务都应该使用不同的 Docker 容器,以减少“只在我的机器上有效”的问题,并避免项目之间的依赖冲突。
Docker 相比 Conda 的优势在于更适合生产和云环境的操作。使用 Docker 可以通过几行命令将本地文件同步到远程机器的容器中,而使用 Conda 则需要更多的步骤。此外,Docker Compose 可以帮助管理多个服务之间的通信。
当创业公司处于早期阶段时,扩展规模可能还不是首要任务,但仍然需要考虑扩展技术。例如,Celery 是一个异步任务队列系统,可以将任务分发给多个工作者处理。我们目前为每种类型的服务(服务器、客户端、嵌入式模型)使用一个工作者,但没有必要为同一服务设置过多的工作者。
机器学习领域的研究论文不断涌现,作为机器学习工程师,需要了解团队正在进行的模型和技术。保持良好的沟通非常重要,尤其是在书面沟通方面。即使当前的工作与团队的其他工作无关,也可能在未来需要扩展或审查。因此,做详细的文档记录至关重要。在需要时,与团队成员讨论项目的进展情况,并保持沟通清晰,以避免误解和困惑。
作为一名机器学习工程师,需要学会调整心态,不要总是追求完美。有时候,快速完成任务比追求细节更重要。尽管你可能对代码的每一个细节都很感兴趣,但在实际工作中,只需要确保模型能正常运行即可。
构建生产级别的机器学习流程是一项复杂的工作,但通过合理的决策和规划,可以逐步克服这些挑战。希望本文能帮助你理清构建生产级机器学习系统时需要考虑的关键问题。