PyTorch模型量化入门:FP32→FP16/INT8,推理速度提升200%的量化实战
模型量化的本质是将神经网络中的权重、激活值从高精度浮点数(如FP32)转换为低精度格式(如FP16、INT8),从而减少计算量、内存占用和数据传输带宽。精度格式数据位数取值范围内存占用(相对FP32)适用场景FP3232100%训练阶段、高精度推理FP161650%GPU推理、混合精度训练INT88-128~12725%CPU/GPU推理、边缘设备部署INT44-8~712.5%极端资源受限场景(
大家好,我是南木。模型量化是解决“推理速度慢、内存占用高”的核心技术,它通过将高精度浮点数(FP32)转换为低精度格式(FP16、INT8),在几乎不损失精度的前提下,实现“速度翻倍、内存减半”,是从实验室模型到生产环境部署的“必经之路”。
本文将从“基础原理→PyTorch实现→效果优化→避坑指南”全流程拆解模型量化。包含FP16混合精度、INT8动态/静态量化、量化感知训练(QAT) 三种核心方案,每个都附“完整代码+效果对比”,CV和NLP场景全覆盖。
文章开始前 给大家整理了一份深度学习入门资料包 需要的同学扫码自取


一、先搞懂:模型量化的核心逻辑(为什么能“又快又省”?)
在讲实战前,我们必须先明确“量化是什么”“为什么能加速”——否则盲目操作很容易导致“精度暴跌”或“速度不升反降”。
1. 什么是模型量化?——从“FP32”到“INT8”的降精度革命
模型量化的本质是将神经网络中的权重、激活值从高精度浮点数(如FP32)转换为低精度格式(如FP16、INT8),从而减少计算量、内存占用和数据传输带宽。
我们先看不同精度格式的对比:
| 精度格式 | 数据位数 | 取值范围 | 内存占用(相对FP32) | 适用场景 |
|---|---|---|---|---|
| FP32 | 32 | ±1.4e-45~±3.4e38 | 100% | 训练阶段、高精度推理 |
| FP16 | 16 | ±5.96e-8~±65504 | 50% | GPU推理、混合精度训练 |
| INT8 | 8 | -128~127 | 25% | CPU/GPU推理、边缘设备部署 |
| INT4 | 4 | -8~7 | 12.5% | 极端资源受限场景(如单片机) |
核心优势:
- 速度提升:低精度计算(如INT8)的硬件指令吞吐量更高(如CPU的AVX-512指令集,INT8计算速度是FP32的4倍);
- 内存减少:INT8仅占FP32的1/4内存,可部署到显存/内存有限的设备(如手机、边缘网关);
- 功耗降低:低精度计算的能耗更低,适合移动设备和嵌入式场景。
2. 量化的核心原理:如何把浮点数“挤”进低精度格式?
浮点数到整数的转换不是简单的“截断”,而是通过“动态范围映射”实现的,核心是两个参数:缩放因子(scale) 和零点偏移(zero_point)。
以INT8量化为例,量化和解量化的公式如下:
(1)量化(FP32 → INT8)
int8_val=round(fp32_val−zero_pointscale)int8\_val = round(\frac{fp32\_val - zero\_point}{scale})int8_val=round(scalefp32_val−zero_point)
(2)解量化(INT8 → FP32)
fp32_val=int8_val×scale+zero_pointfp32\_val = int8\_val × scale + zero\_pointfp32_val=int8_val×scale+zero_point
其中:
- scale:浮点数范围与整数范围的比值(如FP32范围[-10,10]映射到INT8的[-128,127],scale≈0.079);
- zero_point:整数域中的零点,用于对齐浮点数的零点(确保量化后数值分布不变);
- round:四舍五入,减少量化误差。
通俗理解:就像把“10米长的绳子(FP32范围)”按比例剪成“2.5米长的小段(INT8范围)”,scale就是“每段4米”的比例,zero_point是“起始裁剪点”。
3. 量化的两种核心方式:Post-training Quantization(PTQ)vs Quantization-aware Training(QAT)
根据量化时机,PyTorch中的量化分为“训练后量化”和“量化感知训练”,适用场景完全不同:
| 类型 | 核心逻辑 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| PTQ(训练后量化) | 训练好的FP32模型直接量化 | 简单快捷(无需重新训练) | 精度损失可能较大(尤其INT8) | 快速部署、对精度要求不极致的场景 |
| QAT(量化感知训练) | 训练过程中模拟量化误差,让模型适应量化 | 精度损失小(接近FP32) | 耗时较长(需重新训练) | 高精度要求场景、低精度(INT4/INT8)量化 |
实战原则:优先试PTQ(成本低),若精度不达标再用QAT(效果好)。
二、FP16混合精度:最简单的加速方案(几乎无精度损失)
FP16量化是入门级量化方案——只需修改少量代码,即可在GPU上实现2倍左右的推理加速,且精度损失通常小于0.5%,适合大多数CV和NLP模型。
1. 原理:为什么FP16能加速?——GPU的“Tensor Core”黑科技
现代GPU(如NVIDIA的A10、3090)都配备了Tensor Core(张量核心),专门优化FP16的矩阵乘法运算,吞吐量是FP32的2-4倍。混合精度训练/推理的核心是“关键计算用FP16,精度敏感部分用FP32”:
- FP16:用于卷积、全连接等核心计算(减少计算量);
- FP32:用于权重更新、BatchNorm统计量等(避免精度损失)。
2. PyTorch实现FP16推理:3行代码搞定
FP16推理的实现非常简单,核心是torch.compile(PyTorch 2.0+)或torch.nn.Module.half(),配合GPU设备即可。
(1)CV模型示例(ResNet50)
import torch
import torchvision.models as models
import timeit
# 1. 加载FP32模型
model_fp32 = models.resnet50(pretrained=False, num_classes=1000).cuda()
model_fp32.eval() # 推理模式
# 2. 转换为FP16模型
model_fp16 = model_fp32.half() # 核心:将模型参数转为FP16
model_fp16.eval()
# 3. 准备测试数据(FP16输入)
input_fp32 = torch.randn(16, 3, 224, 224).cuda() # batch_size=16
input_fp16 = input_fp32.half() # 输入也需转为FP16
# 4. 预热(避免首次推理的编译耗时)
with torch.no_grad():
model_fp32(input_fp32)
model_fp16(input_fp16)
# 5. 测试速度
fp32_time = timeit.timeit(lambda: model_fp32(input_fp32), number=100)
fp16_time = timeit.timeit(lambda: model_fp16(input_fp16), number=100)
# 6. 对比结果
print(f"FP32推理时间:{fp32_time:.2f}秒")
print(f"FP16推理时间:{fp16_time:.2f}秒")
print(f"加速比:{fp32_time/fp16_time:.2f}x")
# 7. 验证精度(确保无明显损失)
with torch.no_grad():
output_fp32 = model_fp32(input_fp32)
output_fp16 = model_fp16(input_fp16)
# 计算top1准确率差异
acc_fp32 = (output_fp32.argmax(dim=1) == torch.zeros(16, dtype=torch.long).cuda()).float().mean()
acc_fp16 = (output_fp16.argmax(dim=1) == torch.zeros(16, dtype=torch.long).cuda()).float().mean()
print(f"FP32准确率:{acc_fp32.item():.4f}")
print(f"FP16准确率:{acc_fp16.item():.4f}")
print(f"准确率差异:{abs(acc_fp32-acc_fp16):.4f}")
(2)NLP模型示例(BERT)
from transformers import BertTokenizer, BertForSequenceClassification
# 1. 加载FP32模型
tokenizer = BertTokenizer.from_pretrained("bert-base-chinese")
model_fp32 = BertForSequenceClassification.from_pretrained("bert-base-chinese", num_labels=2).cuda()
model_fp32.eval()
# 2. 转换为FP16模型
model_fp16 = model_fp32.half()
# 3. 准备输入(FP16)
text = ["这是一篇测试文本", "模型量化真的很快"]
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True).to("cuda")
inputs = {k: v.half() for k, v in inputs.items()} # 输入转为FP16
# 4. 速度测试(省略,同ResNet50)
3. 关键优化:用torch.compile进一步加速(PyTorch 2.0+)
PyTorch 2.0推出的torch.compile可对FP16模型进行“编译优化”,再提升30%-50%的速度:
# 编译FP16模型(核心代码)
model_fp16_compiled = torch.compile(model_fp16)
# 测试编译后速度
fp16_compiled_time = timeit.timeit(lambda: model_fp16_compiled(input_fp16), number=100)
print(f"FP16编译后推理时间:{fp16_compiled_time:.2f}秒")
print(f"相对FP32加速比:{fp32_time/fp16_compiled_time:.2f}x")
4. 避坑指南:FP16量化的3个常见问题
(1)问题1:推理时出现“NaN/Inf”(数值溢出)
原因:FP16的取值范围比FP32小(最大65504),部分模型的激活值可能超过FP16上限,导致溢出。
解决:启用“动态损失缩放”(混合精度训练时)或限制激活值范围:
# 混合精度训练时启用动态损失缩放
scaler = torch.cuda.amp.GradScaler()
with torch.cuda.amp.autocast():
output = model(input)
loss = criterion(output, labels)
scaler.scale(loss).backward() # 自动缩放损失,避免溢出
(2)问题2:CPU上FP16速度无提升
原因:大多数CPU不支持FP16指令集,FP16在CPU上会被转为FP32计算,反而增加转换开销。
解决:CPU上优先用INT8量化,而非FP16。
(3)问题3:精度损失超过1%
原因:部分模型(如小模型、低精度要求模型)对FP16更敏感。
解决:对精度敏感层(如输出层)保持FP32:
# 仅将特征提取层转为FP16,输出层保持FP32
model_fp16 = model_fp32.half()
model_fp16.fc = model_fp32.fc # 全连接层保持FP32
三、INT8训练后量化(PTQ):CPU/GPU通用,速度提升4倍
INT8量化是工业部署的首选方案——内存仅占FP32的25%,CPU上速度提升4倍以上,GPU上也能提升2-3倍,适合边缘设备和服务器端高并发场景。
PyTorch的INT8 PTQ分为动态量化和静态量化,适用场景不同。
1. 动态量化(Dynamic Quantization):最简单的INT8量化
(1)原理:推理时动态计算量化参数
动态量化在推理过程中实时计算激活值的scale和zero_point,无需提前校准数据,实现简单,但精度损失相对较大。
核心特点:
- 仅量化“权重”(转为INT8),激活值在推理时动态量化;
- 适合“权重占比高、激活值动态范围小”的模型(如Transformer、LSTM);
- 不支持卷积层(CV模型慎用)。
(2)NLP模型示例(BERT)
import torch
from transformers import BertTokenizer, BertModel
import timeit
# 1. 加载FP32模型
tokenizer = BertTokenizer.from_pretrained("bert-base-chinese")
model_fp32 = BertModel.from_pretrained("bert-base-chinese").cpu() # CPU推理
model_fp32.eval()
# 2. 动态量化INT8模型(核心代码)
model_int8 = torch.quantization.quantize_dynamic(
model_fp32,
qconfig_spec={torch.nn.Linear}, # 仅量化全连接层(BERT的核心计算层)
dtype=torch.qint8 # 量化为INT8
)
# 3. 准备输入
text = ["动态量化真简单", "PyTorch量化太方便"]
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
# 4. 预热
with torch.no_grad():
model_fp32(**inputs)
model_int8(**inputs)
# 5. 速度测试
fp32_time = timeit.timeit(lambda: model_fp32(**inputs), number=50)
int8_time = timeit.timeit(lambda: model_int8(**inputs), number=50)
print(f"FP32推理时间:{fp32_time:.2f}秒")
print(f"INT8动态量化推理时间:{int8_time:.2f}秒")
print(f"加速比:{fp32_time/int8_time:.2f}x")
(3)适用场景:NLP模型(BERT、GPT)、Transformer架构、CPU推理。
2. 静态量化(Static Quantization):精度更高的INT8量化
(1)原理:用校准数据提前计算量化参数
静态量化需要少量校准数据(通常100-1000个样本),提前计算权重和激活值的scale和zero_point,推理时直接使用,精度损失比动态量化小30%-50%。
核心特点:
- 同时量化“权重”和“激活值”(均转为INT8);
- 支持卷积层(适合CV模型);
- 精度更高,但需校准数据。
(2)CV模型示例(ResNet50)
静态量化的步骤更严谨,需“准备→配置→校准→量化”四步:
import torch
import torchvision.models as models
from torch.quantization import QuantStub, DeQuantStub, fuse_modules
# 步骤1:定义支持量化的模型(需添加QuantStub和DeQuantStub)
class QuantResNet50(torch.nn.Module):
def __init__(self, model):
super().__init__()
self.quant = QuantStub() # 量化入口(输入转为INT8)
self.model = model
self.dequant = DeQuantStub() # 反量化出口(输出转回FP32)
def forward(self, x):
x = self.quant(x) # 输入量化
x = self.model(x)
x = self.dequant(x) # 输出反量化
return x
# 步骤2:加载FP32模型并融合层(提升量化精度和速度)
model_fp32 = models.resnet50(pretrained=False, num_classes=1000).cpu()
model_fp32.eval()
# 融合Conv+BN+ReLU层(量化前必须融合,否则精度损失大)
fuse_modules(
model_fp32,
[["conv1", "bn1", "relu"], ["layer1.0.conv1", "layer1.0.bn1", "layer1.0.relu"]], # 融合第一层
inplace=True
)
# 步骤3:初始化量化模型
model_quant = QuantResNet50(model_fp32)
# 步骤4:配置量化参数
model_quant.qconfig = torch.quantization.get_default_qconfig("fbgemm") # CPU量化后端(fbgemm)
# model_quant.qconfig = torch.quantization.get_default_qconfig("qnnpack") # 移动端量化后端
# 步骤5:准备校准数据(100个样本,无需标签)
calibration_data = [torch.randn(1, 3, 224, 224) for _ in range(100)]
# 步骤6:校准并量化(核心:用校准数据计算scale和zero_point)
def calibrate(model, data):
model.eval()
with torch.no_grad():
for x in data:
model(x)
# 准备量化
torch.quantization.prepare(model_quant, inplace=True)
# 校准
calibrate(model_quant, calibration_data)
# 完成量化
torch.quantization.convert(model_quant, inplace=True)
# 步骤7:速度测试(同FP16,省略)
(3)关键优化:层融合(Layer Fusion)
静态量化前融合“Conv+BN+ReLU”等层,可减少计算量和量化误差,提升速度和精度:
# 融合ResNet50的所有Conv+BN+ReLU层
for m in model_fp32.modules():
if isinstance(m, torch.nn.Conv2d):
torch.quantization.fuse_modules(m, ["conv", "bn", "relu"], inplace=True)
(4)适用场景:CV模型(ResNet、EfficientNet)、CPU/GPU推理、需要高精度的INT8场景。
3. 动态vs静态量化对比表
| 维度 | 动态量化 | 静态量化 |
|---|---|---|
| 量化对象 | 仅权重 | 权重+激活值 |
| 校准数据 | 无需 | 需100-1000个样本 |
| 精度 | 较低(损失1%-3%) | 较高(损失0.5%-1%) |
| 速度 | 中等(CPU加速2-3x) | 较快(CPU加速4-5x) |
| 支持模型 | NLP模型(Transformer、LSTM) | CV模型(CNN)、NLP模型 |
| 实现复杂度 | 低(1行代码) | 中(需配置和校准) |
4. 避坑指南:INT8 PTQ的5个致命错误
(1)错误1:CV模型用动态量化
现象:速度提升不明显,精度暴跌5%以上。
原因:动态量化不支持卷积层,CV模型的核心计算层(Conv)未被量化。
解决:CV模型必须用静态量化。
(2)错误2:静态量化未融合层
现象:ResNet50量化后精度掉3%,速度仅提升2x。
原因:未融合Conv+BN+ReLU,量化误差累积,且计算量未减少。
解决:量化前必须融合相关层(如步骤2所示)。
(3)错误3:校准数据太少/分布不均
现象:量化后模型对罕见样本预测错误率高。
原因:校准数据不足,无法覆盖激活值的全部动态范围,导致极端值量化误差大。
解决:校准数据需100-1000个,且与测试集分布一致。
(4)错误4:GPU量化用CPU后端
现象:GPU上INT8速度比FP32还慢。
原因:用了fbgemm(CPU后端),GPU上需用tensorrt或cuDNN后端。
解决:GPU量化配置正确后端:
# GPU静态量化(需安装TensorRT)
model_quant.qconfig = torch.quantization.get_default_qconfig("tensorrt")
(5)错误5:量化后未测试精度
现象:部署后发现模型效果差,但已上线无法回滚。
解决:量化后必须对比FP32和INT8的精度(如准确率、mAP),确保损失在可接受范围内(通常≤1%)。
四、INT8量化感知训练(QAT):精度接近FP32的终极方案
当PTQ的精度损失超过可接受范围(如>1%)时,就需要用QAT(量化感知训练)——在训练过程中模拟量化误差,让模型“学习适应量化”,最终INT8模型的精度可接近FP32(损失≤0.5%)。
1. 原理:让模型“提前适应”量化误差
QAT的核心是在训练时插入“量化-反量化”模拟节点,让模型在更新参数时考虑量化带来的误差,从而学习到更鲁棒的权重分布。
关键步骤:
- 插入模拟量化节点:在Conv、Linear等层前后插入模拟量化/反量化操作;
- 正常训练:模型在FP32下训练,但损失函数包含量化误差;
- 量化转换:训练完成后,将模型转为真实INT8格式。
2. PyTorch实现QAT:ResNet50示例
QAT的实现比PTQ复杂,需修改模型结构并重新训练,但精度提升显著。
(1)步骤1:定义支持QAT的模型
import torch
import torchvision.models as models
from torch.quantization import QuantStub, DeQuantStub, fuse_modules
class QATResNet50(torch.nn.Module):
def __init__(self, num_classes=1000):
super().__init__()
# 加载预训练的FP32模型
self.resnet = models.resnet50(pretrained=True)
# 添加量化/反量化入口
self.quant = QuantStub()
self.dequant = DeQuantStub()
# 替换输出层(适配自定义类别数)
self.resnet.fc = torch.nn.Linear(2048, num_classes)
def forward(self, x):
x = self.quant(x) # 量化入口
x = self.resnet(x)
x = self.dequant(x) # 反量化出口
return x
# 实例化模型
model_qat = QATResNet50(num_classes=100).cpu()
(2)步骤2:融合层并配置QAT参数
# 步骤1:融合Conv+BN+ReLU层
fuse_modules(model_qat.resnet, [["conv1", "bn1", "relu"]], inplace=True)
for layer in ["layer1", "layer2", "layer3", "layer4"]:
for block in getattr(model_qat.resnet, layer):
fuse_modules(block, [["conv1", "bn1", "relu1"], ["conv2", "bn2"], ["conv3", "bn3", "relu2"]], inplace=True)
# 步骤2:配置QAT参数
model_qat.qconfig = torch.quantization.get_default_qat_qconfig("fbgemm") # CPU QAT后端
# 步骤3:准备QAT
model_qat_prepared = torch.quantization.prepare_qat(model_qat, inplace=True)
(3)步骤3:QAT训练(常规训练流程+模拟量化)
# 定义优化器和损失函数
optimizer = torch.optim.SGD(model_qat_prepared.parameters(), lr=0.001, momentum=0.9)
criterion = torch.nn.CrossEntropyLoss()
# 训练循环(与普通训练一致,模型会自动模拟量化)
num_epochs = 10
for epoch in range(num_epochs):
model_qat_prepared.train()
total_loss = 0.0
for batch_x, batch_y in train_loader:
batch_x, batch_y = batch_x.cpu(), batch_y.cpu()
# 前向传播(含模拟量化)
output = model_qat_prepared(batch_x)
loss = criterion(output, batch_y)
# 反向传播和更新
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 累积损失
total_loss += loss.item()
print(f"Epoch {epoch}, Loss: {total_loss/len(train_loader):.4f}")
# 步骤4:完成QAT并转换为INT8模型
model_int8_qat = torch.quantization.convert(model_qat_prepared.eval(), inplace=False)
(4)步骤4:效果对比(QAT vs PTQ vs FP32)
# 测试精度和速度(代码同PTQ,省略)
print("FP32准确率:92.5%")
print("INT8 PTQ准确率:90.1%") # 损失2.4%
print("INT8 QAT准确率:92.1%") # 仅损失0.4%
print("QAT INT8速度:FP32的4.2x")
3. QAT的核心优势与适用场景
(1)核心优势
- 精度高:INT8 QAT的精度通常比PTQ高2%-3%,接近FP32;
- 鲁棒性强:对低精度格式(如INT4)的适应能力更好;
- 支持复杂模型:适合对精度敏感的任务(如医学影像分类、自动驾驶)。
(2)适用场景
- 精度要求高的INT8量化(如准确率损失需≤1%);
- 低精度量化(INT4)的前置步骤;
- 边缘设备部署(如手机、无人机)。
4. 避坑指南:QAT的4个关键注意事项
(1)注意1:QAT需要预训练权重
原因:从零开始QAT会导致收敛慢且精度低,预训练权重能提供较好的初始点。
解决:先用FP32预训练,再用QAT微调(通常10-20个epoch即可)。
(2)注意2:学习率需减小
原因:QAT的参数更新需要更精细,大学习率会破坏预训练的鲁棒性。
解决:QAT的学习率设为预训练的1/10-1/100(如预训练lr=0.01,QAT lr=0.001)。
(3)注意3:量化节点位置要正确
原因:量化节点应放在模型输入和输出处,以及层与层之间,否则会漏量化。
解决:严格按照“QuantStub→模型→DeQuantStub”的结构设计。
(4)注意4:验证时需切换eval模式
原因:QAT训练时模拟量化的参数(如scale)会更新,验证时需固定参数。
解决:验证前必须调用model.eval()。
五、量化效果评估:如何科学衡量“速度+精度”?
量化不是“一锤子买卖”,必须通过科学的评估指标验证效果,避免“速度提升但精度暴跌”的尴尬。
1. 核心评估指标
(1)速度指标:延迟(Latency)
- 定义:单张图片/文本的推理时间(单位:毫秒ms);
- 测试方法:用
timeit或torch.cuda.Event测试,需预热后取平均值; - 关键:测试时关闭梯度计算(
torch.no_grad()),避免额外开销。
(2)内存指标:模型大小与显存占用
- 模型大小:用
torch.save保存模型后查看文件大小; - 显存占用:用
nvidia-smi或torch.cuda.memory_allocated()查看; - 示例:ResNet50 FP32(98MB)→ INT8(25MB),显存占用从400MB降至100MB。
(3)精度指标:根据任务选择
- 分类任务:Top-1准确率、Top-5准确率;
- 检测任务:mAP(mean Average Precision);
- 分割任务:IoU(Intersection over Union);
- 可接受损失:通常≤1%,关键任务≤0.5%。
2. 评估工具推荐
(1)PyTorch内置工具:torch.profiler
分析模型的计算瓶颈和量化效果:
from torch.profiler import profile, record_function, ProfilerActivity
with profile(activities=[ProfilerActivity.CPU], record_shapes=True) as prof:
with record_function("model_inference"):
model_int8(**inputs)
# 打印分析报告
print(prof.key_averages().table(sort_by="cpu_time_total", row_limit=10))
(2)第三方工具:NVIDIA TensorRT
GPU量化的终极优化工具,支持FP16/INT8,比PyTorch原生量化速度再提升30%-50%:
# 安装:pip install tensorrt
import tensorrt as trt
# 将PyTorch模型转为TensorRT引擎(INT8)
# 详细代码见TensorRT官方文档,需用ONNX作为中间格式
六、学习路径
1. 学习路径(分3个阶段)
(1)入门阶段(1-2周):掌握FP16和动态量化
- 目标:能用FP16和动态量化加速模型,理解量化基本原理;
- 核心任务:
- 用FP16加速ResNet50推理,实现2x加速;
- 用动态量化加速BERT,实现CPU上3x加速;
- 对比量化前后的速度和精度。
- 推荐资源:PyTorch官方文档《Quantization》。
(2)进阶阶段(1-2个月):掌握静态量化和QAT
- 目标:能实现静态量化和QAT,解决精度损失问题;
- 核心任务:
- 用静态量化实现ResNet50的INT8推理,精度损失≤1%;
- 用QAT优化INT8模型,将精度损失降至0.5%以内;
- 部署量化模型到CPU边缘设备。
- 推荐资源:
- PyTorch教程《Quantization Aware Training》;
- 论文《Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference》。
(3)专家阶段(2-3个月):部署与优化
- 目标:能结合TensorRT、ONNX Runtime优化量化模型,落地生产环境;
- 核心任务:
- 用TensorRT优化INT8模型,实现GPU上5x加速;
- 将量化模型部署到Android/iOS设备;
- 设计量化+剪枝的联合优化方案。
- 推荐资源:
- NVIDIA TensorRT文档;
- ONNX Runtime量化指南。
我是南木 需要学习规划、就业指导、论文辅导和岗位内推的小伙伴 欢迎扫码交流
更多推荐



所有评论(0)