一、关于TVM
TVM是一个用于CPU,GPU和专用加速器的开放式深度学习编译器堆栈。它旨在缩小以生产力为重点的深度学习框架与面向性能或效率的硬件后端之间的差距。TVM提供以下主要功能:
- 将Keras,MXNet,PyTorch,Tensorflow,CoreML,DarkNet中的深度学习模型汇编成各种硬件后端的最小可部署模块。
- 基础架构可在更多后端自动生成和优化张量运算符,并具有更好的性能。
TVM堆栈始于华盛顿大学Paul G. Allen计算机科学与工程学院SAMPL小组的研究项目。该项目现在由一个涉及多个行业和学术机构的开源社区推动。该项目采用基于Apache风格的优点管理模型。
TVM提供了两个级别的优化,如下图所示。计算图优化,用于执行高级操作员融合,布局转换和内存管理等任务。然后是张量运算符优化和代码生成层,它优化张量运算符。更多详细信息可以在找到techreport。
二、编译
#依赖
sudo apt install clang-6.0 lldb-6.0
#源码
git clone --recursive https://github.com/dmlc/tvm
cd tvm
mkdir build
cp cmake/config.cmake build
cd build
#请注意,我们键入`make runtime`仅构建运行时库。
# 如果要包含其他运行时(如OpenCL),可以修改`config.cmake`以启用这些选项。
#我是修改并开启了cuda和llvm
$ vim config.cmake
set(USE_CUDA ON)
set(USE_LLVM ON)
#编译
cmake ..
make runtime
sudo make install
三、库调用
对于API调用,可以在CMakeLists.txt中使用include_directories()
写入指定调用路径。
我是把这些文件拷贝到了另一个文件夹下:
新建shell脚本auto_include_tvm.sh
文件,写入以下内容,然后根据自己的目录运行脚本:
#!/bin/bash
if [ "$1" == "-h" ];then
echo "执行的文件名:$0";
echo "功能:拷贝tvm目录中的链接库文件,到目标目录中。"
echo "用法:$ bash 文件名 [源目录] [目标目录]"
echo "例子:$ bash auto_include_tvm.sh ~/soft/tvm ~/download_libs/tvm"
exit 0;
fi
if [ "$1" == "" ];then
echo "请输入源目录!"
exit 0;
fi
if [ "$2" == "" ];then
echo "请输入目标目录!"
# echo "未输入目标目录,默认为当前目录!"
exit 0;
fi
mkdir -p "$2"
cp -r "$1""/include" "$2"
mkdir -p "$2""/3rdparty/dmlc-core"
cp -r "$1""/3rdparty/dmlc-core/include" "$2""/3rdparty/dmlc-core"
mkdir -p "$2""/3rdparty/dlpack"
cp -r "$1""/3rdparty/dlpack/include" "$2""/3rdparty/dlpack"
echo "end."
这样在CMakeLists.txt中这样进行链接:
set(CMAKE_CXX_STANDARD 11 )
find_package(OpenCV REQUIRED)
include_directories(
/home/toson/download_libs/tvm/include
/home/toson/download_libs/tvm/3rdparty/dmlc-core/include
/home/toson/download_libs/tvm/3rdparty/dlpack/include)
target_link_libraries(demo
/usr/local/lib/libtvm_runtime.so
${OpenCV_LIBS})