阿里安全使用 NVIDIA NeMo 框架和 TensorRT-LLM 的大模型工程化落地实践
前言

ChatGPT 的爆火,把大模型推向了前台,也让它们在各行各业的落地速度骤然加快。阿里安全涉足大模型应用,至今也已有两年多的时间。借这个机会,把团队在大模型工程领域摸爬滚打积累下来的经验做个梳理,分享出来。
实践下来,阿里安全主要借助了
NVIDIA NeMo
TensorRT-LLM
大模型训练
先从工程的角度出发,聊聊大模型训练。我们团队过去两年在这方面积累了一些经验,特别是关于训练加速的部分。
NVIDIA NeMo 框架(基于 Megatron-LM)是一个端到端的云原生框架。无论你在本地还是在云上,都能用它来灵活地构建、定制和部署生成式 AI 模型。它的功能模块覆盖了预训练模型、数据管护、模型对齐、训练推理、检索增强和护栏工具包等,为用上生成式 AI 提供了一种既方便又经济的方式。NeMo 也支持多模态模型的训练,比如 Stable Diffusion、Vision Transformer 等。不过,
本文的焦点是大模型训练框架的速度对比,所以我们只看 NVIDIA Megatron Core 的部分
在使用 NeMo 进行大模型训练时,以下几个 feature 对速度的影响最大:
- ,包括张量并行和流水线并行。当然,现在还有更新的 feature,比如长序列下的 context parallel。
模型并行
- ,Megatron Core 会把多个算子的计算融合在一起,放到一个 kernel 里计算,以此提升训练速度。
Layer & Kernel Fusion
- ,Megatron Core 会把 Optimizer States 分配到各个 device 中,减少显存占用。此外还有比较新的 FSDP,能支持梯度和参数的进一步分块,进一步降低显存占用。
Distributed Optimizer
当然,NeMo 还有其他的 feature,比如让计算和通信 overlap,以及调用基于
cuDNN
训练性能对比
在 Megatron-LM 的公开论文中可以看到(如图 1 所示),Megatron Core 能保证在 GPU 水平扩展时,单卡的 FLOPs 基本保持不变;而 DeepSpeed 框架则有较大的衰减。175B 模型在 1,536 卡的规模上,Megatron-LM 的性能是 DeepSpeed 的 3 倍多;530B 模型在 2,240 卡规模上,Megatron-LM 也是 DeepSpeed 的 3 倍多。
图 1. Megatron-LM 论文中性能对比数据
(https://people.eecs.berkeley.edu/~matei/papers/2021/sc_megatron_lm.pdf)
我们团队基于 Llama2-13B 模型也做了类似的实验,结论一致:NeMo 比 DeepSpeed 性能高。具体数据如下表所示:
无论在单机 8 卡,还是双机 16 卡的规模上,NeMo 的性能都是 DeepSpeed 的 2 倍。
NeMo 性能评测小结
- 训练过程中,模型并行以及梯度交换需要在多个节点间通信,此时带宽会成为比较重要的瓶颈。训练大模型时,网卡带宽很容易成为瓶颈,所以建议使用 RDMA+ 多网卡方案。
- 为了降低多节点间模型 Optimizer States 的通信量,同时保证训练精度不受太大影响,可以将 Distributed Optimizer 的 dataType 设为 FP32,同时将 grad_sync_dtype 设为 BF16。
NeMo 使用问题总结
- :
影响性能的三个重要参数
megatron_amp_O2x0(混合精度 O2 优化选项,设为 False 会降低训练性能);optim.grad_sync_dtype(梯度同步精度,与显存占用相关,使用 FP16 可减少显存占用);optim.optimizer_dtype(optimizer states 参数类型,设为 FP16 或 BF16 会降低模型精度)。 - :需要将 NeMo 的默认 prompt 配置修改成与原模型一致的 prompt,否则会造成训练 loss 增大,影响最终效果。
SFT Chat 类模型
- :实践中发现,对于 13B 左右的模型,当显卡规模小于 32,且有高效的 RDMA 网络时,通常只需开启 TP(TP>1),保持 PP=1;如果模型更大,比如 70B 模型,则需要同时开启 PP(PP>1)。
TP 和 PP 的参数配置
大模型推理
大模型快速部署流程
在大模型推理方面,NVIDIA 推出的 TensorRT-LLM 实现了业界领先的性能。经过多方比较,我们最终选定它作为阿里安全大模型高性能推理的基石。由于业务中涉及的大模型服务较多,为了让算法同学能快速部署,工程团队开发了一系列功能,让他们可以快速、高效、平稳地完成部署。具体流程如下图所示:
图 2. 大模型部署流程,图片来源于阿里安全
- :对用户提供的模型文件和包含相关参数的配置文件进行校验,并生成标准的数据格式,方便后续的模型编译。
模型校验和标准化导出
- :使用 TensorRT-LLM 将模型编译成 engine 格式。
模型编译
- :将服务的各个模块定义为 Op,通过 DAG 的方式在可视化界面中展示,让算法同学可以自主编排服务逻辑。
服务 DAG 编排
- :用户在 DAG 中可自行构造服务输入数据,完成对整个 DAG 的实时调试。调试结束后,可将 DAG 固化,并构建成真实的服务配置。
DAG 调试和构建
- :我们的模型服务都通过 K8s 进行部署,便于快速部署、快速复制和扩容。
K8s 服务部署
大模型服务在线推理架构
大模型推理场景有什么特点
- 每条请求的推理耗时分布非常不均匀。耗时短的,几百毫秒就能返回;耗时长的,可能需要几十秒。这种情况在非 LLM 的模型上基本不存在。
- 大模型是生成式的,实际应用中会依赖上文信息——之前的推理结果需要在后续的推理中作为输入再次传入。
- 部署的服务需要能实时监控内部的健康状态。因为大模型服务在使用 GPU 时,GPU 内部的错误(如数组越界)会导致后续所有计算都失败,所以推理框架需要能及时感知这类错误,并做到快速重启。
针对这些特点,我们采用异步服务进行部署:上游调用先提交一次请求,然后通过轮询或回调的方式获取计算结果。具体架构图如下:
图 3. 模型服务架构图,图片来源于阿里安全
大模型服务性能优化篇
TensorRT-LLM 在 In-Flight Batching 的基础上新增了调度机制,即动态批处理(Dynamic Batch)。为了进一步提升推理速度,我们仔细分析了推理过程中的计算。从公式来看,要想让推理过程中的计算密度变大,只能调大 batch_size;而 generate 过程中,每个样本的输入长度和输出长度都不相同,必然会导致算力浪费。具体推理过程如下图所示:
图 4. 大模型 generate 生成过程示意图,图片来源于阿里安全
从案例中可以看到,一共有 4 条样本需要推理。若 GPU 最多只能一次处理 3 条,则共需 9 步完成这 3 条样本的推理。其中,第 1 条样本在 step1 时就结束了,input2 在 step5 时结束,因此这 9 步中间出现很多 EOS token(我们称之为气泡)。气泡越多,算力浪费越严重;剩下的 input4 只能按 batch_size=1 进行推理,浪费更明显。
在实际的推理服务中,如果一个 batch 里的某条输出长度特别大,气泡比例甚至可能超过 80%,造成严重的算力浪费。为了解决这个问题,我们提出了一种新的推理算法:
- 准备输入数据(n = max_batch_size*10),形成一个候选集合 S。
- 如果集合 S 为空,退出;否则,对集合 S 中的文本序列进行排序。
- 从集合 S 中取出 m 个文本进行推理,其中 m = find_max_batch_size(current_seq_len)。推理到一定 step(一般取 100),或者当本次 batch 中 70% 的样本已推理完成且未完成样本数大于 1/max_batch_size 时,推理中断退出。
- 将上次未推理完成的样本拼接上已生成的部分文本,作为一个新文本插入候选集合 S,然后重复第 2 步。
算法的核心思想是:根据当前 seq_len 动态设置每次 batch 的大小(让 GPU 内存占满,不浪费算力),并在推理过程中动态检测是否需要提前终止,终止条件是大部分样本已推理完成或推理的 step 达到一定限度。针对图 4 中的案例,采用新调度思想后的效果如下图所示:
图 5. 启用新的调度策略后的推理,图片来源于阿里安全
采用新调度逻辑后,这个案例的 step 数从 20 步减少到 14 步;在实际生产中,步数减少的幅度远不止于此。经过验证,采用上述算法后,服务的 QPS 通常有 2-3 倍以上的提升。
优化 prompt,提升服务性能
通常情况下,优化 prompt 能提升模型效果。来看一个案例:
输入:请判断一下,这段文字是否正确,如果错误请说明理由。「古代帝王把帝位让给贤能的人称为禅让,是原始社会末期部落首领的选举制度」
输出:对
输入:请判断一下,这段文字是否正确,如果错误请说明理由。「礼部为六部之一,掌管礼仪、祭祀、土地、户籍等职事,部长官称为礼部尚书」
输出:错,"礼部",在明代有尚书一人,左、右侍郎各一人,下设四司,分别为:仪制清吏司,掌嘉礼、军礼以及管理学务、科举考试事;祠祭清吏司,掌吉礼、凶礼事物;主客清吏司,掌宾礼及接待外宾事物;精膳清吏司,掌筵飨等事务。
上述案例让大模型判断一段文字的正确性,错误则说明理由。在实际服务中,回答正确的 case 输出 token 数为 1,而回答错误的 case 输出 token 数可能很大。如 Dynamic Batch 一节所述,当输出长度差异很大时,推理过程中产生的气泡会非常大,造成严重的算力浪费。为解决这个问题,我们可以将问题分解:先让大模型判断正确性,再针对错误 case 询问原因。
输入:请判断这段文字是否正确,「古代帝王把帝位让给贤能的人称为禅让,是原始社会末期部落首领的选举制度」
输出:对
输入:请判断这段文字是否正确,「礼部为六部 之一,掌管礼仪、祭祀、土地、户籍等职事,部长官称为礼部尚书」
输出:错
输入:这段有事实错误,请指出原因,「礼部为六部之一,掌管礼仪、祭祀、土地、户籍等职事,部长官称为礼部尚书」
输出:"礼部",在明代有尚书一人,左、右侍郎各一人,下设四司,分别为:仪制清吏司,掌嘉礼、军礼以及管理学务、科举考试事;祠祭清吏司,掌吉礼、凶礼事物;主客清吏司,掌宾礼及接待外宾事物;精膳清吏司,掌筵飨等事务。
在实际业务中,采用这种策略后,部分业务的吞吐量提升了 10 倍以上。
模型推理量化
我们的模型量化大部分是基于
NVIDIA TensorRT Model Optimizer
模型量化后的性能表现
我们分别在 Baichuan2-13B 和 Qwen-14B 模型上使用了上述各种量化方法进行实验。量化后的性能结果如下:
图 6. 图片来源于阿里安全
模型推理基于 TensorRT-LLM 实现。实验表明,在 batch_size 和 seq_len 都相同的条件下,sq_int8 的推理速度最快。
模型量化后的业务效果
以两个实际落地的业务来说明量化的效果:
图 7. 图片来源于阿里安全
结论是:业务 1 上 smoothQuant int8 表现最好,业务 2 上 int8 weight only 表现更好。实践中发现,并没有哪一种方法始终是最好的,但相对而言,smoothQuant 在大部分业务场景中表现都比较稳健。有些资料提到 smoothQuant int8 对模型精度会有一定影响,但在我们的应用场景下,ModelOpt 量化出来的 smoothQuant int8 精度令人满意。
模型量化经验总结
- :我们会在标准的业务数据集上测试各种量化方法的效果,然后选取稳定的方法应用到实际业务中。
前期是量化方法的选择问题
- :理论上,量化后的模型精度不可能与未量化模型完全相同,但我们在实际业务中能将量化带来的损失控制在 1% 以内。如果精度损失过大,通常可以通过调整量化过程中的校准数据集来改善,校准样本一般需要 2,000-8,000 条,而对校准数据集的要求是,其分布要尽可能与实际业务的样本分布一致。
量化后期要注意精度损失
大模型工程落地的一些思考
模型性能优化总结
- 。从 Transformer 的 FLOPs 分析可以看出,其主要计算集中在 attention 上。过去两年,业内的优化也主要集中在这一点上,比如 FlashAttention、FlashAttention-2 等方法。而 TensorRT-LLM 针对不同模型的 attention,基于 flash 思想实现了更丰富的功能和性能支持。
Attention 是 Transformer 的计算瓶颈
- 。过去一年,业内提出的 flash-decoding++ 就是解决这个问题的。在 TensorRT-LLM 中对此部分也有特定的性能优化,在此基础上,通过调大 batch_size 可以进一步提升吞吐量。
解决第 2-n 个推理的加速问题,是当前最迫切的
- 。需具体问题具体分析,总的原则是,在一个 batch 的推理过程中要避免 token 的无效计算。
优化 prompt、减少推理中的气泡也是性能优化的重要手段
模型效果优化总结
- prompt 工程是大模型实际应用中非常重要的一环。prompt 设计的好坏,不仅影响模型的业务效果,也极大地影响服务的吞吐量。prompt 是个经验工程,需要在实践中不断尝试和总结。
- 另外,prompt 的 few-shot 中 example 的顺序也会影响模型推理的结果。
- ,建议开发者设计多套 prompt,逐步引导大模型正确输出,并在 prompt 中设计结束符,避免模型出现幻觉。
为避免大模型输出预期之外的结果
- ,不推荐直接使用换行或空格来分开各个部分。建议使用 markdown 或 xml 语法,这可能是因为大模型在预训练阶段使用了大量 xml 和 markdown 语料。
对于结构化的 prompt
- 。例如,可以在 prompt 中添加类似这样的语句:
prompt 设计要考虑边界情况
if you cannot fetch any information, output `no answer`
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名