亚马逊AWS官方博客

Amazon SageMaker Debugger 助力 Autodesk 优化 Fusion 360 中的视觉相似性搜索模型

Original URL: https://aws.amazon.com/cn/blogs/machine-learning/autodesk-optimizes-visual-similarity-search-model-in-fusion-360-with-amazon-sagemaker-debugger/

几年之前,Autodesk公司着手将工作负载由本地数据中心迁移至AWS,并由此开启了自己的数字化转型之旅。其中,生成式设计的实现就清晰证明了数字化转型的优势所在——这是一项使用云计算加速设计探索的新兴技术,能够产出超越人类能力极限的成果。生成式设计允许用户根据特定约束条件(例如材料、重量、成本或者制造方法等)快速生成一组高性能设计选项。目前来看,生成式设计或将颠覆整个制造行业,带来前所未有的设计流程与执行方式。再回到Autodesk这边,他们通过云迁移扩展了生成式设计的可用范围,在Amazon SageMaker的帮助下得以将原本需要数小时甚至数天的大量模拟任务,在一个小时之内快速完成。

2019年秋季,Autodesk决定使用机器学习(ML)技术为Fusion 360中的生成式设计技术提供视觉相似性搜索功能。Autodesk团队与AWS合作,利用Amazon SageMaker Debugger评估模型的训练与调试流程。SageMaker Debugger能够实时自动捕捉并分析来自训练流程的数据,且全程无需修改任何现有代码,帮助团队成员轻松建立起对于机器学习模型训练流程的完整洞见。

在本文中,我们将探讨Autodesk如何加快模型的设计、训练与调试速度,以及由云迁移带来的其他一些好处。在以下各章节中,我们将分别介绍视觉相似性搜索模型、Autodesk在选择SageMaker Debugger之前使用的传统方法、如何针对SageMaker Debugger进行代码修改、选择SageMaker Debugger之后的方法以及前后两种实现方法之间的性能比较。

视觉相似性搜索模型

经过训练的视觉相似性搜索模型能够计算特征向量,并按特征间的距离对其进行分组,或者借此查找相邻度最高的生成式设计结果。所谓生成式设计结果的相似性,是指两种结果之间具有相似的特征向量。视觉相似度搜索能够为生成式设计结果创建分类视图,帮助用户快速选择最佳设计。如以下截图所示,为包含视觉相似性搜索模型的Fusion 360示例。


Fusion 360中生成式设计所提供的全部结果皆为3D图形。视觉搜索模型会从不同角度为这些3D对象拍摄多个快照,而后由该模型尝试重建这些快照。

Autodesk的机器学习模型在本质上属于一种自动编码器,其由以下几层组成:

  • 编码器 – 理解输入的特征。
  • 瓶颈层– 强制自动编码器理解输入数据的压缩表示形式。
  • 解码器 – 提取潜在特征向量并尝试重建原始输入内容。

在自动编码器训练完成之后,用户可以使用其中的瓶颈层(已经从给定图形当中学习到最重要的特征)为各几何图形生成特征向量。接下来,这些特征向量将负责把具有相似性的设计结果聚合起来,帮助用户们更加轻松高效地找到理想的设计结果。

使用SageMaker Debugger前的解决办法

在使用SageMaker Debugger之前,Autodesk团队只能遵循线性流程训练并编辑模型。为了控制模型的训练成本,团队不得不尽量避免使用并行训练方法。但这样做的代价就是,他们无法探索其他网络架构,也无法找到效率最高、效果最佳的架构选项。

如下图所示,为验证超参数时的具体工作流程。

该工作流具体包含以下步骤:

  1. 在Amazon SageMaker上运行训练工作。在训练数据准备就绪之后,Autodesk为训练作业设置超参数,并通过Amazon SageMaker notebook启动训练作业。Autodesk还使用Tensorboard对自动编码器的重建性能进行可视化处理。
  2. 手动监控Amazon CloudWatch Events以获取必要指标,并以特定训练时间间隔报告准确性与损失情况。Autodesk将降低损失与提高准确性的指标结合起来,借此为训练过程建立良好基准。为了验证模型,Autodesk还使用了Tensorboard的本地实例。他们还在模型当中添加代码,用以为每个检查点生成自动编码器输入与输出,帮助他们更直观地检查并验证模型效果。
  3. 等待训练工作完成。一般来说,一项训练任务往往需要10到15个小时才能完成。很明显,如果训练质量低下,则会给Autodesk团队带来严重的时间与计算资源浪费。所谓训练质量低下,一般是指经过数小时的训练后仍未能收敛或者继续产生不良输出的场景。
  4. 手动验证测试数据集上的聚类质量。Autodesk利用Tensorboard对模型的聚类性能进行可视化验证。如以下截图所示,为Tensorboard的可视化效果。

Tensorboard投影中的3D空间放置状态,代表着T-SNE聚类的结果。T-SNE属于t分布的随机近邻嵌入,该技术能够将高维数据映射至二维或者三维空间当中,您可以轻松对其进行可视化。相似的几何形状能够产生相似的T-SNE嵌入,因此结果将在嵌入空间中相对接近。以此为基础,Autodesk就能验证模型的嵌入是否能以理想方式对生成式设计的结果进行聚类。接下来,由人类用户判断结果是否得到正确分组,如果准确性较高,即证明模型性能表现良好。

使用Amazon SageMaker Debugger调整代码

将SageMaker Debugger添加至Autodesk训练任务的过程非常简单。SageMaker Debugger支持零代码变更范式,因此大家完全不需要变更自己的训练脚本。我们只需要在Amazon SageMaker估计器中指定一项debugger hook配置,即可定义要使用的张量。

SageMaker Debugger还提供多个默认集合,例如权重、偏差、梯度与损失等。您也可以通过指定所包含张量名称的正则表达式来轻松定义定制化集合。例如,如果要包含Relu激活的输出,则可以使用以下代码定义集合:

CollectionConfig(
           name="custom_collection",
           parameters={ "include_regex": ".*Relu_output")

对于Autodesk的视觉相似性搜索模型,将发出以下默认集合:

from sagemaker.debugger import DebuggerHookConfig, CollectionConfig, Rule, rule_configs

from sagemaker.tensorflow import TensorFlow


debugger_hook_config = DebuggerHookConfig(
      collection_configs=[ 
          CollectionConfig("weights"),
          CollectionConfig("gradients")
      ])

Amazon SageMaker Debugger hook配置将被传递至估计器以及LossNotDecreasing内置规则的配置。详见以下代码示例:

rule = Rule.sagemaker(base_config=rule_configs.loss_not_decreasing())

estimator = TensorFlow (
		  role=sagemaker.get_execution_role(),
                  train_instance_count=1,
                  train_instance_type='ml.p3.2xlarge',
                  entry_point='src/updatedOptKepler.py',
		   framework_version='1.15',
                  py_version='py3',
		   debugger_hook_config=debugger_hook_config,
		   rule=[rule]		
)

在下一章节中,我们将具体讲解关于内置规则的详细信息。

使用SageMaker Debugger后的解决办法

利用SageMaker Debugger,Autodesk启动了并行训练作业以运行参数扫描。训练工作的并行化,极大改变了公司的整体工作流程。为了控制计算成本,Autodesk建立起内置的SageMaker Debugger规则,用于自动终止无法得出高质量结果的训练作业。

Autodesk使用不同的超参数值以评估哪种组合会产生最佳结果。在使用SageMaker Debugger之前,Autodesk需要运行多项训练任务,每项训练任务都具有一组不同的参数值,并且必须等待训练作业完成之后,才能检查实际结果。但在SageMaker Debugger的帮助下,他们可以并行运行多项训练作业、设置内置规则、并选择在触发警报时立即停止训练作业。

如下图所示,为使用SageMaker Debugger后的新工作流。

SageMaker Debugger中包含一组内置规则,可检测最常见的各类训练问题,包括梯度消失与梯度爆炸、神经元饱和等等。这些规则负责向CloudWatch发出指标,以指示是否存在问题。您可以设置CloudWatch警报与AWS Lambda函数以随时停止训练任务。

这项功能使Autodesk得以启动并行训练作业以运行大规模参数扫描,并自动终止无法产出高质量结果的训练作业。如此一来,Autodesk成功节约了大量计算成本,并产生了更强大的模型。

在参数扫描期间,Autodesk主要使用LossNotDecreasing内置规则,该规则能够在损失不降低时按百分比进行触发。损失函数负责评估模型输出与真实情况之间的关系:在自动编码器中,损失函数负责测量自动编码器输出与输入之间的距离。Autodesk的视觉相似性搜索模型使用L2损失:重建的输出质量越高,L2损失就越低。持续降低的损失,可能代表以下情况:

  • 训练已经在局部达到最优,因此无需进一步训练模型(继续训练可能导致过拟合)。
  • 整个训练过程中,如果有错误的超参数,那么损失无法降低,相应的,模型也无法建立起学习能力。

在这两种情况下,及时停止训练都是最好的选择。

在参数扫描期间,Autodesk还会不断变更学习率、学习率衰减、批处理大小与训练数据集等。

大家也可以在SageMaker Debugger当中定义定制化规则。Autodesk使用SageMaker Debugger作为模型性能的关键指示器,探索其如何在潜在空间内对相似输入进行分组。您可以轻松定义一项定制化规则,检查潜在空间中相同类型输入之间的距离,并在附近没有相似输入的情况下触发异常。

除了能够运行并行训练作业并根据规则自动终止低质量作业之外,SageMaker Debugger还帮助Autodesk在训练过程中实现实时可视化并计算张量统计信息。

在张量的读取与过滤方面,Autodesk选择使用smdebug开源库。smdebug能够方便快捷地将数据表示为NumPy数组形式,帮助用户使用Numpy、Scipy、Scikit等工具实现数据的分析与可视化。

以下代码示例,展示了如何获取各层梯度的最小值与最大值:

from smdebug.trials import create_trial

trial = create_trial(s3_bucket_for_tensors)

for step in trial.steps():

	for tname in trial.tensor_names(regex='.*gradient'):

		tensor = trial.tensor(tname).value(step)

	print("Gradients in layer {} min :{} max {}".format(tname, 
							np.min(tensor), 
								np.max(tensor))) 

在检索到张量之后,您可以实时对权重、梯度及激活输出等的分布进行可视化处理。在Autodesk示例中,他们发现模型发生了梯度消失,且内层权重的更新程度非常有限。造成这种状况的原因如下:

  • L2损失函数收敛太快并产生小梯度。这种问题在自动编码器中相当常见,因为L2损失仅比较了输入与输出之间的强度值。这会导致损失值过小,并使重建输出不够精确。
  • 模型中包含的层太多,因此越是接近模型的初始层部分,梯度就会越小。
  • 瓶颈层由数个完全连接的层组成,其中大部分层更新程度不足。

下图所示为示例编码器中第一层与最后一层的梯度分布。可以看到梯度范围很小,各层之间的数量级也有所不同。

根据分析结论,Autodesk决定采用以下优化手段:

  • 使用结构相似性指数 (SSIM) 损失取代L2损失函数。SSIM是一种更适用于比较图像间相似度的指标。在使用SSIM之后,视觉相似性搜索模型顺利掌握到更多细粒度细节,并产生了质量更高的输出结果。
  • 在编码器与解码器中删除一些层,这既缩小了模型的体积,又不致影响到模型质量。
  • 瓶颈层减少至不足三分之一,显著降低了总体参数量。

Autodesk还通过对TSNE嵌入的可视化以确定其自动编码器模型是否训练成功。借助SageMaker Debugger与Scikit-Learn,他们能够在训练执行过程中实时计算并可视化这些嵌入。关于更多详细信息,请参考GitHub repo

如以下截图所示,为优化后的模型生成的示例图像。

Amazon SageMaker Debugger的优势

Autodesk团队利用SageMaker Debugger实现了以下收益:

  • 节约时间 – 凭借强大的并行训练作业执行能力,整体模型训练时间降低了90%以上。Autodesk使用SageMaker Debugger在10个小时之内,训练出以往手动训练方法需要5到6天的完整模型。
  • 节约计算成本 – 使用SageMaker Debugger,大多数训练作业都能快速终止,从而节约70%左右的计算成本。通过避免对低质量训练作业的无用验证,Autodesk也帮助开发人员节约下宝贵的精力与时间。
  • 缩小模型大小 – Autodesk团队通过提取自模型性能数据中的洞见来确定各网络层的具体性能。这些重要洞见让模型层数减少达33%,并使总体模型大小降低约40%。

相关建议

除了本文中提到的方法与收益之外,我们还建议大家在训练及部署机器学习模型时认真考虑以下建议:

  • 使用Amazon SageMaker Studio简化模型创建流程。
  • 使用并行Lambda函数对Amazon S3上的数据集进行快速转换。您可以将转换任务提交至作为Lambda触发器的Amazon SQS队列当中,以此利用Lambda函数的并发性。
  • 利用Amazon SageMaker竞价实例执行训练任务,以此节约高达70%的成本。您也可以增加检查点执行频率以减少因服务中断造成的时间损失。
  • 在Amazon SageMaker Ground Truth中设置私有数据标记任务,确保在使用该工具时避免数据暴露于外部。

关于使用SageMaker Debugger的更多详细信息,请参考GitHub repo

总结

本文探讨了Autodesk公司如何使用SageMaker Debugger实现机器学习模型的设计、训练与调试。您也可以使用SageMaker Deubbger以节约时间、降低计算成本并控制模型大小。

本篇作者

Alexander Carlson

Autodesk公司Fusion 360机器学习团队机器学习工程师。目前,他正在研究基于AWS的基础设施,努力将机器学习技术引入Autodesk的生产工作流程当中。

Nathalie Rauschmayr

AWS公司机器学习科学家,她主要负责帮助客户开发各类深度学习应用程序。

Niraj Jetly

AWS公司Neptune软件开发经理。在担任此职务之前,Niraj曾在Autodesk作为资深CSM领导数字化转型工作。在加入AWS前,Niraj已经在多个产品及工程团队中拥有超过15年的CTO、工程技术副总裁以及产品主管等从业经历。

Satadal Bhattacharjee

AWS AI首席产品经理。他领导机器学习引擎PM团队开发Amazon SageMaker等项目,并对TensorFlow、PyTorch以及MXNet等机器学习框架进行了优化。