【PyTorch】模型 FPS 测试 Benchmark(参考 MMDetection 实现)

这篇具有很好参考价值的文章主要介绍了【PyTorch】模型 FPS 测试 Benchmark(参考 MMDetection 实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

深度学习中,模型的速度和性能具有同等重要的地位,因为这直接关系到模型是否能在实际生产应用中落地。在计算机视觉领域,FPS(模型每秒能够处理的图像帧数)是一个重要且直观地反映模型处理速度的指标,基本在所有图像处理类任务中都有用到,例如图像超分,图像修复和目标检测等等。本文从 MMDetection 中抽取了 FPS Benchmark,并做了微小的修改,以便快速测试。

代码

参数 描述
model 继承 torch.nn.Module 类实例化的 PyTorch 模型。
input_size 模型可接受的输入维度。注意第一个维度是 batch_size,必须为 1,余下的维度根据模型来设置。
device 选择在 GPU 或 CPU 上测试 FPS。默认是在 CPU 上测试,也支持 GPU,例如 cuda:0 是在机器的第一张独立显卡上测试。
warmup_num 预热次数。因为模型刚开始测试的几轮速度很慢,会影响 FPS 的测试结果,所以我们直接跳过。
log_interval 打印日志的频率,即每隔多少轮打印计算的平均 FPS 值。
iterations 单次测试的总迭代次数。程序会汇总该迭代次数内的所有 FPS 值,并取平均作为我们最终的结果。
repeat_num 重复测试的次数。为进一步缓解测试结果的偶然性,可进行多次重复的测试实验。
import torch
import time


class FPSBenchmark():
    def __init__(
        self,
        model: torch.nn.Module,
        input_size: tuple,
        device: str = "cpu",
        warmup_num: int = 5,
        log_interval: int = 10,
        iterations: int = 100,
        repeat_num: int = 1,
    ) -> None:
        """FPS benchmark.

        Ref:
            MMDetection: https://mmdetection.readthedocs.io/en/stable/useful_tools.html#fps-benchmark.

        Args:
            model (torch.nn.Module): model to be tested.
            input_size (tuple): model acceptable input size, e.g. `BCHW`, make sure `batch_size` is 1.
            device (str): device for test. Default to "cpu".
            warmup_num (int, optional): the first several iterations may be very slow so skip them. Defaults to 5.
            iterations (int, optional): numer of iterations in a single test. Defaults to 100.
            repeat_num (int, optional): number of repeat tests. Defaults to 1.
        """
        # Parameters for `load_model`
        self.model = model
        self.input_size = input_size
        self.device = device

        # Parameters for `measure_inference_speed`
        self.warmup_num = warmup_num
        self.log_interval = log_interval
        self.iterations = iterations

        # Parameters for `repeat_measure_inference_speed`
        self.repeat_num = repeat_num

    def load_model(self):
        model = self.model.to(self.device)
        model.eval()
        return model

    def measure_inference_speed(self):
        model = self.load_model()
        pure_inf_time = 0
        fps = 0

        for i in range(self.iterations):
            input_data = torch.randn(self.input_size, device=self.device)
            if "cuda" in self.device:
                torch.cuda.synchronize()
                start_time = time.perf_counter()
                with torch.no_grad():
                    model(input_data)
                torch.cuda.synchronize()
            elif "cpu" in self.device:
                start_time = time.perf_counter()
                with torch.no_grad():
                    model(input_data)
            else:
                NotImplementedError(
                    f"{self.device} hasn't been implemented yet."
                )
            elapsed = time.perf_counter() - start_time

            if i >= self.warmup_num:
                pure_inf_time += elapsed
                if (i + 1) % self.log_interval == 0:
                    fps = (i + 1 - self.warmup_num) / pure_inf_time
                    print(
                        f'Done image [{i + 1:0>3}/{self.iterations}], '
                        f'FPS: {fps:.2f} img/s, '
                        f'Times per image: {1000 / fps:.2f} ms/img',
                        flush=True,
                    )
                else:
                    pass
            else:
                pass
        fps = (self.iterations - self.warmup_num) / pure_inf_time
        print(
            f'Overall FPS: {fps:.2f} img/s, '
            f'Times per image: {1000 / fps:.2f} ms/img',
            flush=True,
        )
        return fps

    def repeat_measure_inference_speed(self):
        assert self.repeat_num >= 1
        fps_list = []
        for _ in range(self.repeat_num):
            fps_list.append(self.measure_inference_speed())
        if self.repeat_num > 1:
            fps_list_ = [round(fps, 2) for fps in fps_list]
            times_pre_image_list_ = [round(1000 / fps, 2) for fps in fps_list]
            mean_fps_ = sum(fps_list_) / len(fps_list_)
            mean_times_pre_image_ = sum(times_pre_image_list_) / len(
                times_pre_image_list_)
            print(
                f'Overall FPS: {fps_list_}[{mean_fps_:.2f}] img/s, '
                f'Times per image: '
                f'{times_pre_image_list_}[{mean_times_pre_image_:.2f}] ms/img',
                flush=True,
            )
            return fps_list
        else:
            return fps_list[0]


if __name__ == '__main__':
    FPSBenchmark(
        model=torch.nn.Conv2d(3, 64, 3, 1, 1),
        input_size=(1, 3, 224, 224),
        device="cuda:0",
    ).repeat_measure_inference_speed()

参考

https://github.com/open-mmlab/mmdetection/blob/master/tools/analysis_tools/benchmark.py文章来源地址https://www.toymoban.com/news/detail-450890.html

到了这里,关于【PyTorch】模型 FPS 测试 Benchmark(参考 MMDetection 实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MMdetection的环境相关,MMCV和PyTorch、CUDA版本对应

    Python版本参考(3.8):开始你的第一步 — MMDetection3D 1.2.0 文档 PyTorch下载:Previous PyTorch Versions | PyTorch MMCV和PyTorch、CUDA版本对应:安装 MMCV — mmcv 1.7.1 文档 SMOKE环境参考:dl_model_infer/application/smoke_det_app/README.md at dev · yhwang-hub/dl_model_infer · GitHub

    2024年02月11日
    浏览(37)
  • mmdetection基于 PyTorch 的目标检测开源工具箱 入门教程

    MMDetection 支持在 Linux,Windows 和 macOS 上运行。它需要 Python 3.7 以上,CUDA 9.2 以上和 PyTorch 1.8 及其以上。 步骤 0.  从官方网站下载并安装 Miniconda。 步骤 1.  创建并激活一个 conda 环境。 步骤 2.  基于 PyTorch 官方说明安装 PyTorch。 在 GPU 平台上: 步骤 3.  使用 MIM 安装 MMEng

    2024年02月11日
    浏览(41)
  • 固态硬盘测试工具-AS SSD Benchmark

    最近迷上AI,但AI对硬件要求较高,而GPU(显卡)和CPU(处理器)价格太贵,于是小编选择了升级硬盘作为替代方案。 新买的SSD到手,上机设置好后肯定是测试硬盘速度啦~而这款检测工具也是小编比较喜欢用的,它不仅小的(文件大小不到1Mb),而且还方便——AS SSD Benchmar

    2024年02月11日
    浏览(62)
  • Go语言基准测试(benchmark)三部曲之一:基础篇

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos Go的标准库内置的testing框架提供了基准测试(benchmark)功能,可以用来验证本地方法在串行或者并行执行时的基准表现,帮助开发者了解代码的真实性能情况,例如一个方法执行一次的平均耗时,还能

    2024年02月06日
    浏览(48)
  • 人工智能(pytorch)搭建模型13-pytorch搭建RBM(受限玻尔兹曼机)模型,调通模型的训练与测试

    大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型13-pytorch搭建RBM(受限玻尔兹曼机)模型,调通模型的训练与测试。RBM(受限玻尔兹曼机)可以在没有人工标注的情况下对数据进行学习。其原理类似于我们人类学习的过程,即通过观察、感知和记忆不同事物的特点

    2024年02月10日
    浏览(71)
  • Go语言基准测试(benchmark)三部曲之三:提高篇

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos -《Go语言基准测试(benchmark)三部曲》已近尾声,经历了《基础篇》和《内存篇》的实战演练,相信您已熟练掌握了基准测试的常规操作以及各种参数的用法,现在可以学习一些进阶版的技能了,在面

    2024年02月06日
    浏览(40)
  • 环境搭建-Ubuntu20.04.6系统TensorFlow BenchMark的GPU测试

    登录阿里云官方镜像站:阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 Server OS:Ubuntu 20.04.6 LTS Kernel: Linux 5.4.0-155-generic x86-64 Docker Version:24.0.5, build ced0996 docker-compose version:1.25.0 Docker OS:Ubuntu 20.04.5 LTS Nvidia GPU Version:NVIDIA-SMI 470.161.03 CUDA Version: 12.1 TensorFlow Version:1.15.

    2024年02月15日
    浏览(43)
  • 玩转MMDetection-MMDetection中的模型框架文件及参数解读(一)

    该文主要介绍完整的MMDetection包含的配置文件中的模型文件--model.py 以下代码详细逐行解读了模型文件包含的代码含义及使用  采用如上图所示的SwinTransformer作为特征提取网络主干,并进行以下配置。  若想选取其他主干模型,则更改“type=‘新模型名字’ ”,且需要根据你选

    2024年02月12日
    浏览(31)
  • PyTorch学习笔记(十七)——完整的模型验证(测试,demo)套路

    完整代码:  采用GPU训练的模型,两种方法 (1)在CPU上加载,要从GPU映射到CPU,即把model = torch.load(\\\"mynn_9.pth\\\")改为: (2)将image转到GPU中,即把output = model(image)改为:    预测错误的原因可能是训练次数不够多  改成:        

    2024年02月11日
    浏览(38)
  • Baichuan-13B:130亿参数的开源语言模型,引领中文和英文benchmark

    Baichuan-13B: 一个强大的开源大规模语言模型 标题:Baichuan-13B:130亿参数的开源语言模型,引领中文和英文benchmark Baichuan-13B是由百川智能开发的一个开源大规模语言模型项目,包含了130亿参数。该模型在中文和英文的权威benchmark上达到了同尺寸模型的最佳效果。这个项目发布了

    2024年02月16日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包