共计 7562 个字符,预计需要花费 19 分钟才能阅读完成。
作者:Yashal Kanungo – 利用科学家,Kamran Khan – 高级技术产品经理,Shubha Kumbadakone – ML 框架高级专家
亚马逊广告应用 PyTorch、TorchServe 和 AWS Inferentia 将推理老本升高 71% 的同时推动横向扩大。
亚马逊广告(Amazon Ads)通过在亚马逊商店内外展现的广告(包含超过 15 个国家 / 地区的网站、利用和流媒体电视内容)帮忙公司建设品牌并与购物者建立联系。各种规模的企业和品牌,包含注册卖家、供应商、图书供应商、Kindle Direct Publishing (KDP) 作者、应用程序开发人员和代理机构都能够上传本人的广告创意,其中能够包含图像、视频、音频,当然,还有在亚马逊上销售的商品。
为了推广精确、平安和愉悦的购物体验,这些广告必须恪守内容准则。例如,广告闪动关上或敞开,产品必须在适当的上下文中展现,图片和文字应适宜一般受众。为了帮忙确保广告合乎所需的政策和规范,咱们须要开发可扩大的机制和工具。
作为解决方案,咱们应用机器学习(ML)模型来展现可能须要批改的广告。随着深度神经网络在过来十年中蓬勃发展,咱们的数据迷信团队开始摸索更通用的深度学习 (DL) 办法,这些办法可能以起码的人工干预解决文本、图像、音频或视频。为此,咱们应用 PyTorch 构建了计算机视觉(CV)和自然语言解决(NLP)模型,这些模型会主动标记可能不合规的广告。PyTorch 直观,灵便且用户敌对,并且曾经使咱们无缝过渡到应用 DL 模型。在基于 AWS Inferentia 的 Amazon EC2 Inf1 实例而不是基于 GPU 的实例上部署这些新模型,对于雷同的工作负载,咱们的推理提早升高了 30%,推理老本升高了 71%。
向深度学习过渡
咱们的机器学习零碎将经典模型与词嵌入配对以评估广告文本。然而咱们的需要在一直变动,随着提交量的不断扩大,咱们须要一种足够灵便的办法来随着咱们的业务扩大。此外,咱们的模型必须疾速并在几毫秒内投放广告,以提供最佳的客户体验。
在过来的十年中,深度学习在许多畛域都十分风行,包含自然语言、视觉和音频。因为深度神经网络通过多层传输数据集——逐渐提取更高层次的特色——它们能够比经典的 ML 模型做出更轻微的推断。例如,深度学习模型能够回绝做出虚伪申明的广告,而不是简略地检测被禁止的语言。
此外,深度学习技术是可转移的——为一项工作训练的模型能够适应执行相干工作。例如,能够优化预训练的神经网络以检测图像中的对象,而后进行微调以辨认不容许在广告中显示的特定对象。
深度神经网络能够主动执行经典 ML 最耗时的两个步骤:特色工程和数据标记与须要探索性数据分析和手工设计特色的传统监督学习办法不同,深度神经网络间接从数据中学习相干特色。DL 模型还能够剖析非结构化数据,例如文本和图像,而无需 ML 中所需的预处理。深度神经网络能够无效地扩大更多数据,并且在波及大型数据集的应用程序中体现得特地好。
咱们抉择了 PyTorch 来开发咱们的模型,因为它帮忙咱们最大限度地进步了零碎的性能。借助于 PyTorch,咱们能够更好地为客户服务,同时利用 Python 最直观的概念。PyTorch 中的编程是面向对象的:它将处理函数与它们批改的数据组合在一起。因而,咱们的代码库是模块化的,咱们能够在不同的应用程序中重用代码片段。此外,PyTorch 的 Eager 模式容许循环和控制结构,因而模型中的操作更简单。Eager 模式能够很容易地对咱们的模型进行原型设计和迭代,并且咱们能够应用各种数据结构。这种灵活性有助于咱们疾速更新模型以满足一直变动的业务需要。
“在此之前,咱们尝试了其余‘Pythonic’框架,但 PyTorch 在咱们这里显然是赢家。”利用科学家 Yashal Kanungo 谈到。“应用 PyTorch 很容易,因为这种构造感觉是 Python 编程的原生构造,而数据科学家对此十分相熟”。
训练管道
明天,咱们齐全在 PyTorch 中构建咱们的文本模型。为了节省时间和金钱,咱们常常通过微调预训练的 NLP 模型来跳过训练的晚期阶段以进行语言剖析。如果咱们须要一个新模型来评估图像或视频,咱们首先浏览 PyTorch 的 torchvision 库,该库为图像和视频分类、对象检测、实例宰割和姿态预计提供了预训练选项。对于专门的工作,咱们从头开始构建自定义模型。PyTorch 非常适合这一点,因为 Eager 模式和用户敌对的前端使尝试不同的架构变得容易。
要理解如何在 PyTorch 中微调神经网络,请参阅本教程。
在开始训练之前,咱们会优化模型的超参数、定义网络架构的变量(例如暗藏层的数量)和训练机制(例如学习率和批量大小)。抉择适当的超参数值至关重要,因为它们将塑造模型的训练行为。在这一步中,咱们依赖 AWS 的 ML 平台 SageMaker 中的贝叶斯搜寻性能。贝叶斯搜寻将超参数调整视为回归问题:它提出可能产生最佳后果的超参数组合并运行训练作业来测试这些值。每次试验后,回归算法会确定下一组要测试的超参数值,并且性能会逐步提高。
咱们应用 SageMaker Notebooks 对咱们的模型进行原型设计和迭代。Eager 模式让咱们通过为每个训练批次构建一个新的计算图来疾速原型模型;操作的程序能够在迭代之间扭转,以适应不同的数据结构或与两头后果相结合。这使咱们能够在训练期间调整网络,而无需从头开始。这些动态图对于基于可变序列长度的递归计算特地有价值,例如应用 NLP 剖析的广告中的单词、句子和段落。
当咱们实现模型架构后,咱们会在 SageMaker 上部署训练作业。PyTorch 通过同时运行大量训练作业帮忙咱们更快地开发大型模型。PyTorch 的分布式数据并行 (DDP) 模块在 SageMaker 内的多台互连机器上复制单个模型,并且所有过程在数据集本人独特的局部上同时向前运行。在反向流传过程中,模块对所有过程的梯度进行均匀,因而每个部分模型都应用雷同的参数值进行更新。
模型部署管道
当咱们在生产中部署模型时,咱们心愿确保在不影响预测准确性的状况下升高推理老本。PyTorch 的多项性能和 AWS 服务帮忙咱们应答了这一挑战。
动静图形的灵活性丰盛了训练,但在部署中,咱们心愿最大限度地进步性能和可移植性。在 PyTorch 中开发 NLP 模型的其中一个长处是开箱即用,它们能够被 TorchScript 追踪到动态操作序列中,TorchScript 是专门用于 ML 应用程序的 Python 子集。Torchscript 将 PyTorch 模型转换为更高效、更易于编译的生产敌对型两头示意(IR)图。咱们通过模型运行一个示例输出,TorchScript 记录在前向传递期间执行的操作。生成的 IR 图能够在高性能环境中运行,包含 C++ 和其余无 Python 的多线程上下文,并且诸如运算符交融之类的优化能够放慢运行时。
Neuron SDK 和 AWS Inferentia 驱动的计算
咱们将模型部署在由 AWS Inferentia 提供反对的 Amazon EC2 Inf1 实例上,这是 Amazon 的第一个 ML 芯片,旨在减速深度学习推理工作负载。与基于 Amazon EC2 GPU 的实例相比,Inferentia 已证实可将推理老本升高多达 70%。咱们应用 AWS Neuron SDK(一组与 Inferentia 一起应用的软件工具)来编译和优化咱们的模型,以便在 EC2 Inf1 实例上进行部署。
以下的代码片段展现了如何应用 Neuron 编译 Hugging Face BERT 模型。与 torch.jit.trace() 一样,neuron.trace() 在前向传递期间记录模型对示例输出的操作,以构建动态 IR 图。
import torch
from transformers import BertModel, BertTokenizer
import torch.neuron
tokenizer = BertTokenizer.from_pretrained("path to saved vocab")
model = BertModel.from_pretrained("path to the saved model", returned_dict=False)
inputs = tokenizer ("sample input", return_tensor="pt")
neuron_model = torch.neuron.trace(model,
example_inputs = (inputs['input_ids'], inputs['attention_mask']),
verbose = 1)
output = neuron_model(*(inputs['input_ids'], inputs['attention_mask']))
主动转换和从新校准
在底层,Neuron 通过将模型主动转换为更小的数据类型来优化模型的性能。默认状况下,大多数应用程序以 32 位单精度浮点 (FP32) 数字格局示意神经网络值。将模型主动转换为 16 位格局——半精度浮点 (FP16) 或大脑浮点 (BF16)——缩小了模型的内存占用和执行工夫。在咱们的案例中,咱们决定应用 FP16 来优化性能,同时放弃高精度。
在某些状况下,主动转换为较小的数据类型会触发模型预测的轻微差别。为了确保模型的准确性不受影响,Neuron 比拟了 FP16 和 FP32 模型的性能指标和预测。当主动转换升高模型的准确性时,咱们能够通知神经元编译器仅将权重和某些数据输出转换为 FP16,将其余两头后果保留在 FP32 中。此外,咱们常常对训练数据进行几次迭代,以从新校准咱们的主动铸造模型。这个过程比原来的训练要少得多。
部署
为了剖析多媒体广告,咱们运行了一组 DL 模型。上传到亚马逊的所有广告都通过专门的模型运行,这些模型评估它们包含的每种类型的内容:图像、视频和音频、题目、文本、背景,甚至语构、语法和可能不失当的语言。咱们从这些模型收到的信号表明广告是否合乎咱们的规范。
部署和监控多个模型异样简单,因而咱们依赖于 SageMaker 的默认 PyTorch 模型服务库 TorchServe。TorchServe 由 Facebook 的 PyTorch 团队和 AWS 联合开发,旨在简化从原型设计到生产的过渡,帮忙咱们大规模部署训练有素的 PyTorch 模型,而无需编写自定义代码。它为推理、治理、度量和解释提供了一组平安的 REST API。TorchServe 具备多模型服务、模型版本控制、集成反对和主动批处理等性能,非常适合反对咱们微小的工作量。您能够在这篇博文中浏览更多对于在 SageMaker 上部署 Pytorch 模型并集成原生 TorchServe 的信息。
在某些用例中,咱们利用 PyTorch 的面向对象编程范式将多个 DL 模型包装到一个父对象(PyTorch nn.Module)中,并将它们作为一个整体服务。在其余状况下,咱们应用 TorchServe 在独自的 SageMaker 终端节点上为独自的模型提供服务,这些终端节点在 AWS Inf1 实例上运行。
自定义处理程序
咱们特地赞叹 TorchServe 容许咱们将模型初始化,预处理,推理和后处理代码嵌入到服务器上的单个 Python 脚本 handler.py 中。此脚本(处理程序)预处理广告中未标记的数据,通过咱们的模型运行该数据,并将后果推断提供给上游零碎。TorchServe 提供了多个默认处理程序,用于加载权重和体系结构,并筹备模型以在特定设施上运行。咱们能够将所有须要的附加工件(如词汇表文件或标签映射)与模型捆绑在一个存档文件中。
当咱们须要部署具备简单初始化过程或源自第三方库的模型时,咱们会在 TorchServe 中设计自定义处理程序。这让咱们能够应用任何所需的过程从任何库加载任何模型。以下代码段显示了一个简略的处理程序,它能够在任何 SageMaker 托管端点实例上为 Hugging Face BERT 模型提供服务。
import torchimport torch.neuronfrom ts.torch_handler.base_handler import BaseHandlerimport transformersfrom transformers import AutoModelForSequenceClassification,AutoTokenizer
class MyModelHandler(BaseHandler):def initialize(self, context):self.manifest = ctx.manifestproperties = ctx.system_propertiesmodel_dir = properties.get("model_dir")serialized_file = self.manifest["model"]["serializedFile"]model_pt_path = os.path.join(model_dir, serialized_file)
self.tokenizer = AutoTokenizer.from_pretrained(model_dir, do_lower_case=True)
self.model = AutoModelForSequenceClassification.from_pretrained(model_dir)
def preprocess(self, data):
input_text = data.get("data")
if input_text is None:
input_text = data.get("body")
inputs = self.tokenizer.encode_plus(input_text, max_length=int(max_length), pad_to_max_length=True, add_special_tokens=True, return_tensors='pt')
return inputs
def inference(self,inputs):
predictions = self.model(**inputs)
return predictions
def postprocess(self, output):
return output
批处理
硬件加速器针对并行性进行了优化,批处理(在一个步骤中为模型提供多个输出)有助于使所有可用容量饱和,通常会导致更高的吞吐量。然而,过高的批量大小会减少提早,而吞吐量的晋升却很小。尝试不同的批量大小有助于咱们确定模型和硬件加速器的最佳地位。咱们进行试验以确定模型大小、无效负载大小和申请流量模式的最佳批量大小。
Neuron 编译器当初反对可变批量大小。以前,跟踪模型硬编码了预约义的批量大小,因而咱们必须填充数据,这会节约计算、升高吞吐量并加剧提早。Inferentia 通过优化,可最大限度地进步小批量的吞吐量,通过加重零碎负载来缩小提早。
批处理
硬件加速器针对并行性进行了优化,批处理(在一个步骤中为模型提供多个输出)有助于使所有可用容量饱和,通常会导致更高的吞吐量。然而,过高的批量大小会减少提早,而吞吐量的晋升却很小。尝试不同的批量大小有助于咱们确定模型和硬件加速器的最佳地位。咱们进行试验以确定模型大小、无效负载大小和申请流量模式的最佳批量大小。
Neuron 编译器当初反对可变批量大小。以前,跟踪模型硬编码了预约义的批量大小,因而咱们必须填充数据,这会节约计算、升高吞吐量并加剧提早。Inferentia 通过优化,可最大限度地进步小批量的吞吐量,通过加重零碎负载来缩小提早。
并行性
多核上的模型并行性还进步了吞吐量和提早,这对于咱们沉重的工作负载至关重要。每个 Inferentia 芯片蕴含四个 NeuronCore,它们既能够同时运行独自的模型,也能够造成流水线来传输单个模型。在咱们的用例中,数据并行配置以最低的老本提供最高的吞吐量,因为它扩大了并发解决申请。
数据并行:
模型并行:
监控
在生产过程中监控推理的准确性至关重要。最后做出良好预测的模型最终会在部署中进化,因为它们裸露在更多品种的数据中。这种景象称为模型漂移,通常产生在输出数据分布或预测指标发生变化时。
We use SageMaker Model Monitor to track parity between the training and production data. Model Monitor notifies us when predictions in production begin to deviate from the training and validation results. Thanks to this early warning, we can restore accuracy — by retraining the model if necessary — before our advertisers are affected. To track performance in real time, Model Monitor also sends us metrics about the quality of predictions, such as accuracy, F-scores, and the distribution of the predicted classes.
咱们应用 SageMaker 模型监控器来跟踪训练和生产数据之间的奇偶校验。当生产中的预测开始偏离训练和验证后果时,模型监控器会告诉咱们。多亏了这种晚期预警形式,咱们能够在咱们的广告商受到影响之前复原准确性——必要时能够从新训练模型。为了实时跟踪性能,模型监控器还会向咱们发送无关预测品质的指标,例如准确度、F 分数和预测类别的散布。
为了确定咱们的应用程序是否须要扩大,TorchServe 会定期记录 CPU、内存和磁盘的资源利用率指标;它还记录收到的申请数量与服务数量。对于自定义指标,TorchServe 提供了一个 Metrics API。
一种无益的后果
咱们的深度学习模型在 PyTorch 中开发并部署在 Inferentia 上,在降低成本的同时放慢了广告剖析的速度。从咱们在 DL 中的第一次摸索开始,在 PyTorch 中编程感觉是十分天然的。它的用户敌对型性能有助于从咱们晚期的试验到多模态集成的部署。PyTorch 让咱们可能疾速制作原型和构建模型,这在咱们的广告服务倒退和扩大过程中至关重要。为了取得额定的益处,PyTorch 与 Inferentia 和咱们的 AWS ML 堆栈无缝合作。咱们期待应用 PyTorch 构建更多用例,以便咱们可能持续为客户提供精确,实时的后果。