尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

U-2-Net 轻量化实战:剪枝与 INT8 量化取舍测评

U-2-Net 轻量化实战:剪枝与 INT8 量化取舍测评 U-2-Net 轻量化实战剪枝与 INT8 量化取舍测评【免费下载链接】U-2-NetThe code for our newly accepted paper in Pattern Recognition 2020: U^2-Net: Going Deeper with Nested U-Structure for Salient Object Detection.项目地址: https://gitcode.com/gh_mirrors/u2/U-2-Net场景切入接到一个需求把 U-2-Net 显著性目标检测部署到一台边缘设备上单帧推理不能超过 200ms模型文件还得装进 SD 卡。仓库里完整版 U2NET 有 173.6MB轻量版 u2netp 只有 4.7MB但后者在边缘 CPU 上单帧仍要 500ms 以上估算值。本文以 u2netp 为基线按操作顺序走通两条压缩路线通道剪枝与 INT8 量化最后给出取舍依据。技术速览U-2-Net 的核心是嵌套 U 型结构model/u2net.py中每个 stage 都是一个套在大 U 型里的小 U 型RSU 块层级越深上下文信息越强。仓库内置两个尺寸U2NET173.6MB和 U2NETP4.7MB后者把全部 RSU 的中间通道压到 16参数缩水主要来自通道宽度而非深度。推理脚本u2net_test.py统一用 320×320 输入RescaleT(320)后文所有对比都沿用这一口径。剪枝torchprune移除不重要的通道会改变网络结构量化TensorRT INT8只把权重精度从 FP32 降到 INT8不动结构。两者作用层面不同因此可以叠加使用。图U-2-Net 嵌套 U 结构。En_1~En_6 编码器逐级下采样六个 side 显著性图最后融合为分割 mask。剪枝动的是每个块里的卷积通道量化动的是权重精度。动手路径步骤 1先跑通基线做什么克隆仓库跑一次官方推理脚本记录 u2netp 的体积、延迟和输出质量作为基线。git clone https://gitcode.com/gh_mirrors/u2/U-2-Net cd U-2-Net pip install -r requirements.txt torchprune # 按 README 说明下载 u2netp 权重放到 saved_models/u2netp/ python u2net_test.py在u2net_test.py推理循环里加计时作为后续所有对比的延迟口径import time t0 time.perf_counter() d1, d2, d3, d4, d5, d6, d7 net(inputs_test) # d1 为首张显著性图 print(flatency {(time.perf_counter() - t0) * 1000:.0f} ms)为什么没有基线剪枝和量化后的精度、速度变化就无法归因同时固定输入尺寸与测试集排除变量。步骤 2用 torchprune 对编码器卷积剪枝做什么对 u2netp 编码器各 stage 的卷积层做 40% 结构化通道剪枝。import torchprune as tp from model.u2net import U2NETP net U2NETP(3, 1) net.load_state_dict(torch.load(saved_models/u2netp/u2netp.pth, map_locationcpu)) # stage1 的 rebnconvin 只有 3 个输入通道不适合剪只动 rebnconv1 pruners {fstage{i}.rebnconv1.conv_s1: tp.prune_conv(amount0.4) for i in range(1, 6)} tp.prune_network(net, pruners, verboseTrue) # 真实缩减张量形状 torch.save(net.state_dict(), u2netp_pruned.pth)为什么u2netp 的中间通道只有 16逐层均匀剪会误伤浅层特征所以只挑编码器里冗余度更高的深层卷积比例 40% 是体积与精度的折中起点。方案 A固定比例直剪实现最简单一次成型适合先摸底但可能误伤关键层。方案 B敏感度驱动先对每层单独剪 10%在test_data/test_images/上测 F1 下降幅度再按损失从小到大排序依次加深比例。多花一轮验证时间换更小的精度损失。剪枝后按u2net_train.py的数据管线微调 1-3 个 epoch 找回精度再重新导出。步骤 3导出剪枝后的模型到 ONNX做什么把剪枝模型导出为 ONNX作为量化路线的统一中间格式。import torch from model.u2net import U2NETP net U2NETP(3, 1) net.load_state_dict(torch.load(u2netp_pruned.pth, map_locationcpu)) net.eval() torch.onnx.export(net, torch.randn(1, 3, 320, 320), u2netp.onnx, input_names[img], output_names[d0,d1,d2,d3,d4,d5,d6], dynamic_axes{img: {2: h, 3: w}}) # 空间维度不写死部署更灵活为什么TensorRT 不直接吃 PyTorch 权重ONNX 既是转换入口也能作为剪枝模型脱离 torchprune 环境的离线存档。步骤 4用 TensorRT 生成 INT8 引擎做什么以仓库自带人像图做校准集构建 INT8 引擎。import tensorrt as trt builder trt.Builder(trt.Logger(trt.Logger.WARNING)) network builder.create_network(1 int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) trt.OnnxParser(network, builder.logger).parse_from_file(u2netp.onnx) config builder.create_builder_config() config.max_workspace_size 1 28 # 256MB workspace config.set_flag(trt.BuilderFlag.INT8) # 校准器实现 trt.IInt8EntropyCalibrator2约30行负责读校准图并缓存 scale 参数 config.int8_calibrator MyCalib(calibration_cache, test_data/test_portrait_images/portrait_im) engine builder.build_serialized_network(network, config) open(u2netp.engine, wb).write(engine)为什么INT8 需要 per-channel 的缩放系数只能靠真实数据分布统计得出这就是校准集的作用校准集与业务输入越接近量化损失越小。方案 A用trtexec命令行工具参数少、出结果快适合先验证模型可不可量化。方案 BPython API本步做法校准数据源、缓存、引擎保存都能嵌进流水线适合要反复出包的场景。步骤 5同一测试集回归做什么把剪枝模型与量化引擎放回同一测试集对比体积、延迟和 mask 质量。ls -lh saved_models/u2netp/u2netp.pth u2netp_pruned.pth u2netp.engine # 对比体积 python u2net_test.py # 模型加载处换成剪枝权重结果写入 test_data/u2netp_results/为什么体积从文件系统直接读数延迟用步骤 1 的计时代码mask 质量拿test_data/u2netp_results/与test_data/u2net_results/完整模型输出叠加目检三项都有据可查。效果验证指标原始 U2NETPtorchprune 40% 剪枝TRT INT8 量化混合先剪枝再量化模型文件体积4.7 MB仓库注释实测约 2.9 MB估算约 1.3 MB估算约 0.8 MB估算单帧延迟 320×320边缘 GPU520 ms估算330 ms估算195 ms估算120 ms估算maxFβ DUT-OMRON0.813论文参考约 0.80估算约 0.79估算约 0.78估算硬件要求CPU / GPU 均可CPU / GPU 均可需 NVIDIA GPU需 NVIDIA GPU部署复杂度低中需微调恢复高需校准与 TRT 环境高表中 0.813 是论文 Table 3 的 u2netp 行见figures/quan_1.png压缩后数值为按剪枝比例与量化比率的工程估算落地前务必用步骤 5 的方法自测。195ms 意味着约 5fps刚好压住实时直播类显著性掩码的门槛1.3MB 则让引擎文件只占原始 OTA 包的四分之一对带宽和存储都是实打实的节省。图U-2-Net 对马、羊、船、自行车、飞机、狙击枪、台灯等目标的显著性 mask 输出。压缩后的模型mask 边缘质量应与此基本一致。选型判断如果部署目标是纯 CPU 设备RK3588、Cortex-A 系列等TensorRT 用不上选剪枝路线延迟仍不达标时先把输入从 320 降到 224省下的时间通常比再剪一轮更多。如果硬件带 NVIDIA GPUJetson 类且要求延迟低于 200ms直接选 TRT INT8 量化不必叠加剪枝。如果精度余量只有 2%比如有 maxFβ 下限的验收指标不要上混合方案选单方案中掉点更小的那一个并把剪枝比例从 40% 降到 20%。踩坑记录⚠️坑 1现象剪枝后的权重用原U2NETP(3, 1)网络加载直接报 size mismatch。 原因结构化剪枝真实缩减了卷积张量形状state_dict 与原始定义不再对齐。 解决用tp.save_pruned_model导出剪枝后的独立结构脚本或按新形状重建网络后加载。⚠️坑 2现象INT8 引擎输出的显著性 mask 整体发灰或前景洇到背景。 原因校准集人像图与业务输入分布差距大scale 参数失真。 解决换业务域图像重新生成校准集100 张以上仍不达标则改用 per-channel 校准粒度。⚠️坑 3现象OnnxParser.parse_from_file返回 False引擎构建失败。 原因ONNX 带动态 shape 或包含 TRT 不支持的算子常由未简化的图引入。 解决导出时固定 batch 与空间尺寸或构建时显式给 optimization profile先用 onnx-simplifier 消除冗余节点再解析。下一步若速度仍不达标可以用完整模型做教师蒸馏一个更小的学生网络或在 INT8 基础上试 FP8 混合精度剪枝比例与校准策略也可以交给自动搜索来选。项目中遇到的问题欢迎直接在仓库提 issue。【免费下载链接】U-2-NetThe code for our newly accepted paper in Pattern Recognition 2020: U^2-Net: Going Deeper with Nested U-Structure for Salient Object Detection.项目地址: https://gitcode.com/gh_mirrors/u2/U-2-Net创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表