踩了不少坑,现将正确方法记录如下:
安装方法参考官方文档。
值得注意的是,目前貌似是由于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
表明安装成功。
从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文件
做到这里看似已经结束了,然而如果在工程中,只链接这两个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
查看结果看是否成功。