探索flutter框架开发的app在移动应用市场的潜力与挑战
1084
2022-09-06
Mac 下 TensorFlow C++ API 的编译与测试
Mac 下 TensorFlow C++ API 的编译与测试
文章目录
Mac 下 TensorFlow C++ API 的编译与测试
广而告之准备工作开始编译测试用例参考资料
在前篇博客介绍了从源码编译 TensorFlow 的 .whl 文件, 以便用 pip 进行安装. 本文介绍 TensorFlow C++ API 的编译与测试, 为后续用 C++ 玩耍 TF 打下基础 ----.
广而告之
准备工作
Python 环境准备
我采用的是 Anaconda3-4.2.0 发行版, Python 的版本为 3.5.2.
- TensorFlow 源码, 因此-完源代码后, 使用 git 进行分支切换 (比如希望切换至r2.0 版本)
git clone --recursive ## - TensorFlowcd tensorflow/ ## 最好备份一份源代码git checkout r2.0 ## 切换到 r2.0 版本
安装 Bazel. 需要注意 Bazel 的版本有较为严格的要求, 在前篇博客介绍了切换到r1.10 分支下, 如何安装对应的 Bazel.
此外, 如果安装的 TensorFlow 是 2.0 以上版本, 可以查看 tensorflow/configure.py, 搜索 Bazel 关键字, 查询到:
_TF_MIN_BAZEL_VERSION = '0.24.1'_TF_MAX_BAZEL_VERSION = '0.26.1'
清楚地指明了合适的 Bazel 版本. 由于我最后安装的 TensorFlow 版本是 r2.0 版, 这里我选择了 0.26.1, 于是到 - Mac 版本:
mkdir ~/Programscd ~/Programswget
在当前目录下得到 bazel-0.26.1-darwin-x86_64, 重命名并增加执行权限:
mv bazel-0.26.1-darwin-x86_64 bazelchmod
为了随时能访问 bazel, 需要将其路径加入到环境变量中, 修改 ~/.zshrc 或者 ~/.bashrc 文件, 增加:
export PATH=$PATH:~/Programs
执行 source ~/.zshrc 或者 source ~/.bashrc 或 exec $SHELL 后, 再执行:
bazel version## 输出结果Build label: 0.26.1Build target: bazel-out/darwin-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jarBuild time: Thu Jun 6 11:08:11 2019 (1559819291)
看是否能得到输出结果.
安装automake , 后续编译会用上, 比如 autoconf.
brew install
开始编译
首先要进行设定一些安装选项. 进入tensorflow/ 源码目录下, 并执行./configure 文件, 会要求进行一些配置, 一律选择N, 少给自己添堵~ ----
cd tensorflow/./configureWARNING: Running Bazel server needs to be killed, because the startup options are different.WARNING: --batch mode is deprecated. Please instead explicitly shut down your Bazel server using the command "bazel shutdown".You have bazel 0.26.1 installed.Please specify the location of python. [Default is anaconda3-4.2.0/bin/python]: ## 默认的话则按 Enter 进行确认, 否则添加新的路径Found possible Python library paths: anaconda3-4.2.0/lib/python3.5/site-packagesPlease input the desired Python library path to use. Default is [anaconda3-4.2.0/lib/python3.5/site-packages] ## 默认则按 EnterDo you wish to build TensorFlow with XLA JIT support? [Y/n]: ## nNo XLA JIT support will be enabled for TensorFlow.Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]: ## nNo OpenCL SYCL support will be enabled for TensorFlow.Do you wish to build TensorFlow with ROCm support? [y/N]: ## nNo ROCm support will be enabled for TensorFlow.Do you wish to build TensorFlow with CUDA support? [y/N]: ## nNo CUDA support will be enabled for TensorFlow.Do you wish to download a fresh release of clang? (Experimental) [y/N]: ## nClang will not be downloaded.Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native -Wno-sign-compare]: ## nWould you like to interactively configure ./WORKSPACE for Android builds? [y/N]: ## nNot configuring the WORKSPACE for Android builds.Do you wish to build TensorFlow with iOS support? [y/N]: ## nNo iOS support will be enabled for TensorFlow.## ...
使用 Bazel 进行源码编译
bazel build //tensorflow:libtensorflow_cc.so
等待近一个小时, 编译即可完成. 中间如果报错, Google 吧~. 我到这步没有出现啥问题.
完成编译之后, 会在当前目录下生成多个目录:
├── bazel-bin├── bazel-genfiles├── bazel-out├── bazel-tensorflow├── bazel-testlogs
可以在 bazel-bin/tensorflow 目录下看到编译好后的 libtensorflow_cc.so 文件以及 libtensorflow_framework.1.dylib 文件.
编译其他依赖, 比如 Eigen3, Protobuf, Nsync 等库:
cd tensorflow/ ## 先进入到 tensorflow 的源码目录cd tensorflow/contrib/makefile./build_all_linux.sh ## 执行该脚本, 对依赖项进行编译
等待数十分钟, 完成依赖项的编译. 此时将在 tensorflow/contrib/makefile/downloads 目录下看到各个编译好的依赖项, 包含头文件以及静态库等. 期间曾报错 autoconf not found, 是因为前面 brew install automake 中的 automake 忘了安装.
测试用例
完成 TF 的编译之后, 就要写点 C++ 代码来测试下有没有效果了. 这里参考 Linux环境下编译TensorFlow C++ API和测试方法总结(完美版) 中的测试用例一, 并对 CMakeLists.txt 文件进行了修改, 以符合我的需要.
首先创建一个目录, 用于存放自己写的测试代码 test.cpp:
mkdir localcd
其中 test.cpp 中的内容为:
#include
而 CMakeLists.txt 中的内容为:
#指定 cmake 的最小版本cmake_minimum_required(VERSION 2.8.8)#项目名称/工程名project(demo)#设置c++编译器# Set C++14 as standard for the whole projectset(CMAKE_CXX_STANDARD 14)#设置TENSORFLOW_DIR变量,变量内容为安装的tensorflow文件夹路径set(TENSORFLOW_DIR /Users/xxx/Codes/Python/BuildTF/tensorflow) ## 注意这里是我的 TensorFlow 源码目录# 将源码目录保存到变量中aux_source_directory(. DIR_SRCS) # 搜索当前目录下的所有.cpp文件 #add_library(demo ${SRC_LIST}) #明确指定包含哪些源文件 #设置包含的目录,项目中的include路径,换成自己的路径即可, 注意包含了 TensorFlow 本身以及第三方依赖库的路径include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${TENSORFLOW_DIR} ${TENSORFLOW_DIR}/bazel-genfiles ${TENSORFLOW_DIR}/bazel-bin/tensorflow ${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/nsync/public ${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/eigen ${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/absl ${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/protobuf ${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/protobuf/src ) #设置链接库搜索目录,项目中lib路径link_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/nsync/builds/default.macos.c++11)link_directories(${TENSORFLOW_DIR}/bazel-bin/tensorflow) #动态链接库目录#添加要编译的可执行文件#add_executable(demo test.cpp)add_executable(demo ${DIR_SRCS}) ## 生成可执行文件#设置 target 需要链接的库#添加可执行文件所需要的库,连接libtensorflow_cc.so和libtensorflow_framework库,链接动态链接库#target_link_libraries(demo tensorflow_cc tensorflow_framework)## 其中 ${TENSORFLOW_DIR}/bazel-bin/tensorflow/libtensorflow_framework.1.dylib 不添加也能成功编译target_link_libraries(demo ${TENSORFLOW_DIR}/bazel-bin/tensorflow/libtensorflow_cc.so ${TENSORFLOW_DIR}/bazel-bin/tensorflow/libtensorflow_framework.1.dylib)
完成以上步骤后, 在当前目录下创建 build 目录, 并执行如下命令对 test.cpp 进行编译:
mkdir build #创建build文件,是为了将编译程序放到build文件中cd buildcmake .. #使用cmake构建生成make文件make #使用make编译./demo #运行可执行文件
得到如下结果:
2020-04-26 23:20:31.366661: I tensorflow/core/platform/cpu_feature_guard.cc:142]
说明代码被成功编译了!
以后可以和 TensorFlow C++ API 愉快的玩耍了~ (泪流满面) ----
参考资料
Linux环境下编译TensorFlow C++ API和测试方法总结(完美版) 这不是标题党, 而是货真价实的详细资料, 如果遇到问题, 推荐参考. 比如要编译 GPU 版本可以去翻翻. ----Tensorflow c++ 实践及各种坑 还未细看, 以后应该用得着, 先 Mark 一波tensorflow C++ api 可以参考tensorflow c++ API的编译和调用 先存着, 也许以后用得着, 里面的参考资料也不错 (虽然还没看, 从标题可以感觉到)
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~