<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>深度学习 | 林子杨的个人网站</title><link>https://ziyanglin.netlify.app/zh/tags/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/</link><atom:link href="https://ziyanglin.netlify.app/zh/tags/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/index.xml" rel="self" type="application/rss+xml"/><description>深度学习</description><generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh-Hans</language><lastBuildDate>Mon, 30 Jun 2025 06:00:00 +0000</lastBuildDate><image><url>https://ziyanglin.netlify.app/img/icon-192.png</url><title>深度学习</title><link>https://ziyanglin.netlify.app/zh/tags/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/</link></image><item><title>TensorRT深度解析：高性能深度学习推理引擎</title><link>https://ziyanglin.netlify.app/zh/post/tensorrt-documentation/</link><pubDate>Mon, 30 Jun 2025 06:00:00 +0000</pubDate><guid>https://ziyanglin.netlify.app/zh/post/tensorrt-documentation/</guid><description>&lt;h2 id="1-">1. 引言&lt;/h2>
&lt;p>NVIDIA® TensorRT™ 是一个用于在 NVIDIA GPU 上进行高性能深度学习推理的软件开发套件（SDK）。它旨在优化和加速经过训练的神经网络，使其能够在生产环境中以低延迟和高吞吐量的方式运行。TensorRT 接收来自主流深度学习框架（如 TensorFlow、PyTorch、ONNX 等）的模型，通过一系列复杂的优化技术，生成一个高度优化的运行时引擎（Runtime Engine）。&lt;/p>
&lt;p>本文档将深入浅出地介绍 TensorRT 的核心概念、关键特性、工作流程以及最新的功能（包括专门用于加速大语言模型的 TensorRT-LLM），帮助开发者充分利用其强大的性能优势。&lt;/p>
&lt;h2 id="2-">2. 核心概念&lt;/h2>
&lt;p>理解 TensorRT 的核心组件是有效使用它的第一步。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Engine&lt;/strong>: TensorRT 的核心。它是一个经过优化的模型表示，包含了针对特定 GPU 架构和配置（如批量大小、精度）生成的计算图和权重。Engine 是不可修改的，并且是部署的最终产物。&lt;/li>
&lt;li>&lt;strong>Builder (&lt;code>IBuilder&lt;/code>)&lt;/strong>: 这是创建 Engine 的主要接口。Builder 接收一个网络定义，并应用各种优化，最终生成一个针对目标 GPU 的优化计划（Plan），该计划可以被序列化为 Engine。&lt;/li>
&lt;li>&lt;strong>Network Definition (&lt;code>INetworkDefinition&lt;/code>)&lt;/strong>: 这是您用来定义模型结构的地方。您可以从头开始手动构建网络，或者使用 Parser 从模型文件中导入。&lt;/li>
&lt;li>&lt;strong>Parser&lt;/strong>: 用于将来自不同框架的模型（主要是 ONNX 格式）解析并转换为 TensorRT 的网络定义。TensorRT 提供了强大的 ONNX 解析器。&lt;/li>
&lt;li>&lt;strong>Profiler (&lt;code>IProfiler&lt;/code>)&lt;/strong>: 一个可选的接口，允许您在构建过程中收集和查询关于层性能的信息。这有助于调试和理解哪些层是性能瓶颈。&lt;/li>
&lt;li>&lt;strong>Execution Context (&lt;code>IExecutionContext&lt;/code>)&lt;/strong>: 这是执行推理的主要接口。一个 Engine 可以有多个 Execution Context，允许并发执行推理任务。每个上下文都维护自己的输入、输出和状态。&lt;/li>
&lt;/ul>
&lt;pre>&lt;code class="language-mermaid">graph TD;
subgraph &amp;quot;模型构建 Offline&amp;quot;
A[原始模型&amp;lt;br&amp;gt;TensorFlow/PyTorch] --&amp;gt; B{ONNX Parser};
B --&amp;gt; C[Network Definition];
C --&amp;gt; D[Builder];
D -- 优化配置 --&amp;gt; E[Optimized Plan];
E --&amp;gt; F((Engine));
end
subgraph &amp;quot;推理部署 Online&amp;quot;
F --&amp;gt; G[Execution Context];
H[输入数据] --&amp;gt; G;
G --&amp;gt; I[输出结果];
end
style F fill:#f9f,stroke:#333,stroke-width:2px
style G fill:#ccf,stroke:#333,stroke-width:2px
&lt;/code>&lt;/pre>
&lt;h2 id="3-">3. 关键特性和优化技术&lt;/h2>
&lt;p>TensorRT 的高性能源于其先进的优化技术。&lt;/p>
&lt;h3 id="31--precision-calibration--quantization">3.1. 精度校准与量化 (Precision Calibration &amp;amp; Quantization)&lt;/h3>
&lt;p>TensorRT 支持多种精度进行推理，包括 FP32、FP16、INT8，以及最新的 FP8。其中，INT8 量化是提升性能、降低内存占用的关键技术。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>训练后量化 (Post-Training Quantization, PTQ)&lt;/strong>: 在不重新训练模型的情况下，通过一个校准数据集来确定将 FP32 权重和激活值转换为 INT8 所需的缩放因子。&lt;/li>
&lt;li>&lt;strong>量化感知训练 (Quantization-Aware Training, QAT)&lt;/strong>: 在训练过程中模拟量化操作，使模型对量化误差更具鲁棒性，从而在转换为 INT8 时获得更高的精度。&lt;/li>
&lt;/ul>
&lt;p>您可以使用 &lt;code>QuantizationSpec&lt;/code> 来精确控制哪些层或哪些类型的层需要被量化。&lt;/p>
&lt;pre>&lt;code class="language-python"># 示例：仅量化 'Conv2D' 类型的层
q_spec = QuantizationSpec()
q_spec.add(name='Conv2D', is_keras_class=True)
q_model = quantize_model(model, quantization_mode='partial', quantization_spec=q_spec)
&lt;/code>&lt;/pre>
&lt;h3 id="32--layer--tensor-fusion">3.2. 层与张量融合 (Layer &amp;amp; Tensor Fusion)&lt;/h3>
&lt;p>TensorRT 会智能地将多个独立的层合并成一个单一的、更复杂的层。这减少了 CUDA 内核的启动次数和内存读写，从而显著降低了延迟。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>垂直融合&lt;/strong>: 将连续的、具有相同数据依赖性的层（如 Conv、Bias、ReLU）融合成一个 CBR 层。&lt;/p>
&lt;pre>&lt;code class="language-mermaid">graph TD;
subgraph &amp;quot;融合前&amp;quot;
A[Input] --&amp;gt; B(Conv);
B --&amp;gt; C(Bias);
C --&amp;gt; D(ReLU);
D --&amp;gt; E[Output];
end
subgraph &amp;quot;融合后&amp;quot;
A2[Input] --&amp;gt; F((Conv + Bias + ReLU));
F --&amp;gt; E2[Output];
end
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>水平融合&lt;/strong>: 将具有相同输入但执行不同操作的并行层融合在一起。&lt;/p>
&lt;pre>&lt;code class="language-mermaid">graph TD;
subgraph &amp;quot;融合前&amp;quot;
A[Input] --&amp;gt; B(Conv A);
A --&amp;gt; C(Conv B);
B --&amp;gt; D[Output A];
C --&amp;gt; E[Output B];
end
subgraph &amp;quot;融合后&amp;quot;
A2[Input] --&amp;gt; F((Conv A + Conv B));
F --&amp;gt; D2[Output A];
F --&amp;gt; E2[Output B];
end
&lt;/code>&lt;/pre>
&lt;/li>
&lt;/ul>
&lt;h3 id="33--kernel-autotuning">3.3. 内核自动调整 (Kernel Auto-Tuning)&lt;/h3>
&lt;p>针对特定的目标 GPU 架构，TensorRT 会从一个包含多种实现的库中，为每个层选择最优的 CUDA 内核。它会根据当前的批量大小、输入尺寸和参数来测试不同的算法和实现，以找到最快的一个。&lt;/p>
&lt;h3 id="34--dynamic-shapes">3.4. 动态形状 (Dynamic Shapes)&lt;/h3>
&lt;p>TensorRT 能够处理输入张量尺寸在运行时可变的模型。在构建 Engine 时，您可以指定一个优化配置文件（Optimization Profile），其中包含输入的最小、最优和最大尺寸。TensorRT 会根据这些信息生成一个可以在指定范围内高效处理任何输入尺寸的 Engine。&lt;/p>
&lt;h3 id="35--plugins">3.5. 插件 (Plugins)&lt;/h3>
&lt;p>对于 TensorRT 原生不支持的自定义或特殊层，您可以通过插件 API (&lt;code>IPluginV2&lt;/code>) 来实现自己的逻辑。这为 TensorRT 提供了极大的扩展性。&lt;/p>
&lt;p>最新的 TensorRT 版本通过装饰器极大地简化了插件的注册过程，特别是对于 Python API。&lt;/p>
&lt;pre>&lt;code class="language-python"># 示例：注册一个简单的元素级加法插件
import tensorrt.plugin as trtp
@trtp.register(&amp;quot;sample::elemwise_add_plugin&amp;quot;)
def add_plugin_desc(inp0: trtp.TensorDesc, block_size: int) -&amp;gt; trtp.TensorDesc:
return inp0.like()
&lt;/code>&lt;/pre>
&lt;h3 id="36--sparsity">3.6. 稀疏性 (Sparsity)&lt;/h3>
&lt;p>TensorRT 支持利用 NVIDIA Ampere 及更高架构 GPU 上的结构化稀疏性特性。如果您的模型权重具有 2:4 的稀疏模式，TensorRT 可以利用稀疏张量核心（Sparse Tensor Cores）来进一步加速计算，性能几乎翻倍。&lt;/p>
&lt;h2 id="4-">4. 工作流程&lt;/h2>
&lt;p>一个典型的 TensorRT 部署流程如下：&lt;/p>
&lt;pre>&lt;code class="language-mermaid">sequenceDiagram
participant D as 开发者
participant TF as TensorFlow/PyTorch
participant ONNX
participant Poly as Polygraphy
participant TRT as TensorRT (trtexec/API)
participant App as 应用程序
D-&amp;gt;&amp;gt;TF: 训练模型
TF--&amp;gt;&amp;gt;D: 生成训练好的模型
D-&amp;gt;&amp;gt;ONNX: 导出为 ONNX 格式
ONNX--&amp;gt;&amp;gt;D: .onnx 文件
D-&amp;gt;&amp;gt;Poly: 使用 Polygraphy 检查和优化
Poly--&amp;gt;&amp;gt;D: 优化的 .onnx 文件
D-&amp;gt;&amp;gt;TRT: 构建 Engine (FP16/INT8)
TRT--&amp;gt;&amp;gt;D: 生成 .engine 文件
D-&amp;gt;&amp;gt;App: 部署 Engine
App-&amp;gt;&amp;gt;App: 加载 Engine 并创建 Execution Context
loop 推理循环
App-&amp;gt;&amp;gt;App: 准备输入数据
App-&amp;gt;&amp;gt;App: 执行推理
App-&amp;gt;&amp;gt;App: 获取输出结果
end
&lt;/code>&lt;/pre>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>模型导出&lt;/strong>: 从您的训练框架（如 PyTorch 或 TensorFlow）中，将训练好的模型导出为 ONNX 格式。ONNX 是一个开放的模型交换格式，是连接训练和推理的桥梁。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>模型检查与优化 (Polygraphy)&lt;/strong>: 在构建 Engine 之前，强烈建议使用 &lt;strong>Polygraphy&lt;/strong> 工具集来检查、修改和优化您的 ONNX 模型。Polygraphy 是一个功能强大的工具，可以：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>检查模型&lt;/strong>: 显示模型的层、输入输出等信息。&lt;/li>
&lt;li>&lt;strong>常量折叠&lt;/strong>: 预先计算模型中的常量表达式，简化计算图。
&lt;pre>&lt;code class="language-bash">polygraphy surgeon sanitize model.onnx -o folded.onnx --fold-constants
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>&lt;strong>比较不同框架的输出&lt;/strong>: 验证 TensorRT 与原始框架（如 ONNX Runtime）的输出是否一致，以排查精度问题。
&lt;pre>&lt;code class="language-bash">polygraphy run model.onnx --trt --onnxrt
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>&lt;strong>处理数据依赖形状 (DDS)&lt;/strong>: 识别并为具有数据依赖形状的张量设置上界。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>构建 Engine&lt;/strong>: 使用 &lt;code>trtexec&lt;/code> 命令行工具或 TensorRT 的 C++/Python API 来构建 Engine。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>trtexec&lt;/code>&lt;/strong>: 一个方便的命令行工具，用于快速从 ONNX 文件构建 Engine 并进行性能基准测试。
&lt;pre>&lt;code class="language-bash">trtexec --onnx=model.onnx --saveEngine=model.engine --fp16
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>&lt;strong>API&lt;/strong>: 提供更灵活的控制，例如定义动态形状的优化配置文件、配置插件等。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>部署与推理&lt;/strong>: 将序列化后的 Engine 文件加载到您的应用程序中，并使用 Execution Context 来执行推理。&lt;/p>
&lt;pre>&lt;code class="language-python"># 使用 Polygraphy 的 TrtRunner 进行推理
from polygraphy.backend.trt import TrtRunner, EngineFromBytes
# 加载 Engine
engine = EngineFromBytes(open(&amp;quot;model.engine&amp;quot;, &amp;quot;rb&amp;quot;).read())
with TrtRunner(engine) as runner:
# 准备输入数据
feed_dict = {&amp;quot;input_name&amp;quot;: input_data}
# 执行推理
outputs = runner.infer(feed_dict=feed_dict)
&lt;/code>&lt;/pre>
&lt;/li>
&lt;/ol>
&lt;h2 id="5-">5. 最新功能亮点&lt;/h2>
&lt;p>TensorRT 正在快速迭代，以下是一些最新的重要功能：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Polygraphy 工具增强&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>简化的 CLI 语法&lt;/strong>: 允许在单个参数中同时指定脚本和函数名 (&lt;code>my_script.py:my_func&lt;/code>)。&lt;/li>
&lt;li>&lt;strong>改进的输入规范&lt;/strong>: 使用新的列表式语法 (&lt;code>--input-shapes input0:[x,y,z]&lt;/code>) 来避免歧义。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>快速部署插件 (Quickly Deployable Plugins)&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>Python API 引入了 &lt;a href="mailto:%60@trtp.register">`@trtp.register&lt;/a>&lt;code>和&lt;/code>@trt.plugin.autotune` 装饰器，使得定义、注册和自动调整插件变得前所未有的简单，无需编写 C++ 代码。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>CUDA 图 (CUDA Graphs)&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>通过 &lt;code>--use-cuda-graph&lt;/code> 标志，TensorRT 可以利用 CUDA Graphs 来捕获整个推理过程，进一步减少 CPU 开销和内核启动延迟，特别适用于模型结构固定的场景。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>FP8 支持&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>在 Hopper 及更高架构的 GPU 上，TensorRT 支持 FP8 推理，为大型语言模型等提供了更高的性能和更低的内存占用。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="6-">6. 附录：常用命令&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>安装 Polygraphy&lt;/strong>:
&lt;pre>&lt;code class="language-bash">python3 -m pip install polygraphy --extra-index-url https://pypi.ngc.nvidia.com
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>&lt;strong>构建并安装 TensorRT 开源组件&lt;/strong>:
&lt;pre>&lt;code class="language-bash"># 从源码目录
make install
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>&lt;strong>运行 pytest 测试&lt;/strong>:
&lt;pre>&lt;code class="language-bash">pytest --verbose
&lt;/code>&lt;/pre>
&lt;/li>
&lt;/ul>
&lt;h2 id="7-tensorrtllmllm">7. TensorRT-LLM：为大语言模型（LLM）推理而生&lt;/h2>
&lt;p>随着大语言模型（LLM）的规模和复杂性呈指数级增长，传统的推理优化方法面临着前所未有的挑战。为了应对这些挑战，NVIDIA 推出了 TensorRT-LLM，一个专门为加速和优化 LLM 推理而设计的开源库。它构建于 TensorRT 之上，并封装了针对 LLM 的一系列尖端优化技术。&lt;/p>
&lt;h3 id="71--tensorrtllm">7.1. 什么是 TensorRT-LLM?&lt;/h3>
&lt;p>可以把 TensorRT-LLM 看作是 TensorRT 的一个 &amp;ldquo;LLM 专家版本&amp;rdquo;。它提供了一个 Python API，让开发者可以轻松地定义 LLM 模型，并自动应用各种SOTA（State-of-the-Art）优化。最终，它会生成一个高性能的 TensorRT 引擎，可以直接部署。&lt;/p>
&lt;p>与通用 TensorRT 主要处理静态图不同，TensorRT-LLM 专门解决了 LLM 推理中的动态特性，例如：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>自回归生成 (Autoregressive Generation)&lt;/strong>: 每个新生成的 token 都依赖于前面的 token，导致输入序列长度动态变化。&lt;/li>
&lt;li>&lt;strong>巨大的模型规模&lt;/strong>: 模型参数动辄数十亿甚至上千亿，无法单卡部署。&lt;/li>
&lt;li>&lt;strong>庞大的 KV 缓存&lt;/strong>: 推理过程中需要存储大量的键值对（Key-Value Cache），对内存带宽和容量提出极高要求。&lt;/li>
&lt;/ul>
&lt;h3 id="72-">7.2. 核心架构与组件&lt;/h3>
&lt;p>TensorRT-LLM 的架构分为前端和后端：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Python API (&lt;code>tensorrt_llm&lt;/code>)&lt;/strong>: 这是用户交互的主要接口。它以声明式的方式定义模型（类似于 PyTorch），开发者无需关心底层复杂的 TensorRT C++ API。&lt;/li>
&lt;li>&lt;strong>C++ Backend&lt;/strong>: 这是真正执行优化的核心，包含了预先写好的、高度优化的 CUDA 内核、LLM 专属优化 pass 以及一个能够高效处理 LLM 任务的运行时。&lt;/li>
&lt;/ul>
&lt;pre>&lt;code class="language-mermaid">graph TD;
subgraph &amp;quot;前端 (Python API)&amp;quot;
A[Hugging Face / 自定义模型] --&amp;gt;|权重| B(模型定义&amp;lt;br&amp;gt;tensorrt_llm.Module);
B --&amp;gt; C{Builder};
C -- 生成网络和配置 --&amp;gt; D[Network Definition];
end
subgraph &amp;quot;后端 (C++ Runtime)&amp;quot;
D --&amp;gt; E[TensorRT-LLM 优化];
E --&amp;gt; F((LLM 优化版 Engine));
end
subgraph &amp;quot;推理&amp;quot;
F --&amp;gt; G[C++/Python Runtime];
H[输入 Prompts] --&amp;gt; G;
G --&amp;gt; I[输出 Tokens];
end
style F fill:#c9f,stroke:#333,stroke-width:2px
&lt;/code>&lt;/pre>
&lt;h3 id="73-llm-">7.3. 关键优化技术（LLM 专属）&lt;/h3>
&lt;p>TensorRT-LLM 的魔力在于其专为 LLM 设计的优化技术。&lt;/p>
&lt;h4 id="731-inflight-batching--continuous-batching">7.3.1. In-Flight Batching (也称 Continuous Batching)&lt;/h4>
&lt;p>&lt;strong>问题&lt;/strong>: 传统的批处理（Static Batching）要求所有请求都等待，直到湊够一个批次再一起处理。由于每个请求的生成长度不同，这会导致大量 GPU 空闲（&amp;ldquo;气泡&amp;rdquo;），因为必须等待批次中最慢的请求完成。&lt;/p>
&lt;p>&lt;strong>解决方案&lt;/strong>: In-Flight Batching 允许服务器在 GPU 运行时动态地加入新的请求，一旦某个请求完成，其占用的计算资源立即被释放并分配给等待队列中的新请求。这极大地提高了 GPU 的利用率和系统的总吞吐量。&lt;/p>
&lt;pre>&lt;code class="language-mermaid">gantt
title GPU 利用率对比
dateFormat X
axisFormat %S
section 静态批处理 (Static Batching)
请求 A: 0, 6
请求 B: 0, 3
请求 C: 0, 5
GPU 等待 : 3, 3
GPU 等待 : 5, 1
section In-Flight Batching
请求 A : 0, 6
请求 B : 0, 3
请求 C : 0, 5
新请求 D : 3, 4
&lt;/code>&lt;/pre>
&lt;h4 id="732-paged-kv-cache--attention">7.3.2. Paged KV Cache &amp;amp; Attention&lt;/h4>
&lt;p>&lt;strong>问题&lt;/strong>: 在自回归生成过程中，KV 缓存会随着序列长度的增加而线性增长，消耗大量显存。传统的做法是为每个请求预分配一个连续的、能容纳最大序列长度的内存块，这导致了严重的内存碎片和浪费。&lt;/p>
&lt;p>&lt;strong>解决方案&lt;/strong>: 受到操作系统虚拟内存分页的启发，TensorRT-LLM 引入了 Paged KV Cache。它将 KV 缓存分割成固定大小的&amp;quot;块&amp;rdquo;（Blocks），并按需分配。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>非连续存储&lt;/strong>: 逻辑上连续的 Token 的 KV 缓存可以存储在物理上不连续的块中。&lt;/li>
&lt;li>&lt;strong>内存共享&lt;/strong>: 对于复杂的场景（如并行采样、Beam Search），不同序列之间可以共享相同的 KV 缓存块（例如共享 Prompt部分的缓存），从而大幅节省内存。&lt;/li>
&lt;li>&lt;strong>优化的 Attention 核&lt;/strong>: TensorRT-LLM 使用了如 FlashAttention、MQA/GQA 等专门优化的 Attention 内核，可以直接操作这些非连续的缓存块，避免了数据拷贝开销。&lt;/li>
&lt;/ul>
&lt;h4 id="733--tensor--pipeline-parallelism">7.3.3. 张量并行与流水线并行 (Tensor &amp;amp; Pipeline Parallelism)&lt;/h4>
&lt;p>对于无法在单个 GPU 上容纳的大型模型，TensorRT-LLM 内置了对张量并行（Tensor Parallelism）和流水线并行（Pipeline Parallelism）的无缝支持。开发者只需在构建时指定并行度（&lt;code>tp_size&lt;/code>, &lt;code>pp_size&lt;/code>），TensorRT-LLM 就会自动处理模型的切分和跨 GPU 的通信。&lt;/p>
&lt;pre>&lt;code class="language-bash"># 示例：构建一个 2 路张量并行的 Llama 模型
python3 examples/llama/convert_checkpoint.py \
--model_dir ./llama-7b-hf \
--output_dir ./tllm_checkpoint_tp2 \
--dtype float16 \
--tp_size 2
&lt;/code>&lt;/pre>
&lt;h4 id="734--fp8int4int8">7.3.4. 先进的量化支持 (FP8/INT4/INT8)&lt;/h4>
&lt;p>LLM 的巨大参数量使其成为量化的理想对象。TensorRT-LLM 支持多种先进的量化方案：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>FP8&lt;/strong>: 在 NVIDIA Hopper 及更高架构的 GPU 上，FP8 提供了接近 FP16 的精度，同时显著提升了性能和降低了内存占用。&lt;/li>
&lt;li>&lt;strong>INT8 SmoothQuant&lt;/strong>: 一种同时量化激活值和权重的技术，能在保持较高精度的同时获得 INT8 的加速。&lt;/li>
&lt;li>&lt;strong>INT4/INT8 仅权重化 (Weight-Only Quantization, W4A16/W8A16)&lt;/strong>: 这是一种非常流行的技术，仅将模型权重（参数量最大部分）量化为 INT4 或 INT8，而激活值保持 FP16。这极大地降低了内存占用，同时对精度的影响很小。&lt;/li>
&lt;/ul>
&lt;pre>&lt;code class="language-bash"># 示例：构建一个 INT4 仅权重化量化的模型
python convert_checkpoint.py --model_dir ./gpt-j-6b \
--dtype float16 \
--use_weight_only \
--weight_only_precision int4 \
--output_dir ./trt_ckpt/gptj_int4wo_tp1/
&lt;/code>&lt;/pre>
&lt;h3 id="74-tensorrtllm-">7.4. TensorRT-LLM 工作流程&lt;/h3>
&lt;p>一个典型的 TensorRT-LLM 工作流程如下：&lt;/p>
&lt;pre>&lt;code class="language-mermaid">sequenceDiagram
participant D as 开发者
participant HF as Hugging Face Hub
participant Conv as convert_checkpoint.py
participant Build as trtllm-build
participant App as 推理应用 (Python/C++)
D-&amp;gt;&amp;gt;HF: 下载模型权重
HF--&amp;gt;&amp;gt;D: model_dir
D-&amp;gt;&amp;gt;Conv: 运行转换脚本 (指定精度、并行度等)
Conv--&amp;gt;&amp;gt;D: 生成 TensorRT-LLM Checkpoint
D-&amp;gt;&amp;gt;Build: 运行构建命令 (指定插件、BatchSize等)
Build--&amp;gt;&amp;gt;D: 生成优化后的 .engine 文件
D-&amp;gt;&amp;gt;App: 加载 Engine 并运行推理
App--&amp;gt;&amp;gt;D: 返回生成结果
&lt;/code>&lt;/pre>
&lt;p>&lt;strong>端到端示例 (以 Llama-7B 为例)&lt;/strong>:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>转换权重&lt;/strong>:
&lt;pre>&lt;code class="language-bash">git clone https://huggingface.co/meta-llama/Llama-2-7b-hf
python3 examples/llama/convert_checkpoint.py \
--model_dir ./Llama-2-7b-hf \
--output_dir ./tllm_checkpoint_1gpu \
--dtype float16
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>&lt;strong>构建 Engine&lt;/strong>:
&lt;pre>&lt;code class="language-bash">trtllm-build --checkpoint_dir ./tllm_checkpoint_1gpu \
--output_dir ./trt_engines/llama_7b \
--gpt_attention_plugin float16 \
--gemm_plugin float16
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>&lt;strong>运行推理&lt;/strong>:
&lt;pre>&lt;code class="language-bash">python3 examples/run.py --max_output_len=100 \
--tokenizer_dir ./Llama-2-7b-hf \
--engine_dir=./trt_engines/llama_7b
&lt;/code>&lt;/pre>
&lt;/li>
&lt;/ol>
&lt;h3 id="75--api-llm">7.5. 便捷的高层级 API (&lt;code>LLM&lt;/code>)&lt;/h3>
&lt;p>为了进一步简化开发流程，TensorRT-LLM 提供了一个名为 &lt;code>LLM&lt;/code> 的高层级 API。这个接口将模型加载、构建、保存和推理封装成一个简单的类，让开发者在几行代码内就能完成所有操作。&lt;/p>
&lt;pre>&lt;code class="language-python">from tensorrt_llm import LLM
# 1. 初始化 LLM 对象，如果引擎不存在，它会自动从 HuggingFace 模型构建
# 这里会应用所有优化，如 In-Flight Batching, Paged KV-Cache
llm = LLM(
model=&amp;quot;meta-llama/Llama-2-7b-hf&amp;quot;,
tensor_parallel_size=1,
)
# 2. (可选) 保存构建好的引擎以备后用
llm.save(&amp;quot;llama_engine_dir&amp;quot;)
# 3. 运行推理
prompt = &amp;quot;NVIDIA TensorRT-LLM is&amp;quot;
for output in llm.generate([prompt], max_new_tokens=50):
print(output)
&lt;/code>&lt;/pre>
&lt;p>这个高层级 API 是快速原型设计和部署的理想选择。&lt;/p>
&lt;h3 id="76-">7.6. 总结&lt;/h3>
&lt;p>TensorRT-LLM 并非简单地将 TensorRT 应用于 LLM，而是一个从根本上为 LLM 推理重新设计的、包含多种SOTA优化的综合性解决方案。通过 In-Flight Batching、Paged KV-Cache、原生并行支持和先进的量化方案，它能够将 NVIDIA GPU 的硬件性能发挥到极致，为部署高性能、高吞吐量的 LLM 服务提供了坚实的基础。&lt;/p></description></item><item><title>现代ASR技术解析：从传统模型到大语言模型驱动的新范式</title><link>https://ziyanglin.netlify.app/zh/post/asr-technology-overview/</link><pubDate>Sat, 28 Jun 2025 13:00:00 +0000</pubDate><guid>https://ziyanglin.netlify.app/zh/post/asr-technology-overview/</guid><description>&lt;h2 id="1-">1. 背景&lt;/h2>
&lt;h3 id="11-asr">1.1 传统ASR模型的痛点&lt;/h3>
&lt;p>传统的自动语音识别（ASR）模型，如基于隐马尔可夫模型-高斯混合模型（HMM-GMM）或深度神经网络（DNN）的模型，在特定领域和受控环境下表现良好，但面临诸多挑战：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>数据稀疏性&lt;/strong>：对大规模、高质量的标注数据集依赖严重，在低资源语言或特定口音上泛化能力差。&lt;/li>
&lt;li>&lt;strong>鲁棒性不足&lt;/strong>：在嘈杂环境、远场拾音、多人对话等真实场景下，性能会急剧下降。&lt;/li>
&lt;li>&lt;strong>上下文理解缺失&lt;/strong>：模型通常局限于声学特征到文本的直接映射，缺乏对长程上下文、语义和说话人意图的理解，导致识别错误（如同音异义词混淆）。&lt;/li>
&lt;li>&lt;strong>多任务能力有限&lt;/strong>：传统模型通常是单一任务的，如仅支持语音转录，而无法同时完成说话人日志、语种识别、翻译等任务。&lt;/li>
&lt;/ol>
&lt;h3 id="12-llm-asr-">1.2 大语言模型（LLM）驱动的 ASR 新范式&lt;/h3>
&lt;p>近年来，以 &lt;code>Whisper&lt;/code> 为代表的端到端大型 ASR 模型，通过在海量、多样化的无监督或弱监督数据上进行预训练，展现了前所未有的鲁棒性和泛化能力。这些模型通常采用 Encoder-Decoder 架构，将 ASR 任务视为一个序列到序列的翻译问题。&lt;/p>
&lt;p>&lt;strong>典型流程&lt;/strong>：&lt;/p>
&lt;pre>&lt;code class="language-mermaid">graph TD
A[&amp;quot;原始音频波形&amp;quot;] --&amp;gt; B[&amp;quot;特征提取（如Log-Mel谱图）&amp;quot;]
B --&amp;gt; C[&amp;quot;Transformer Encoder&amp;quot;]
C --&amp;gt; D[&amp;quot;Latent Representation&amp;quot;]
D --&amp;gt; E[&amp;quot;Transformer Decoder&amp;quot;]
E --&amp;gt; F[&amp;quot;文本序列输出&amp;quot;]
&lt;/code>&lt;/pre>
&lt;p>这种方法不仅简化了传统 ASR 的复杂流水线，还通过大规模数据学习到了丰富的声学和语言知识，从而在零样本（Zero-shot）场景下也能取得优异表现。&lt;/p>
&lt;h2 id="2-asr">2. ASR模型的解决方案分析&lt;/h2>
&lt;h3 id="21-whisperlargev3turbo">2.1 Whisper-large-v3-turbo&lt;/h3>
&lt;p>&lt;code>Whisper&lt;/code> 是由 OpenAI 开发的预训练 ASR 模型，其 &lt;code>large-v3&lt;/code> 和 &lt;code>large-v3-turbo&lt;/code> 版本是目前业界领先的模型之一。&lt;/p>
&lt;h4 id="211-whisper">2.1.1 Whisper的设计&lt;/h4>
&lt;p>&lt;strong>结构模块&lt;/strong>：&lt;/p>
&lt;pre>&lt;code class="language-mermaid">graph TD
A[&amp;quot;音频输入 (30s片段)&amp;quot;] --&amp;gt; B[&amp;quot;Log-Mel谱图&amp;quot;]
B --&amp;gt; C[&amp;quot;Transformer Encoder&amp;quot;]
C --&amp;gt; D[&amp;quot;Encoded Representation&amp;quot;]
D --&amp;gt; E[&amp;quot;Transformer Decoder&amp;quot;]
E --&amp;gt; F[&amp;quot;预测文本Token&amp;quot;]
subgraph &amp;quot;多任务处理&amp;quot;
E --&amp;gt; G[&amp;quot;转录&amp;quot;]
E --&amp;gt; H[&amp;quot;翻译&amp;quot;]
E --&amp;gt; I[&amp;quot;语种识别&amp;quot;]
end
&lt;/code>&lt;/pre>
&lt;p>&lt;strong>特点&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>大规模弱监督训练&lt;/strong>：在 68 万小时的多语言、多任务数据上进行训练，覆盖了广泛的口音、背景噪音和技术术语。&lt;/li>
&lt;li>&lt;strong>端到端架构&lt;/strong>：一个统一的 Transformer 模型直接将音频映射到文本，无需外部的语言模型或对齐模块。&lt;/li>
&lt;li>&lt;strong>多任务能力&lt;/strong>：模型能够同时处理多语言语音转录、语音翻译和语种识别。&lt;/li>
&lt;li>&lt;strong>鲁棒性&lt;/strong>：通过对数据进行精心设计的数据增强和混合，模型在各种具有挑战性的条件下都表现出色。&lt;/li>
&lt;li>&lt;strong>Turbo 版本&lt;/strong>：&lt;code>large-v3-turbo&lt;/code> 是 &lt;code>large-v3&lt;/code> 的优化版本，可能在推理速度、计算效率或特定任务性能上有所提升，参数量约为 798M。&lt;/li>
&lt;/ul>
&lt;h4 id="212-">2.1.2 解决的问题&lt;/h4>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>目标问题&lt;/th>
&lt;th>Whisper 的应对方案&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>泛化能力差&lt;/td>
&lt;td>在海量、多样化的数据集上进行大规模预训练，覆盖近百种语言。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>鲁棒性不足&lt;/td>
&lt;td>训练数据包含各种背景噪音、口音和说话风格，提升了真实场景下的性能。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>上下文建模弱&lt;/td>
&lt;td>Transformer 架构能够捕捉音频信号中的长程依赖关系。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>部署复杂&lt;/td>
&lt;td>提供多种模型尺寸（从 &lt;code>tiny&lt;/code> 到 &lt;code>large&lt;/code>），并开源了代码和模型权重，方便社区使用和部署。&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4 id="213-">2.1.3 生产缺陷分析&lt;/h4>
&lt;h5 id="2131-hallucination">2.1.3.1 &amp;ldquo;幻觉&amp;rdquo;（Hallucination）问题&lt;/h5>
&lt;ul>
&lt;li>在无语音或噪声片段中，模型有时会生成无意义或重复的文本，这是大型自回归模型的通病。&lt;/li>
&lt;li>这种现象在长音频处理中尤为明显，可能需要额外的后处理逻辑来检测和过滤。&lt;/li>
&lt;/ul>
&lt;h5 id="2132-">2.1.3.2 时间戳精度有限&lt;/h5>
&lt;ul>
&lt;li>模型预测的时间戳是词级别的，但其精度可能不足以满足某些应用（如字幕对齐、语音编辑）的苛刻要求。&lt;/li>
&lt;li>在长段静音或快速语流中，时间戳的准确性会下降。&lt;/li>
&lt;/ul>
&lt;h5 id="2133-">2.1.3.3 计算资源要求高&lt;/h5>
&lt;ul>
&lt;li>&lt;code>large-v3&lt;/code> 模型包含 15.5 亿参数，&lt;code>turbo&lt;/code> 版本也有近 8 亿参数，对计算资源（特别是 GPU 显存）要求较高，不适合在边缘设备上直接运行。&lt;/li>
&lt;li>虽然有量化等优化手段，但在保证性能的同时降低资源消耗仍是一个挑战。&lt;/li>
&lt;/ul>
&lt;h5 id="2134-">2.1.3.4 实时性瓶颈&lt;/h5>
&lt;ul>
&lt;li>模型基于 30 秒的音频窗口进行处理，对于实时流式 ASR 场景，需要设计复杂的滑动窗口和缓存机制，这会引入额外的延迟。&lt;/li>
&lt;/ul>
&lt;h3 id="22-sensevoice">2.2 SenseVoice&lt;/h3>
&lt;p>&lt;code>SenseVoice&lt;/code> 是由阿里巴巴达摩院的语音团队开发的下一代工业级 ASR 模型。与 &lt;code>Whisper&lt;/code> 专注于鲁棒的通用转录不同，&lt;code>SenseVoice&lt;/code> 在设计上更侧重于多功能性、实时性和与下游任务的结合。&lt;/p>
&lt;h4 id="221-sensevoice">2.2.1 SenseVoice的设计&lt;/h4>
&lt;p>&lt;strong>结构模块&lt;/strong>：&lt;/p>
&lt;pre>&lt;code class="language-mermaid">graph TD
A[&amp;quot;音频流&amp;quot;] --&amp;gt; B[&amp;quot;FSMN-VAD (语音活动检测)&amp;quot;]
B --&amp;gt; C[&amp;quot;Encoder (如 SAN-M)&amp;quot;]
C --&amp;gt; D[&amp;quot;Latent Representation&amp;quot;]
D --&amp;gt; E[&amp;quot;Decoder&amp;quot;]
E --&amp;gt; F[&amp;quot;文本输出&amp;quot;]
subgraph &amp;quot;多任务与控制&amp;quot;
G[&amp;quot;说话人日志&amp;quot;] --&amp;gt; C
H[&amp;quot;情绪识别&amp;quot;] --&amp;gt; C
I[&amp;quot;零样本TTS Prompt&amp;quot;] --&amp;gt; E
end
&lt;/code>&lt;/pre>
&lt;p>&lt;strong>特点&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>统一端到端模型&lt;/strong>：集成了声学模型、语言模型和标点预测，实现了从语音到带标点文本的端到端输出。&lt;/li>
&lt;li>&lt;strong>多任务学习&lt;/strong>：模型不仅能进行语音识别，还能同时输出说话人日志（Diarization）、情绪信息，甚至可以生成用于零样本 TTS 的声学 prompt。&lt;/li>
&lt;li>&lt;strong>流式与非流式一体化&lt;/strong>：通过统一的架构支持流式和非流式两种模式，满足实时和离线场景的需求。&lt;/li>
&lt;li>&lt;strong>与 TTS 联动&lt;/strong>：&lt;code>SenseVoice&lt;/code> 的一个创新点是其输出可以作为 &lt;code>CosyVoice&lt;/code> 等 TTS 模型的 prompt，实现声音的克隆和迁移，打通了 ASR 与 TTS 的闭环。&lt;/li>
&lt;/ul>
&lt;h4 id="222-">2.2.2 解决的问题&lt;/h4>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>目标问题&lt;/th>
&lt;th>SenseVoice 的应对方案&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>任务单一，集成困难&lt;/td>
&lt;td>设计为多任务模型，原生支持说话人日志、情绪识别等，简化了对话系统的构建。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>实时性差&lt;/td>
&lt;td>采用高效的流式架构（如 SAN-M），并结合 VAD，实现了低延迟的实时识别。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>缺乏与下游任务的协同&lt;/td>
&lt;td>输出包含了丰富的元信息（如说话人、情绪），并能生成 TTS prompt，实现了 ASR 与 TTS 的深度融合。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>标点恢复依赖后处理&lt;/td>
&lt;td>将标点预测作为模型的一个内置任务，实现了文本和标点的联合建模。&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4 id="223-">2.2.3 生产缺陷分析&lt;/h4>
&lt;h5 id="2231-">2.2.3.1 模型复杂度与维护&lt;/h5>
&lt;ul>
&lt;li>作为一个集成了多种功能的复杂模型，其训练和维护成本相对较高。&lt;/li>
&lt;li>多任务之间的平衡可能需要精细的调整，以避免某一任务性能的下降。&lt;/li>
&lt;/ul>
&lt;h5 id="2232-">2.2.3.2 零样本能力的泛化性&lt;/h5>
&lt;ul>
&lt;li>虽然支持零样本 TTS prompt 生成，但其声音克隆的效果和稳定性在面对未见过的说话人或复杂声学环境时，可能不如专门的 voice cloning 模型。&lt;/li>
&lt;/ul>
&lt;h5 id="2233-">2.2.3.3 开源生态与社区&lt;/h5>
&lt;ul>
&lt;li>相较于 &lt;code>Whisper&lt;/code> 强大的开源社区和丰富的生态工具，&lt;code>SenseVoice&lt;/code> 作为工业级模型，其开源程度和社区支持可能相对有限，这会影响其在学术界和开发者社区中的普及。&lt;/li>
&lt;/ul>
&lt;h2 id="3-">3. 总结&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Whisper&lt;/strong>：通过大规模弱监督学习，将 ASR 的鲁棒性和泛化能力推向了新的高度。它是一个强大的&lt;strong>通用语音识别器&lt;/strong>，特别适合处理多样化、非受控的音频数据。其设计哲学是&amp;quot;用规模换性能&amp;rdquo;，在零样本和多语言场景下表现卓越。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>SenseVoice&lt;/strong>：代表了 ASR 技术向&lt;strong>多功能、一体化&lt;/strong>方向发展的趋势。它不仅仅是一个识别器，更是一个&lt;strong>对话智能的感知前端&lt;/strong>，旨在为下游任务（如对话系统、TTS）提供更丰富、更实时的输入。其设计哲学是&amp;quot;融合与协同&amp;rdquo;，强调 ASR 在整个智能交互链路中的枢纽作用。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>总的来说，&lt;code>Whisper&lt;/code> 定义了现代 ASR 的性能基线，而 &lt;code>SenseVoice&lt;/code> 则探索了 ASR 在工业应用中更广阔的可能性。未来的 ASR 技术可能会朝着二者结合的方向发展：既有 &lt;code>Whisper&lt;/code> 的鲁棒性和泛化能力，又有 &lt;code>SenseVoice&lt;/code> 的多任务协同和实时处理能力。&lt;/p></description></item></channel></rss>