【CUDA-BEVFusion】qat/export-camera.py 代码解读

部署运行你感兴趣的模型镜像

【CUDA-BEVFusion】qat/export-camera.py代码的主要功能是将一个名为’bevfusion_ptq.pth’的模型导出为 ONNX 格式,支持 INT8 和 FP16 两种精度。

  • Export INT8 model
python qat/export-camera.py --ckpt=model/resnet50int8/bevfusion_ptq.pth

`qat/export-camera.py

import sys
import warnings
warnings.filterwarnings("ignore")  # 忽略所有警告信息

import argparse  # 用于解析命令行参数
import os  # 用于处理文件和目录路径

import onnx  # ONNX格式支持库
import torch  # PyTorch深度学习框架
from onnxsim import simplify  # 用于简化ONNX模型
from torchpack.utils.config import configs  # 用于加载配置文件
from mmcv import Config  # MMDetection库中的配置工具
from mmdet3d.models import build_model  # 用于构建3D检测模型
from mmdet3d.utils import recursive_eval  # 用于递归评估配置

from torch import nn  # PyTorch中的神经网络模块
from pytorch_quantization.nn.modules.tensor_quantizer import TensorQuantizer  # 量化工具
import lean.quantize as quantize  # 自定义量化模块

def parse_args():
    """解析命令行参数"""
    parser = argparse.ArgumentParser(description="Export bevfusion model")
    parser.add_argument('--ckpt', type=str, default='qat/ckpt/bevfusion_ptq.pth', help="模型检查点路径")
    parser.add_argument('--fp16', action='store_true', help="是否使用FP16精度")
    args = parser.parse_args()
    return args

class SubclassCameraModule(nn.Module):
    """自定义相机模块,用于处理图像和深度信息"""
    def __init__(self, model):
        super(SubclassCameraModule, self).__init__()
        self.model = model  # 传入的模型

    def forward(self, img, depth):
        """前向传播函数"""
        B, N, C, H, W = img.size()  # 获取输入图像的维度
        img = img.view(B * N, C, H, W)  # 将图像展平

        # 通过模型的相机编码器提取特征
        feat = self.model.encoders.camera.backbone(img)
        feat = self.model.encoders.camera.neck(feat)
        if not isinstance(feat, torch.Tensor):
            feat = feat[0]  # 如果特征不是张量,取第一个元素

        BN, C, H, W = map(int, feat.size())
        feat = feat.view(B, int(BN / B), C, H, W)  # 重新调整特征维度

        def get_cam_feats(self, x, d):
            """获取相机特征和深度信息"""
            B, N, C, fH, fW = map(int, x.shape)
            d = d.view(B * N, *d.shape[2:])
            x = x.view(B * N, C, fH, fW)

            d = self.dtransform(d)  # 深度变换
            x = torch.cat([d, x], dim=1)  # 将深度信息和图像特征拼接
            x = self.depthnet(x)  # 通过深度网络处理

            depth = x[:, : self.D].softmax(dim=1)  # 计算深度权重
            feat = x[:, self.D: (self.D + self.C)].permute(0, 2, 3, 1)  # 调整特征维度
            return feat, depth
        
        return get_cam_feats(self.model.encoders.camera.vtransform, feat, depth)

def main():
    """主函数,用于导出模型为ONNX格式"""
    args = parse_args()  # 解析命令行参数

    model = torch.load(args.ckpt).module  # 加载模型检查点
    suffix = "int8"  # 默认使用INT8量化
    if args.fp16:
        suffix = "fp16"  # 如果使用FP16精度,更改后缀
        quantize.disable_quantization(model).apply()  # 禁用量化
        
    data = torch.load("example-data/example-data.pth")  # 加载示例数据
    img = data["img"].data[0].cuda()  # 将图像数据放到GPU上
    points = [i.cuda() for i in data["points"].data[0]]  # 将点云数据放到GPU上

    camera_model = SubclassCameraModule(model)  # 创建自定义相机模块
    camera_model.cuda().eval()  # 将模型放到GPU上并设置为评估模式
    depth = torch.zeros(len(points), img.shape[1], 1, img.shape[-2], img.shape[-1]).cuda()  # 创建深度张量

    downsample_model = model.encoders.camera.vtransform.downsample  # 获取下采样模型
    downsample_model.cuda().eval()  # 将下采样模型放到GPU上并设置为评估模式
    downsample_in = torch.zeros(1, 80, 360, 360).cuda()  # 创建下采样输入张量

    save_root = f"qat/onnx_{suffix}"  # 设置保存路径
    os.makedirs(save_root, exist_ok=True)  # 创建保存目录

    with torch.no_grad():  # 禁用梯度计算
        camera_backbone_onnx = f"{save_root}/camera.backbone.onnx"  # 相机骨干网络的ONNX保存路径
        camera_vtransform_onnx = f"{save_root}/camera.vtransform.onnx"  # 相机变换网络的ONNX保存路径
        TensorQuantizer.use_fb_fake_quant = True  # 启用伪量化
        torch.onnx.export(
            camera_model,
            (img, depth),
            camera_backbone_onnx,
            input_names=["img", "depth"],
            output_names=["camera_feature", "camera_depth_weights"],
            opset_version=13,
            do_constant_folding=True,
        )  # 导出相机骨干网络为ONNX格式

        onnx_orig = onnx.load(camera_backbone_onnx)  # 加载导出的ONNX模型
        onnx_simp, check = simplify(onnx_orig)  # 简化ONNX模型
        assert check, "Simplified ONNX model could not be validated"  # 检查简化后的模型是否有效
        onnx.save(onnx_simp, camera_backbone_onnx)  # 保存简化后的ONNX模型
        print(f"🚀 The export is completed. ONNX save as {camera_backbone_onnx} 🤗, Have a nice day~")

        torch.onnx.export(
            downsample_model,
            downsample_in,
            camera_vtransform_onnx,
            input_names=["feat_in"],
            output_names=["feat_out"],
            opset_version=13,
            do_constant_folding=True,
        )  # 导出相机变换网络为ONNX格式
        print(f"🚀 The export is completed. ONNX save as {camera_vtransform_onnx} 🤗, Have a nice day~")

if __name__ == "__main__":
    main()  # 运行主函数

代码功能概述:

  • 该代码的主要功能是将一个名为 bevfusion 的模型导出为 ONNX 格式,支持 INT8 和 FP16 两种精度。
  • 代码首先解析命令行参数,加载模型检查点,并根据参数决定是否使用 FP16 精度。
  • 然后,代码加载示例数据,并将模型和数据放到 GPU 上。
  • 接着,代码定义了一个自定义的相机模块 SubclassCameraModule,用于处理图像和深度信息。
  • 最后,代码使用 torch.onnx.export 将模型导出为 ONNX 格式,并对导出的模型进行简化和保存。

主要模块:

  1. parse_args: 解析命令行参数,包括模型检查点路径和是否使用 FP16 精度。
  2. SubclassCameraModule: 自定义的相机模块,用于处理图像和深度信息。
  3. main: 主函数,负责加载模型、处理数据、导出模型为 ONNX 格式,并进行简化和保存。

关键点:

  • 量化支持: 代码支持 INT8 量化,并且可以通过 --fp16 参数切换到 FP16 精度。
  • ONNX 导出: 使用 torch.onnx.export 将模型导出为 ONNX 格式,并使用 onnxsim 对模型进行简化。
  • GPU 加速: 模型和数据都被放到 GPU 上进行处理,以提高计算效率。

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think> 我们面对的错误信息涉及QAT引擎初始化和处理器指令集支持问题。根据错误信息,系统尝试加载一个名为"qatengine"的OpenSSL引擎,但失败了。同时,处理器缺少必要的指令集(如AVX512F、AVX2等)导致QAT_SW(可能是QAT的软件模拟)无法运行。 分析步骤: 1. **理解错误来源**: - `ENGINE_by_id("qatengine") failed`:说明OpenSSL无法找到或加载名为"qatengine"的引擎。这通常是因为没有正确安装QAT引擎或者配置有问题。 - `ssl engine send ctrl failed`和`ssl engine set failed`:这些错误通常发生在尝试设置或控制SSL引擎时,由于引擎加载失败而导致的后续错误。 - `QAT_SW - Processor unsupported: ...`:这个错误明确指出了处理器缺少支持QAT软件模拟所需的指令集(AVX512F, AVX2, VAES, VPCLMULQDQ)。这意味着当前CPU不支持这些指令集,因此无法使用软件模拟的QAT功能。 2. **什么是QAT?** QAT(QuickAssist Technology)是英特尔提供的一种硬件加速技术,用于加速加密、解密和压缩等操作。如果服务器上没有安装QAT硬件加速卡,那么通常会使用软件模拟(QAT_SW)来模拟这些操作。然而,软件模拟需要处理器的指令集支持。从错误信息看,当前处理器不支持所需的指令集。 3. **解决方案**: - **方案1:禁用QAT引擎**(如果不需要硬件加速) 由于错误表明处理器不支持软件模拟所需的指令集,而且很可能我们并没有QAT硬件,因此最简单的方法是在Nginx配置中禁用QAT引擎。 在Nginx配置文件中(通常是`nginx.conf`或包含的`ssl.conf`等),找到与SSL引擎相关的配置项,并移除或注释掉类似以下配置: ``` ssl_engine qatengine; ``` 或者,如果配置文件中没有直接设置,可能是通过OpenSSL的配置文件加载的。我们也可以尝试在启动Nginx之前,通过环境变量禁用引擎: ```bash export OPENSSL_ENGINES=/path/to/engines # 如果确实有引擎,确保路径正确;如果没有,可以尝试设置为空 ``` 或者,更直接地,在Nginx的配置中,我们可以通过`ssl_engine`指令将其设置为空或默认值(如果配置了的话,去掉该指令即可)。 - **方案2:安装或更新QAT驱动和引擎**(如果确实有QAT硬件) 如果服务器上确实安装了QAT硬件加速卡,那么这些错误可能是因为驱动或引擎没有正确安装或加载。需要: 1. 确保安装了正确的QAT驱动和OpenSSL引擎(参考Intel QAT官方文档)。 2. 检查引擎是否在OpenSSL中可用:可以使用命令`openssl engine`查看可用的引擎列表,确认是否有`qatengine`。 - **方案3:检查处理器支持情况并考虑升级硬件**(如果必须使用QAT软件模拟) 如果确实需要QAT的软件模拟功能,但处理器不支持,那么可能需要升级处理器。但是,这通常不是首选方案。 4. **针对指令集错误的具体分析**: 错误信息指出处理器缺少AVX2、AVX512F、VAES和VPCLMULQDQ指令集。这些指令集是英特尔处理器中的扩展指令集,主要用于加速加密操作(如AES-NI和CLMUL)。较老的处理器可能不支持这些指令集。 可以通过以下命令检查当前处理器的指令集支持情况(在Linux系统上): ```bash grep -m1 flags /proc/cpuinfo | tr ' ' '\n' | grep -E 'avx2|avx512f|vaes|vpclmulqdq' ``` 如果没有任何输出,则说明不支持这些指令集。 5. **实际解决建议**: 鉴于大多数情况下,我们可能并没有QAT硬件,并且错误信息明确指出了处理器不支持软件模拟所需的指令集,因此推荐方案1:禁用QAT引擎。 步骤: a. 打开Nginx的主配置文件(通常位于`/etc/nginx/nginx.conf`或`/usr/local/nginx/conf/nginx.conf`)。 b. 查找`ssl_engine`指令,并将其注释掉或删除。例如,如果有一行如下: ``` ssl_engine qatengine; ``` 改为: ``` # ssl_engine qatengine; ``` c. 保存配置文件并重新启动Nginx。 如果配置文件中没有找到`ssl_engine`指令,那么问题可能出在OpenSSL的配置文件或者Nginx的模块加载方式上。可以尝试在启动Nginx之前设置环境变量`OPENSSL_ENGINES`为空,或者检查Nginx编译时是否包含了QAT模块。 另外,如果Nginx是通过Docker容器运行的,那么需要在容器启动时传递环境变量,或者在容器内部修改配置文件。 6. **其他可能的配置位置**: 有时,QAT引擎的配置可能在Nginx的server块中,或者被包含在其他配置文件中(如`conf.d/`目录下的文件)。因此,建议全局搜索`ssl_engine`。 7. **验证**: 在修改配置后,重启Nginx,观察错误日志是否还有上述错误信息。 8. **如果问题依旧**: 如果禁用`ssl_engine`后问题依旧,可能需要检查Nginx是否在编译时加入了QAT模块。如果编译时加入了QAT模块,而运行时又没有正确配置,可能会导致类似错误。此时,可以考虑重新编译Nginx,去掉QAT模块支持。 9. **关于引用**: 虽然提供的引用内容没有直接解决这个问题,但引用[1]提到了修改Nginx源码中的特定文件,这提醒我们可能需要修改配置或源码。但是,我们这里的问题并不需要修改源码,而是配置层面的调整。 根据以上分析,我们给出解决方案:禁用Nginx配置中的QAT引擎设置。 具体操作步骤总结: 1. 打开Nginx的配置文件(主配置文件以及包含的其他配置文件)。 2. 查找`ssl_engine qatengine;`这样的指令,将其注释掉或删除。 3. 重启Nginx服务。 如果找不到该指令,尝试在启动Nginx脚本或服务文件中设置环境变量`OPENSSL_ENGINES`为空(例如`export OPENSSL_ENGINES=`)然后再启动。 如果上述方法无效,可能需要考虑重新编译Nginx,移除QAT模块支持。 注意:由于引用内容中没有直接涉及QAT引擎的配置,因此我们主要基于错误信息本身和常规的Nginx配置知识进行推理。 如果用户按照上述步骤操作后问题仍然存在,可能需要提供更多关于Nginx安装方式(如是否使用官方预编译包、是否自行编译)以及系统环境的信息。 </think> ### 解决Nginx启动时QAT引擎错误的完整指南 错误表明Nginx在尝试加载英特尔的QAT(QuickAssist Technology)硬件加速引擎时失败,主要涉及两个问题: 1. **QAT引擎加载失败** `ENGINE_by_id("qatengine") failed` 表示OpenSSL找不到QAT引擎 - 可能原因:未安装QAT驱动、配置错误或缺少OpenSSL引擎库 - 引用[1]修改配置的方式可借鉴(修改前备份)[^1] 2. **处理器指令集不支持** `QAT_SW - Processor unsupported` 表示CPU缺少AVX2/AVX512等指令集 - 软件模拟要求CPU支持特定指令集 - 可通过命令验证: ```bash grep -E 'avx2|avx512' /proc/cpuinfo ``` --- ### 解决方案 #### 方法1:禁用QAT引擎(推荐方案) ```bash # 1. 修改Nginx配置文件 sudo sed -i '/ssl_engine/d' /etc/nginx/nginx.conf # 2. 确认OpenSSL引擎配置 sudo grep -r "qatengine" /etc/nginx/ # 查找残留配置 # 3. 重启Nginx sudo systemctl restart nginx ``` > 此方案适用于**无QAT硬件**的情况,通过注释`ssl_engine qatengine;`配置实现 #### 方法2:安装QAT驱动(需硬件支持) 若服务器有英特尔QAT加速卡: ```bash # 1. 下载驱动 wget https://downloadmirror.intel.com/634314/QAT.L.4.24.0-00001.tar.gz # 2. 编译安装 tar zxvf QAT.L.4.24.0-00001.tar.gz cd QAT.L.4.24.0-00001 ./configure make sudo make install # 3. 加载内核模块 sudo modprobe qat_c62x ``` > 安装后执行`openssl engine -c`应显示`qatengine`[^4] #### 方法3:优化Nginx工作进程(引用[2]) ```nginx # /etc/nginx/nginx.conf worker_processes auto; # 自动匹配CPU核心数 events { worker_connections 1024; # 每进程连接数 } ``` 验证工作进程数: ```bash ps aux | grep "nginx: worker" | grep -v grep | wc -l ``` #### 方法4:安全加固(引用[3]) 禁用IP直接访问,防止恶意解析: ```nginx server { listen 80 default_server; server_name _; return 444; # 直接关闭连接 } ``` --- ### 验证步骤 1. 检查Nginx状态: ```bash sudo nginx -t # 测试配置 sudo systemctl status nginx ``` 2. 查看日志: ```bash journalctl -u nginx -xe --since "5 minutes ago" ``` ### 典型错误场景分析 | 错误代码 | 根本原因 | 解决方案 | |---------|---------|---------| | `ENGINE_by_id failed` | QAT引擎未安装或路径错误 | 禁用QAT或安装驱动 | | `ssl engine set failed` | 驱动程序版本不兼容 | 升级QAT驱动至最新版 | | `Processor unsupported` | CPU缺少AVX2/AVX512指令集 | 更换CPU或禁用软件加速 | > 💡 **经验提示**:云服务器通常无QAT硬件,建议直接禁用QAT引擎配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值