原载于 作者:Ryan Greenhalgh – 经作者同意转载
AI 模型在大型数据集上进行训练的过程中变得越来越智能、越来越准确,也因此变得越来越有用。这些数据集往往经过多年的精心整理。
但在实际应用中,数据集最初往往很小。例如,在设计新药时,研究人员从测试化合物开始,需要利用 AI 的力量来预测最佳排列组合。但实际的数据集对于传统的 AI 来说太小,导致模型没有可用于训练的原始材料。
在 DeepMirror,我们率先推出了新的 AI 训练算法,这些算法能够学习从小型数据集进行 预测 。我们的新训练算法称为 DeepMirror Spark,它将计算机视觉 AI 训练所需的数据量减少了 10-100 倍(在此处查看它如何应用于生物医学图像:(https://deepmirror.ai/2021-12-09-spark-instance-segmentation/)。
从训练 AI 模型到交付最终结果并非易事。事实上,大多数机器学习模型从未投入生产 [1]。是的,没错。才华横溢的工程师投入的所有时间并没有被现实世界的客户使用。当我第一次听到这个统计数据时,我感到震惊——这些模型是研究中最有价值的部分,怎么会是这样呢?在这篇文章中,我将探讨我们在从机器学习研究转向生产过程中经常面临的一些问题。在初创公司工作的一个好处是,我们可以从一开始就建立良好的流程,以开发完美的内部机器学习和部署工作流程。这就是我想要分享的。
对于每个新项目,我们需要管理多个训练好的模型,扩充带标注的数据集,比较不同模型的性能,根据不同数据集进行基准测试,并将获胜的模型部署给用户。因此,为了优化我们的研究到生产工作流程,我们面临以下五个工程挑战:
- 记录、监控和共享实验
- 数据版本控制和存储
- 复现和复制
- GPU 计算的自动扩缩容
- 服务和部署
从零开始设计一个系统来管理这些机器学习操作 (MLOps) 的每个组件将花费大量时间和金钱。在研究了几家 MLOps 提供商后,我们发现 ClearML 显著优于其他产品。ClearML 是一个基于 Python 的 MLOps 平台,提供了解决我们上面列出的从研究到生产挑战的工具。我们主要关注的是基础设施能够自动监控和记录模型的训练,以及简单的部署步骤。 图 1 总结了我们的机器学习生命周期和系统设计。这里主要发生了两个过程:
- 机器学习团队可以创建和设计不同的模型,使用可伸缩的计算资源训练模型,并在团队内部对模型进行基准测试。
- 客户端可以通过提交数据并使用模型对他们的数据进行预测来与后端 API 进行交互。也可以训练新模型,这由机器学习团队使用的相同框架处理。

让我们看看我们如何使用 ClearML 解决了上面提到的五个挑战。
记录、监控和共享实验
在 DeepMirror,我们希望开发新技术来快速训练我们的 AI,并将性能最佳的模型部署给客户。为了选择性能最佳的模型,我们需要快速比较不同模型的性能,并针对其他数据集对模型进行基准测试。这要求我们记录、监控和共享来自各种实验以及跨研究团队的结果。如果没有日志记录和监控,实验可能会冗余地躺在本地机器上,或者研究人员必须缓慢地来回发送文件:累积技术债务。
ClearML 让实验的记录和监控变得非常容易。设置自动记录所需要做的就是,在我们的训练脚本的开头初始化一个 ClearML 任务。
from clearml import Task | |
task = Task.init(project_name='DeepMirror', task_name='low_data_AI') |
现在,所有的终端输出和 Tensorboard 输出都远程保存,供其他工程师在 ClearML UI 上查看。
数据版本控制和存储
对于内部 ML 研究,我们需要工程师能够高效地访问数据集来创建新模型。在此过程中,管理工程师之间的数据集访问可能很困难,从而产生数据版本控制和存储方面的挑战。
除了在 ML 团队中共享日志和监控实验外,在不同的机器上训练时,能够复制数据集也很重要。ClearML 通过几行代码就可以轻松上传和复制数据集。要上传新数据集,我们的工程师可以运行以下代码将其推送到我们的云存储中:
from clearml import Dataset | |
dataset = Dataset.create(dataset_name="Image_Data", dataset_project="low_data") | |
dataset.add_files("data/low_data_benchmark/") | |
dataset.upload(show_progress=True, verbose=False, output_url="s3://deepmirror/",compression=None) |
在任务中复制数据集也很容易:
Dataset.get(dataset_name="Image_Data", dataset_project="Low_data).get_local_copy() |
这使得在不同机器上工作的不同 ML 工程师可以轻松地以编程方式在本地检索数据集。
复现和复制
在开发过程中,我们需要能够复制我们代码的旧版本。例如,研究人员可能想用新的超参数或在不同的数据集上重新训练旧模型。通常,这需要工程师复制依赖环境和数据集。确保设置正确的环境对工程师来说通常会浪费时间。
ClearML UI 使复制和复现不同的实验(任务)变得容易。可以克隆一个任务,然后重新训练或更改特定的超参数。这使得在本地运行实验变得容易,甚至不需要安装 Python – 只需通过浏览器即可。
GPU 计算的自动扩缩容
此外,我们需要能够训练多个模型来对模型性能进行基准测试。为了实现快速周转,拥有大量 GPU 计算资源至关重要。在云提供商上运行许多 GPU 实例可能很昂贵,因此理想情况下,我们希望按需拥有恰到好处的资源数量。为了满足这一要求,我们需要拥有自动扩缩容的 GPU 计算能力。
我们非常喜欢 ClearML 的一个功能是 ClearML Agent 和自动扩缩容服务。ClearML Agent 可以安装在我们本地的 GPU 机器上,当一个新任务被发送到队列(无论是 ML 工程师还是客户端通过浏览器发送)时,Agent 将在本地接收并执行该任务(如图 1 所示)。起初,我们使用几台本地机器来训练模型,但在需求激增期间计算资源很快就耗尽了。ClearML 再次拯救了我们——这次是他们的自动扩缩容器。我们使用 ClearML 的 AWS 自动扩缩容服务来监控任务队列中的任务数量,并启动安装了 ClearML Agent 的 EC2 GPU 实例来执行队列中的所有任务。自动扩缩容功能显著加速了我们的 ML 模型开发和部署。
服务和部署
我们提供的核心组件是让客户能够训练他们自己的定制模型。为了实现这一点,我们需要一个系统,允许 ML 工程师和客户在共享资源下进行交互。一旦我们的团队开发出了一个可用的模型,或者客户训练了一个模型,我们就需要能够将模型提供并部署回给客户。
以这种方式提供模型使客户能够在其数据上进行预测。为此,我们只需在后端使用 ClearML,只需几行代码即可从特定任务中缓存模型的本地副本。
prev_task = Task.get_task(task_id=best_task_id) | |
last_snapshot = prev_task.models["output"][-1].get_local_copy() | |
model = torch.load(last_snapshot) |
总之,ClearML 使我们能够打破从研究到生产的壁垒。该平台使我们的研究团队能够轻松快速地将模型投入生产,同时监控其性能,而无需担心 GPU 资源。ClearML 的团队及其社区在社区 Slack 上提供了很好的支持。使用 ClearML 作为一站式 MLOps 解决方案,为我们节省了时间和金钱,并且将来会继续如此,因为我们可以专注于开发我们的核心技术。
参考