计算量评价
评价指标:
简写 | 含义 |
---|---|
AP | 检测精度 |
Parameters | 参数量,模型有多少参数 |
GFLOPs | 浮点运算数 |
Latency | 网络前向传播的时间 |
FPS | 每秒帧数 |
通常 Latency 不包括后处理时间。
结论
- 参数量低约等于 FLOPs 低
- FLOPs 低不等于 Latency 低
- 参数量低不等于 Latency 低
网络速度和很多因素有关:
- 显卡
- 网络结构
- 网络并行度
- 网络层数
- 软件、驱动版本
神经网络量化部署
量化部署是指将神经网络的权重和激活值从浮点数转换为定点数,以减少计算量和内存占用。
神经网络的计算可以做到多快?首先我们需要了解神经网络的计算过程。
CPU 执行过程
首先我们需要了解 CPU 的执行过程:
AMD ZEN 3 架构的基本数据:
指令 | 微指令数量 | 延迟 | 吞吐量 |
---|---|---|---|
ADD | 1 | 1 | 4 |
ADDSS | 1 | 3 | 2 |
PADDB | 1 | 1 | 4 |
MUL (r8) | 1 | 3 | 1 |
MUL (r32) | 2 | 3 | 1 |
MULPS | 1 | 3 | 2 |
DIVSS | 1 | 10.5 | 0.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))