如何用顶点人工智能预测的优化TensorFlow运行时间加快模型推理的速度

92 阅读8分钟

从产品推荐到欺诈检测,再到路线优化,低延迟预测对众多机器学习任务至关重要。这就是为什么我们很高兴地宣布公开预览一个新的运行时间,优化顶点AI预测服务上的TensorFlow模型。这个优化的TensorFlow运行时利用了谷歌内部使用的技术和模型优化技术,并可以纳入你的服务工作流程,而不需要对你的训练或模型保存代码做任何改变。与基于开源的预建TensorFlow服务容器相比,其结果是以更低的成本进行更快的预测。

这篇文章是对优化的TensorFlow运行时的高层次概述,回顾了它的一些功能,如何使用它,然后提供了基准数据,展示了它的性能。关于如何使用该运行时的详细信息,请参阅Vertex AI用户指南中的优化TensorFlow运行时

优化的TensorFlow运行时概述

优化的TensorFlow运行时使用模型优化和谷歌专有技术,以更快的速度和更低的成本提供训练的模型,而不是开源的TensorFlow。这个运行时同时利用了TensorFlow运行时(TFRT)和谷歌的内部堆栈。

为了利用这个运行时,你所需要做的就是在部署模型时选择一个特定的容器,并可选择设置一些标志。这样做之后,你会得到以下好处。

  • 在GPU上提高表格模型的性能。这个运行时可以通过在GPU上运行模型中计算昂贵的部分,以更快的速度和更低的成本为表格模型服务。通过最大限度地减少主机和加速器之间的通信,模型的其余部分在CPU上运行。运行时自动决定哪些操作最好在GPU上运行,哪些最好在CPU上运行。这种优化在默认情况下是可用的,不需要对你的模型代码做任何修改或设置任何标志来使用它。

  • 模型预编译。为了消除单独运行所有操作造成的开销,该运行时可以预编译部分或全部TensorFlow图。预编译是可选的,可以在模型部署期间启用。

  • **可能影响精度的优化:**这个标志提供了可选的优化,可以在延迟和吞吐量方面提供重大改进,但可能招致模型精度或准确性的小幅(通常是一个百分比的零头)下降。正因为如此,建议你在部署具有这些优化的模型之前,在一个保留的验证集上测试优化模型的精度或准确性。

这些是在公开预览时可用的优化措施。额外的优化和改进将在即将发布的版本中添加。

为了进一步降低你的延迟,你可以使用优化的TensorFlow运行时间的私有端点。欲了解更多信息,请参阅Vertex AI预测用户指南中的使用私有端点进行在线预测

注意,上述优化的影响取决于模型中使用的运算符和模型架构。对于不同的模型,观察到的延迟和吞吐量(即成本)改进是不同的。后面部分的基准提供了一个粗略的估计,你可以期待什么。

如何使用优化的TensorFlow运行时

你可以使用优化的TensorFlow运行时,几乎完全是你使用基于开源的预建TensorFlow服务容器的方式。而不是使用基于开源TensorFlow构建的预构建容器,你需要做的是选择一个优化的TensorFlow运行时容器。

有两种类型的容器可用:夜间和稳定。夜间容器有最新的更新和优化,最适合于实验。稳定的容器是基于稳定的TensorFlow版本,最适合于生产部署。要查看具有优化的TensorFlow运行时间的容器的列表,请参见可用的容器图像

当你配置你的部署时,你可以启用本文前面提到的两个可选的优化,模型预编译和影响精度的优化。关于如何启用这些优化的细节,请参阅Vertex AI Prediction用户指南中的模型优化标志

下面的代码示例演示了你如何用预先建立的优化的TensorFlow运行时容器创建一个模型。关键的区别是在“container_spec” 中使用us-docker.pkg.dev/vertex-ai-restricted/prediction/tf_opt-cpu.nightly:latest 容器。更多的细节,请参阅Vertex AI预测用户指南中的使用优化的TensorFlow运行时部署一个模型

代码_块

[StructValue([(u'code', u'from google.cloud.platform import gapic as aip\nPROJECT_ID = uu201c<your PROJECT_ID>\u201d\r\nREGION = uu201c\u201d\rnAPI_ENDPOINT = f"{REGION}-aiplatform.googleapis.com",r/nPARENT = f "projects/{PROJECT_ID}/locations/{REGION}",r/n nclient_options = {"api_endpoint":API_ENDPOINT}/rnmodel_service_client = aip.ModelServiceClient(client_options=client_options)/r\ntf_opt_model_dict = {"display_name":"DISPLAY_NAME",\r\n "artifact_uri":"MODEL_URI",/r/n "container_spec":{r\n # 使用优化的TensorFlow运行时间image\r\n "image_uri":"us-docker.pkg.dev/vertex-ai-restricted/prediction/tf_opt-cpu.nightly:best",\r\n "args":[\r\n # 可选优化功能在此启用\r\n ],\r\n },\r\n}\rntf_opt_model = model_service_client.upload_model(\r\n parent=PARENT,\r\n model=tf_opt_model_dict).result(timeout=180).model'), (u'language', u'') ])

比较性能

为了展示使用Vertex AI Prediction优化的TensorFlow运行时间的好处,我们对部署在Vertex AI Prediction上的表格Criteo和BERT基础分类模型的性能进行了并列比较。在比较中,我们使用了库存的TensorFlow 2.7和优化的TensorFlow运行时容器。

为了评估性能,我们在 "服务器 "场景下为Vertex AI使用了MLPerf loadgen。MLPerf loadgen使用与官方MLPerf Inference基准相同的分布向Vertex Prediction端点发送请求。我们以每秒不断增加的查询次数(QPS)运行它,直到模型达到饱和,然后记录每个请求的观察延迟。

模型和基准代码是完全可重复的,可在vertex-ai-samplesGitHub仓库中找到。你可以使用下面的笔记本浏览并运行我们的基准测试。

Criteo模型性能测试

表格Criteo模型被部署在Vertex AI Prediction上,使用n1-standard-16与NVIDIA T4 GPU实例和优化的TensorFlow运行时间,TF2.7 CPU和TF2.7 GPU容器。虽然使用优化的TensorFlow运行时间与gRPC协议没有得到官方支持,但它们可以一起工作。为了比较不同Criteo模型部署的性能,我们使用gRPC协议在Vertex AI Prediction私有端点上运行MLPerf loadgen基准,请求批量大小为512。

下图显示了性能结果。TF Opt GPU "条显示了启用预编译时优化的TensorFlow运行时的性能,而 "TF Opt GPU lossy "条显示了启用预编译和影响精度的优化时的性能。

Optimized TensorFlow Runtime 1

优化的TensorFlow运行时间导致了明显的低延迟和高吞吐量。由于优化的TensorFlow运行时间将大部分计算转移到GPU上,因此可以使用CPU功率较小的机器。这些基准测试表明,启用影响优化的可选精度("TF Opt GPU "有损条)明显有助于提高模型的性能。我们比较了在优化的TensorFlow运行时间上运行的模型与在TF2.7容器上运行的模型对51,200个请求的预测结果,这些模型具有有损优化。在我们的结果中,精度的平均差异小于0.0016%,在最坏的情况下,精度差异小于0.05%。

基于这些结果,对于表格Criteo模型,与TensorFlow 2.7 CPU相比,优化的TensorFlow运行时间提供了大约6.5倍的吞吐量和2.1倍的延迟,当启用影响精度的优化时,吞吐量提高8倍,延迟提高6.7倍。

BERT基础模型性能测试

对于BERT基础模型的基准测试,我们微调了TensorFlow Hubbert_en_uncased_L-12_H-768_A-12分类模型,用于使用IMDB数据集进行情感分析。该基准使用MLPerf loadgen在公共端点上运行,请求批量大小为32。

下图显示了性能结果。TF Opt GPU "条显示了启用预编译时优化的TensorFlow运行时的性能,"TF Opt GPU lossy "条显示了启用预编译和影响精度的优化的性能。

bert_graph

为了确定影响精度的优化对模型精度的影响,我们比较了在优化的TensorFlow运行时上运行的模型与在TF2.7容器上运行的模型对32,000个请求的预测结果。在我们的结果中,精度的平均差异小于0.01%,在最坏的情况下,精度差异小于1%。

对于BERT基本模型,与TensorFlow 2.7相比,优化的TensorFlow运行时间提供了大约1.45倍的吞吐量和1.13倍的延迟,而在启用影响精度的优化时,吞吐量是4.3倍,延迟是1.64倍。

下一步是什么

在这篇文章中,你了解了新的优化的TensorFlow运行时以及如何使用它。如果你想重现基准结果,请务必尝试CriteoBert样本,或者查看可用的图像列表,开始运行一些你自己的低延迟实验!

鸣谢

非常感谢Cezary Myczka,他在获得本项目的基准测试结果方面做出了重大贡献。