TensorRT 分析engine的每一层的耗时

该博客介绍了如何实现一个用于记录和分析深度学习模型中各层运行时间的Profiler类。Profiler类继承自IProfiler接口,包含一个Record类型的vector来存储层名及其运行时间。通过reportLayerTime方法,可以将每层的运行时间累加到相应的记录中。printLayerTimes方法则用于打印所有层的平均运行时间,提供模型性能的直观评估。该工具对于理解和优化深度学习模型的计算效率非常有用。

转载自:https://blog.csdn.net/hjxu2016/article/details/109258566

核心代码如下

// profile类,继承自 IProfiler
struct Profiler : public IProfiler
{
    typedef std::pair<std::string, float> Record;
    std::vector<Record> mProfile;
    // 将每一层的运行时间存放到 vector中
    virtual void reportLayerTime(const char* layerName, float ms)
    {
        // find_if找到第一个 r.first 与 layerName 相同的层,返回一个迭代器
        auto record = std::find_if(mProfile.begin(), mProfile.end(), [&](const Record& r){ return r.first == layerName; });
        // 如果是新的层就push_back进vector
        if (record == mProfile.end())
            mProfile.push_back(std::make_pair(layerName, ms));
        // 如果是vector中已有的层就直接累加时间,因为他是迭代1000次的,肯定会重复,所以要累加时间
        else
            record->second += ms;
    }
    // 打印各层的运行时间,打印时要除掉 总的迭代次数
    void printLayerTimes()
    {
        float totalTime = 0;
        for (size_t i = 0; i < mProfile.size(); i++)
        {
            printf("%-40.40s %4.3fms\n", mProfile[i].first.c_str(), mProfile[i].second / TIMING_ITERATIONS);
            totalTime += mProfile[i].second;
        }
        printf("Time over all layers: %4.3f\n", totalTime / TIMING_ITERATIONS);
    }
} gProfiler;
————————————————
版权声明:本文为CSDN博主「hjxu2016」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hjxu2016/article/details/109258566
<think> 我们正在讨论如何使用 Polygraphy 工具来分析 engine 文件的时间性能。Polygraphy 是一个用于深度学习模型推理性能分析和调试的工具,特别适用于 TensorRT 引擎。 根据用户的问题,我们需要使用 Polygraphy 来分析 engine 文件(通常是 TensorRT 引擎文件)的运行时间。Polygraphy 提供了多种工具,其中 `polygraphy run` 命令可以用于运行引擎并收集性能数据。 具体步骤可能包括: 1. 使用 `polygraphy run` 命令加载 engine 文件。 2. 配置输入数据(如果需要的话,但有时可以使用随机数据)。 3. 运行多次迭代以收集稳定的时间统计信息。 4. 输出时间分析报告。 一个典型的命令可能是: ```bash polygraphy run model.engine --trt --iterations 100 --duration 0 ``` 其中: - `model.engine` 是你的 TensorRT 引擎文件。 - `--trt` 表示使用 TensorRT 运行。 - `--iterations 100` 表示运行100次迭代以收集统计信息。 - `--duration 0` 表示不限制运行的总时间(仅由迭代次数控制)。 运行后,Polygraphy 会输出每次推理的耗时以及统计信息(如最小值、最大值、均值、中位数和标准差)。 此外,Polygraphy 还可以生成更详细的报告,包括逐层分析(如果引擎支持)。要获取逐层分析,可以添加 `--profile` 选项: ```bash polygraphy run model.engine --trt --iterations 100 --duration 0 --profile ``` 需要注意的是,逐层分析可能会增加一些开销,并且需要引擎在构建时启用性能分析(profiling)选项。 如果用户需要将结果保存到文件,可以使用重定向或 `--save-output` 选项,但注意 `--save-output` 保存的是输出张量数据,而不是性能数据。性能数据默认输出到标准输出(控制台)。我们可以使用重定向将控制台输出保存到文件: ```bash polygraphy run model.engine --trt --iterations 100 --duration 0 > perf.txt ``` 另外,Polygraphy 还支持将性能数据以 JSON 格式输出,这可以通过 `--save-results` 选项实现: ```bash polygraphy run model.engine --trt --iterations 100 --duration 0 --save-results perf.json ``` 这样,性能数据(包括时序)会被保存到 JSON 文件中,方便进一步分析。 总结一下,使用 Polygraphy 分析 engine 文件时间的步骤是: 1. 准备一个 TensorRT 引擎文件(例如 `model.engine`)。 2. 使用 `polygraphy run` 命令运行该引擎,并指定迭代次数以收集足够的性能数据。 3. 根据需要选择是否进行逐层分析(使用 `--profile`)。 4. 将结果输出到控制台或保存到文件(JSON 格式)。 注意:确保 Polygraphy 已正确安装(可以通过 `pip install polygraphy` 安装)。 现在,我们将根据以上内容生成相关问题。 </think>### 使用 Polygraphy 分析 Engine 文件时间的方法 Polygraphy 是 NVIDIA TensorRT 工具包中的性能分析工具,主要用于分析 TensorRT engine 文件的推理时间和逐层性能。以下是详细操作步骤: #### **1. 基础性能分析** ```bash polygraphy run your_engine.engine \ --trt \ --iterations 100 \ --duration 0 \ --save-output timing.json ``` - **`--iterations 100`**:运行 100 次推理取平均时间 - **`--duration 0`**:禁用时间限制,确保完成所有迭代 - **`--save-output timing.json`**:保存时间数据到 JSON 文件 #### **2. 逐层时间分析** ```bash polygraphy run your_engine.engine \ --trt \ --profile \ --save-engine-layer-info layer_perf.json ``` - **`--profile`**:启用逐层分析 - **`--save-engine-layer-info`**:将各层耗时保存为 JSON 文件 #### **3. 可视化时间线** ```bash polygraphy run your_engine.engine \ --trt \ --save-timeline timeline.json nsight systems -i timeline.json ``` 1. 生成 JSON 格式时间线数据 2. 用 NVIDIA Nsight Systems 可视化分析 #### **4. 关键指标解读** 输出结果包含: - **Latency**:端到端推理时间(含数据拷贝) - **GPU Compute Time**:纯 GPU 计算时间 - **Layer Time**:各算子耗时(如 `Conv2D: 1.2ms`) - **Percentiles**:P50/P90/P99 延迟分布 #### **5. 注意事项** 1. 确保使用 **最新版本** 的 Polygraphy: ```bash pip install --upgrade polygraphy ``` 2. 若需分析动态输入尺寸,添加 `--input-shapes 'input_name:[1,3,224,224]'` 3. 对于 INT8 引擎,添加 `--calibration-cache cache.calib` 校准缓存文件 > **输出示例**: > ``` > [I] Average Inference Time: 4.15 ms (std=0.12ms) > [I] Layer Time (Top 5): > conv1: 1.32ms (31.8%) > relu1: 0.21ms (5.1%) > conv2: 0.98ms (23.6%) > ... > ``` ### 性能优化建议 如果发现性能瓶颈: 1. **算子融合**:使用 `trtexec --layerPrecisions` 检查未融合算子 2. **精度调整**:尝试 FP16/INT8 (`--fp16`/`--int8`) 3. **内存优化**:检查 `--verbose` 日志中的内存拷贝耗时 4. **批处理优化**:测试不同 batch size (`--shapes 'input:bsize,3,224,224'`)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值