IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【KAWAKO】TVM-使用c++进行推理 -> 正文阅读

[C++知识库]【KAWAKO】TVM-使用c++进行推理

目录

前言

修改cpp_deploy.cc文件

修改DeployGraphExecutor()函数

numpy与bin文件的互相转换

numpy转bin

bin转numpy

使用CMakeLists.txt进行编译

运行


前言

在tvm工程的apps目录下,有一个howto_deploy的工程,根据此工程进行修改,可以得到c++推理程序。


修改cpp_deploy.cc文件

DeploySingleOp()函数不需要,直接将其和相关的Verify函数一起删掉。

修改DeployGraphExecutor()函数

读取指定模型,同时获得后面所需的函数

  LOG(INFO) << "Running graph executor...";
  printf("load in the library\n");
  DLDevice dev{kDLCPU, 1};
  tvm::runtime::Module mod_factory = tvm::runtime::Module::LoadFromFile("../model_autotune.so");
  printf("create the graph executor module\n");
  tvm::runtime::Module gmod = mod_factory.GetFunction("default")(dev);printf("  default\n");
  tvm::runtime::PackedFunc set_input = gmod.GetFunction("set_input");printf("  set_input\n");
  tvm::runtime::PackedFunc get_output = gmod.GetFunction("get_output");printf("  get_output\n");
  tvm::runtime::PackedFunc run = gmod.GetFunction("run");printf("  run\n");

定义输入输出的变量

  printf("Use the C++ API\n");
  tvm::runtime::NDArray input = tvm::runtime::NDArray::Empty({1, 1, 640}, DLDataType{kDLFloat, 32, 1}, dev);
  tvm::runtime::NDArray input_state = tvm::runtime::NDArray::Empty({1, 2, 128, 2}, DLDataType{kDLFloat, 32, 1}, dev);
  tvm::runtime::NDArray output = tvm::runtime::NDArray::Empty({1, 1, 640}, DLDataType{kDLFloat, 32, 1}, dev);
  tvm::runtime::NDArray output_state = tvm::runtime::NDArray::Empty({1, 2, 128, 2}, DLDataType{kDLFloat, 32, 1}, dev);

从bin文件中读取数据

  float input_storage[1 * 1 * 640];
  FILE* fp = fopen("../input.bin", "rb");
  fread(input->data, 1 * 1 * 640, 4, fp);
  fclose(fp);
  float input_state_storage[1 * 2 * 128 * 2];
  FILE* fp_state = fopen("../input_state.bin", "rb");
  fread(input_state->data, 1 * 2 * 128 * 2, 4, fp_state);
  fclose(fp_state);

将数据输入到网络

  printf("set the right input\n");
  set_input("input_4", input);
  set_input("input_5", input_state);

运行推理

  struct timeval t0, t1;
  int times = 100000; // 3394
  gettimeofday(&t0, 0);
  printf("run the code\n");
  for(int i=0;i<times;i++)
  run();
  gettimeofday(&t1, 0);
  printf("%.5fms\n", ((t1.tv_sec - t0.tv_sec) * 1000 + (t1.tv_usec - t0.tv_usec) / 1000.f)/times);

?得到输出

  printf("get the output\n");
  get_output(0, output);printf("  0\n");
  get_output(1, output_state);printf("  1\n");

?将输出保存到bin文件

  FILE* fp_out = fopen("output.bin", "wb");
  fwrite(output->data, 1 * 1 * 640, 4, fp_out);
  fclose(fp_out);
  FILE* fp_out_state = fopen("output_state.bin", "wb");
  fwrite(output_state->data, 1 * 2 * 128 * 2, 4, fp_out_state);
  fclose(fp_out_state);

numpy与bin文件的互相转换

numpy转bin

import numpy as np
import os

input_1 = np.load("./input.npy")
input_2 = np.load("./input_states.npy")

build_dir = "./"
with open(os.path.join(build_dir, "input.bin"), "wb") as fp:
    fp.write(input_1.astype(np.float32).tobytes())
with open(os.path.join(build_dir, "input_state.bin"), "wb") as fp:
    fp.write(input_2.astype(np.float32).tobytes())

bin转numpy

output = np.fromfile("./output.bin", dtype=np.float32)
output_state = np.fromfile("./output_state.bin", dtype=np.float32)

使用CMakeLists.txt进行编译

在howto_deploy目录下创建CMakeLists.txt

cmake_minimum_required(VERSION 3.2)
project(how2delploy C CXX)

SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O3 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -fPIC")

set(TVM_ROOT /path/to/tvm)
set(DMLC_CORE ${TVM_ROOT}/3rdparty/dmlc-core)

include_directories(${TVM_ROOT}/include)
include_directories(${DMLC_CORE}/include)
include_directories(${TVM_ROOT}/3rdparty/dlpack/include)

link_directories(${TVM_ROOT}/build/Release)

add_definitions(-DDMLC_USE_LOGGING_LIBRARY=<tvm/runtime/logging.h>)

add_executable(cpp_deploy_norm cpp_deploy.cc)

target_link_libraries(cpp_deploy_norm ${TVM_ROOT}/build/libtvm_runtime.so)

老四连

mkdir build
cd build
cmake ..
make

运行

cd build
./cpp_deploy_norm

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 15:50:34  更:2022-03-03 15:51:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:02:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码