理论上,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解决(原因:内存不够,可以限制任务数解决)
编译结束后得到一些压缩文件
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的文件。
/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;#include <cstdio>
#include"tensorflow/c/c_api.h"
int main()
{
printf("Hello from TensorFlow C library version %s\n", TF_Version());
return 0;
}
运行结果:
保存完整模型的方式,根据官网的说明有两种方法。
先建立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中实现
保存
model.save('my_model.h5')
调用
new_model=tf.keras.models.load.model('my_model.h5')
new_model.summary()#检查其架构
(研究中)
本文章使用limfx的vsocde插件快速发布