c++调用tensorflow2.3接口(tensorflow2.x的c++编译)

c++调用tensorflow2.x训练结果()

注:
  • 本来想着用Tensorflow2.x训练模型,然后用C++去调用模型进行预测.后来计划有变,于是只完成了编译tensorflow生成.so文件.至于后续怎么用C++调用就没有去研究了.
  • 本文说明的是2.x版本的tensorflow的编译,其他版本的编译类似.1.x应该也是.只是编译需要的库的版本不一致.不过版本不一致在编译的过程中会有提示,按着提示安装对应版本的库就行了.

整个的安装过程是从0开始的,也就是从一个全新的Linux进行的.会安装所有用到的软件.

整个的环境:

  • Centos 7.6
  • 12G内存
  • 6核处理器
  • 200G硬盘大小

其中:

  • 12G内存是因为编译tensorflow这玩意儿太耗内存,我6G的时候在执行命令 (bazel build --config=opt //tensorflow:libtensorflow_cc.so) 的时候会报错直接退出.报错内容大概长下面这样:fatal error: Killed signal terminated program cc1plus Exit(1)

  • 6核处理器这里,其实4核差不多就够用了.

  • 200G硬盘大小.实际上用不到200G.但是我估计安全起见怎么说也得弄个50G吧.我只是偷懒直接弄了200G.这里是因为我在这个过程中遇到的坑.一开始我只分配了20G给虚拟机.然后也能编译完成,但是!!! 后续配置一系列环境等其他操作的时候,很难受的发现磁盘空间都占满了(不确定是哪里的问题).然后尝试扩容,历经九九八十一难最后放弃(什么逻辑卷,物理卷的,扩展逻辑卷,然后虚拟机好像又没弄逻辑卷什么什么的.反正很头疼).所以最好保证你的虚拟机分配50G以上.


首先安装一些必要的环境

1.安装gcc8.5

  1. 首先安装依赖
yum install m4
yum install -y glibc-headers gcc-c++
yum install zlib-devel.x86_64
  1. 安装gcc8.5
wget  http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-8.5.0/gcc-8.5.0.tar.gz
tar -zxvf  gcc-8.5.0.tar.gz
cd gcc-8.5.0/
  1. 进入gcc以后,先修改一个配置文件,不然有些东西下载起来很慢.
vim ./contrib/download_prerequisites 
  1. 将其中的base_url修改为:
base_url='http://www.mirrorservice.org/sites/sourceware.org/pub/gcc/infrastructure/'
  1. 修改完成后保存并关闭,然后执行下面的语句
./contrib/download_prerequisites
mkdir build
cd build
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib

6.上述步骤完成后,编译并安装gcc,编译大概半小时.安装比较快,几分钟.安装完成后输入gcc -v可以看到gcc版本已经变了.

make -j 4 && make install

2.安装python3.7

  1. 下载安装
yum install libffi-devel -y
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
tar -zxvf Python-3.7.0.tgz
cd Python-3.7.0
./configure
make&&make install
  1. 环境配置
mv /usr/bin/python /usr/bin/python.bak
ln -s /usr/local/bin/python3 /usr/bin/python
ln -s /usr/local/bin/pip3 /usr/bin/pip

3.修改配置文件
分别执行vi /usr/libexec/urlgrabber-ext-downvi /usr/bin/yum,将这两个文件的第一行:#!/usr/bin/python修改为#!/usr/bin/python2.7

3.下载安装future

点击下载下载future-0.18.2.tar.gz然后上传到服务器
上传完毕后执行下面的命令

tar -zxvf future-0.18.2.tar.gz 
cd future-0.18.2/
python setup.py install

4. 其他依赖

  1. 编译最开始先执行一条命令,这条命令是因为后续编译的过程中没有Numpy会报ModuleNotFoundError.我目前记得好像只需要安装这一个,如果报了其他ModuleNotFoundError,对应的安装一下就行了.
yum install numpy
  1. 注意,这里可以执行一下java -version命令看看现在虚拟机是否有JDK环境了.这里应该会显示JDK8.后续安装后用到JDK,如果没有的话安装一下.

5.Bazel安装

  1. 安装
wget https://copr.fedorainfracloud.org/coprs/vbatts/bazel/repo/epel-7/vbatts-bazel-epel-7.repo
mv vbatts-bazel-epel-7.repo  /etc/yum.repos.d/
yum install bazel4
  1. 执行bazel version查看bazel版本,这里应该是4.1.0版本的

关于Bazel的话,不同版本的tensorflow有不同版本的要求.如果版本不符合要求,它会有提示的,告诉你要求的版本是多少.(怎么下载任意版本的bazel我还不是摸得很清楚.yum install bazel3下的是3.x版本的.yum install bazel下载的是1.x版本的,)

6. tensorflow下载编译

点击下载拉倒页面最下面,下载tensorflow源码包,下载tar.gz格式的.

tar -zxvf tensorflow-2.3.0.tar.gz
cd tensorflow-2.3.0/
./configure

configure执行的过程中,一直回车就行了.其他不用管(这里安装的是CPU版的,其他版的在这里需要设置一下,具体没研究).

这里会出现一个错误,这个错误会给你一个提示的命令,把它执行一遍就行了.

cd "/usr/bin" && curl -fLO https://releases.bazel.build/3.7.2/release/bazel-3.7.2-linux-x86_64 && chmod +x bazel-3.7.2-linux-x86_64

最后,先重启一遍虚拟机,然后再执行以下命令.不重启的话有些东西它会找不到.

yum install git
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
bazel build --config=opt  //tensorflow:libtensorflow_cc.so
bazel build -c opt --verbose_failures //tensorflow:libtensorflow_framework.so

安装git,git用于接下来的命令要通过git下载东西.
export命令好像是暂时的,意思是如果重启了.需要重新export一次,然后再执行bazel命令.
第一个bazel比较慢,要编译8000+文件,好像大概要2.3个小时.第二个就2000+文件,相对快点.

编译完成后将在tensorflow/bazel_bin/tensorflow文件夹中出现libtensorflow_cc.so和libtensorflow_framework.so两个文件.

我就研究到这里.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TensorFlow 2 可以使用 C++ API 进行编译,以便在 C 或 C++调用。以下是一些基本步骤: 1. 首先,您需要安装 TensorFlow 2 的 C++ API。可以使用以下命令: ```shell pip install tensorflow-cpp ``` 2. 然后,您需要编写一个 C 或 C++ 程序,以便在其中调用 TensorFlow 2。例如,以下是一个简单的 C++ 程序,它使用 TensorFlow 2 来执行一个简单的矩阵乘法: ```c++ #include <iostream> #include <tensorflow/c/c_api.h> int main() { // 创建 TensorFlow 会话 TF_SessionOptions* session_options = TF_NewSessionOptions(); TF_Status* status = TF_NewStatus(); TF_Session* session = TF_NewSession(session_options, status); TF_DeleteSessionOptions(session_options); // 加载模型 TF_Graph* graph = TF_NewGraph(); TF_Buffer* graph_def = TF_NewBuffer(); TF_SessionRunOptions* run_options = TF_NewSessionRunOptions(); TF_SessionPRunSetup* prun_setup = TF_NewSessionPRunSetup(); TF_Buffer* error_msg = TF_NewBuffer(); TF_Status* status_load = TF_NewStatus(); TF_SessionOptions* sess_opts = TF_NewSessionOptions(); TF_GraphImportGraphDef(graph, graph_def, NULL, status_load); // 创建输入张量 const std::int64_t dims[] = {2, 2}; const std::size_t ndims = 2; float input_values[] = {1, 2, 3, 4}; TF_Tensor* input_tensor = TF_NewTensor(TF_FLOAT, dims, ndims, input_values, sizeof(input_values), NULL, NULL); // 创建输出张量 TF_Output output_op = {TF_GraphOperationByName(graph, "MatMul"), 0}; TF_Tensor* output_tensor = NULL; // 运行会话 TF_SessionRun(session, run_options, &output_op, &input_tensor, 1, &output_tensor, 1, NULL, 0, prun_setup, status); TF_DeleteSessionRunOptions(run_options); TF_DeleteSessionPRunSetup(prun_setup); // 打印结果 float* output_values = static_cast<float*>(TF_TensorData(output_tensor)); std::cout << output_values[0] << ", " << output_values[1] << std::endl; // 清理资源 TF_DeleteGraph(graph); TF_DeleteBuffer(graph_def); TF_DeleteTensor(input_tensor); TF_DeleteTensor(output_tensor); TF_DeleteStatus(status); TF_DeleteStatus(status_load); TF_DeleteSession(session, status); TF_DeleteSessionOptions(sess_opts); return 0; } ``` 3. 编译上述程序。在 Linux 上,可以使用以下命令: ```shell g++ -std=c++11 -I/usr/local/include -L/usr/local/lib -ltensorflow -o my_program my_program.cpp ``` 注意,在这个命令中,我们使用了 TensorFlow 库的标准名称“libtensorflow.so”来链接库。 4. 运行编译后的程序。 ```shell ./my_program ``` 这将输出矩阵乘积的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值