作者:TurboNLP,腾讯 TEG 后台工程师
NLP 任务(序列标注、分类、句子关系判断、生成式)训练时,通常使用机器学习框架 Pytorch 或 Tensorflow,在其之上定义模型以及自定义模型的数据预处理,这种方式很难做到模型沉淀、复用和共享,而对于模型上线同样也面临:上线难、延迟高、成本高等问题,TEG-AI 平台部-搜索业务中心从 2019 年底开始,前期经过大量调研,在 AllenNLP 基础上自研了推理及训练一体化工具 TurboNLP, 涵盖了训练框架 TurboNLP-exp 和推理框架 TuboNLP-inference,TurboNLP-exp 训练框架具备可配置、简单、多框架、多任务、可复用等特点,在其之上能够快速、高效的进行 NLP 实验.
TurboNLP-inference 推理框架底层支持高效的模型推理库 BertInference,集成了常用的 NLP 模型, 具备无缝兼容 TurboNLP-exp、推理性能高(在 BERT-base 文档分类业务模型上实测,FP6 精度在 batch_size=64、seq_len=64 的情况下达到了 0.275ms/query,INT8 精度在 batch_size=64、seq_len=64 的情况下达到了 0.126ms/query 性能)等特点,NLP 训练和推理一体化工具极大的简化了训练到推理的流程,降低了任务训练、模型上线等人力成本,本文将主要介绍 NLP 训练和推理一体化工具。
NLP 任务通常是算法研究者自定义模型和数据预处理在机器学习框架Pytorch
或Tensorflow
进行训练,并手动部署到 libtorch 或 tensorflow 上,这一过程存在如下问题:
为了解决以上存在的痛点,在此背景下,我们打通了 NLP 训练端到推理端、自研了训练框架TurboNLP-exp
及推理框架TuboNLP-inference
,以下是框架的整体架构图:
训练框架 TurboNLP-exp
推理框架 TurboNLP-inference
BertInference
(BERT 推理加速库)、libtorch
、tensorflow
、TurboTransformers
(WXG 开源的 BERT 推理加速库)、BertInference-cpu
(BERT 在 CPU 上推理加速库)。TurboNLP-exp 训练框架是基于 AllenNLP 研发,为了满足算法研究者和推理的业务需求,TurboNLP-exp 不断优化,具备了业界框架不具备的特性,下表是 TurboNLP-exp 于业界其他框架的对比:
框架 | 难度 | 模块化 | 可配置 | Pytorch | Tensorflow | 多任务训练 | 多模型格式导出 | 数据预处理 | 推理 |
---|---|---|---|---|---|---|---|---|---|
PyText | 难 | T | T | T | F | F | F | Python | Caffe2 执行引擎 |
AllenNLP | 简单 | T | T | T | F | F | F | Python | 简单的 Python 服务 |
TurboNLP-exp | 简单 | T | T | T | T | T | T | Python、C++ | 高效的 TurboNLP-inference |
以下会详细介绍我们对 TurboNLP-exp 上所做的优化。
TurboNLP-exp 的可配置程度高,源于其合理的模块设计,通过模块化封装,TurboNLP-exp 支持随意组合模型、扩展子模块等,对于刚接触的研究者 TurboNLP-exp 提供了界面化配置,通过可视化界面生成数据预处理和模型配置,大大降低了上手难度。
数据预处理粗略可分为dataset_reader、token_indexer、tokenizer、vocabulary四个模块。
模型的模块化设计可以分为三大块:model、trainer、exporter。
caffe
、onnx
、pt
格式,通过配置来定义导出的格式。TurboNLP-exp 对底层机器学习平台进行了抽象,实现统一的 framework 接口对底层的 pytorch 和 tensorflow 调用(如下图所示),framework 根据配置来选择 pytorch 或 tensorflow 来实现接口。目前以 pytorch 的格式为标准。
多任务学习通过模拟人类认知过程的多任务特性,将不同类型的任务如实体识别、紧密度等集成在一个模型中,在共用的预训练语言模型上,训练各自的 tagger 层,在训练中,通过各个任务领域知识和目标的相互补充,共同提升任务模型效果,在上线时,使用同一个底层模型,从而达到节省存储及计算资源;目前,多任务的需求日渐增大,TurboNLP-exp 支持多任务多种组合方式及训练调度方式(如下图所示)
TurboNLP-exp 的多任务模型具备以下几个特点:
能通过现有单任务模型快速组合多任务模型。
支持多种组合规则,包括:共享、累加、shotcut。
支持多种训练调度方式,包括:依次调度、随机调度、共同调度。
依次及随机调度属于交替训练,可以在多任务的基础上获取各自任务的最优解,且不需要构造统一输入,更加简单。
共同调度属于联合训练,使用统一的输入,由于 loss 最后会累加,因此查找的是多任务综合最优解。
用户可根据实际任务场景自由配置对应的组合方式和调度方式,以此来让多任务能达到最优的效果。
TurboNLP-exp 能够导出格式:caffe
、onnx
、pt
,支持直接导出 TurboNLP-inference 推理框架支持的格式,直接推理端加载,无需再经过复杂的模型转换。
TurboNLP-exp 的数据预处理能够同时支持 Python、C++,Python 数据预处理主要服务于训练端,C++数据预处理主要服务于推理端,也能服务于训练端(如下图所示)
在训练端,当数据预处理还处在修改、调试时,使用 Python 数据预处理能够快速实验,当 Python 数据预处理固定后,通过配置切换为 C++数据预处理来验证数据预处理结果,从而保证训练端和推理端数据一致性。
在推理端,使用与训练端相同的配置,C++数据预处理输出将作为模型输入,C++数据预处理——TurboNLP-data
采用多线程、预处理队列来保证数据预处理的低延迟,在 BERT-base 五分类模型上实测,在 batch_size=64、seq_len=64 的情况下达到了0.05ms/query的性能。
TurboNLP-inference 推理框架能够无缝兼容TurboNLP-exp
、具备低延迟
、可配置
等特点,TurboNLP-inference 底层支持五种推理库:BertInference
(BERT 推理加速库)、libtorch
、tensorflow
、TurboTransformers
(WXG 开源的 BERT 推理加速库)、BertInference-cpu
(BERT 在 CPU 上推理加速库),其中,BertInference
是我们基于TensorRT研发的一款高效能 BERT 推理库,BertInference-cpu
是和 intel 合作开发的一款在 CPU 上进行 BERT 推理加速库。
以下是推理框架 TurboNLP-inference 和训练框架 TurboNLP-exp 一体化架构图:
TurboNLP-inference 具备以下特性:
lstm
、esim
、seq2seq_encoder
、attention
、transformer
等,根据配置构造模型结构及模型输入。TurboNLP-exp
的 exporter 导出model.weights
模型格式。TurboNLP-data
,并将数据预处理输出自动的喂入模型输入。NLP 一体化工具(TurboNLP-exp 训练框架和 TurboNLP-inference 推理框架)极大的简化了模型从训练到上线的流程(如下图所示),依据业务模型的实际上线流程,手工训练和部署需要 14.5/人天,而使用 NLP 一体化工具仅需 4/人天,整体节省了**72.4%**人力成本。
TurboNLP-inference 目前已成功支持了 TEG-AI 平台部-搜索业务中心的 5 个业务:
TurboNLP-inference 在业务上的表现,离不开对训练框架的无缝支持以及底层高效推理库的支持。
TurboNLP-inference 的底层高效推理库之一——BertInference 目前已具备支持 INT8 推理,优化了 Attention 计算,我们使用 BERT-base 文本分类业务模型和真实的线上数据进行了性能测试,效果如下:
在 batch_size=64,、seq_len=64 的情况下,性能达到了0.126ms/query,INT8 相比于 FP16 提升了**54.2%**左右。
TurboNLP-inference 支持 INT8 校准,能够使用已有的模型直接校准,通过配置调整校准过程,校准过程简单,校准后可以直接使用 INT8 精度进行模型推理。
NLP 一体化工具(TurboNLP-exp 训练框架和 TurboNLP-inference 推理框架)目前已经在 TEG AI 工作组内部演进,在预训练模型方面也有一些合作应用,同时我们也正在积极与 AI 工作组的算力和太极机器学习平台团队积极合作,把训练端能力在平台上更好的开放出来。接下来训练及推理框架也会在 TencentNLP 的公司统一协同 oteam 里面去演进,也期待在公司内更多团队的合作。
TurboNLP-inference 的 BERT 推理加速在 INT8 精度模型效果上仍有进一步的提升空间,目前着力于 QAT 以及知识蒸馏、QAT 目前在五分类 BERT-base 模型上实测,Accuracy 仅降低了0.8%,加入知识蒸馏有望达到 Accuracy 不掉。
更多: