Created 04/25/2020 at 10:34PM

前言

最近在学习如何让模型在CPU机器上部署起来,并且要达到速度要求,一般来说,可能需要用C++重写整个模型,将神经网络计算用AVX C语言库和MKL库重写。一个工程化之后的模型速度上可以有极大地提升(相比于pytorch直接用cpu inference),但要学的东西也很多,我们就从配置环境开始吧😀。在这之前,你最好需要一个支持AVX-512指令的intel CPU,不小于2GB的内存和一个Linux系统(本文基于root用户下的CentOS)。

安装cmake

  1. 首先在cmake官方网址下载cmake-x.x.x-Linux-x86_64.tar.gz的文件至服务器
  2. 解压该文件tar -xzvf cmake-x.x.x-Linux-x86_64.tar.gz
  3. mv cmake-x.x.x-Linux-x86_64 /opt/cmake-x.x.x
  4. 创建软链ln -s /opt/cmake-x.x.x/bin/cmake /usr/bin/cmake
  5. 安装完成,测试cmake --version

更新gcc版本

  1. Linux预装的gcc版本太旧,很多特性不支持,需要先更新gcc
  2. 先不要卸载原有的gcc,去官网下载适合你的版本的gcc-x.x.x.tar.gz
  3. 解压该文件tar -xvzf gcc-x.x.x.tar.gz
  4. 编译gcc需要几个依赖包需要提前下载(以往可能需要先编译依赖包,但是现在新版的gcc可以直接在编译gcc过程中编译依赖啦),进入gcc-x.x.x,运行./contrib/download_prerequisites下载依赖
  5. 创建文件夹存放编译时产生的文件,mkdir temp
  6. 配置环境,cd temp && ../configure --prefix=/usr/local/gcc-x.x.x --enable-languages=c,c++ --disable-multilib,其中--prefix表示gcc安装路径,--enable-languages表示你想要gcc支持的语言,--disable-multilib表示取消32位支持
  7. 上面没问题就可以开始编译啦,注意先不要运行类似make -j-j时make针对多核的优化,会加快编译的速度,但也会导致你比较难找到具体的报错或是导致编译失败,建议先用make确定没啥大问题之后,再用make -j来加速你的编译
  8. 等到编译成功之后,运行make install进行安装,成功之后就可以删除temp文件夹,并且卸载掉原先版本的gcc,yum remove gcc
  9. 创建软链ln -s /usr/local/gcc-x.x.x/bin/gcc /usr/bin/gcc && ln -s /usr/local/gcc-x.x.x/bin/g++ /usr/bin/g++
  10. 现在gcc已经安装成功,但是还需要手动更新动态库,找到新版动态库的位置find / -name "libstdc++.so*",复制过去,cp /usr/local/gcc-x.x.x/lib64/libstdc++.so.6.0.xx /usr/lib64/,再更新软链,rm -rf /usr/lib64/libstdc++.so.6 && ln -s /usr/lib64/libstdc++.so.6.0.xx /usr/lib64/libstdc++.so.6,大功告成,测试gcc --version

安装intel MKL(Math kernel Library)

  1. 先去intel官网下载MKL
  2. 解压文件,进入文件夹,运行./install.sh,如果在root下运行,mkl会安装到/opt下面,如果是user运行会安装到/home/user
  3. 运行install后,intel会有很完善的安装指引,请仔细阅读指引
  4. intel提供了脚本设置环境变量,但是不设置也是可以用的,如果你的程序涉及到MKL库,编译的时候需要加上gcc -I/opt/intel/mkl/include demo.c -lmkl_core -lmkl_intel_lp64 -lmkl_sequential -L/opt/intel/mkl/lib/intel64 -L/opt/intel/lib/intel64,对应到cmake就是
link_directories(/opt/intel/lib/intel64)
link_directories(/opt/intel/mkl/lib/intel64)

include_directories(/opt/intel/mkl/include)

target_link_libraries(main mkl_intel_lp64)
target_link_libraries(main mkl_sequential)
target_link_libraries(main mkl_core)

安装icc(Intel C++ Compiler)

  1. 先去官网下载icc,这里需要认证还需要license去验证身份,按着官网的指引一步步来,虽然麻烦但也没啥坑,我是学生就直接去验证了教育邮箱
  2. 解压文件,进入文件夹,运行./install.sh,如果在root下运行,mkl会安装到/opt下面,如果是user运行会安装到/home/user
  3. 运行install后,intel会有很完善的安装指引,请仔细阅读指引,并且会提示你解决一些依赖不足的问题,跟它一步一步来就能搞定,如果有些问题解决不了,比如服务器不需要图形化界面,就选择自定义安装(默认全部安装)
  4. 创建软链ln -s /opt/intel/compilers_and_libraries/linux/bin/intel64/icc /usr/bin/icc && ln -s /opt/intel/compilers_and_libraries/linux/bin/intel64/icpc /usr/bin/icpc
  5. 大功告成,测试icc --version && icpc --version,当然中途你可能会遇到各种小问题,相信善用Google会让你的问题得到解决的🙂