
人工智能大模型媒体生成本地部署深度学习【免费下载链接】stable-diffusion-webui-forge项目地址https://gitcode.com/GitHub_Trending/st/stable-diffusion-webui-forge点击查看免费下载本篇技术指南围绕extensions-builtin/forge_legacy_preprocessors/annotator/oneformer/detectron2/export/目录展开系统讲解如何将一个 detectron2 模型如 OneFormer 预处理模块所依赖的检测/分割模型导出为TorchScript、ONNX 与已弃用的Caffe2三种部署格式。读完本文你将掌握Caffe2Tracer的完整调用链、三种导出入口的参数与产物形态、TorchScript 场景下Instances结构体的脚本化改造原理以及导出图的可视化与回读验证方法可直接在本仓库的 detectron2 子模块中上手操作。一、目录定位detectron2 模型部署导出的专用模块在 export/README.md 中官方对该目录的定位非常明确This directory contains code to prepare a detectron2 model for deployment. Currently it supports exporting a detectron2 model to TorchScript, ONNX, or (deprecated) Caffe2 format.也就是说这个目录不是模型定义也不是推理主干而是**模型出厂前的打包车间**——它负责把训练/验证阶段的 PyTorch 模型转换成可以被服务端运行时TorchScript runtime、ONNX 生态、Caffe2 引擎直接加载的产物。在本仓库的语境下该模块被随 OneFormer 预处理插件的 detectron2 依赖整体内置路径为 detectron2/export因此任何基于 detectron2 元架构Meta Architecture构建的模型都可以借助它完成部署导出。从源码结构看整个导出模块由 10 个文件组成职责划分如下文件职责api.py对外统一入口Caffe2Tracer导出器与Caffe2ModelCaffe2 产物封装torchscript.pyTorchScript 脚本化辅助scripting_with_instances、dump_torchscript_IRtorchscript_patch.py对不可脚本化的类做运行时补丁ResNet/FPN/ROIHeads 等caffe2_export.pyONNX 导出与 Caffe2 protobuf 转换、图优化流水线caffe2_modeling.pyCaffe2 兼容版元架构GeneralizedRCNN / RetinaNetcaffe2_inference.pyCaffe2 protobuf 模型在 PyTorch 中的运行封装ProtobufModelc10.pyCaffe2 兼容的底层算子级组件RPN、ROIPooler、推断逻辑caffe2_patch.py将 PyTorch 模块递归替换为 Caffe2 兼容实现的补丁机制shared.py共享工具protobuf 参数读写、图变换、设备类型推断、图保存flatten.py图扁平化辅助二、核心入口Caffe2Tracer一条龙导出三格式整个导出体系的心脏是 api.py 中定义的Caffe2Tracer类。它完成两件关键工作重写模型基于META_ARCH_CAFFE2_EXPORT_TYPE_MAP见 caffe2_modeling.py目前仅收录GeneralizedRCNN与RetinaNet两种内置元架构把原始 PyTorch 模型替换为 Caffe2 算子兼容的副本并剥离后处理逻辑只输出原始层输出统一输入形态转换后的可跟踪模型固定接收两个张量输入——data形状为(1, C, H, W)的 float 图像通常取值在[0, 255]其中(H, W)往往需要按模型架构 padding 成 32 的倍数im_info形状为Nx3的 float 矩阵每行为(height, width, 1.0)记录 padding 之前的真实图像尺寸。2.1 构造函数与输入转换tracer Caffe2Tracer(cfg, torch_model, inputs)cfg用于构建 Caffe2 兼容模型的 detectron2CfgNodemodel已加载好权重的原始 PyTorch 模型必须是 detectron2 官方内置的、可被自动转换为 Caffe2 兼容版本的少数元架构之一inputs用于 trace 模型的样例输入。注意对于大多数模型随机输入或无检测目标的输入会产生错误的 trace 结果因此必须使用真实有效的推理输入。构造时Caffe2Tracer会通过copy.deepcopy(model)复制模型避免污染原模型再调用get_caffe2_inputscaffe2_modeling.py把 PyTorch 风格的list[dict]结构化输入转成张量元组。2.2 三种导出方法Caffe2Tracer提供三个平行的导出入口均可在构造完成后直接调用# 1. Caffe2 protobuf 格式 c2_model tracer.export_caffe2() # 返回 Caffe2Model 对象 # 2. ONNX 格式 onnx_model tracer.export_onnx() # 返回 onnx.ModelProto # 3. TorchScript 格式 ts_model tracer.export_torchscript() # 返回 torch.jit.TracedModule可用 .save() 保存需要特别说明的是ONNX 产物的局限性由于导出图内包含仅在 Caffe2 中可用的自定义算子该 ONNX 模型不能直接被 onnxruntime 或 TensorRT 等运行时执行需要针对不同运行时做后处理或变换而 detectron2 本身并不提供这类支持。这是 api.py 中明确声明的事实读者在选型时应加以权衡。三、TorchScript 导出绕开Instances动态属性的三板斧detectron2 的推理输出大量使用Instances容器其字段是运行时动态挂载的这恰好与 TorchScript 的静态类型编译模型相冲突。为此torchscript.py 提供了scripting_with_instancesfrom annotator.oneformer.detectron2.export import scripting_with_instances fields {proposal_boxes: Boxes, objectness_logits: torch.Tensor} ts_model scripting_with_instances(model, fields)其内部原理详见 torchscript_patch.py 的patch_instances上下文管理器根据fields参数动态生成一个字段全部静态化的ScriptedInstances子类由_gen_instance_class在运行时拼接 Python 源码并导入见 torchscript_patch.py清空 JIT 缓存_clear_jit_cache让脚本编译器在解析Instances时命中新的脚本化版本通过torch.jit.script(new_instances)预编译该类并把Instances.__torch_script_class__置为True、改写其 JIT 限定名使编译器以为Instances已被脚本化为脚本化类注册from_instances转换方法使 eager 模式下的Instances能转换到脚本化版本上下文退出时全部回滚不影响同一进程内对其它模型的脚本化。fields中的属性名必须完整列出模型推理期间Instances使用到的所有字段无论是否为模型输入/输出且数据类型必须限定在 detectron2 已支持的类型Boxes、torch.Tensor等。此外scripting_with_instances仅支持**评估模式evaluation mode**下的模型——freeze_training_mode会把每个子模块的training属性注解为torch.jit.Final[bool]常量从而让训练分支在元编译阶段被裁剪掉torchscript_patch.py。3.1 不可脚本化类的运行时补丁除Instances外ResNet/FPN 的容器结构、StandardROIHeads的布尔标志也存在脚本化障碍。patch_nonscriptable_classestorchscript_patch.py在模块导入时即被调用且无副作用为ResNet/FPN注入__prepare_scriptable__将普通容器替换为nn.ModuleList注意这会改变state_dict中的参数名将StandardROIHeads.mask_on/keypoint_on注解为torch.jit.Final[bool]常量。3.2 调试利器dump_torchscript_IR当导出结果不符合预期时可用dump_torchscript_IRtorchscript.py把模型中间表示倾倒到磁盘产出 4 类调试文件model_ts_code.txt逐模块的脚本化 Python 代码含子模块递归model_ts_IR.txt完整 IR不内联子模块model_ts_IR_inlined.txt全图内联后的 IRmodel.txtPyTorch 风格的模型结构打印。四、Caffe2 导出经 ONNX 中转的完整流水线Caffe2 导出并非原生态实现而是先导出 ONNX、再由 ONNX 模型转换回 Caffe2 protobuf。核心函数是 caffe2_export.py 的export_caffe2_detection_modelpredict_net, init_net export_caffe2_detection_model(model, tensor_inputs)流水线分为五个阶段ONNX 导出export_onnx_model在torch.no_grad()下调用torch.onnx.export使用OperatorExportTypes.ONNX_ATEN_FALLBACK策略导出前强制校验所有子模块处于 eval 模式caffe2_export.py格式转换Caffe2Backend.onnx_graph_to_caffe2_net将 ONNX 图转为init_net参数初始化网络与predict_net推理网络两个 protobuf图优化fuse_alias_placeholder移除 trace 时插入的AliasWithName占位算子并重命名 blobshared.py非 CPU 输入时执行fuse_copy_between_cpu_and_gpu合并往返拷贝算子、remove_dead_end_ops、_assign_device_option为每个算子标注 CUDA 设备选项remove_reshape_for_fc识别并删除仅供nn.Linear使用的 4D→2D reshape 子图——Caffe2 的 FC 直接支持 4D 张量同时该变换也规避了 ONNX/Int8 工具链对动态 reshape 的兼容问题shared.pygroup_norm_replace_aten_with_caffe2把 ONNX 导出的ATen group_norm算子原位替换为原生GroupNorm算子shared.py重建参数网络从 init_net 提取全部参数与设备选项后用construct_init_net_from_params重新构建更精简的 init_net元数据编码encode_additional_info把size_divisibility、device、meta_architecture等运行期必需信息写入 predict_net 的 protobuf 参数中GeneralizedRCNN 还会写入 NMS 阈值、bbox_reg_weights、序列化的 anchor generator 等见 caffe2_modeling.py。4.1 Caffe2 兼容元架构的输入转换在导出前原始 PyTorch 输入需先转成 Caffe2 风格输入。convert_batched_inputs_to_c2_formatcaffe2_modeling.py的转换规则为把每张 CHW 图像经ImageList.from_tensors(images, size_divisibility)做 batch 化与 padding得到 NCHW 大张量为每张图计算im_info行(H, W, scale)其中scale target_height / padded_height——注意由于宽高 scale 可能略有差异用单一 scale 与 detectron2 原生后处理相比存在轻微数值偏差输出(images.tensor, im_info)元组。五、Caffe2 产物的封装、保存与加载5.1Caffe2Model与 PyTorch 接口对齐的封装export_caffe2()返回的Caffe2Modelapi.py是一个nn.Module包装器恒处于eval()模式将 Caffe2 protobuf 图的输入/输出重新模拟为原 PyTorch 模型的接口c2_model Caffe2Tracer(cfg, torch_model, inputs).export_caffe2() outputs c2_model([{image: img_tensor_CHW}]) # 与 torch_model 的调用方式一致 orig_outputs torch_model([{image: img_tensor_CHW}])它提供了四组关键方法save_protobuf(output_dir)落盘三个文件——model.pb图的二进制定义可用 Netron 等工具可视化model_init.pb模型参数model.pbtxt图的可读文本定义部署时不需要load_protobuf(dir)静态方法从目录回读model.pbmodel_init.pb重建Caffe2Modelsave_graph(output_file, inputsNone)导出图为SVG格式传入inputs时还会实际运行一次网络把每个 blob 的张量形状一并标注到图中__call__(inputs)内部惰性构建ProtobufDetectionModel执行推理由于存在 PyTorch/Caffe2 之间的转换开销此接口不用于基准测试仅用于与原模型输出对比验证。5.2ProtobufModel的运行机制caffe2_inference.py 中的ProtobufModel负责实际运行 Caffe2 图每个实例创建唯一临时 workspaceinit_net运行一次填充参数随后FeedBlob注入输入、RunNet执行推理、FetchBlob取回输出。其中有两个工程细节值得注意推理失败时不直接崩溃而是记录错误信息并返回部分结果便于排查网络中间层问题每次运行结束后会把外部输出 blob 重新置为未初始化状态避免模型中途失败时误取上一次运行的结果。六、从 patch 到算子Caffe2 兼容组件是如何替换的为了让原始 PyTorch 模型可被 trace 并转成 Caffe2 图caffe2_patch.py 提供递归补丁机制patch将目标类型及其子类替换为 Caffe2 兼容实现def patch_generalized_rcnn(model): model patch(model, rpn.RPN, Caffe2CompatibleConverter(Caffe2RPN)) model patch(model, poolers.ROIPooler, Caffe2CompatibleConverter(Caffe2ROIPooler)) return model替换后的组件在 c10.py 中实现全部以torch.ops._caffe2.*自定义算子为底层Caffe2RPN用GenerateProposals/CollectRpnProposals算子替代原生 proposal 生成参数pre_nms_topN、post_nms_topN、nms_thresh、min_size与训练/评估阶段配置联动c10.pyCaffe2ROIPooler单层用RoIAlign/RoIAlignRotatedFPN 多层场景先经DistributeFpnProposals分发、RoIAlign采样、BatchPermutation恢复顺序且要求 FPN 恰好 4 层c10.pyCaffe2FastRCNNOutputsInference以BBoxTransformBoxWithNMSLimit两个算子完成边框回归与 NMSc10.pyCaffe2MaskRCNNInference/Caffe2KeypointRCNNInferencemask 与关键点推理的 Caffe2 版本关键点部分支持可配置的HeatmapMaxKeypoint算子。这些组件统一继承Caffe2Compatiblec10.py通过tensor_mode属性区分纯张量 C2 风格输入输出与PyTorch 结构体风格从而保证补丁对 eager 推理无副作用。七、导出图的可视化与验证闭环7.1 图可视化无论走哪条导出路径都可以借助save_graphshared.py把 Caffe2 网络画成图片。它基于net_drawer.GetPydotGraph实现支持op_onlyTrue默认最小依赖图突出算子间关系op_onlyFalse完整拓扑图含 blob 节点可选传入blob_sizes/blob_ranges在节点标签上追加张量形状与数值范围输出格式由文件扩展名决定.png/.pdf/.svg。在 Caffe2 导出链路上run_and_save_graphcaffe2_export.py会先用给定输入真实运行一次网络、收集每个 blob 的形状再连同形状信息一起保存为 SVG实现带 shape 标注的可视化调试。7.2 输出一致性验证Caffe2 导出的正确性验证方式是双模型对拍用Caffe2Model(inputs)与原始torch_model(inputs)在相同输入上分别推理并比较结果。这依赖get_outputs_convertercaffe2_modeling.py把 Caffe2 的dict[str, Tensor]输出重新组装成 detectron2 的list[Instances]标准格式——GeneralizedRCNN 直接按bbox_nms/score_nms/class_nms/mask_fcn_probs/keypoints_out等 Caffe2 命名约定组装caffe2_modeling.pyRetinaNet 则先反序列化 anchor generator 与回归权重再复用其原生的forward_inference逻辑完成解码caffe2_modeling.py。八、实战建议与注意事项汇总基于本仓库源码整理以下可直接落地的使用要点选格式看场景需要与 PyTorch 生态深度集成、追求调试便利选 TorchScript需要进入 ONNX 生态但能接受仅 Caffe2 算子可执行的约束选 ONNX历史服务端使用 Caffe2 引擎选 Caffe2README 已明确标注 deprecated新项目不建议起步于此。trace 输入必须真实有效Caffe2Tracer的inputs直接影响 trace 质量空检测/随机输入会产生错误图同时 Caffe2 导出要求模型权重已加载完毕且仅支持GeneralizedRCNN、RetinaNet两种内置元架构caffe2_modeling.py。TorchScript 导出需声明全部字段scripting_with_instances的fields必须穷举模型推理中Instances用到的所有属性且只支持评估模式。注意补丁的隐藏影响__prepare_scriptable__会把 ResNet/FPN 的普通容器改为nn.ModuleList从而改变state_dict参数名——若你的下游流程依赖原参数名需留意此差异。图像 padding 纪律Caffe2 导出图固定接收 NCHW 输入(H, W)需 padding 到 32 的倍数由size_divisibility控制im_info负责记录真实尺寸运行期推理如 caffe2_inference.py 的ProtobufDetectionModel会自动复用它完成尺寸还原与后处理。验证先行正式部署前务必用Caffe2Model(inputs)与torch_model(inputs)对拍输出并将导出图导出为带 shape 的 SVG 检查结构完整性。九、致谢与后续资源正如 export/README.md 所述本模块凝聚了多方贡献Facebook Mobile Vision 团队开发了 Caffe2 转换工具阿里巴巴集团计算平台事业部 PAI 团队bddpqq、chenbohua3协助实现了 detectron2 模型到 TorchScript 的导出微软 ONNX Converter 团队协助实现了 ONNX 导出。这些能力在stable-diffusion-webui-forge中以 OneFormer 预处理插件 内置 detectron2 依赖的形式随仓库分发感兴趣者可进一步阅读 detectron2 部署工具源码或结合 OneFormer 预处理脚本 观察该依赖在实际预处理管线中的调用方式。赞分享人工智能大模型媒体生成本地部署深度学习【免费下载链接】stable-diffusion-webui-forge项目地址https://gitcode.com/GitHub_Trending/st/stable-diffusion-webui-forge点击查看免费下载相关推荐Detectron2部署实战将模型转换为ONNX和TorchScript格式Detectron2部署实战将模型转换为ONNX和TorchScript格式 Detectron2是Facebook AI Research开发的一个强大目标人工智能计算机视觉深度学习机器学习Detectron2 模型部署导出指南TorchScript / ONNX / Caffe2 的完整导出方案Detectron2 模型部署导出指南TorchScript / ONNX / Caffe2 的完整导出方案 本指南基于 Detectron2 仓库中的 de人工智能计算机视觉深度学习机器学习OOTDiffusion 人体解析部署指南detectron2 模型导出 Caffe2/ONNX/TorchScript 与推理实战OOTDiffusion 人体解析部署指南detectron2 模型导出 Caffe2/ONNX/TorchScript 与推理实战 导读 本指南围绕 OOT人工智能计算机视觉媒体生成AI 应用上一篇解放Alienware潜能轻量级控制套件完全指南下一篇SMUDebugTool终极指南免费开源AMD Ryzen处理器调试工具完全教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考