【TVM教程】设计与架构

TVM(一):简介与安装 简介 TVM是一个用于深度学习系统的编译器堆栈。 它旨在缩小以生产力为中心的深度学习框架与以性能和效率为中心的硬件后端之间的差距。TVM与深度学习框架合作,为不同的后端提供端到端编译。 换句话说,TVM就是一种将深度学习工作负载部署到硬件的端到端IR(中间表示)堆栈。可以表述为一种把深度学习模型分发到各种硬件设备上的、端到端的解决方案。 GitHub:https://github.com/dmlc... 阅读详情

TVM 现已更新到 0.21.0 版本,TVM 中文文档已经和新版本对齐。

Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →Apache TVM
本文档适用于想要了解 TVM 架构或积极开发项目的开发者。本文档组织结构如下:

  • 整体编译流程示例:概述 TVM 如何将一个高级模型描述转换为可部署模块的各个步骤。建议首先阅读本节以了解基础流程。
  • 简要介绍 TVM 栈中的关键组件。您也可以参考 TensorIR 深度解析 和 Relax 深度解析,了解 TVM
    栈中两个核心部分的详细内容。

本指南提供了架构的一些补充视图。首先研究端到端的编译流程,并讨论关键的数据结构和转换。这种基于 runtime 的视图侧重于运行编译器时每个组件的交互,接下来我们将研究代码库的逻辑模块及其关系。本部分将提供该设计的静态总体视图。

编译流程示例

本指南研究编译器中的编译流程示例,下图展示了流程。从高层次来看,它包含以下步骤:

  • 导入: 前端组件将模型引入到 IRModule 中,它包含了内部表示模型的函数集合。
  • 转换: 编译器将 IRModule 转换为功能与之等效或近似等效(例如在量化的情况下)的 IRModule。许多转换与
    target(后端)无关,并且允许 target 配置转换 pipeline。
  • Target 转换: 编译器将 IRModule 转换(codegen)为指定 target 的可执行格式。target
    的转换结果被封装为 runtime.Module,可以在 runtime 环境中导出、加载和执行。
  • Runtime 执行: 用户加载 runtime.Module,并在支持的 runtime 环境中运行编译好的函数。

在这里插入图片描述

关键数据结构

设计和理解复杂系统的最佳方法之一,就是识别关键数据结构和操作(转换)这些数据结构的 API。识别了关键数据结构后,就可以将系统分解为逻辑组件,这些逻辑组件定义了关键数据结构的集合,或是数据结构之间的转换。

IRModule 是整个堆栈中使用的主要数据结构。一个 IRModule(intermediate representation module)包含一组函数。目前支持两种主要的功能变体(variant):

  • relay::Function 是一种高层功能程序表示。一个 relay.Function 通常对应一个端到端的模型。可将
    relay.Function 视为额外支持控制流、递归和复杂数据结构的计算图。
  • tir::PrimFunc
    是一种底层程序表示,包含循环嵌套选择、多维加载/存储、线程和向量/张量指令的元素。通常用于表示算子程序,这个程序在模型中执行一个(可融合的)层。
    在编译期间,Relay 函数可降级为多个 tir::PrimFunc 函数和一个调用这些 tir::PrimFunc 函数的顶层函数。

在编译和转换过程中,所有的 Relax 运算符都会被下沉(lower)为 tir::PrimFunc 或 TVM PackedFunc,这些函数可以直接在目标设备上执行。而对 Relax 运算符的调用,则会被下沉为对低层函数的调用(例如 R.call_tir 或 R.call_dps)。

转换

前面介绍了关键数据结构,接下来讲转换。转换的目的有:

  • 优化:将程序转换为等效,甚至更优的版本。
  • 降级:将程序转换为更接近 target 的较低级别表示。 relay/transform 包含一组优化模型的
    pass。优化包括常见的程序优化(例如常量折叠和死码消除),以及特定于张量计算的 pass(例如布局转换和 scale 因子折叠)。

Relax 转换
Relax 转换包括一系列应用于 Relax 函数的 Pass。优化内容包括常见的图级优化(如常量折叠、无用代码消除等),以及后端特定的优化(例如库调度)。

tir 转换
tir 转换包含一组应用于 tir 函数的 pass,主要包括两类:

  • TensorIR 调度(TensorIR schedule): TensorIR 调度旨在为特定目标优化 TensorIR
    函数,通常由用户指导控制目标代码的生成。对于 CPU 目标,TIR PrimFunc
    即使没有调度也可以生成有效代码并在目标设备上运行,但性能较低。对于 GPU 目标,调度是生成有效线程绑定代码的关键。详情请参考
    TensorIR 转换教程。此外,TVM 提供了 MetaSchedule 来自动搜索最优的 TensorIR 调度。
  • 降层 Pass(Lowering Passes): 这些 Pass 通常在应用调度后执行,将 TIR PrimFunc
    转换为功能等价但更贴近目标表示的版本。例如,有些 Pass 会将多维访问扁平化为一维指针访问,或者将中间表示中的 intrinsic
    扩展为目标特定的形式,并对函数入口进行修饰以符合运行时调用约定。 许多底层优化可以在目标阶段由 LLVM、CUDA C
    以及其他目标编译器处理。因此,我们将寄存器分配等底层优化留给下游编译器处理,仅专注于那些它们未涵盖的优化。

跨层转换(Cross-level transformations)
Apache TVM 提供统一的策略来优化端到端模型。由于 IRModule 同时包含 Relax 和 TIR 函数,跨层转换的目标是在这两类函数之间应用变换来修改 IRModule。

例如,relax.LegalizeOps Pass 会通过将 Relax 算子降层为 TIR PrimFunc 并添加至 IRModule 中,同时将原有的 Relax 算子替换为对该 TIR 函数的调用,从而改变 IRModule。另一个例子是 Relax 中的算子融合流程(包括 relax.FuseOps 和 relax.FuseTIR),它将多个连续的张量操作融合为一个操作。与以往手动定义融合规则的方法不同,Relax 的融合流程会分析 TIR 函数的模式,自动检测出最佳融合策略。

目标转换(Target Translation)

目标转换阶段将 IRModule 转换为目标平台的可执行格式。对于 x86 和 ARM 等后端,TVM 使用 LLVM IRBuilder 构建内存中的 LLVM IR。也可以生成源码级别的语言,如 CUDA C 和 OpenCL。此外,TVM 支持通过外部代码生成器将 Relax 函数(子图)直接翻译为目标代码。

目标代码生成阶段应尽可能轻量,大多数转换和降层操作应在此阶段之前完成。

TVM 还提供了 Target 结构体用于指定编译目标。目标信息也可能影响前期转换操作,例如目标的向量长度会影响向量化行为。

Runtime 执行

TVM runtime 的主要目标是提供一个最小的 API,从而能以选择的语言(包括 Python、C++、Rust、Go、Java 和 JavaScript)加载和执行编译好的工件。以下代码片段展示了一个 Python 示例:

import tvm
# Python 中 runtime 执行程序示例,带有类型注释
mod: tvm.runtime.Module = tvm.runtime.load_module("compiled_artifact.so")
arr: tvm.runtime.Tensor = tvm.runtime.tensor([1, 2, 3], device=tvm.cuda(0))
fun: tvm.runtime.PackedFunc = mod["addone"]
fun(arr)
print(arr.numpy())

tvm.runtime.Module 封装了编译的结果。runtime.Module 包含一个 GetFunction 方法,用于按名称获取 PackedFuncs。

tvm.runtime.PackedFunc 是一种为各种构造函数消解类型的函数接口。runtime.PackedFunc 的参数和返回值的类型如下:POD 类型(int, float)、string、runtime.PackedFunc、runtime.Module、runtime.Tensor 和 runtime.Object 的其他子类。

tvm.runtime.Module 和 tvm.runtime.PackedFunc 是模块化 runtime 的强大机制。例如,要在 CUDA 上获取上述 addone 函数,可以用 LLVM 生成主机端代码来计算启动参数(例如线程组的大小),然后用 CUDA 驱动程序 API 支持的 CUDAModule 调用另一个 PackedFunc。OpenCL 内核也有相同的机制。

以上示例只处理了一个简单的 addone 函数。下面的代码片段给出了用相同接口执行端到端模型的示例:

import tvm
# python 中 runtime 执行程序的示例,带有类型注释
factory: tvm.runtime.Module = tvm.runtime.load_module("resnet18.so")
# 在 cuda(0) 上为 resnet18 创建一个有状态的图执行模块
gmod: tvm.runtime.Module = factory["resnet18"](tvm.cuda(0))
data: tvm.runtime.Tensor = get_input_data()
# 设置输入
gmod["set_input"](0, data)
# 执行模型
gmod["run"]()
# 得到输出
result = gmod["get_output"](0).numpy()

主要的结论是 runtime.Module 和 runtime.PackedFunc 可以封装算子级别的程序(例如 addone),以及端到端模型。

总结与讨论

综上所述,编译流程中的关键数据结构有:

  • IRModule:包含 relay.Function 和 tir.PrimFunc
  • runtime.Module:包含 runtime.PackedFunc

编译基本是在进行关键数据结构之间的转换。

  • relay/transform 和 tir/transform 是确定性的基于规则的转换
  • meta-schedule 则包含基于搜索的转换

最后,编译流程示例只是 TVM 堆栈的一个典型用例。将这些关键数据结构和转换提供给 Python 和 C++ API。然后,就可以像使用 numpy 一样使用 TVM,只不过关注的数据结构从 numpy.ndarray 改为 tvm.IRModule。以下是一些用例的示例:

  • 用 Python API 直接构建 IRModule。
  • 编写一组自定义转换(例如自定义量化)。
  • 用 TVM 的 Python API 直接操作 IR。

tvm/support

support 模块包含基础架构最常用的程序,例如通用 arena 分配器(arena allocator)、套接字(socket)和日志(logging)。

tvm/runtime

runtime 是 TVM 技术栈的基础。它提供加载和执行已编译产物的机制。运行时定义了一套稳定的 C API 标准接口,用于与前端语言(如 Python 和 Rust)交互。

除了 ffi::Function, runtime::Object 是 TVM 运行时的核心数据结构之一。它是一个带有类型索引的引用计数基类,支持运行时类型检查和向下转型。该对象系统允许开发者向运行时引入新的数据结构,例如 Array、Map 以及新的 IR 数据结构。

除了用于部署场景,TVM 编译器本身也大量依赖运行时机制。所有 IR 数据结构都是 runtime::Object 的子类,因此可以直接从 Python 前端访问和操作。我们使用 PackedFunc 机制将各种 API 暴露给前端使用。

不同硬件后端的运行时支持定义在 runtime 子目录中(例如 runtime/opencl)。这些特定于硬件的运行时模块定义了设备内存分配和设备函数序列化的 API。

runtime/rpc 实现了对 PackedFunc 的 RPC 支持。我们可以利用 RPC 机制将交叉编译后的库发送到远程设备,并基准测试其执行性能。该 RPC 基础设施使得能够从多种硬件后端收集数据,用于基于学习的优化。

TVM 运行时系统
运行时信息
模块序列化指南
设备/目标交互

tvm/node

node 模块在 runtime::Object 的基础上为 IR 数据结构增加了更多功能。其主要功能包括:反射、序列化、结构等价性检查以及哈希计算。

得益于 node 模块,我们可以在 Python 中通过字段名直接访问 TVM IR 节点的任意字段:

x = tvm.tir.Var("x", "int32")
y = tvm.tir.Add(x, x)
# a 和 b 是 tir.Add 节点的字段
# 可以通过字段名直接访问
assert y.a == x

我们还可以将任意 IR 节点序列化为 JSON 格式,并加载回来。这种保存/加载和查看 IR 节点的能力为提高编译器的可用性打下了基础。

tvm/ir

tvm/ir 文件夹包含所有 IR 函数变体所共享的统一数据结构与接口。该模块中的组件被 tvm/relax 和 tvm/tir 共享,主要包括:

  • IRModule
  • 类型
  • PassContext 和 Pass
  • Op

不同的函数变体(如 relax.Function 和 tir.PrimFunc)可以共存于一个 IRModule 中。尽管这些变体的内容表示不同,但它们使用相同的数据结构来表示类型。因此,不同函数变体之间可以共享函数签名的表示结构。统一的类型系统使得在定义好调用约定的前提下,一个函数变体可以调用另一个,从而为跨函数变体的优化奠定了基础。

此外,我们还提供了统一的 PassContext 用于配置 Pass 行为,并提供组合 Pass 的方式构建优化流程。如下示例:

# 配置 tir.UnrollLoop pass 的行为
with tvm.transform.PassContext(config={"tir.UnrollLoop": { "auto_max_step": 10 }}):
    # 在该上下文下执行的代码

Op 是用于表示系统内置的原始操作符/内建指令的通用类。开发者可以向系统注册新的 Op,并附加属性(例如该操作是否是逐元素操作)。

tvm/target

target 模块包含将 IRModule 转换为目标运行时代码的所有代码生成器,同时也提供了一个通用的 Target 类用于描述目标平台。

编译流程可以根据目标平台的属性信息和每个目标 id(如 cuda、opencl)所注册的内建信息来自定义。

tvm/relax

Relax 是用于表示模型计算图的高级 IR。多种优化过程定义在 relax.transform 中。需要注意的是,Relax 通常与 TensorIR 的 IRModule 协同工作,许多转换会同时作用于 Relax 和 TensorIR 函数。更多信息可参考: Relax 深度解析。

tvm/tir

TIR 定义了低级程序表示。我们使用 tir::PrimFunc 来表示可以由 TIR Pass 转换的函数。除了 IR 数据结构,TIR 模块还包括:

  • 位于 tir/schedule 中的一组调度原语
  • 位于 tir/tensor_intrin 中的内置指令
  • 位于 tir/analysis 中的分析 Pass
  • 位于 tir/transform 中的转换/优化 Pass

更多信息请参考: TensorIR 深度解析。

tvm/arith

该模块与 TIR 紧密相关。低级代码生成中的一个核心问题是对索引的算术属性进行分析——如是否为正数、变量界限、描述迭代器空间的整数集合等。arith 模块提供了一套主要用于整数分析的工具,TIR Pass 可以利用这些工具简化和优化代码。

tvm/te 和 tvm/topi

TE(Tensor Expression)是用于描述张量计算的领域专用语言(DSL)。需要注意的是,Tensor Expression 本身并不是可以直接存储进 IRModule 的自包含函数。我们可以使用 te.create_prim_func 将其转换为 tir::PrimFunc,然后集成进 IRModule。

尽管可以使用 TIR 或 TE 为每个场景直接构造算子,但这种方式较为繁琐。为此,topi(Tensor Operator Inventory)提供了一组预定义算子,覆盖了 numpy 操作和深度学习常见操作。

tvm/meta_schedule

MetaSchedule 是一个用于自动搜索优化程序调度的系统。它是 AutoTVM 和 AutoScheduler 的替代方案,可用于优化 TensorIR 调度。需要注意的是,MetaSchedule 目前仅支持静态形状工作负载。

tvm/dlight

DLight 提供一套预定义、易用且高性能的 TIR 调度策略。其目标包括:

全面支持动态形状工作负载
轻量级:提供无需调优或仅需极少调优的调度策略,且性能合理
稳定性强:DLight 的调度策略具有通用性,即使当前规则不适用也不会报错,而是自动切换至下一个规则

TVM 架构设计 TVM 架构设计 本文面向希望了解TVM体系结构和/或积极参与项目开发的开发人员。 主要内容如下: 示例编译流程概述了TVM将模型的高级概念转换为可部署模块的步骤。 逻辑架构组件部分描述逻辑组件。针对每个逻辑组件,按组件的名称进行组织。 也可以随时查看开发人员如何指导有用的开发技巧。 提供了架构的一些补充视图。首先,检查一个单一的端到端编译流程,并讨论关键的数据结构和转换。这个基于runtime的视图主要关注运行编译器时每个组件之间的交互。然后将检查代码库的逻辑模块及其关系。设计了静态总体视图。 Examp 阅读详情

相关推荐

TVM设计与构架构建

TVM设计与构架构建 本文档适用于希望了解TVM体系结构和/或在项目上进行积极开发的开发人员。该页面的组织如下: • 实例编译流程Example Compilation Flow描述TVM把一个模型的高级描述到可部署模块的步骤。 • “逻辑体系结构组件” Logical Architecture Components部分描述了逻辑组件。针对每个逻辑组件的特定内容,按组件名称组织。 • 开发人员操作手册,以获取有用的开发技巧。 本文提供了一些体系结构的补充视图。首先,回顾一个端到端的编译流程,并讨论关键的数据

吴建明wujianming_110117 1444

【tvm官网教程01】设计和架构-1

【tvm官网教程01】设计和架构-1目的1. 编译流1.1 关键数据结构1.2 Transformations1.2.1 变换的分类1.2.2 relay/transform1.2.2.1 子函数1.2.2.2 overall问题1.2.3 tir/transform1.3 搜索空间和基于学习的transformation1.4 Target Translation1.5 Runtime Execution1.6 小结2. 逻辑组件2.1 tvm/support2.2 tvm/runtime2.3 tvm

B10030607的博客 1994

TVM 各个模块总体架构

TVM 各个模块总体架构 Deploy Deep Learning Everywhere Existing Deep Learning Frameworks Limitations of Existing Approach Learning-based Learning System Problem Setting Example Instance in a Search Space Optimization Choices in a Search Space Problem Form

吴建明wujianming_110117 1967

【tvm官网教程01】设计和架构-2-runtime

【tvm官网教程01】设计和架构-2-runtime1. runtime系统1.1 PackedFunc1.2 Module1.3 远程部署1.4 TVM object和编译器栈1.5 runtime具体实现2. debugger3. Relay虚拟机4. Module序列 1. runtime系统 TVM支持多种编程语言用于编译栈的开发和部署。 runtime需要解决的难题有: 部署:从python / javascript / c ++语言调用已编译的函数。 调试:在python中定义一个函数,然后从

B10030607的博客 1353

tvm如何添加npu支持

tvm如何添加npu支持代码准备tvm 环境ethos stackrelay.build for ethosnstep 1 get_pattern_table("ethos-n")step 2 MergeComposite & AnnotateTargetstep 3 MergeCompilerRegions & PartitionGraphstep 4 relay.build TVM算是比较大的社区,用的小伙伴很多,效果也不错,知乎上有很多关于TVM stack relay流程的分析,现

承远哥 的博客 4049

【TVM系列二】TVM介绍

文章同步更新在公众号 AIPlayer,欢迎扫码关注,共同进步 目录 一、TVM的工作流程 1、整体流程 2、关键数据结构 3、Transformations 4、搜索空间和基于机器学习的转换 5、目标代码转化 二、逻辑架构组件 三、运行TVM实例 1、交叉编译runtime 2、编译模型 3、运行模型 四、总结 一、TVM的工作流程 TVM主要由两个部分组成: (1)TVM编译器:负责编译和优化模型 (2)TVM runtime:提供目标设备上运行模型的API ..

Flying Cat 6695

【tvm官网教程01】设计和架构-3-pass

【tvm官网教程01】设计和架构-3-pass目的 目的

B10030607的博客 435

TVM-初识TVM

目录TVM简介那么TVM是什么?TVM做了哪些工作 TVM简介 随着深度学习的发展,深度学习的能力可以说是越来越强大,识别率节节攀升,与此同时,深度学习框架也变得越来越多,目前比较主流的深度学习框架包括:Pytorch、TensorFlow、MxNet、Caffe、Keras等。 一般进行深度学习任务主要包括两部分,一是训练出精度比较高的模型,然后将其部署到对应的目标机器上。 针对第一部分,自然我们可以使用各种深度学习框架,通过修改网络参数等,训练出精度比较满意的模型,一般情况下,在训练深度学习模型的时候,

qq_33287871的博客 4433

Apache TVM 文档写作指南:基于 Divio 体系的四类文档组织与 Sphinx 构建实践

Apache TVM 是一个面向 CPU、GPU 与专用加速器的开源深度学习编译器栈,其官方文档体系庞大且分层清晰。本文以仓库中的 [docs/contribute/document.rst](https://link.gitcode.com/i/2dddd52b55aa6f8abbf67d6dfe07530b) 为核心骨架,系统讲解 TVM 文档的组织方式(入门教程、操作指南、参考、架构指南四类

gitblog_01102的博客 1044

论文阅读:Visual Relationship Detection with Language Priors

Visual Relationship Detection with Language Priors(ECCV2016) 文章   尽管大多数的relationship并不常见,但是它们的object和predicate却更频繁地独立出现。paper用这个insight分别独立训练训练object和predicate的模型,然后再进行组合来预测relationship。Visual relatio...

Kivee的博客 2877

Q学习(Q-learning)入门小例子及python实现

一、从马尔科夫过程到Q学习 # 有一定基础的读者可以直接看第二部分 Q学习(Q-learning)算法是一种与模型无关的强化学习算法,以马尔科夫决策过程(Markov Decision Processes, MDPs)为理论基础。 标准的马尔科夫决策过程可以用一个五元组<S,A,P,R,γ>表示,其中: S是一个离散有界的状态空间; A是一个离散的动作空间; P为状态转...

wlm_py的博客 4万+

【TEE】PENGLAI TEE

Penglai-TVM: 基于OpenSBI,支持不可信host和enclaves的 细粒度隔离(页级别隔离)。代码。Penglai-sPMP: 它利用 PMP或者 sPMP (S-mode PMP)提供基本的enclave功能。代码。Penglai-ZONE: 是一个旨在支持可信执行环境(TEE)中的特权区域的项目,例如TEEOS,统一可扩展固件接口(UEFI)中的独立MM。代码。PengLai-MCU:支持Global Platform,支持PSA。非开源。

qq_43543209的博客 2039

【IPAM】Netbox docker模式版本升级

NETBOX 是一个开源的网络资源管理系统,主要用于管理 IP 地址、机架、设备、接口等网络资源信息。下面是 NETBOX 的功能、优点和缺点的详细介绍。

u012153104的博客 1329

TVM:设计与架构

TVM:设计与架构 本文档适用于想要了解 TVM 架构和/或积极开发项目的开发人员。页面组织如下: 示例编译流程概述了 TVM 将模型的高层描述转换为可部署模块所采取的步骤。要开始使用,请先阅读本节。 逻辑架构组件部分描述了逻辑组件。后面的部分是针对每个逻辑组件的特定指南,按组件的名称组织。 设备/目标交互描述了 TVM 如何与每种支持的物理设备和代码生成目标进行交互。 请查看开发人员操作指南以获取有用的开发技巧。 本指南提供了架构的一些补充视图。首先,我们回顾了一个端到端的编译流程,并

weixin_44966641的博客 1264

果蔬及菜品识别系统

果蔬及菜品识别系统

我的博客 2118

开源DIY | 打造会“听”会“走”的智能移动垃圾桶

本文详细介绍了如何利用Arduino和超声波传感器打造一款会“听”会“走”的智能移动垃圾桶。通过开源硬件和简单编程,实现声控移动和自动避障功能,适合创客爱好者和家庭DIY。项目成本控制在200元内,涵盖硬件搭建、电路连接和核心功能实现,是入门级机器人制作的理想选择。

weixin_33670713的博客 231

TVM编译器原理与实践

TVM(Tensor Virtual Machine, 张量虚拟机)是一种开源的模型编译框架,旨在将机器学习模型自动编译成可供下层硬件执行的机器语言,从而利用多种类型的算力。其工作原理是,先将深度学习模型进行优化推理、内存管理与线程调度,再借用LLVM框架将模型部署在CPU、GPU、FPGA、ARM等硬件设备上。本书全面解析TVM的主要功能,帮助读者理解TVM工作原理,以及使用 TVM对深度学习与机器学习进行优化与部署。

等风来 5571

[RK3568 Android11] 开发之蓝牙(AP6275S)

前言 蓝牙是一种支持设备短距离通信(一般10m内)的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效地简化移动通信终端设备之间的通信,也能够成功地简化设备与因特网Internet之间的通信,从而数据传输变得更加迅速高效,为无线通信拓宽道路。 接下来是在RK3568上调试AP6275S模块蓝牙部分: 一、设备树dts配置 根据硬件原理图,找到对应的控制引脚,配置好dts: ...

~未来可期~ 4072

【tvm官网教程】张量表达与调度

【tvm官网教程】张量表达与调度目的1. 调度原语1.1 te常用接口1.2 stage常用成员函数欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 目的 编译器是下一代大厂之争的关键,曾经有过

B10030607的博客 2407

微信小程序云开发 - 实现商家转账到零钱(微信企业付款到零钱) V3功能流程及完整实例代码,过微信云开发的云函数实现企业付款到零钱(提供详细示例源码纯云函数实现,证书、密钥、签名等各种常见问题解决方案

企业付款到零钱(微信小程序提现功能,提现到零钱)微信小程序-云函数实现微信企业付款到零钱功能,实现微信商户号中的企业付款到零钱的功能,微信小程序+云开发+商家转账至零钱+微信小程序用户提现,使用云开发环境的云函数实现微信小程序的支付功能,微信小程序实现微信企业付款到零钱功能的流程,V3 V2基于微信云开发的商家转账至零钱,小程序云函数企业付款到零钱功能实现,云开发实现微信商户支付企业付款到零钱功能,不用服务器纯云函数实现,详细示例代码demo教程,API证书错误,转账不到账怎么办,密钥生成有误,转账失败,有

🏆 前端领域优质创作者 1万+

手把手教你学simulink(40.1)--水力发电场景示例:基于 Simulink 的抽水蓄能电站水力发电

项目背景抽水蓄能电站是一种重要的储能技术,广泛应用于电力系统的调峰填谷、频率调节和备用电源。它通过在电力负荷低谷时将水从下水库抽到上水库储存,在电力负荷高峰时释放水进行发电,从而实现电能的高效利用。与传统的水电站不同,抽水蓄能电站可以在短时间内快速响应电网的需求,具有良好的灵活性和可靠性。本项目旨在使用 MATLAB/Simulink 模拟一个完整的抽水蓄能电站的水力发电过程,包括水泵-涡轮机系统、发电机、水道系统、控制系统等,并实现对电站的精确控制,确保其在不同工况下都能稳定运行。

MHD0815的博客 886

TVM简介

TVM软件栈 工作流程 从已有的深度学习框架中获取一个模型并将此模型转换为计算图表示(深度学习框架的前端主要是计算图表示以及自动梯度); 图中 Section 3 使用一些方法优化当前的计算图得到优化后的计算图(操作融合,可以将多个操作合并为一个kernel,以此节省存储中间结果的空间;数据布局转换,改变计算图中张量的存储方式以适应目标硬件设备并提升执行效率); 图中 Section 4 针对...

MLer 4万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【TVM 教程】编写自定义 Pass

Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →https://tvm.hyper.ai/

HyperAI超神经 925

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

初识 TVM

如有图像或公式显示错误,可以访问我的个人博客:https://www.wanglichun.tech/2019/11/15/tvm/ 笔者也是最近偶然的机会才开始接触TVM,使用过后发现,经过auto-tuning后的TVM模型在速度是竟然超过了TensorRT,并且笔者使用的是MXNet框架,TVM对MXNet绝对的友好,对于Pytorch等模型,可以使用ONNX,操作也一样简单,使用起来基本类...

小菜鸟的AI之路 7152

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: 【vLLM 学习】Profiling
下一篇: 【Triton 教程】triton_language.make_block_ptr
HyperAI超神经
博客等级 码龄7年 8873粉丝 1753原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值