当前位置: 首页 > news >正文

深度学习模型部署(四)常用模型及推理平台评估指标

判断选择什么模型,什么量化方案,什么推理框架,最基础的知识就是如何评估自己的模型以及推理平台。

模型衡量标准

衡量一个模型的最直接标准就是运算速度,但是运算速度是无法计算的,所以定义了一些间接标准来推测模型的运算速度。这些标准不仅仅可以用来选择模型的量化方案,在设计模型时也应该有所参考。

模型计算量FLOPs

Floating point operations,浮点运算数量,代表一次推理需要的浮点运算次数

注意不要与FLOPS混淆,FLOPS是floating point operations per second指芯片每秒浮点运算数量用于衡量芯片的运算能力。

例如对于一个普通CNN卷积层,输入尺寸为 C o u t × H × W C_{out}\times H\times W Cout×H×W输出尺寸相同,卷积核尺寸 K = 3 K=3 K=3,添加偏置 b i a s bias bias
一次卷积的运算量:

  • 乘法: C i n K 2 C_{in} K^2 CinK2
  • 加法: C i n ( K 2 − 1 ) + ( C i n − 1 ) + 1 = C i n K 2 C_{in}(K^2-1)+(C_{in}-1)+1=C_{in}K^2 Cin(K21)+(Cin1)+1=CinK2

输出尺寸 C o u t × H × W C_{out}\times H\times W Cout×H×W中的每个像素点都是一次卷积,运算量共计:
2 C i n C o u t H W × K 2 2C_{in}C_{out}HW\times K^2 2CinCoutHW×K2

计算方法的不同以及是否添加bias导致算出来的结果可能不完全一样,无所谓,FLOPs这种就跟算法中的复杂度O(n)差不多,常数不会对结果产生数量级的影响。
FLOPs只是一个衡量标准,还有其他的衡量标准例如MACCs,multiply-accumulate operations,乘-加操作次数,一次乘法+一次加法为一个MACCs,MACCs 大约是 FLOPs 的一半。

模型参数量parameters

顾名思义,模型的参数总量
例如对于普通CNN卷积层,一共有 C i n C o u t C_{in}C_{out} CinCout个卷积核,参数量: C i n C o u t × K 2 C_{in}C_{out}\times K^2 CinCout×K2

模型内存访问代价MAC

一次前向推理的过程中,模型内存交换的总量,体现了模型的空间复杂度。

模型计算强度

I = F L O P s M A C I=\frac{FLOPs}{MAC} I=MACFLOPs,表示每次内存交换对应多少次浮点运算,计算强度越大,模型内存利用率越高,

模型量化就约等于是运算量不变,但是每次运算本来要读取fp32,4个字节,现在换成了读取int8,1个字节,MAC降低了,模型计算强度提高了。

推理平台衡量标准

算力FLOPS

每秒浮点数运算次数,(用 π \pi π来表示)

带宽

每秒的内存交换量,(用 β \beta β表示)

计算强度上限

I m a x = π β I_{max}=\frac{\pi}{\beta} Imax=βπ

理论上模型的计算强度刚好达到推理平台的计算强度上限时性能最佳,这个理论最佳性能称为roof-line。计算强度低于 I m a x I_{max} Imax时被称为带宽瓶颈区,这时推理平台的性能没有完全发挥出来,性能的上限取决于模型的计算强度;计算强度高于 I m a x I_{max} Imax时称为计算瓶颈区,平台的算力得到了充分利用。
在这里插入图片描述

不过想要达到roof-line不是光考虑模型的计算量和内存访问代价就够的。因为实际计算过程中还有除算力和带宽之外的其他重要因素,它们也会影响模型的实际性能,这是 Roofline Model 未考虑到的。例如矩阵乘法,会因为 cache 大小的限制、GEMM 实现的优劣等其他限制,导致你几乎无法达到 Roofline 模型所定义的边界(屋顶)。

GEMM指通用矩阵乘法,这个在后面的blog中我们也要讲到,多年来数学家和计算机科学家都在努力优化矩阵乘法,但是进展不大,最近清华姚班大佬发了一篇paper被称为十年来矩阵乘法的最大优化,有空可以读一下
论文地址:https://epubs.siam.org/doi/10.1137/1.9781611977912.134
在这里插入图片描述
多年来矩阵乘法优化算法的发展历程
pytorch社区中的一篇讲解矩阵乘法的blog:https://pytorch.org/blog/inside-the-matrix/

解放双手

这么复杂的运算,自然不会是考我们人手工计算然后评估模型,实际上有很多用于评估模型的库,实践如下:

pytorch自行计算

如果只是评估模型参数量,不需要进行借助工具,直接两行代码就搞定

from torchvision.models import resnet50model = resnet50()
total = sum([param.nelement() for param in model.parameters()])
print("parameter:%fM" % (total/1e6))

Torchstat

  • 统计模型的参数量、计算量、访存量等指标,且会针对模型的每层指标进行打印;
  • 部分指标与常见含义不同,具体会结合yolov5的指标进行介绍
  • 只对常见网络层进行统计;
  • 安装方法如下:
pip install torchstat
  • 使用方法如下:
import torch
import torchvision.models as models
from torchstat import statmodel = models.resnet50(pretrained=True)# 使用torchstat的stat函数来分析模型
stat(model, (3, 224, 224))

Thop

top这个词在计算机领域很常见,很多关系到性能的都会有top这个词,例如Linux平台下的性能管理工具:top,Jetson中的性能检测工具:jtop。这是为啥呢,不懂。

  • 统计模型的参数量和计算量;
  • 部分指标与常见含义不同,具体会结合yolov5的指标进行介绍;
  • 只对常见网络层进行统计;
  • 安装方法如下:
pip install thop
  • 使用方法如下:
from torchvision.models import resnet50
from thop import profile
model = resnet50()
input = torch.randn(1, 3, 224, 224)
flops, params = profile(model, inputs=(input, ))
print("FLOPs=", str(flops/1e9) + '{}'.format("G"))
print("params=", str(params/1e6) + '{}'.format("M"))

更复杂的使用建议用到了再去翻文档学习,工具类的提前学习没有意义。

如果感觉有帮助,点赞收藏+关注,thanks

相关文章:

深度学习模型部署(四)常用模型及推理平台评估指标

判断选择什么模型,什么量化方案,什么推理框架,最基础的知识就是如何评估自己的模型以及推理平台。 模型衡量标准 衡量一个模型的最直接标准就是运算速度,但是运算速度是无法计算的,所以定义了一些间接标准来推测模型的…...

【控制台警告】npm WARN EBADENGINE Unsupported engine

今天用webpack下载几个loader依赖,爆出了三个警告,大概的意思就是本地安装的node和npm的版本不是很匹配? 我的解决思路是: 先检查node和npm版本 然后去官网查找版本的对应 靠,官网404 Node.js (nodejs.org) 就找到…...

ArmSoM Rockchip系列产品 通用教程 之 GPIO 使用

1. GPIO简介​ GPIO,全称 General-Purpose Input/Output(通用输入输出),是一种在计算机和嵌入式系统中常见的数字输入输出接口。它允许软件控制硬件的数字输入和输出,例如开关、传感器、LED灯等。GPIO通常由一个芯片或…...

npm镜像源地址

镜像源地址替换问题(重要) 2024 年 1 月 22 日 ,registry.npm.taobao.org 的 SSL 证书正式过期。 2022 年 5 月 淘宝源发布了公告: (大家应该没有太多关注哦,也包括我,哈哈) &am…...

Java的Writer类详解

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…...

R语言基础的代码语法解译笔记

1、双冒号,即:“::” 要使用某个包里的函数,通常做法是先加载(library)包,再调用函数。最新加载的包的namespace会成为最新的enviroment,某些情况下可能影响函数的结果。而package name::funct…...

【蓝桥杯】蓝桥杯算法复习(一)

😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!&#x1f4…...

移动端精准测试简介

在测试领域每隔一段时间,就会有一些主流的测试技术,比如说:接口自动化,WebUI, AppUI自动化,然后就是测试平台的开发,各类专项测试(性能,安全),再到前几年的手机集群云测平…...

CCProxy代理服务器地址的设置步骤

目录 前言 一、下载和安装CCProxy 二、启动CCProxy并设置代理服务器地址 三、验证代理服务器设置是否生效 四、使用CCProxy进行代理设置的代码示例 总结 前言 CCProxy是一款常用的代理服务器软件,可以帮助用户实现网络共享和上网代理。本文将详细介绍CCProxy…...

探秘分布式神器RMI:原理、应用与前景分析(二)

本系列文章简介: 本系列文章将深入探究RMI远程调用的原理、应用及未来的发展趋势。首先,我们会详细介绍RMI的工作原理和基本流程,解析其在分布式系统中的核心技术。随后,我们将探讨RMI在各个领域的应用,包括分布式计算…...

[项目设计] 从零实现的高并发内存池(三)

🌈 博客个人主页:Chris在Coding 🎥 本文所属专栏:[高并发内存池] ❤️ 前置学习专栏:[Linux学习] ⏰ 我们仍在旅途 ​ 目录 4.CentralCache实现 4.1 CentralCache整体架构 4.2 围绕Span的相关设计…...

将Q算法和D算法结合应用到llm解码上之人在回路

将Q算法和D算法结合应用到llm解码上之人在回路 参考地址代码解释 参考地址 https://dongfangyou.blog.csdn.net/article/details/136466609 代码 import numpy as np from tqdm import tqdmfrom sample import net, char2id_dict, get_real_p# 假设的词汇表 VOCABULARY lis…...

el-table-column嵌套el-form-item不能进行校验问题解决

项目为vue3elementPlus开发的项目 业务要求:table表格展示数据,其中有一行是ip地址可展示可修改,此处要求增加自定义校验规则 先看一下效果: 此处先描述一下,问题出在了哪里,我将el-table的data,使用一个…...

leetcode200. 岛屿数量

leetcode200. 岛屿数量 题目 思路 遍历每一个网格,若网格为1,岛屿数量1,利用一个深度优先搜索函数将岛屿置零,注意判断数组边界 代码 class Solution:def numIslands(self, grid: List[List[str]]) -> int:self.grid grid…...

MySQL--索引类型详解

索引的类型 主键索引: PRIMARY KEY,当一张表的某个列是主键的时候,该列就是主键索引,一张表只允许有一个主键索引,主键所在的列不能为空。 创建主键索引的SQL语法: # 给user表中的id字段创建名为id_ind…...

R语言中ggplot2图例位置、颜色、背景、标题

目录 1、不显示图例 2、自定义图例位置 3、修改图例背景颜色、外框颜色、大小 4、修改图例大小 5、图例设置背景、线框为空 6、自定义设置多个图例的标题 7、设置多个图例的之间的间隔 8、取消不需要的图例显示 1、不显示图例 theme(legend.position "none"…...

波卡 Alpha 计划启动,呼唤先锋创新者重新定义 Web3 开发

原文:https://polkadot.network/blog/the-polkadot-alpha-program-a-new-era-for-decentralized-building-collaboration/ 编译:OneBlock 区块链领域不断发展,随之而来的是发展和创新机会的增加。而最新里程碑是令人振奋的 Polkadot Alpha …...

公网IP与私有IP及远程互联

1.公网有私有IP及NAT 公网IP是全球唯一的IP,通过公网IP,接入互联网的设备是可以访问你的设备。但是IPV4资源有限,一般ISP(Internet Service Provider)并不会为用户提供公网IP。所以家里的计算机在公司是没法直接使用windows远程桌面直接访问…...

openCV xmake debug失效 release可以使用

在使用xmake构建一个项目时,添加openCV库,调用 imread函数时,debug函数失效, release可以使用,最后发现是xmake.lua写的有问题 option("OpenCV4.6.0")set_showmenu(true) set_default(true) set_category(&…...

ES分布式搜索-IK分词器

ES分词器-IK 1、为什么使用分词器? es在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。 我们在kibana的DevTools中测试: GET /_analyze {"analyzer": "…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...