TensorFlow with MKL for c++环境搭建

踩了不少坑,现将正确方法记录如下:

安装bezel


  安装方法参考官方文档。
  值得注意的是,目前貌似是由于bazel的bug,tensorflow的1.4版本编译需要用bazel 0.5.4~0.8.0,再往上的版本会编译失败,具体参考tensorflow的这个issues。
  另外,bazel 0.12也有问题,具体参看这个issues。因此在这里选择bazel 0.11.1版本。

安装完成后使用命令查看bazel版本

sudo bazel version

显示

Build label: 0.11.1
Build target: bazel-out/k8-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Tue May 14 07:48:23 +50148 (1520362424903)
Build timestamp: 1520362424903
Build timestamp as int: 1520362424903

表明安装成功。

编译TensorFlow源码


从github上下载tensorflow源码,或者切换到要保存代码的目录使用命令

sudo git clone git@github.com:tensorflow/tensorflow.git

然后切换到tensorflow目录,配置编译选项,然后开始build

./configure

这里注意若要编译tensorflow GPU版需要手下安装CUDA以及cuDNN,这里不在赘述。

配置完成之后,先安装tensorflow for python ,如果已经有了python版本可略去这一步

sudo bazel build --config=mkl --config=opt //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package  ~/path_to_save_wheel
sudo pip install --upgrade --user ~/path_to_save_wheel/wheel_name.whl

此时python 版本已安装好,然后编译tensorflow for c++。

sudo bazel build --config=mkl --config=opt //tensorflow:libtensorflow_cc.so
cd bazel-bin/tensorflow/
cp libtensorflow_cc.so libtensorflow_framework.so ~/path_to_your_libFolder/

此时就得到了我们需要的两个so文件

编译MKL-DNN源码


  做到这里看似已经结束了,然而如果在工程中,只链接这两个so文件,会发生错误,提示需要libmklml_intel.so与libiomp5.so。如果已经编译过python版本,这两个so文件位于~/path_to_python_package/_solib_local这个路径下。如果没有编译过python版本,则需要再编译一下MKL-DNN。编译MKL-DNN的方法可参考官网教程

编写测试程序


在工程文件夹中新建consoleMain.cpp以及Makefile文件,并新建lib/文件夹,将libtensorflow_cc.so, libtensorflow_framework.so, libmklml_intel.so, libiomp5.so放入lib文件夹中。之后编写源文件与Makefile。
consoleMain.cpp如下:

#include 
#include "tensorflow/core/public/session.h"
#include "tensorflow/core/platform/env.h"
#include "tensorflow/core/graph/default_device.h"
#include "tensorflow/core/util/device_name_utils.h"
#include 
using namespace std;
using namespace tensorflow;
int main(int   argc   ,   char   *argv[]   ,   char   *envp[]) {
        //set environ
        setenv("KMP_BLOCKTIME","0",1);
        setenv("KMP_SETTIONS","1",1);
        setenv("KMP_AFFINITY","granularity=fine,verbose,compact,1,0",1);
        setenv("OMP_NUM_THREADS","4",1);
        //set session option
        tensorflow::SessionOptions options;
        tensorflow::ConfigProto & config = options.config;
        config.set_inter_op_parallelism_threads(1);
        config.set_intra_op_parallelism_threads(4);
        config.set_allow_soft_placement(true);
        config.mutable_gpu_options()->set_allow_growth(true);

        cout<<"tensorflow test session begin."<cout<<"NewSession test pass."<if(!status.ok()) {
                cout<else {
                cout<<"tensorflow test session success."<cout<<"tensorflow test session test pass."<return 0;
}

Makfile如下:

#MKL测试程序

CXX   =  g++
CXXFLAGS = -Wall -Wno-strict-aliasing -Wno-unused-variable

SUBDIR   = $(shell ls ./ -R | grep /)
SUBDIRS  = $(subst :,/,$(SUBDIR))
# tensorflow头文件路径
INCPATHS = -I/usr/local/lib/python2.7/dist-packages/tensorflow/include/
INCPATHS += -I/usr/local/lib/python2.7/dist-packages/tensorflow/include/external/nsync/public/
VPATH = $(subst : ,:,$(SUBDIR))./
SOURCE = $(foreach dir,$(SUBDIRS),$(wildcard $(dir)*.cpp))

OBJS = $(patsubst %.cpp,%.o,$(SOURCE))

OBJFILE  = $(foreach dir,$(OBJS),$(notdir $(dir)))

OBJSPATH = $(addprefix obj/,$(OBJFILE))

LIBPATH = -L./
LIBPATH += -L./lib/
LIBS = -ltensorflow_cc
LIBS += -ltensorflow_framework
LIBS += -liomp5
LIBS += -lmklml_intel
EXE = ./lib/mklTest

all : $(EXE)

$(EXE): consoleMain.o $(filter-out consoleMain.o,$(OBJFILE))
        $(CXX) -std=c++1z $(LIBPATH) -o $@ $^ $(INCPATHS) $(LIBS)
$(OBJFILE):%.o:%.cpp
        $(CXX) -std=c++1z -c -o $@ $<  $(INCPATHS) -pipe -g -Wall


DPPS = $(patsubst %.cpp,%.dpp,$(SOURCE))
include $(DPPS)
%.dpp: %.cpp
        g++ -std=c++11 $(INCPATHS) -MM $(CPPFLAGS) $< > $@.$$$$; \
        sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
        rm -f $@.$$$$ 


.PHONY:clean
clean:
        rm -rf $(OBJFILE)
        rm -rf $(DPPS)
        rm -rf $(EXE)

构建文件,并运行

sudo make
cd lib/
./mklTest

查看结果看是否成功。

你可能感兴趣的:(机器学习,C++)