上两节介绍的权值预加载技术,在很多业务中是真实存在的。
只不过限于本小册内容以及大部分同学硬件设备的局限,这里无法通过真正的推理框架(比如 tvm, pytorch) + GPU 来实现底层细节,这些推理框架中一般会将类似的优化技术封装起来。
作为 tvm 或者 pytorch 的用户,你一般看不到这些实现细节,除非你是这些框架的开发者。
因此,为了介绍这个优化,我通过 81、82 这两节内容来引入了一个简单的硬件-内存模型。
整个权值预加载技术的实现思路为:尽可能的在执行模型推理前,将权值存放在距离计算单元最近的存储器中,比如内存中或 L2 缓存中。如果你用 CUDA 写过 GPU 的 kernel,可能你会有更深刻的理解。
这里,我们模拟的就是将权值从 txt 文件(硬盘),预加载到了内存中,相比于硬盘,内存距离计算单元(CPU)更近一些。
评估下性能
在相同的环境下,分别运行 2nd_avx2 和 3rd_preload 下的 compile.sh 脚本进行代码编译,然后运行编译后生成的可执行文件 ./resnet。
可以分别获取到权值预加载前后的性能指标。
可以看到性能提升非常明显:优化前平均推理延时为 5044 ms,优化后为 862 ms,性能提升了大概 6 倍。
注意:不同电脑机器不同环境下测出来的性能会有差异,大家只需要比对性能提升的相对值即可。