tensorflow编译环境配置

一、Linux操作系统的选择

理论上,tensorflow的编译与Linux操作系统的版本不同没什么关系,但是,使用一个合适的Linux版本能省很多的麻烦。 以Ubunatu操作系统为例
我使用最新的版本20.0.4,明显感觉到了其存在很多bug,比如desktop的文件清理,和sever版本突然冒出个不伦不类的图形界面。
这里 我推荐安装Ubuntu的16.0.4版本,另外tensorflow目前只保证支持16.0.4和18.0.4版本的Ubuntu系统。 另外16.0.4的系统已经预装python2.7,和3.5不用自己装了(2.x好说,apt就能装,3.x就要自己编译,要装一堆的依赖)
(后来的补充:最后是用的Ubuntu20.0.4编译成功的)

二、编译支持

rensorflow我查到的编译方式我查到的有两种,一种是cmake另一种是bazel,cmake只有在比较低的版本中才有用,因为后面tensorflow不想支持cmake了,tensorflow指定bazel编译。tensorflow 与bazel版本对应关系比较严格。

三、编译实例

现在完成了tensorflow r2.2版本的编译。主要环境如下:
python 3.6.12 bazel 2.0.0(参考:https://docs.bazel.build/versions/master/install.html) Ubuntu 20.0.4 环境配置好以后 ./configure(cpu版本都选n) bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package 再运行tensorflow/bazel-bin/tensorflow/tools/lib_package中README.md上编译C api的命令。 bazel build --config opt //tensorflow/tools/lib_package:libtensorflow 得到lib。 麻烦:1.用bazel编译1.x版本的tensorflow,bazelisk无法自动切换(因为无法读取bazel的配置信息) 2.用bazel编译除2.x版本的tensorflow,报错如下: Server terminated abruptly (error code: 14, error message: 'Socket closed', log file: '/home/tcy/.cache/bazel/_bazel_tcy/28a0800c39a766b94ee7d45d854c027e/server/jvm.out')

补充

现在已经完成了tensorflow2.3.0版本的编译 python 3.6.12 Ubuntu20.0.4 bazel:bazelisk自动选择 上文出的问题可以在build后添加-j 16解决(原因:内存不够,可以限制任务数解决)

四、项目环境和动态链接.so配置(以tensorflow2.3.0为例)

1.动态链接.so处理

编译结束后得到一些压缩文件 1.解压缩libtensorflow.tar.gz 2.得到一个include文件夹和一个lib文件夹,include中是c的接口头文件,lib中有六个文件 libtensorflow.so; libtensorflow.so.2; libtensorflow.so.2.3.0; libtensorflow_framework.so; libtensorflow_framework.so.2; libtensorflow_framework.so.2.3.0; 3.include文件夹放在项目里,lib中的文件需要创建软连接 4.创建软连接,在/usr/local/lib中创建六个软连接,与步骤2中的6个文件名称相同,但是都指向 lib中 .so.2.3.0的文件。

2.项目环境配置

  1. 建立项目:Linux,C++
  2. 添加附加包含目录:将tensoflow中的头文件所在目录include(不是tensorflow,也不是c,是include这一级)添加到附加包含目录。
  3. 将以下路径添加到链接器:附加依赖项 /usr/local/lib/libtensorflow.so; /usr/local/lib/libtensorflow.so.2; /usr/local/lib/libtensorflow.so.2.3.0; /usr/local/lib/libtensorflow_framework.so; /usr/local/lib/libtensorflow_framework.so.2; /usr/local/lib/libtensorflow_framework.so.2.3.0;
  4. 第一个tensorflow代码
#include <cstdio>
#include"tensorflow/c/c_api.h"

int main()
{
    printf("Hello from TensorFlow C library version %s\n", TF_Version());
    return 0;
}

运行结果:

3、问题总结

  1. 在服务器上编译并且运行的代码,在自己的虚拟机上报错 解决:虚拟机版本太低,某些组件不支持运行tensorflow2.3.0的动态文件 安装新版本的虚拟机即可(不拍折腾可以尝试升级组件)
  2. illegal instruction(core dump) 似乎是CPU型号和虚拟机的问题:在服务器上编译且能够运行的代码在自己虚拟机上可以编译,但是不能够运行。

tensorflow模型保存(从官网上看到的)。

保存完整模型的方式,根据官网的说明有两种方法。

1.保存为pd格式

先建立save_model文件夹再

model.save('saved_model/my_model')

在saved_model/my_model文件夹中得到如下文件 assets saved_model.pb variables 重新加载

new_model = tf.keras.models.load_model('saved_model/my_model')
new_model.summary()#检查其架构

这一部分要放在C中实现

2.HDF5格式保存

保存

model.save('my_model.h5')

调用

new_model=tf.keras.models.load.model('my_model.h5')
new_model.summary()#检查其架构

tensorflow模型C/C++加载

(研究中)


本文章使用limfx的vsocde插件快速发布