linxu tensorflow-1.13.1 C++动态库编译

1、版本要求

版本    Python 版本    编译器    编译工具
tensorflow-1.13.1    2.7、3.3-3.6    GCC 4.8    Bazel 0.19.2
tensorflow-1.12.0    2.7、3.3-3.6    GCC 4.8    Bazel 0.15.0
tensorflow-1.11.0    2.7、3.3-3.6    GCC 4.8    Bazel 0.15.0
tensorflow-1.10.0    2.7、3.3-3.6    GCC 4.8    Bazel 0.15.0
tensorflow-1.9.0    2.7、3.3-3.6    GCC 4.8    Bazel 0.11.0
tensorflow-1.8.0    2.7、3.3-3.6    GCC 4.8    Bazel 0.10.0
tensorflow-1.7.0    2.7、3.3-3.6    GCC 4.8    Bazel 0.10.0
tensorflow-1.6.0    2.7、3.3-3.6    GCC 4.8    Bazel 0.9.0
tensorflow-1.5.0    2.7、3.3-3.6    GCC 4.8    Bazel 0.8.0
tensorflow-1.4.0    2.7、3.3-3.6    GCC 4.8    Bazel 0.5.4
tensorflow-1.3.0    2.7、3.3-3.6    GCC 4.8    Bazel 0.4.5
tensorflow-1.2.0    2.7、3.3-3.6    GCC 4.8    Bazel 0.4.5
tensorflow-1.1.0    2.7、3.3-3.6    GCC 4.8    Bazel 0.4.2
tensorflow-1.0.0    2.7、3.3-3.6    GCC 4.8    Bazel 0.4.2
 

2、编译安装Bazel-0.21.0
TensorFlow要用Bazel来进行构建,所以要先安装Bazel,后面我们编译好动态库后,就可以摆脱Bazel这个依赖了。Bazel官网安装教程:https://docs.bazel.build/versions/master/install-compile-source.html,我这里是按照如下方式操作的,最后输入bazel version命令确认安装成功

wget https://github.com/bazelbuild/bazel/releases/download/0.21.0/bazel-0.21.0-installer-linux-x86_64.sh
chmod +x ./bazel-0.21.0-installer-linux-x86_64.sh
./bazel-0.21.0-installer-linux-x86_64.sh

3、编译TensorFlow-1.31.1

编译libtensorflow_cc.so
git clone 获取tensorflow的源码

git clone https://github.com/tensorflow/tensorflow
cd tensorflow
git checkout r1.13
编译之前,要进行一系列的配置:

./configure
接下来,配置系统会给出各种询问,以确认编译时的配置参数,直接按回车,确认默认值Y(默认值通常就是被大写的选项),下面挑选比较重要的几个参数解释如下:

Do you wish to build TensorFlow with CUDA support? [y/N]: 
No CUDA support will be enabled for TensorFlow.
这个选项是询问是否使用CUDA。CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。如果用户配备有NVIDIA的GPU,可以选择“y”,如果仅使用TensorFlow的CPU版本,回车确认“N”。

Do you wish to build TensorFlow with MPI support? [y/N]: 
No MPI support will be enabled for TensorFlow.
这个选项是询问是否使用MPI。MPI(Message-Passing-Interface 消息传递接口)是实现进程级别的并行程序的通信协议,它通过在进程之间进行消息传递。如果不是基于TensorFlow做并行程序开发,建议回车确认选择默认值“N”。

Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]:
这个选项是指定CPU编译优化选项。默认值就是“-march=native”。这里“m”表示“machine(机器)”,“arch”就是“architecture”简写。“march”合在一起表示机器的结构,如果选择“-march=native”,则表示选择本地(native)CPU,如果本地CPU比较高级,就可以支持SSE4.2、AVX等选项。这里建议选择默认值。

编译过程中可能会报错"no such package '@png_archive//",建议在编译之前运行如下命令:

yum install -y patch
编译C++ API所需的库,期间Bazel需要联网下载许多依赖,时间有点长:

bazel build --config=opt //tensorflow:libtensorflow_cc.so
编译正常完成后,会在bazel-bin/tensorflow/文件夹下生产libtensorflow_cc.so和libtensorflow_framework.so这两个动态库文件。

4、编译Protobuf和Eigen

这个步骤中需要运行autogen.sh,在此之前得 yum install autoconf automake libtool

yum install autoconf   
yum install automake
yum install libtool
# protobuf
mkdir /tmp/proto
./tensorflow/contrib/makefile/download_dependencies.sh
cd tensorflow/contrib/makefile/downloads/protobuf/
./autogen.sh
./configure --prefix=/tmp/proto/
make
make install
 
# eigen
mkdir /tmp/eigen
cd ../eigen
mkdir build_dir
cd build_dir
cmake -DCMAKE_INSTALL_PREFIX=/tmp/eigen/ ../
make install
cd ../../../../../..
————————————————

5、整理库文件和头文件

库文件
mkdir -p ../tf_test/lib
cp bazel-bin/tensorflow/libtensorflow_cc.so ../tf_test/lib/
cp bazel-bin/tensorflow/libtensorflow_framework.so ../tf_test/lib/  # 之前编译r0.12和r1.3版本的库,只需要libtensorflow_cc.so,1.4版本的似乎分成了两个so文件,即还需要libtensorflow_framework.so
cp /tmp/proto/lib/libprotobuf.a ../tf_test/lib/
头文件
mkdir -p ../tf_test/include/tensorflow
cp -r bazel-genfiles/* ../tf_test/include/
cp -r tensorflow/cc ../tf_test/include/tensorflow
cp -r tensorflow/core ../tf_test/include/tensorflow
cp -r third_party ../tf_test/include
cp -r /tmp/proto/include/* ../tf_test/include
cp -r /tmp/eigen/include/eigen3/* ../tf_test/include
————————————————

6、测试

准备好库文件和相应的头文件后,可以编译测试示例:

示例代码tf_test/test.cc:


#include "tensorflow/cc/client/client_session.h"
#include "tensorflow/cc/ops/standard_ops.h"
#include "tensorflow/core/framework/tensor.h"
 
int main() {
  using namespace tensorflow;
  using namespace tensorflow::ops;
  Scope root = Scope::NewRootScope();
  // Matrix A = [3 2; -1 0]
  auto A = Const(root, { {3.f, 2.f}, {-1.f, 0.f}});
  // Vector b = [3 5]
  auto b = Const(root, { {3.f, 5.f}});
  // v = Ab^T
  auto v = MatMul(root.WithOpName("v"), A, b, MatMul::TransposeB(true));
  std::vector<Tensor> outputs;
  ClientSession session(root);
  // Run and fetch v
  TF_CHECK_OK(session.Run({v}, &outputs));
  // Expect outputs[0] == [19; -3]
  LOG(INFO) << outputs[0].matrix<float>();
  return 0;
}

g++ -std=c++11 -I./include -I./include/external/nsync/public -L./lib test.cc -ltensorflow_cc -ltensorflow_framework -o test

如果编译失败遇到一个小问题,./include/tensorflow/core/lib/core/stringpiece.h:29:38: fatal error: absl/strings/string_view.h: No such file or directory
解决办法:cp -r ../tensorflow/tensorflow/contrib/makefile/downloads/absl/absl/ include/.

编译成功后,如果./test失败,没找到库文件,就直接运行下面这句命令

export LD_LIBRARY_PATH=/root/tf_test/lib:$LD_LIBRARY_PATH
正确的情况下,应该会输出19 -3,还会输出类似Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA的信息,这涉及到CPU指令优化的问题,说明在编译动态库的时候没有选择进行指令优化。

参考:

TensorFlow C++动态库编译 https://www.jianshu.com/p/d46596558640

tensorflow c++ API的编译和调用 https://zhuanlan.zhihu.com/p/46566618

TensorFlow学习系列之七:TensorFlow的源码编译 https://blog.csdn.net/yhily2008/article/details/79967118

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/786104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot中Bean注册

Bean注解 Springboot中默认扫描启动类所在的包及其子包。 比如这里的DemoApplication是启动类&#xff0c;那么spring boot默认扫描com.example.demo这个包。 Controller、Service、Repository这三个注解是Component的衍生注解&#xff0c;它们经常会被添加到Controller层、Se…

什么是EDM邮件推广营销?

电子邮件作为最古老的互联网沟通工具之一&#xff0c;凭借其无可比拟的直达性、个性化潜力与高投资回报率&#xff0c;始终占据着企业营销策略的核心地位。随着人工智能技术的革新应用&#xff0c;云衔科技以其前瞻视野与深厚技术底蕴&#xff0c;倾力打造了一站式智能EDM邮件营…

机器学习实战17-高斯朴素贝叶斯(GaussianNB)模型的实际应用,结合生活中的生动例子帮助大家理解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下机器学习实战17-高斯朴素贝叶斯(GaussianNB)模型的实际应用&#xff0c;结合生活中的生动例子帮助大家理解。GaussianNB&#xff0c;即高斯朴素贝叶斯模型&#xff0c;是一种基于概率论的分类算法&#xff0c;广泛应…

免杀对抗-安全工具篇新型Go架构C2-Sliver多平台上线模式红队集成研究免杀方向

首先&#xff0c;你需要分析&#xff1a; 1、安全工具是否有源代码 2、安全工具源代码逻辑复杂程度 3、当前源代码你是否有能力修改 其次&#xff0c;你需要考虑&#xff1a; 1、无源码或无能力修改 2、各种异常bug打包问题 3、修改打包后效果也不太好 故&#xff1a; 1、非源码…

VScode使用Prettier格式化代码

1、安装Prettier插件 2、扩展设置 3、设置.prettierrc.json配置文件路径 4、.prettierrc 配置文件 .prettierrc.json 是 Prettier 格式化工具的配置文件&#xff0c;用于指定代码格式化的规则和风格。下面是一些可能的配置选项&#xff0c;请自行选择&#xff1a; {"prin…

MetaGPT部分源码解读--Memory

storage: list[SerializeAsAny[Message]] []index: DefaultDict[str, list[SerializeAsAny[Message]]] Field(default_factorylambda: defaultdict(list))ignore_id: bool False storage 属性是一个列表&#xff0c;用于存储消息对象。每个消息对象都被标记为 SerializeAsAn…

Yarn与Zookeeper的介绍

Yarn--三大调度策略 FIFO(先进先出): 目前几乎已经没有人使用了. 类似于: 单行道. 好处: 每个计算任务能独享集群100%的资源. 弊端: 不能并行执行, 如果大任务过多, 会导致小任务执行时间过长. Capacity(容量调度): 我们用…

找到矩阵中位于降序15%位置的值

MATLAB实现 clc clearvars; matrix randn(10, 10); % 一个示例矩阵 disp(matrix)value find_value_at_15_percent(matrix); disp([位于降序中15%位置的值为: , num2str(value)]);% 验证 xreshape(matrix,1,100); ysort(x,descend); y(1:16)function value_at_15_percent fi…

缓存(反向代理)服务器-varnish

varnish简介&#xff1a; varnish是一款高性能且开源的反向代理服务器和HTTP加速器&#xff0c;&#xff08;其实就是带缓存的反向代理服务器&#xff09;它可以把整个HTTP响应内容缓存到内存或文件中&#xff0c;从而提高web服务器器的响应速度。 与传统的squid相比&#xff0…

【Java后端开发】教程及案例

Java后端开发是软件开发中的一个重要领域&#xff0c;它涉及到服务器端的程序设计、数据库交互、API开发、安全性处理等多个方面。以下是关于Java后端开发的教程和案例的详细介绍&#xff1a; ### Java后端开发基础 #### 1. Java基础知识 - 掌握Java基础语法、面向对象编程、…

压测Nginx时对Linux内核参数优化,以支持更高的并发

文章目录 Linux内核参数优化参数意义解析注意事项 Linux内核参数优化 编辑/etc/sysctl.conf文件 fs.file-max 999999 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_keepalive_time 600 net.ipv4.tcp_fin_timeout 30 net.ipv4.tcp_max_tw_buckets 5000 net.ipv4.ip_local_port_…

如何提高图片的分辨率?dpi修改工具推荐

在调整分辨率之前&#xff0c;我们需要了解什么是dpi分辨率&#xff0c;简单来说&#xff0c;分辨率是指图像中包含的像素数量&#xff0c;分辨率越高&#xff0c;图像就越清晰&#xff0c;常见的分辨率包括72dpi、96dpi和300dpi等&#xff0c;在打印照片或者一些考试平台对图片…

02-JDK新特性-泛型

泛型 什么是泛型 泛型是JDK5中引入的特性&#xff0c;它提供了编译时类型安全检测机制&#xff0c;该机制允许在编译是检测到非法的类型。 它的本质是参数化类型&#xff0c;也就是说操作的数据类型被指定为一个参数。 也就是将类型有原来的具体类型参数化&#xff0c;然后在…

【CVE复现计划】CVE-2023-27179

CVE-2023-27179 简介&#xff1a; GDidees CMS v3.9.1及更低版本被发现存在本地文件泄露漏洞&#xff0c;漏洞通过位于 /_admin/imgdownload.php 的 filename 参数进行利用。 影响版本&#xff1a; GDidees CMS v3.9.1及更低版本 POC: /_admin/imgdownload.php?filename/fla…

2024蓝桥杯每日一题(树形DP)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;病毒溯源 试题二&#xff1a;没有上司的舞会 试题三&#xff1a;生命之树 试题一&#xff1a;病毒溯源 【题目描述】 病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株&#xff0c;而…

MATLAB 自定义中值滤波(54)

MATLAB 自定义中值滤波(54) 一、算法介绍二、算法实现1.原理2.代码一、算法介绍 中值滤波,是一种常见的点云平滑算法,改善原始点云的数据质量问题,MATLAB自带的工具似乎不太友好,这里提供自定义实现的点云中值滤波算法,具体效果如下所示: 中值滤波前: 中值滤波后:…

前端性能优化-Table渲染速度优化

教务系统-排课页面性能优化总结 一、前言 在公司教务系统中,排课页面慢的令人发指,在某些情况由于数据量大导致页面主进程卡死,遂组织进行一次排查优化,现记录一下 二、效果对比 以下数据均为UAT环境 Performence对比 更改前: 主进程渲染时间为 8s 教务系统-排课页面性…

Ubuntu安装elasticsearch

Ubuntu系统上安装Elasticsearch可以通过多种方式进行&#xff0c;以下是几种常用的安装方法。在开始安装前&#xff0c;请确保你的系统是最新的&#xff0c;这可以通过运行sudo apt update和sudo apt upgrade命令来完成。 方法一&#xff1a;使用APT仓库安装&#xff08;推荐&…

【日常积累】指定ruby版本环境安装

背景说明 在redis的5.0版本之前&#xff0c;使用redis提供的redis-trib创建redis集群时还需要依赖ruby环境。当然有时候我们自已也需要安装指定ruby版本环境。下面是安装时的大致过程&#xff0c;以及过程中遇到的问题解决。我使用的环境是centos7&#xff0c;小版本差别应该不…