发布于: Aug 26, 2022

 

在调优之后,Neuron 编译的 TensorFlow 模型较现有费率最低的 GPU 实例实现 72% 的成本节约,且性能仍旧保持一致

 

在本文中我们不再使用原始下载脚本来获取 CMU 模型,而是将 Neuron 编译完成的模型复制到 ./models/graph/cmu/graph_model.pb,而后再次运行测试:

aws s3 cp s3://<MY_BUCKET_NAME>/graph_opt.pb ./models/graph/cmu/graph_model.pb

如果您之前已经对未经 Neuron 编译的模型进行过测试,请确保在 notebook 上重新启动 Python 内核。重新启动内核,能够保证关闭所有 TensorFlow 会话,为基准测试提供完全等效的空白环境。再次运行同一 notebook,您将得到以下日志条目:

‘[TfPoseEstimatorRun] [INFO] 10 times inference on image: ./images/ski.jpg at 0.1709 seconds/image.’

结果显示,与 g4dn.xlarge 实例相比,新环境能够在降低约 30% 运营成本的前提下实现相同的帧速率。这意味着将工作负载转移至基于 Amazon Web Services Inferentia 的实例虽然无法在吞吐量层面带来直观可见的性能提升,但却确实具有成本优势。例如,当迁移至 Amazon Web Services Inferentia 时,Amazon Alexa 文本到语音转换团队得以将推理成本降低达 50%。

我们决定剖析已编译的图版本,并进一步寻求对 OpenPose 管道进行端到端推理性能调优的空间。Neuron 与 TensorFlow 相集成之后,可实现对本地配置文件库的访问。要剖析 Neuron 编译图,我们使用 TensorFlow Python 分析器,在 estimator 方法上检测 TensorFlow 会话所运行的命令:

from tensorflow.core.protobuf import config_pb2
from tensorflow.python.profiler import model_analyzer, option_builder

run_options = config_pb2.RunOptions(trace_level=config_pb2.RunOptions.FULL_TRACE)
run_metadata = config_pb2.RunMetadata()

peaks, heatMat_up, pafMat_up = self.persistent_sess.run(
    [self.tensor_peaks, self.tensor_heatMat_up, self.tensor_pafMat_up], feed_dict={
        self.tensor_image: [img], self.upsample_size: upsample_size
    }, 
    options=run_options, run_metadata=run_metadata
)

options = option_builder.ProfileOptionBuilder.time_and_memory()
model_analyzer.profile(self.persistent_sess.graph, run_metadata, op_log=None, cmd='scope', options=options)
The model_analyzer.profile method prints on StdErr the time and 

其中 model_analyzer.profile 方法会在 StdErr 上输出 TensorFlow 图上各项操作所对应的时间与内存消耗。使用原始代码,Neuron 操作与平滑操作占据整个图运行时间中的大部分比例。以下 StdErr 日志输出结果显示,总图运行时间为 108.02 毫秒,其中平滑操作耗费 43.07 毫秒:

node name | requested bytes | total execution time | accelerator execution time | cpu execution time
_TFProfRoot (--/16.86MB, --/108.02ms, --/0us, --/108.02ms)
…
   TfPoseEstimator/conv5_2_CPM_L1/weights/neuron_op_ed41d2deb8c54255 (430.01KB/430.01KB, 58.42ms/58.42ms, 0us/0us, 58.42ms/58.42ms)
…
smoothing (0B/2.89MB, 0us/43.07ms, 0us/0us, 0us/43.07ms)
   smoothing/depthwise (2.85MB/2.85MB, 43.05ms/43.05ms, 0us/0us, 43.05ms/43.05ms)
   smoothing/gauss_weight (47.50KB/47.50KB, 18us/18us, 0us/0us, 18us/18us)
…

其中,OpenPose 中平滑方法提供针对置信度图计算得出的高斯模糊结果。通过对此项计算进行优化,我们能够从端到端姿态估计当中榨取出更好的性能。我们将 estimator.py 脚本上的平滑器 filter 参数从 25 修改为 5。在使用新配置之后,总运行时间降低至 67.44 毫秒,其中平滑计算如今只需要 2.37 毫秒——时间节约量达 37%!而在 g4dn 实例上,相同的优化对于运行时间几乎没有任何影响。大家还可以更改同一参数,并通过本地副本重新安装 tf-pose-estimation repo 的方式优化端到端管道版本。

我们使用七种不同的实例类型与大小运行了同一项基准测试,借此评估端到端图像处理管道的性能与推理成本优化效果。为了进行直观比较,我们还纳入了 Amazon EC2 按需实例的计费指标。

结果显示,即使是 Inf1 实例中最小的 xlarge 实例,其吞吐量也要比 g4dn 实例中最强劲的 8xlarge 实例高 2 倍,且处理 1000 张图像的成本仅为后者的十二分之一。对比最优的两个选项,inf1.xlarge 和 g4dn.xlarge(成本最低的 GPU 选项),Inf1 能够将每 1000 张图像的处理成本较 g4dn.xlarge 降低 72%,相当于性价比提升 3.57 倍。下表整理了此次基准测试的各项发现:

 

inf1.xlarge

inf1.2xlarge

inf1.6xlarge

g4dn.xlarge

g4dn.2xlarge

g4dn.4xlarge

g4dn.8xlarge

图像处理时间(秒/图像)

0.0703

0.0677

0.0656

0.1708

0.1526

0.1477

0.1427

吞吐量(FPS)

14.22

14.77

15.24

5.85

6.55

6.77

7.01

1000张图像处理时间(秒)

70.3

67.7

65.6

170.8

152.6

147.7

142.7

按需实例价格

$ 0.368

$ 0.584

$ 1.904

$ 0.526

$ 0.752

$ 1.204

$ 2.176

每1000张图像处理成本

$ 0.007

$ 0.011

$ 0.035

$ 0.025

$ 0.032

$ 0.049

$ 0.086

以下图表,总结了 xlarge 与 2xlarge 实例在处理 1000 张图像时的吞吐量与成本情况。

通过在端到端管道中引入数据并行处理方法,我们又进一步降低了 Inf1 实例的图像处理成本并提升了 tf-pose-estimation 吞吐量。上表中列出的数值,与单一 Amazon Web Services Inferentia 处理核心(即 Neuron 核心)的使用方式有关。基准实例中包含 4 个核心,因此仅使用其中 1 个显然会产生资源浪费。我们使用 Python joblib 库以比较粗糙的方式将 main() 函数调用实现并发扩展至四个线程当中。这种模式能够将吞吐量提升至 56.88 FPS,并将每 1000 张图像的成本降低至 0.002 美元以下。这意味着更好的批处理策略可以让 OpenPose 在 Amazon Web Services Inferentia 实例上的运行性价比得到更进一步的改善。

规模较大的 CMU 模型还能提供更好的姿态估计性能。例如,大家可以在包含多重景深与相应拍摄对象的场景下(参见下图),使用 Neuron SDK 编译模型进行多姿态检测。

 

 

在 Amazon EC2 控制台上选择您的编译与推理实例,而后从 Actions 下拉菜单中选择 Terminate。您编译之后的模型将被保存在 s3:// <My Bucket Name> 当中以备后续重复使用。如果您对实例中的代码做出了更改,也请注意进行保存。实例终止仅会导致存储在实例主卷内的数据丢失。

 

在本文中,我们分步完成了对 OpenPose TensorFlow 版开源模型的编译,更新自定义端到端图像处理管道,并体验了能够在 EC2 Infi1 实例之上对 ML 推理时间做出分析及深度优化的工具。在调优之后,Neuron 编译的 TensorFlow 模型较现有费率最低的 GPU 实例实现 72% 的成本节约,且性能仍旧保持一致。本文中阐述的各项操作步骤,也适用于其他 ML 模型类型与框架。关于更多详细信息,请参阅 Amazon Web Services Neuron SDK GitHub repo。

 

相关文章