NVIDIA大语言模型落地的全流程解析
导读 本文将分享 NVIDIA 在大语言模型领域的解决方案。
包括三部分内容:
NeMo Framework,NVIDIA 的大语言模型全栈解决方案,赋能生成式 AI 各阶段:
* 数据预处理
* 分布式训练
* 模型微调
* 模型推理加速(TensorRT-LLM 和 Triton)
* 检索增强生成 (RAG)
* 护栏技术 (Guardrails)
借助 TensorRT 的强大基础,NVIDIA 推出了 TensorRT-LLM,专为 AI 2.0 时代的大语言模型而优化。TensorRT-LLM 经过封装和增强,可为 LLM 应用提供卓越性能。
秉承 NVIDIA 一贯的开放精神,TensorRT-LLM 采用开源的 Apache-2.0 协议,为用户提供无与伦比的灵活性。
RAG:提升大语言模型的准确性
NVIDIA 开发的 RAG (检索增强生成) 技术增强了大语言模型的准确性。RAG 利用检索机制,为模型提供上下文信息,减少其在特定领域出现胡言乱语的可能。通过此技术,大语言模型可在面对未掌握信息时也能提供可信赖的生成结果。
01NeMo Framework首先来介绍 NeMo Framework。
1. NeMo Framework Overview
生成式 AI 浪潮正席卷而来,从大语言模型到文生图、科学研究,再到多模态切换,其影响范围不断扩大。它超越了传统 AI 技术,与深度神经网络和更广泛的领域深度融合,为创新开辟了无限可能。
NVIDIA 的 NeMo Framework 专精于大语言模型,涵盖其开发、部署和应用的全流程。
它由六个部分组成,涵盖模型开发和企业应用部署。通过 NeMo,企业可以轻松地构建、部署和使用大语言模型,从而解锁其强大的文本处理和理解能力。
第一,数据处理和清洗,以形成高质量数据集。
第二,分布式训练,其中涉及诸多技术,后文中会详细讨论。
第三,模型定制化,针对不同的场景或行业进行相应的适配工作。
优化推理性能:
NVIDIA 推出的 TensorRT-LLM 和 Triton 可显著提升推理速度。TensorRT-LLM 针对单个模型进行优化,而 Triton 则支持直接部署模型。
RAG(检索增强生成)通过检索知识库和向量数据库,增强生成模型的性能。涉及大型语言模型的落地应用,可提高准确性和信息丰富度。
NeMo Framework 灵活适用于多种模态,为大语言模型的训练、推理和大规模多模态 AI 提供支持,并可流畅适配语音转文字等场景。
2. NeMo Framework Key Components
接下来介绍 NeMo Framework 的核心组件。
首先是数据处理部分,这是一个关键环节。在实际场景中,原始数据集通常需要经过多次处理。典型的处理步骤包括去重、清除一些低质量的数据等。对于去重,通常使用基于规则的方法。
例如,如果发现某条数据中同一个词语重复出现超过一定的频率,我们就会将其视为不合适或低质量的数据,这就是基于规则的过滤方法。此外,我们还可以通过各种手段,包括训练模型的方式,来区分低质量和高质量的数据。通过这一系列手段对数据进行处理的过程称为数据预处理。这一部分非常重要,因为数据的质量直接影响到最终模型的训练效果,我们必须注意确保数据预处理的质量。
利用 NeMo Data Curator,通过去重和数据清洗技术提升数据集质量,可大幅提升模型效果。该工具可帮助用户评估和改进数据集,实现目标梯度显著提升。
加速训练:解锁大语言模型的潜能
NeMo 采用 NVIDIA Megatron Core 技术,针对大语言模型训练进行优化,大幅加速训练进程。
加速方法:
* 混合精度训练:提升效率,减少资源使用。
* 流水线并行:同时执行多个操作,提升吞吐量。
* 数据并行:在多个 GPU 上并行训练,缩短训练时间。
并行计算:Tensor 和 Pipeline 并行化,将模型分层为 Tensor,让每个 GPU 并发计算部分 Tensor,大幅提升计算效率。
Sequence 的并行处理显著提升计算效率。Dropout 和 LayerNorm 操作可以分散到不同 GPU 上执行,无需完整序列数据的聚合。这有效缩减了计算时间,最大化 GPU 资源利用率。
选择性重计算通过有选择地计算激活函数,可大幅提升效率。此方法通过只计算必要的激活函数,减少显存使用和重复计算,从而释放显存并提高处理速度。
这些方法都是 Nemo 框架在训练中用来提升效率的手段。
NeMo Framework:自动参数选择
NeMo Framework 提供了 Auto-Configurator 工具,可自动为模型训练选择最佳参数。只需输入时间和规模限制,Auto-Configurator 即可生成合理的参数表,帮助用户简化训练流程,节省时间和精力。
大模型训练可以分为不同的类型。在上图中,从左到右分别是 Prompt Engineering、Prompt Learning、Parameter Efficient Fine-Tuning、Fine Tuning。这几种训练类型在资源消耗和对参数的改变等方面都存在很大差异,效果也有很大的不同。NeMo Framework 对这四种类型的 Tuning 都是支持的。这里特别提一下,SFT 和 RLHF 会对模型所有参数都进行改变。
在这四种微调中,SFT 和 RLHF 所需要的资源是最大的。上图中提到了 LoRA 技术。该技术通过矩阵的分解,将一个大的参数矩阵分解成两个矩阵相乘。其中大矩阵保持不变,而小矩阵在训练时进行改变。这样就能以最小的参数代价达到最佳效果。
3. NeMo Framework Deployment Practice
下面介绍在使用 NeMo Framework 时的一些最佳实践。
一般来说,训练一个模型需要经过几个步骤。第一步,使用 NeMo Data Curator 对数据集进行清洗。第二步,配置参数。配置好参数后,可以直接使用 NeMo Framework Launcher。这个 Launcher 实际上是由许多脚本或者 E2E recipes 组成的。这些 recipes 中,训练参数可以进行自定义设置,比如需要运行多少步,每多少步保存一次 checkpoint 等。配置好这些参数后,只需启动相应的脚本,训练就会开始。
模型训练过程,可参见上图。中间的框图描述了 NeMo 在整个训练过程中的步骤。尤其是最耗时的 Pre-Train 过程。第三步,Pre-Train 结束后会进入模型效果对齐(aligner)阶段,比如与场景相关的 align,以及一些类似强化学习的模型调整,NeMo 平台也会提供支持。不管是 SFT、PEFT、Reward Model 还是 RLHF,NeMo 都可以通过 NeMo Framework Launcher 启动不同的脚本,使用不同的参数选择不同的阶段来完成训练或者微调。这里提到了 NeMo Training Container,NeMo Framework Launcher 实际上是一套脚本,通过参数配置控制 NeMo Training Container 容器进行训练。在容器化后,可以很方便地进行单节点多卡、单节点多 Pod,甚至多节点多卡等扩缩容。
尤其在扩容方面非常方便,因为训练通常需要大量资源,可以由 NeMo Framework Launcher 进行调配组织和协调容器资源。当训练过程结束后,就涉及到 Inference 阶段。对于 Inference,NeMo 也提供了 Inference Container。这个容器将运行 Triton 和 TensorRT-LLM,完成推理工作。通常情况下,NeMo Training Container 运行在 Slurm 或者是 K8S 集群上。K8S 目前也是支持的,但可能会有一些限制,Slurm 集群是比较主流的选择。但推理部署通常是基于 K8S 的。
训练模型通常分为三大类,资源需求各异:
1. 预训练:所需资源最小,为基础训练步骤。
2. 监督微调:中度资源需求,根据特定任务调整模型。
3. 提示学习:资源需求最大,通过提供特定提示来微调模型。
预训练采用高度密集的训练方式,需投入大量资源。它使用大规模集群,每个节点配备 8 张显卡,从零开始训练模型,带来最丰富的训练经验。
02TensorRT-LLM
优化 LLM 推理,TensorRT-LLM 展现非凡实力!训练完成后,TensorRT-LLM 闪耀登场,更智能、更高效地开展推理任务。
TensorRT-LLM 优化推理效率,提升 NLP 应用性能。它专注于以下两个关键指标:
- 延迟:优化模型响应速度,在输入字符后快速返回结果。
- 吞吐:提升模型处理能力,一次性处理多个句子并高效返回推理结果。
通过减少延迟和提高吞吐,TensorRT-LLM 显著提升模型推理效率,满足 NLP 应用对实时性和处理量的要求。
TensorRT-LLM 已开源,附带详尽文档,助您轻松学习和使用!访问 Github 获取代码:link
NeMo 生态系统将模型部署和推理优化相结合,提供卓越的模型性能。Triton Inference Server 确保高效部署,而 TensorRT-LLM 则凭借其快速的推理速度提升模型性能,为用户提供无缝的体验。
这里介绍下 TensorRT-LLM 和 TensorRT 之间的关系。TensorRT-LLM 实际上是基于 TensorRT 的,它对 LLM(语言模型)相关的一些操作进行了一些优化,但是很多 CUDA kernel 仍然来自于 TensorRT。TensorRT-LLM 增加的优化部分包括:KV Caching,每次计算中,KV Caching 始终是一个较大的部分,因为这部分有很多无需进行重复计算的内容,需要将之前的计算结果保存在 Caching 中,这是一个非常重要的优化。
其次,对于 MHA(Multi-Head Attention)kernels,也就是多头注意力的 CUDA kernel,TensorRT-LLM 也做了增强。除此之外,TensorRT-LLM 有 Inflight Batching。语言模型接收的每句话长度都不同,对于比较短的话,很快就结束了,是否可以在运行时插入后面一句话进行推理呢?这是语言模型的一个特点,与视觉不同,视觉推理的每个请求基本上都具有相对固定的维度,正因为语言模型存在每句话的长度都不同的特点,因此需要 Inflight Batching 特性。
对于大型语言模型,即使在推理阶段,也可能涉及到多个 GPU、多个节点等,因此 TensorRT-LLM 还拥有 Multi-GPU、Multi-Node 等功能。除了这些特性之外,TensorRT-LLM 剩下的部分与 TensorRT 是一致的,它也会借用到非常多 TensorRT 原有的 CUDA kernel。以矩阵运算为例,MHA kernel 实际上最终会退化到矩阵运算层,因此,最终它仍然会使用 TensorRT 中的GEMM 运算,因为这些都是通用的。TensorRT-LLM 使用的流程如下:
TensorRT-LLM 优化了深度学习模型推理,从而显著提高了速度。它加载模型,构建 Engine 以选择最快的计算路径,包括层融合和优化 CUDA 内核。通过固定这些优化后的内核,模型推理可通过加载 Engine 以达到最快的速度。
构建深度学习模型流程:
1. 加载模型和权重
2. 建立 engine
3. 运行 engine 测试效果
TensorRT-LLM 采用 Fast Transformer 的工作流程,集成自定义插件和优化内核,数量不断增长。
TensorRT 编译器针对模式优化内核,提高性能。
大型语言模型的训练涉及跨节点和卡之间的复杂通信。NCCL 库支持高效的通信,通过优化卡间和节点间数据传输来提升模型训练性能。
Inflight Batching 优化了大型语言模型的计算效率。它动态地将不同长度的句子分批处理,确保充分利用计算资源。通过插入后续内容,Inflight Batching 实现了平滑的批处理过程,避免了资源浪费或计算不足。
TensorRT-LLM 对多种 attention类型提供支持。我们知道,Multi-Head Attention 实际上还有其他类型的变体,例如有 Multi-Query Attention、Group-Query Attention 等,这些都是为了减少 attention 计算量而进行的一些优化,但这些方法也导致了 attention 计算过程的差异,因此针对这些不同的计算过程,需要有一些 CUDA kernel 来进行优化支持。
这里的 optimize attention 主要指的是对不同类型的 attention 进行支持的优化。
TensorRT-LLM 可量化多种模型,提升性能和效率。支持的模型包括:
- BERT-Base(93.0%)
- RoBERTa-Base(92.9%)
- GPT-2(92.3%)
- ALBERT-Base(91.9%)
- ELECTRA-Base(91.4%)
TensorRT-LLM 正在快速扩展,加入对多 GPU 和多节点的支持。当前正在解决的问题包括:
* Tensor 并行和并行操作
* NCCL 卡间通信
随着这些问题的解决,TensorRT-LLM 将提供更强大的性能,满足大型语言模型训练的需求。
RAG (Retrieval-Augmented Generation)
提升文风,融合检索增强式生成 (RAG) 技术,赋能您从海量文本数据中高效生成信息丰富、引人入胜的内容。
RAG 的主要目标是处理大型语言模型由于专业领域知识不足以及其他一些原因导致的幻觉问题。大语言模型不可能一直进行训练和微调,因为那样的代价相当大,所以训练和微调通常是周期性而不是一直进行的。在这些周期之间,如何确保大语言模型能够迅速适应专业领域知识呢?
RAG 就是用来解决这个问题的。这里通过一个小视频来演示 NeMo 提供的解决方案。首先将我们的 Knowledge Base,也就是与专业领域相关的整个文献,输入到系统中,作为其知识输入。
这样,我们就为大语言模型提供了专业领域的知识。然后,输入查询(query),经过一系列的处理过程,在处理完毕后,再输入我们的问题。可以输入一个相对专业的问题,比如询问 NVIDIA 的 Grace 芯片有多少个 CPU core,显然,对于一个预训练模型来说,它的回答肯定是不准确的,因为它没有这方面的知识。但由于刚刚输入了 Knowledge Base 对其进行了增强,现在大语言模型就能够更清楚地回答这个问题了,它有 200 个核心。这个示例直观地展示了 RAG 的作用。
上图展示了应用 RAG 的过程,图的右边展示了 RAG 过程中涉及的模块或参与的组件。左侧展示了 RAG 的过程,这里将 Knowledge Base 文件作为输入,经过预处理模块进行处理,主要包括特征提取等操作,我们使用了 LlamaIndex,当然也有很多其它工具可以在这个步骤中发挥作用。处理完的数据进入 Embedding model,在这个产品中我们使用了 E5 模型。将刚才提到的 Knowledge Base 作为模型的输入,进行微调。
微调完成后,将 embedding 结果作为向量数据库的输入。向量数据库使用的是 Milvus,而 RAFT 是用于加强当前数据库搜索过程的工具,主要引入了 GPU 加速的功能。接下来是大语言模型 LLM,这里使用的是 Llama 2 模型。通过这样的流程来回答我们的问题,相当于在经过大语言模型之前,先在 prompt 之外添加了一个上下文,使得大语言模型的反馈更准确。这就是 RAG 的过程。
基于 Nvidia 工具和大型语言模型,RAG 优化了大语言模型 (LLM) 的服务流程:
* 数据处理: Nvidia 工具处理 RAG
* 推理: RAG 与大型模型结合进行推理
* 反馈: 结果反馈给用户查询,缓解幻觉和专业知识匹配问题
此流程提高了 LLM 的实用性,确保准确性和有效性。
总结RAG 的过程:
为优化知识库,第一步是分块和分片。此过程将输入数据转换为标准化格式,如问答对或其他规定长度的数据。这种标准化处理便于后续步骤,如特征提取和模型训练。
优化后:运用微调和索引等技术,提升 Embedding 模型性能,充分利用 Knowledge Base 的丰富知识。
第三步,访问数据库。
第四步,进行 Top K 的选择,选出最符合条件的多条 chunk。
-对此,您有什么看法见解?-