编译Quantization-caffe
最近疯狂肝caffe模型量化,尝试很多模型量化方法,踩坑无数,各家用的量化方式不尽相同,配了多种模型量化环境后,发现自己最初的问题不用量化模型也可以解决,记录一下调研的方法,以及Quantization-caffe编译的问题。
caffe-int8-convert-tools: https://github.com/BUG1989/caffe-int8-convert-tools,基于TensorRT2.0 Int8 calibration tools的量化方法,使用KL算法找到合适的阈值进行Float32到Int8(-127-127)的量化。README文档中有基于TensorRT进行8-bit推理的PDF,代码实现流程很简单,按照HowTo一步一步做没有遇到特殊的问题。
算丰模型量化:https://sophon-edge.gitbook.io/project/toolkit/bmnet-compiler,操作步骤明确,按照网页说明文档没有遇到特别的问题,就是得到的量化模型,需要在特定开发板上进行测试。
NVIDIA/caffe:https://github.com/NVIDIA/caffe,网页介绍上说支持16bit floating point训练和推理,项目提供了cpu和gpu的镜像,如果创建失败,也可以按照caffe官网的编译文档自行编译,只是调研了该项目,还没有亲自编译,但是看文档说明应该和下一个的编译方式大同小异。
Quantization-caffe:https://github.com/GongCheng1919/Quantization-caffe,鬼使神差地开始编译这个项目,可能是被量化给蒙蔽了双眼,这个项目的README文档,在我编译成功后才开始仔细阅读,介绍说的一种ultra-low loss quantization (μL2Q) 量化方法,具体原理有网页有具体的参考文献。下面是针对该项目编译的一些细节。
1. 前提
电脑配置:Ubuntu 16.04 , Tesla P100
拉取镜像:docker pull nvidia/cuda:9.2-cudnn7-devel-ubuntu18.04
项目网址:https://github.com/GongCheng1919/Quantization-caffe.git
2. 编译
在上述镜像下创建容器,下载好代码,解压缩,之后就可以开始编译了。
按照caffe官网的编译文档进行,我用的是cmake的编译方式。http://caffe.berkeleyvision.org/installation.html#prerequisites
1. 在Quantization-caffe-master下执行以下操作
我的路径如下:
root@b6cfae995923:/home/Quantization-caffe-master# mkdir build
root@b6cfae995923:/home/Quantization-caffe-master# cd build
root@b6cfae995923:/home/Quantization-caffe-master/build# cmake ..
执行完之后开始报错,原因是少依赖包
2. 装编译所需的依赖包
root@b6cfae995923:/home/Quantization-caffe-master/build# apt install libboost-all-dev libprotobuf-dev protobuf-compiler libhdf5-serial-dev libgflags-dev libgoogle-glog-dev
root@b6cfae995923:/home/Quantization-caffe-master/build# apt install libatlas-base-dev liblmdb-dev libleveldb-dev libsnappy-dev
root@b6cfae995923:/home/Quantization-caffe-master/build# cmake ..
提示Cmake Error at cmake/Dependencies.cmake:99 cmake找不到OpenCV库所在的路径
root@b6cfae995923:/home/Quantization-caffe-master/build# apt install libopencv-dev libopencv-library-dev
root@b6cfae995923:/home/Quantization-caffe-master/build# apt install python-pip doxygen git
root@b6cfae995923:/home/Quantization-caffe-master/build# pip install numpy
装完以上依赖包之后提示GIT : unknown,卸载该包重新装过还是没有用,就搁置了,除了这项,其他的都显示正常。
没有报错之后继续执行以下的命令等待编译成功就行了。
root@b6cfae995923:/home/Quantization-caffe-master/build# make all
root@b6cfae995923:/home/Quantization-caffe-master/build# make install
root@b6cfae995923:/home/Quantization-caffe-master/build# make runtest
编译成功后会提示
【100%】Built target runtest
3. 测试
该开源项目支持配置量化,如果未在模型中配置任何量化参数,则默认情况下将执行全精度的网络模型。
-
Configure quantization
如果上述安装执行完成后,可以将指定的压缩参数(如下所示)添加到每个层,以示该层需要执行的压缩操作。
weights_compress:"ULQ" weights_compress_param{ maxbits:8 }
其中 weights_compress: 量化方式
weights_compress_param: 量化参数
-
运行demo.py
caffe模型支持 LevelDB,LMDB,和HDF5三种格式的输入,所以在运行demo.py前可以先执行以下命令
# Download data ./data/mnist/get_mnist.sh # Prepare data ./examles/mnist/create_mnist.sh
如果提示没有 convert_mnist_data.bin文件,从build文件夹下把上述文件拷贝到./example/mnist下,执行./convert_mnsit.sh便会生成caffe模型需要的LMDB文件。
然后运行demo.py
No module named pylab : pip install matplotlib No module named _tkinter: apt install python-tk No module named skimage.io: pip install scikit-image No module named google.protobuf.internal: pip install protobuf Check failed: error == cudaSuccess (10 vs. 0) invalid device ordinal:demo.py 设置caffe.set_device(0)
-
测试通过