【Tensorflow】源码编译详细教程

本文目标

从源码开始编译 Tensorflow 1.15 版本。,网络上已经有很多教程了, 本篇文章,不打算讲解编译一开始各种环境的准备,直接说明在开发过程中,我们用到的几种编译方式和编译目标。

最终编译生成的东西分为三类:

  1. 编译两个主要的库文件,可供 C++ 程序和 python 直接调用;
  2. 编译 whl 文件,可提供给用户直接安装;
  3. 编译 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

附录

  1. 代码准备
git clone -b r1.15 https://github.com/tensorflow/tensorflow.git
  1. 环境
    ubuntu18.04
    gcc-7.5.0
    bazel 0.26.1

  2. 参考资料
    https://tensorflow.google.cn/install/source?hl=zh-cn
    https://zhuanlan.zhihu.com/p/376613039

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值