神经网络预测推理---TensorRT: (比Tensorflow的推理快20倍)
1. Kernel融合: 横向融合(例如1*1卷积等), 纵向融合(卷积+bias+Relu),消除concatenate层(预分配输出缓存,跳跃式的写入);
2. 量化成FP16或者INT8: 减少显存占用,加快推理速度;
3. Auto-Tuning: 例如,对于卷积计算有若干种算法,TensorRT会根据输入数据大小、filter大小、tensor分布、batch大小等等参数针对目标平台GPU进行选择和优化。
4. 动态分配显存:使用时分配;减少显存分配次数,增加显存复用率;
训练使用cuDNN/cuBLAS/thrust
神经网络量化: (好处:模型和激活、梯度变小对显存占用节省;显存占用变小允许更大的batch,加快计算;计算加快;多机多卡间的通信量减少)
1. 训练时对gredient量化,减少网络传输,加快训练速度(1-bit quantization)
2. 预测模型量化,减少模型大小,使得能加载进内存或显存;计算时还是转成float计算;
3. 预测模型量化,输入的样本也量化,中间激活值也用量化的,INT8和INT8直接计算,计算也加速了;(可能要先跑小数据集确定激活值范围,才好量化之)
4. 训练Forward时也进行伪量化,让训练的模型尽量往减少Forward误差上靠拢,从而减少预测时的量化误差;
1. 边的Pruning(剪枝):存成稀疏数组,计算使用cuSPARSE和MKL SPSPARSE库;下标使用diff法存储(类似倒排索引)
2. 训练阶段用INT8量化:用聚类来找每个编码的最优float值;重视max和min,因为大的w对最终结果影响大;
3. 哈夫曼编码实现压缩:量化编码后的w们,还可使用哈夫曼编码来减少bit数;
矩阵SVD分解:用2个小矩阵近似权重矩阵;效果损失较大;
pruning和量化,使网络size变小,除了省空间,也可加快infer速度,因为可增大缓存利用率(cache或shared-memory);