本文目标
从源码开始编译 Tensorflow 1.15 版本。,网络上已经有很多教程了, 本篇文章,不打算讲解编译一开始各种环境的准备,直接说明在开发过程中,我们用到的几种编译方式和编译目标。
最终编译生成的东西分为三类:
- 编译两个主要的库文件,可供 C++ 程序和 python 直接调用;
- 编译 whl 文件,可提供给用户直接安装;
- 编译 Test 文件,可以执行 Tensorflow 自身携带的测试用例;
编译步骤
编译单元测试用例
在开发tensorflow 过程中,开发最多的就是增加和修改 OP,这个时候需要对所加的 OP 进行单元测试,或者我们需要知道 tensorflow 本来某个 OP 的单元测试结果,那么就可以用一下命令编译;
# 以 matmul op 为例
bazel build --config=cuda -c dbg //tensorflow/core/kernels:matmul_op_test --verbose_failures
# 编译完之后,生成的可执行文件路径为
bazel-bin/tensorflow/core/kernels/
# 也可以直接使用一下命令编译和执行一次性完成
bazel test --config=cuda -c dbg //tensorflow/core/kernels:matmul_op_test
bazel run --config=cuda -c dbg //tensorflow/core/kernels:matmul_op_test
编译 so
目的是,在开发 tensorflow 的过程中, 没有必要每次都编译 whl package 来安装生效,这样比较花费时间,如果我们是在 c++ 层代码, 仅仅需要在改动 c++ 之后, 编译需要调用的 so 文件,然后替换掉系统中的 so 文件;
前提:系统已经安装了官方的 whl 包,对应位置如下:
/usr/local/lib/python3.6/dist_packages/tensorflow_core/libtensorflow_framework.so.1
/usr/local/lib/python3.6/dist_packages/tensorflow_core/python/_pywrap_tensorflow_internal.so
我们的目的就是,编译出上面两个 so 文件,然后替换掉上述路径的 so,这样每次我们修改 c++ 源码之后,只需要替换两个 so 就可以快速验证结果;
# 生成:libtensorflow_framework.so.1
bazel build --config=v1 -c dbg //tensorflow:libtensorflow_framework.so --verbose_failures
# 生成:_pywrap_tensorflow_internal.so
bazel build --config=v1 -c dbg //tensorflow:_pywrap_tensorflow_internal.so --verbose_failures
# --verbose_failures: 打印编译输出详细信息
编译 .whl 安装包
如果确定开发完成,最终要提供客户使用,那么直接编译成安装包即可;
bazel build --config=v1 -c dbg //tensorflow/tools/pip_package:build_pip_package
# 打包
./bazel-bin/tensorflow/tools/pip_package/build_pip_package /home/tensorflow_pkg
# 执行完上述命令之后,生成 tensorflow-xxx.whl
附录
- 代码准备
git clone -b r1.15 https://github.com/tensorflow/tensorflow.git
-
环境
ubuntu18.04
gcc-7.5.0
bazel 0.26.1 -
参考资料
https://tensorflow.google.cn/install/source?hl=zh-cn
https://zhuanlan.zhihu.com/p/376613039