Skip to content

计算量评价

评价指标:

简写含义
AP检测精度
Parameters参数量,模型有多少参数
GFLOPs浮点运算数
Latency网络前向传播的时间
FPS每秒帧数

FPS=1Latency\mathrm{FPS} = \frac{1}{\mathrm{Latency} }

通常 Latency 不包括后处理时间。

结论

  1. 参数量低约等于 FLOPs 低
  2. FLOPs 低不等于 Latency 低
  3. 参数量低不等于 Latency 低

网络速度和很多因素有关:

  1. 显卡
  2. 网络结构
  3. 网络并行度
  4. 网络层数
  5. 软件、驱动版本

神经网络量化部署

量化部署是指将神经网络的权重和激活值从浮点数转换为定点数,以减少计算量和内存占用。

神经网络的计算可以做到多快?首先我们需要了解神经网络的计算过程。

CPU 执行过程

首先我们需要了解 CPU 的执行过程:

AMD ZEN 3 架构的基本数据:

指令微指令数量延迟吞吐量
ADD114
ADDSS132
PADDB114
MUL (r8)131
MUL (r32)231
MULPS132
DIVSS110.50.3

常规的指令所需时间:

操作时间代价
取指~100(主存) / ~1 缓存
译码> 1
访存~100(主存) / ~1 缓存
执行1 ~ 5
写回~100(主存) / ~1 缓存

操作:

操作时间代价
CPU 进程上下文切换> 1000 (重建缓存)
CPU 线程上下文切换10 ~ 100(切换寄存器组)
Python 加法100 ~ 1000
访问硬盘(机械)4ms(磁盘寻道)
访问硬盘(固态)0.002ms

现代处理器架构

  • x86
  • ARM
  • CUDA
  • FPGA

专用芯片架构:

  • 移除浮点运算器,添加更多整数运算器
  • 移除图形计算设备,不支持图形相关指令
  • 更大的缓存,更大的显存

嵌入式设备:

  • Jetson NX

CPU 与 GPU 通过 PCIE 总线连接的。

CPU 与 GPU 之间总是异步的,CPU 不需要等待 GPU 完成任务再执行。

由于硬件特征和设备流水线的存在,神经网络的延迟与吞吐量并不是完全反比的关系。

我们可以简单测试下 CUDA 设备的特性:

python
import torch
import torchvision
from tqdm import tqdm

DEVICE = 'cuda'

model = torchvision.models.mobilenet_v2(pretrained=True).to(DEVICE)

with torch.no_grad():
    data = torch.rand(size=[1, 3, 224, 224])
    for i in tqdm(range(1024)):
        o = model.forward(data.to(DEVICE))

    data = torch.rand(size=[128, 3, 224, 224])
    for i in tqdm(range(128)):
        o = model.forward(data.to(DEVICE))