TensorRT教程17: 使用混合精度--fp32、fp16、int8(重点)

本文介绍TensorRT中的五种精度类型及其应用方法,包括TF32、FP16、INT8等,探讨不同精度下的性能与准确性的平衡策略,并提供设置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TensorRT 使用混合精度

五种精度类型

kFLOAT //!< FP32 format.
kHALF  //!< FP16 format.
kINT8  //!< INT8 format.
kINT32 //!< INT32 format.
kTF32  //!< TF32 format.

TF32精度

TF32 Tensor Cores 可以使用 FP32 加速网络,通常不会损失准确性。 对于需要高动态范围权重或激活的模型,它比 FP16 更健壮。

在构建引擎时设置环境变量 NVIDIA_TF32_OVERRIDE=0 将禁用 TF32

//如果设备支持TF32精度,则使用TF32精度
if(builder->platformHasTf32())
{
    builder->setTf32Mode(true);//不确定是否对,先这么写
	builder->setTf32Mode(dataType == DataType::kTF32);//不确定是否对,先这么写
};

//step6:创建config并设置最大batchsize和最大工作空间
IBuilderConfig * config = builder->createBuilderConfig();
//停用TF32指令
config->clearFlag(BuilderFlag::kTF32);

//也可通过设置环境变量禁用TF32
NVIDIA_TF32_OVERRIDE=0

此外可以对特定的网络层指定精度,这个是通用方法

//指定layer层精度是INT8
layer->setPrecision(nvinfer1::DataType::kINT8)

//指定输出层精度是FP32
layer->setOutputType(out_tensor_index, nvinfer1::DataType::kFLOAT)    

FP16精度的设置

fp16只需略微修改代码,明显提高速度,基本不影响精度, TensorRT3.0的官方文档上说,如果只是使用 float 16 的数据精度代替 float-32 , 实际上并不会有多大的性能提升。真正提升性能的是 half2mode ,使用16位交叉存存储方式的模式。在 batchsize 大于 1的情况下,这种模式的运行速度是最快的

//如果设备支持FP16精度,则使用FP16精度
if(builder->platformHasFastFp16())
{
    builder->setFp16Mode(true);
	builder->setFp16Mode(dataType == DataType::kHALF);
};

//step6:创建config并设置最大batchsize和最大工作空间
IBuilderConfig * config = builder->createBuilderConfig();
//设置构建器标志可启用 FP16 精度推理。
config->setFlag(BuilderFlag::kFP16);
//强制使用 FP16 位精度:
config->setFlag(BuilderFlag::kSTRICT_TYPES)//这可能没有最佳性能。  建议仅出于调试目的使用此标志。

INT8精度的设置

精度并没有损失太多,速度提升很大,尤其是当 batch_size 大于1时,提升更明显

TensorRT 的INT8模式只支持计算能力为6.1以上的GPU

注意:parser解析模型的时候传进去的dataType,使用INT8 inference的话,这个地方传进去的是kFLOAT,也就是 FP32,这是因为INT8 需要先用FP32的精度来确定转换系数,TensorRT自己会在内部转换成INT8。这个看起来就跟使用FP32是一样的流程,INT8 MODE inference的输入和输出都是 FP32的。

//如果设备支持INT8精度,则使用INT8精度
if(builder->platformHasFastInt8())
{
    builder->setInt8Mode(true);
    builder->setInt8Mode(dataType == DataType::kINT8);
    builder->setInt8Calibrator(calibrator);//校准器接口
};

//step6:创建config并设置最大batchsize和最大工作空间
IBuilderConfig * config = builder->createBuilderConfig();
//设置构建器标志可启用 INT8 精度推理。
config->setFlag(BuilderFlag::kINT8);
//强制使用INT8位精度:
config->setFlag(BuilderFlag::kSTRICT_TYPES)//这可能没有最佳性能。  建议仅出于调试目的使用此标志。
//配置校准器
config->setInt8Calibrator(calibrator.get());

TensorRT 提供了多种 IInt8Calibrator 校准器变体:

//这是推荐的校准器,是 DLA 所必需的。  默认情况下,校准发生在图层融合之前。  推荐用于基于 CNN 的网络。
IEntropyCalibratorV2
    
//这个校准器似乎更适合 NLP 任务。  默认情况下,校准发生在图层融合之前。  推荐用于 NVIDIA BERT(谷歌官方实现的优化版本)等网络   
IMinMaxCalibrator
    
//这是传统的熵校准器。这比传统的校准器更简单,并且产生更好的结果。  默认情况下,在层融合之后进行校准。
IEntropyCalibrator
    
//该校准器与 TensorRT 2.0 EA 兼容。  该校准器需要用户参数化,并在其他校准器产生不良结果时作为备用选项提供。  默认情况下,在层融合之后进行校准。  
ILegacyCalibrator    

int8量化流程

典型的工作流还是直接使用 GTC2017 PPT 原文说法吧:

  • You will need:

    • Model trained in FP32.
    • Calibration dataset.
  • TensorRT will:

    • Run inference in FP32 on calibration dataset.

    • Collect required statistics(直方图).

    • Run calibration algorithm → optimal scaling factors.

    • Quantize FP32 weights → INT8.

    • 根据直方图和参数生成校准表CalibrationTable,根据网络定义和校准表生成int8 engine

结论 Conclusion

  • 对称的,不饱和的线性量化,会导致精度损失较大;
  • weights权值的int8量化使用的是不饱和的方式,对activation激活值使用的是饱和的量化方式
  • 通过最小化 (相对熵)KL散度来选择 饱和量化中的 阈值 |T|;
  • FP32完全可以降低为INT8推理,精度几乎持平,速度有很大提升。
<think>嗯,用户在使用TensorRT-LLM转换和优化QwQ-32B-AWQ模型时遇到了问题。他们提供的硬件配置是RTX 3070 Ti 8GB显存,i9 12900H CPU,32GB DDR5内存。首先,我需要分析他们的硬件限制,尤其是显存方面。QwQ-32B模型参数是32B,即大约320亿参数,通常这样的模型在FP16下需要大约64GB显存,显然他们的8GB显存远远不够。所以用户必须使用量化技术,比如AWQ,来减少显存占用。 用户已经运行了convert_checkpoint.py脚本,参数包括int4量化、组大小128、tp_size 1,workers 1,并且加载模型到CPU。这说明他们可能已经意识到显存不足的问题,尝试通过量化和CPU加载来缓解。但转换后的trtllm-build优化指令需要进一步优化。 接下来,我需要考虑TensorRT-LLM的构建参数。由于用户的GPU显存有限,必须尽可能减少显存使用。可能的优化方向包括:使用更低的精度(比如FP16),启用paged_attention来减少内存碎片,使用paged_kv_cache管理KV缓存,限制最大输入长度以避免OOM,调整批处理大小,以及使用内存映射加载避免重复占用内存。 另外,Tensor并行(tp_size)设置为1,因为单卡无法进行多卡并行。可能还需要使用GPU-FP32进行低精度计算,但需要注意精度损失。此外,如果可能,启用输出张量的内存共享,进一步节省显存。 需要提醒用户注意显存不足的风险,建议监控显存使用情况,并考虑模型剪枝或切换到更小模型的可能性。另外,确保环境版本兼容性,比如TensorRT-LLM、CUDA、PyTorch等,以避免其他问题。 总结下来,trtllm-build的指令应该包含上述优化参数,同时给出调整批处理大小和输入长度的建议,并提醒用户硬件限制可能带来的性能问题。</think>根据您的硬件配置(RTX 3070 Ti 8GB显存)和QwQ-32B-AWQ模型特性,以下是分步优化建议: --- ### 一、硬件限制分析 1. **显存瓶颈**:32B模型在FP16模式下约需64GB显存,需通过量化压缩 2. **AWQ特性**:已采用4bit量化,理论显存需求约16GB,仍需进一步优化 3. **CPU辅助**:需利用`--load_model_on_cpu`参数缓解显存压力 --- ### 二、trtllm-build 优化指令 ```bash trtllm-build \ --checkpoint_dir E:/QwQ-32B-AWQ/tllm_checkpoint/ \ --output_dir E:/QwQ-32B-AWQ/tllm_engine/ \ --gemm_plugin float16 \ --gpt_attention_plugin float16 \ --use_paged_context_fmha enable \ --max_batch_size 2 \ --max_input_len 512 \ --max_output_len 128 \ --paged_kv_cache enable \ --context_fmha enable \ --remove_input_padding disable \ --use_custom_all_reduce disable \ --workers 1 \ --log_level verbose ``` --- ### 三、关键参数解析 | 参数 | 推荐值 | 作用 | |-------|-------|-------| | `--gemm_plugin` | float16 | 加速矩阵运算 | | `--gpt_attention_plugin` | float16 | 优化注意力计算 | | `--max_batch_size` | 2 | 防止OOM | | `--max_input_len` | 512 | 控制显存占用 | | `--paged_kv_cache` | enable | 分页管理KV缓存 | | `--use_paged_context_fmha` | enable | 分页注意力机制 | --- ### 四、补充建议 1. **混合精度策略**: ```bash --quant_mode int4_awq \ --fp8_layer_norm \ --fp8_qdq ``` 2. **显存优化技巧**: - 启用`--use_mem_map_load`避免重复加载权重 - 添加`--enable_context_flash_attention`减少中间缓存 - 设置`--max_tokens_in_paged_kv_cache 1024`限制缓存大小 3. **性能监控命令**: ```bash nvidia-smi --query-gpu=memory.used --format=csv -l 1 ``` --- ### 五、注意事项 1. 8GB显存可能仍无法满足需求,建议: - 尝试`--use_gpu_float32_compute`降低计算精度 - 启用`--output_tensor_share_memory`共享输出内存 - 考虑模型剪枝或切换至13B级模型 2. 如遇CUDA OOM错误,可逐步降低: ```bash --max_batch_size 1 \ --max_input_len 256 ``` 建议先使用小批量测试,逐步调整参数至显存占用量稳定在6GB以下。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米斯特龙_ZXL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值