【从零开始学深度学习编译器】番外二,在Jetson Nano上玩TVM

Jetson系列——重编译内核 博主团队最近新买了一块Jetson NX,打算将之前的ROS项目从树莓派4移植至其上,发现Jetson TX2无法识别手柄。在通过网上查找资料后,发现解决方案,特此记录。 阅读详情

【GiantPandaCV导语】这篇文章主要是讲解了如何给Jetson Nano装机,以及在Jetson Nano上如何配置TVM并将MxNet的ResNet18跑起来获取分类结果,最后我们还体验了一下使用AutoTVM来提升ResNet50在Jetson Nano上的推理效率,AutoTune了一个Task(一共需要AutoTune 20个Task)之后可以将ResNet50的推理速度做到150ms跑完一张图片(224x224x3),从上面的BenchMark可以看到TensorRT在FP32的时候大概能做到50-60ms推理一张图片(224x224x3)。本文所有实验代码均可以在这里找到:https://github.com/BBuf/tvm_learn/blob/main/relay ,如果你对学习TVM感兴趣可以考虑点个star。

0x00. Jetson Nano 安装

这里就不详细介绍Jetson Nano了,我们只需要知道NVIDIA Jetson是NVIDIA的一系列嵌入式计算板,可以让我们在嵌入式端跑一些机器学习应用就够了。手上刚好有一块朋友之前寄过来的Jetson Nano,过了一年今天准备拿出来玩玩。

拿到的Jetson Nano大概长这个样子:

Jetson Nano实物图

我们需要为Jetson Nano烧录一个系统,Jetson Nano的系统会被烧录在一个SD Card中,然后插入到板子上。我这里选取了一块内存为128GB的SD Card。

首先,我们下载Jetson Nano镜像(https://developer.nvidia.com/embedded/jetpack),这个镜像里面包含提供引导加载程序、Ubuntu18.04、必要的固件、NVIDIA驱动程序、示例文件系统等。

然后下载Etcher(https://www.balena.io/etcher)这个镜像烧录工具把我们下载好的Jetson Nano镜像烧录到SD卡中,操作很简单,选择镜像和我们的读卡器就可以了。下面展示了完成烧录后的界面。

完成了镜像烧录

然后将SDCard插回Jetson Nano并插入电源完成系统的安装即可,安装完成后界面如下。

已经成功安装Ubuntu18.04系统

只有一个显示器,为了不影响基于windows的开发工作,所以直接ssh登录:

直接远程登录Jetson Nano

为了开发方便,可以将jetson Nano在VsCode里面进行配置,配置信息这样写:

Host JetsonNano
  HostName 192.168.1.6
  User bbuf

然后就可以通过VsCode远程连接到Jetson Nano上进行开发了。

0x01. 基础环境安装

首先使用uname -a查看一下系统的基本信息:

Linux bbuf-desktop 4.9.201-tegra #1 SMP PREEMPT Fri Feb 19 08:40:32 PST 2021 aarch64 aarch64 aarch64 GNU/Linux

可以看到这个系统是64位的arm系统,接下来我们为ubuntu更换一下国内源,换源前最好备份一下原始的源:

sudo cp /etc/apt/sources.list /etc/apt/sources_init.list

然后换源:

sudo gedit /etc/apt/sources.list

我这里选择的是清华的镜像源,将下面的代码粘贴进去:

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe

保存之后,执行sudo apt-get update就完成了。

镜像源更新成功

然后我们就可以来配置TVM需要的一些依赖了,我们一边编译一边配置,根据报错提示来。

首先建一个新的文件夹,克隆一下TVM源码然后执行下面这些操作:

git clone --recursive https://github.com/apache/tvm tvm
cd tvm
mkdir build
cp cmake/config.cmake build
cd build
cmake ..
make -j4
export TVM_HOME=/path/to/tvm
export PYTHONPATH=$TVM_HOME/python:${PYTHONPATH}

先把config.cmake里面的USE_LLVM和USE_CUA编译选项打开,开始Cmake,然后错误发生了:

CMake Error at cmake/utils/FindLLVM.cmake:47 (find_package):
  Could not find a package configuration file provided by "LLVM" with any of
  the following names:

    LLVMConfig.cmake
    llvm-config.cmake

这是因为没有安装LLVM的原因,我们来安装一下。

git clone https://github.com/llvm/llvm-project llvm-project
cd llvm-project
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS=lld -DCMAKE_INSTALL_PREFIX=/usr/local ../../llvm-project/llvm
make -j4 && sudo make install

编译的时候提示cmake版本过低,先升级一下cmake版本:

wget https://github.com/Kitware/CMake/releases/download/v3.14.4/cmake-3.14.4.tar.gz
tar xvf cmake-3.14.4.tar.gz
cd cmake-3.14.4
./bootstrap --prefix=/usr
make
sudo make install

现在已经成功将cmake版本升级,继续编译llvm(编译llvm的时候建议checkout到大于等于release7.0分支,我直接编译master的代码虽然成功了,但编译tvm会报和LLVM相关的Codegen错误)。

然后编译完成之后编译tvm就可以了。成功编译之后还需要记得设置TVM的PYTHONPATH环境变量:

export TVM_HOME=/home/bbuf/tvm_project/tvm
export PYTHONPATH=$TVM_HOME/python:${PYTHONPATH}

然后source ~/.bashrc使环境变量生效,这样就完成了在Jetson Nano上配置TVM了

可以成功导入TVM

0x02. 在Jetson Nano上跑ResNet50

首先参考着https://tvm.apache.org/docs/tutorials/frontend/deploy_model_on_rasp.html TVM提供的在树莓派上的这个教程来改一改,由于这里使用的预训练模型是Mxnet提供的,所以我们需要在Jetson Nano上安装一下MxNet包,安装步骤如下:

首先安装MxNet的依赖:

sudo apt-get update
sudo apt-get install -y git build-essential libopenblas-dev libopencv-dev python3-pip
sudo pip3 install -U pip

然后下载Jetson Nano的MxNet v1.6的whell包,并安装:

wget https://mxnet-public.s3.us-east-2.amazonaws.com/install/jetson/1.6.0/mxnet_cu102-1.6.0-py2.py3-none-linux_aarch64.whl
sudo pip3 install mxnet_cu102-1.6.0-py2.py3-none-linux_aarch64.whl

安装好之后导入一下MxNet看看是否可以成功:

可以成功导入MxNet

然后我们讲解一下如何在Jetson Nano上完成MxNet的ResNet50模型的推理:

首先导入需要的头文件:

import tvm
from tvm import te
import tvm.relay as relay
from tvm import rpc
from tvm.contrib import utils, graph_executor as runtime
from tvm.contrib.download import download_testdata

然后运行的时候我们选择利用RPC在服务器上远程调用Jetson Nano的板子进行运行,也可以选择直接在板子上运行,这里我们选择的是直接在板子上运行,所以不用启动RPC Server,所以我们这里直接准备预训练模型然后编译Graph并在本地的Jetson Nano上进行推理即可:

准备预训练模型

这里直接从mxnet的gloun的modelzoo里面加载ResNet18的预训练模型:

from mxnet.gluon.model_zoo.vision import get_model
from PIL import Image
import numpy as np

# one line to get the model
block = get_model("resnet18_v1", pretrained=True)

然后为了测试这个模型,这里下载一张猫的图片并且转换图片的格式。

img_url = "https://github.com/dmlc/mxnet.js/blob/main/data/cat.png?raw=true"
img_name = "cat.png"
img_path = download_testdata(img_url, img_name, module="data")
image = Image.open(img_path).resize((224, 224))


def transform_image(image):
    image = np.array(image) - np.array([123.0, 117.0, 104.0])
    image /= np.array([58.395, 57.12, 57.375])
    image = image.transpose((2, 0, 1))
    image = image[np.newaxis, :]
    return image


x = transform_image(image)

synset_url是网络输出类别的下标和真实名字对应的文件,这里也加载进来:

synset_url = "".join(
    [
        "https://gist.githubusercontent.com/zhreshold/",
        "4d0b62f3d01426887599d4f7ede23ee5/raw/",
        "596b27d23537e5a1b5751d2b0481ef172f58b539/",
        "imagenet1000_clsid_to_human.txt",
    ]
)
synset_name = "imagenet1000_clsid_to_human.txt"
synset_path = download_testdata(synset_url, synset_name, module="data")
with open(synset_path) as f:
    synset = eval(f.read())

然后利用我们之前介绍过的relay.frontend.xxx接口将Gluon模型转换为Relay计算图。

# We support MXNet static graph(symbol) and HybridBlock in mxnet.gluon
shape_dict = {"data": x.shape}
mod, params = relay.frontend.from_mxnet(block, shape_dict)
# we want a probability so add a softmax operator
func = mod["main"]
func = relay.Function(func.params, relay.nn.softmax(func.body), None, func.type_params, func.attrs)

下面定义了一些基本的数据相关的配置信息:

batch_size = 1
num_classes = 1000
image_shape = (3, 224, 224)
data_shape = (batch_size,) + image_shape

编译图

这里使用relay.build来编译计算图。我们不能在一个ARM设备上推理一个X86程序,所以这里需要指定目标设备为"llvm",这里的"llvm"代表了Jetson Nano的Arm CPU。然后编译出计算图的运行时库之后,可以将这个库直接存下来,下次运行的时候不用重新编译。下面的代码中local_demo设置为True表示在真实的Jetson Nano运行这个Relay计算图,如果设置为False表示要基于RPC调用局域网中的Jetson Nano运行Relay计算图。我们这里是直接本地编译和运行。在执行完这个步骤之后我们获得了可以直接Jetson Nano CPU上运行的库,并打包成net.tar。

local_demo = True

if local_demo:
    target = tvm.target.Target("llvm")
else:
    target = tvm.target.Target("llvm")

with tvm.transform.PassContext(opt_level=3):
    lib = relay.build(func, target, params=params)

# After `relay.build`, you will get three return values: graph,
# library and the new parameter, since we do some optimization that will
# change the parameters but keep the result of model as the same.

# Save the library at local temporary directory.
tmp = utils.tempdir()
lib_fname = tmp.relpath("net.tar")
lib.export_library(lib_fname)

接下来我们可以加载运行时库,然后推理刚才猫的图片:

local_demo = True

if local_demo:
    target = tvm.target.Target("llvm")
    # target = tvm.target.Target("nvidia/jetson-nano")
    # target_host = "llvm"
    # assert target.kind.name == "cuda"
    # assert target.attrs["arch"] == "sm_53"
    # assert target.attrs["shared_memory_per_block"] == 49152
    # assert target.attrs["max_threads_per_block"] == 1024
    # assert target.attrs["thread_warp_size"] == 32
    # assert target.attrs["registers_per_block"] == 32768
else:
    target = tvm.target.Target("llvm")

with tvm.transform.PassContext(opt_level=7):
    lib = relay.build(func, target, target_host=target_host, params=params)

tmp = utils.tempdir()
lib_fname = tmp.relpath("net.tar")
lib.export_library(lib_fname)


# create the remote runtime module
dev = tvm.cuda(0)
module = runtime.GraphModule(lib["default"](dev))
time_start = time.time()
# set input data
module.set_input("data", tvm.nd.array(x.astype("float32")))
# run
module.run()

time_end = time.time()

print('time cost', time_end-time_start,'s')
# get output
out = module.get_output(0)
# get top1 result
top1 = np.argmax(out.numpy())
print("TVM prediction top-1: {}".format(synset[top1]))

打印结果:

TVM prediction top-1: tiger cat

上面还记录了运行的时间,输出结果是:

time cost 0.16585731506347656 s

可以看到在Jetson Nano的CPU上加载输入数据然后推理这张图片(不包含后处理)耗时大概160ms。

然后尝试使用Jetson Nano的GPU来进行推理,这个时候报了一个警告大概是找不到tophub包:

WARNING:root:Failed to download tophub package for cuda: <urlopen error [Errno 111] Connection refused>

这个警告导致了一系列错误导致了无法推理,这个错误的解决方法是:

git clone https://github.com/tlc-pack/tophub
cp tophub/tophub/ /home/bbuf/.tvm -rf

然后就可以使用Jetson Nano的GPU来推理了,然后发现推理这张图片花了1.81s。。。这一节的代码可以在https://github.com/BBuf/tvm_learn/blob/main/relay/jetsonnano/deploy_model_on_jetsonnano.py这里看到。

由此可以看到直接应用TVM到Jetson Nano上效率还是很低的,主要原因是我们还没有针对这个硬件来Auto-tuning,也就是使用到Auto-TVM来提高程序运行的性能。

0x03. 体验AutoTVM

这里先不讲AutoTVM原理什么的,直接在Jetson Nano基于AutoTVM来Autotune一下ResNet50看看效果吧,我在https://developer.nvidia.com/embedded/jetson-nano-dl-inference-benchmarks NVIDIA的官网上找到了Jetson Nano一些经典网络的FPS,包含ResNet50,注意这里是FP16推理,那么可以估算FP32情况下推理 224 × 224 × 3 224\times 224\times 3 224×224×3的图片应该在50+ms:

Jetson Nano BenchMark

然后直接参考https://tvm.apache.org/docs/tutorials/autotvm/tune_relay_cuda.html 这个官方的AutoTune文档来修改一下,就可以在Jetson Nano上AutoTune ResNet50了,修改后的代码见:https://github.com/BBuf/tvm_learn/blob/main/relay/tune_relay_cuda.py。这里是直接在Jetson Nano上本地AutoTune。

由于这个AutoTune需要很久的时间,所以我暂时只跑了一下午也就是一个Task(这里Task的概念和ResNet50里面的卷积层个数有关,因为这里是来AutoTune卷积Op,ResNet50有20个Conv Op,所以Tasks一共有20个)之后测试一下推理的速度:

Extract tasks...
Compile...
Evaluate inference time cost...
Mean inference time (std dev): 154.54 ms (0.47 ms)

平均推理时间在150ms左右,注意到这里只跑了一轮,相信跑完整个Auto-Tune之后或许有可能可以超越TensorRT的速度的,这个板子跑完AutoTune可能要3-4天。。。下篇文章再报告最终结果,看看是否能超过TensorRT。

0x04. 总结

这篇文章主要是讲解了如何给Jetson Nano装机,以及在Jetson Nano上如何配置TVM并将MxNet的ResNet18跑起来获取分类结果,最后我们还体验了一下使用AutoTVM来提升ResNet50在Jetson Nano上的推理效率,AutoTune了一个Task(一共需要AutoTune 20个Task)之后可以将ResNet50的推理速度做到150ms跑完一张图片(224x224x3),从上面的BenchMark可以看到TensorRT在FP32的时候大概能做到50-60ms推理一张图片(224x224x3)。

0x05. 同期文章

0x06. 参考

  • https://zhuanlan.zhihu.com/p/91876198

欢迎关注GiantPandaCV, 在这里你将看到独家的深度学习分享,坚持原创,每天分享我们学习到的新鲜知识。( • ̀ω•́ )✧

有对文章相关的问题,或者想要加入交流群,欢迎添加BBuf微信:

二维码

TVM:深度学习框架编译器的安装踩坑集 目录一、引言二、流程 一、引言 4月底的时候,花了一天时间安装TVM这个东西。那时,上来就弄TVM 0.8的版本,但因为具体安装的流程不是很懂,所以出现了一些莫名其妙的问题。后来,直接改用TVM0.6版本,一路顺风。 但,今天(5月7日)时,打算仔细看下教程,发现0.6版本的,已经没了,只剩下0.8的教程,行吧!还是得回头安装0.8的,但之前怎么安装的,又给忘了,于是乎,一顿操作后,直接弄好了,打算写篇文章讲讲这个东西的安装。 二、流程 安装的流程很简单,网上也有许多教程了,这里先详细地讲下。 1°代码 阅读详情

相关推荐

Jetson nano编译第一个驱动程序,挂载并运行

这次记录的内容是我使用nano板加载了自己的第一个驱动程序,并且测试成功!

weixin_36921153的博客 2955

Jetson Nano交叉编译教程

目录 环境: 主机: 环境: 主机:

K_K_yl的博客 6089

Jetson nano编译安装OpenCV 4

Jetson nano编译安装OpenCV 4 GCC交叉编译链 因为直接在nano上编译会特别慢,所以我们在x86上交叉编译之后在安装。 GCC交叉编译链 从NVIDIA官方下载GCC交叉编译链GCC Tool Chain for 64-bit BSP ...

B2A3x0的博客 2214

【TVM】——对比tensorrt速度评测,他香吗?

简介 在推理的时候,如果使用nvidia的显卡,网上很多人都说使用tensorrt是不二的选择,直到TVM的出现,大家开始各种推崇,同时TVM也是延续了tensorrt的理念——加速模型的推理速度,只是做了tensorrt没有做的,加速了不同平台x86-64,armv7,arm64等,同时TVM是开源的,这点比起tensorrt就很香了。 那TVM开源,支持多后端这点确实很香。那他的推理速度和tensorrt比起来来到底能不能打呢? 这里我们不分析二者的加速原理,只是简单用resnet50测试二者的推理速度

怡宝2号 4454

AI编译器TVM部署示例解析

AI编译器TVM部署示例解析 AI编译器TVM(一)——一个简单的例子 概述 什么是TVM? TVM可以称为许多工具集的集合,这些工具可以组合起来使用,实现一些神经网络的加速和部署功能。这也是为什么叫做TVM Stack了。TVM的使用途径很广,几乎可以支持市面上大部分的神经网络权重框架(ONNX、TF、Caffe2等),也几乎可以部署在任何的平台,如Windows、Linux、Mac、ARM等等。 参考文献 https://oldpan.me/archives/the-first-step-towards

吴建明wujianming_110117 3207

【从零开始学深度学习编译器】六,TVM的编译流程详解

TVM的编译流程详解一. 前言二. TVM编译流程详解三,总结四,参考 一. 前言 上一篇文章对TVM Relay和Pass进行了介绍,但还没有介绍整体的编译流程。这一篇文章将继续介绍一下TVM的编译流程,即TVM是如何将深度学习框架的模型转换成Relay IR之后进一步编译和优化为硬件可以执行的IR,再将这个底层IR和运行时库以及模型参数打包为一个tvm.Module返回。关于为什么要将底层IR和运行时库以及模型参数打包,根据官方文档可以知道这样是为了可以更方便的保存底层IR和运行时库,做到一次编译,可持

qq_33287871的博客 1710

【Jetson Nano学习笔记】Ubuntu18.04 上安装Nodejs、Hexo、nginx、配置到github(ARM版本)

Nodejs有很多版本,按照不同的操作系统、不同的处理器,下载安装对应版本。 一、去官网下载ARMv8版本的压缩包(Jetson Nano的处理器是ARM57,基于ARMv8的核) 英文网址:Download | Node.js 通过Linux系统命令【uname -a】 查看操作系统位数(备注:x86_64表示X86处理器64位系统, aarch64表示ARM处理器64位系统) Linux ljx-desktop 4.9.253-tegra #1 SMP PREEMPT Mon Jul 26 12

梁俊星的博客 4105

jetson Nano安装及编译jetson-inference

git clone --recursive https://github.com/dusty-nv/jetson-inference github mkdir build cd build cmake .. make -j4 sudo make install sudo ldconfig vim download-models.sh

LZL2020LZL的博客 829

Jetson_nano环境配置

准备工作:写入系统镜像 准备microSD卡(32G以上), 官网下载系统镜像(Ubuntu 18.04LTS); https://developer.nvidia.com/embedded/dlc/jetson-nano-dev-kit-sd-card-image (2)下载镜像制作工具Etcher; (3)傻瓜式操作,选择插入的microSD卡,然后点击“Flash!”,直到制作完成。...

zb23415的博客 5916

SqlSugar避坑指南:C#操作MySQL时你可能会忽略的5个细节

本文分享了使用C#和SqlSugar框架操作MySQL数据库时的实战避坑指南。针对连接配置、实体映射、查询性能、事务处理等关键环节,深入剖析了5个容易被忽略但至关重要的细节,帮助开发者提升项目稳定性和执行效率,避免常见陷阱。

delta的博客 275

Flutter 中使用蓝牙插件报错,说没有权限怎么解决

2、在build.grale里面更改一下版本号,我修改的是targetSdkVersion这个版本号,需要根据你自己的版本进行更改,记得更改之后先flutter clean一下再run。搞了一晚上,没搞出来,第二天用同事手机测试发现他手机可以,我手机还是不行,才发现是Android版本问题,需要修改两处地方。废话不多说,咱先看报错信息。

zzj17637822814的博客 2288

ubuntu 下jetson nano编译内核、系统烧录、内核裁剪

一、内核编译 jetson nano 的内核编译踩了不少坑,记录一下: 步骤如下: 1.下载交叉编译工具 这里的网址来自官网,可以会更新,如果下载不了,需要去官网下载。 /home$ wgethttp://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz 2.解压工具 可.

嵌入式开发记录 7943

SAP FICO会计凭证过账接口

-------------------------------------增加职能范围-ZHANGZG-2022.09.07 注释掉-2022.09.20。CONCATENATE '总账' ls_doc_item-hkont '要求输入成本对象值!*-------------------------------------增加职能范围-ZHANGZG-2022.09.07。*-------------------------------------增加职能范围-ZHANGZG-2022.09.07。

dingqing86的专栏 1078

Jetson Nano(10) -- 编译并安装OpenCV 3.4.X

参考链接: https://jkjung-avt.github.io/opencv-on-nano/ Installing OpenCV 3.4.6 on Jetson Nano Quick link:jkjung-avt/jetson_nano As a follow-up onSetting up Jetson Nano: The Basics, my next step of s...

Techblog of HaoWANG 4911

手把手教你用SIMCOM A7670C_FASL模组实现双路MQTT连接阿里云(附完整源码)

本文详细介绍了如何使用SIMCOM A7670C_FASL 4G模组实现双路MQTT连接阿里云,包括硬件配置、开发环境搭建、双路MQTT架构设计及实现细节。通过完整的源码示例和实战指南,帮助开发者快速掌握物联网设备开发中的多路MQTT连接技术,提升工业级应用的开发效率。

weixin_33696822的博客 226

华为云CodeHub代码托管

什么是代码托管 代码托管(CodeHub)是面向软件开发者的基于Git的在线代码托管服务,是具备安全管控、成员/权限管理、分支保护/合并、在线编辑、统计服务等功能的云端代码仓库,旨在解决软件开发者在跨地域协同、多分支并发、代码版本管理、安全性等方面的问题。 代码托管具有以下特性 · 在线代码阅读、修改、提交,随时随地开发,不受地域限制。 · 在线分支管理,包含分支新建、切换、合并,实现多分支并行开发,效率高。 master分支:最为稳定,功能比较完整,随时可发布的代码。 develop分支:用于平时开

LUJINYUANA的博客 1万+

Jetson Nano 编译安装Opencv4.0 和opencv_contrib4.0

第一步: 编写 install_opencv4.0.0_Nano.sh #!/bin/bash # # Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. # # NVIDIA Corporation and its licensors retain all intellectual property # and pro...

long19960208的博客 7489

DeepL Pro免费使用技巧与API调用优化方案

机器翻译技术通过神经网络模型实现跨语言语义转换,其核心价值在于保持专业术语准确性的同时实现自然语言流畅度。现代翻译工具如DeepL采用注意力机制等深度学习技术,在医疗、法律等专业领域展现出接近人工翻译的质量。针对API调用场景,开发者可通过请求模拟实现小批量自动化处理,而文档预处理和术语库优化则能显著提升免费额度使用效率。本文重点解析如何通过字符计算优化、临时接口调用等工程实践方法,在合规前提下最大化利用免费翻译资源。

weixin_29038303的博客 265

jetson nano编译运行GCNv2

** GCNv2: Efficient Correspondence Prediction for Real-Time SLAM ** 论文原文 中文翻译 开源代码 PS:代码从码云上克隆快 git clone https://gitee.com/hzm8341/GCNv2_SLAM.git 编译前需要如下环境 pytorch 别去编译源码,很慢,还有各种问题,不要问我怎么知道的 直接百度网盘下...

weixin_44457020的博客 1284

【计算摄影】相机成像原理:从光到JPEG图像

本文我们将从最基本的相机成像原理开始论述,再讨论光线进入相机后,经过一系列处理成为JPEG图像的大致流程。

qq_35149975的博客 2万+

基于Vision Transformer的鸟类图像分类(200个类别)完整代码+数据

基于Vision Transformer的鸟类图像分类(200个类别)完整代码+数据

1724

nano怎么编译c语言,面向Linux C++的CMake简明教程(Jetson Nano)

目录1. CMake简介2.环境配置3.示例程序Hello World4. 包含其它.h和.cpp文件1. CMake简介本教程面向Linux系统,重点讲解CMake的基本使用方法,用于构建C++项目。采用的平台为Jetson Nano嵌入式开发板,arm64系统。当然,本教程同样适合绝大部分Linux平台。在讲解CMake使用方法之前,先要了解gcc、make和MakeFile的概念。gcc(G...

weixin_42371226的博客 2355

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

玩转Jetson nano系列(1):Jetson nano编译安装ncnn

整个安装流程基本按照官方的步骤 build ncnn for jetson 但是在jetson nano上安装时,遇到了glslang和vulkan引发的问题: Found glslangValidator: GLSLANGVALIDATOR_EXECUTABLE-NOTFOUND Could NOT find Vulkan (missing: Vulkan_INCLUDE_DIR) 所以这篇博客...

hanzy88的博客 5267

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

史上最全的ubuntu16.04安装nvidia驱动+cuda9.0+cuDnn7.0

本文参考了 http://www.cnblogs.com/5211314jackrose/p/7081020.html https://jingyan.baidu.com/article/4853e1e55679491909f726f4.html http://www.cnblogs.com/iloveblog/p/7683349.html 1. 检

abc869788668的博客 3万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WIN10 anaconda 安装 tensorflow-gpu不出错的最佳解决办法(不在系统安装CUDA)

来源:https://www.pugetsystems.com/labs/hpc/The-Best-Way-to-Install-TensorFlow-with-GPU-Support-on-Windows-10-Without-Installing-CUDA-1187/ 由于使用根据百度出来的WIN10下面使用anaconda和CUDA安装tensorflow-gpu的解决办法,总会报如下错误...

star2523的专栏 1万+
上一篇: 【从零开始学深度学习编译器】八,TVM的算符融合以及如何使用TVM Pass Infra自定义Pass
下一篇: 【从零开始学深度学习编译器】九,TVM的CodeGen流程
just_sort
博客等级 码龄11年 2356粉丝 1667原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值