【TVM教程】TensorIR 创建

从零手动创建TensorIR:深入TVM底层编译原理与实践 中间表示(IR)是编译器将高级计算描述转换为底层硬件指令的核心抽象层,它通过结构化地表达计算逻辑、数据流和内存访问模式,为自动化优化提供了基础。其原理在于将计算图分解为更细粒度的操作与循环结构,从而显式地暴露并行性和数据局部性。这一技术价值在于实现了计算描述与硬件优化的解耦,使得同一份计算逻辑能够针对不同硬件后端(如CPU、GPU)进行定制化性能调优。在深度学习模型部署与高性能计算领域,IR的应用场景广泛,尤其对于需要极致性能的算子融合、循环变换和内存层次优化至关重要。本文以TVM的TensorIR为例,通 阅读详情

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

Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。

在线运行 TVM 学习教程→https://go.hyper.ai/PEh1Q

使用 TVMScript 创建 TensorIR​

创建 TensorIR 函数最直接的方法是使用 TVMScript。TVMScript 是一种用于表示 TVM 中 TensorIR 的 Python 语言。

标准格式​

我们来看一个来自「理解 TensorIR 抽象」中的 mm_relu 示例。以下是完整的 ir_module 和 TVMScript 格式:

import numpy as np
import tvm
from tvm.script import ir as I
from tvm.script import tir as T


@I.ir_module
class MyModule:
    @T.prim_func
    def mm_relu(
        A: T.Buffer((128, 128), "float32"),
        B: T.Buffer((128, 128), "float32"),
        C: T.Buffer((128, 128), "float32"),
    ):
        Y = T.alloc_buffer((128, 128), dtype="float32")
        for i in range(128):
            for j in range(128):
                for k in range(128):
                    with T.block("Y"):
                        vi = T.axis.spatial(128, i)
                        vj = T.axis.spatial(128, j)
                        vk = T.axis.reduce(128, k)
                        T.reads(A[vi, vk], B[vk, vj])
                        T.writes(Y[vi, vj])
                        with T.init():
                            Y[vi, vj] = T.float32(0)
                        Y[vi, vj] = Y[vi, vj] + A[vi, vk] * B[vk, vj]
        for i in range(128):
            for j in range(128):
                with T.block("C"):
                    vi = T.axis.spatial(128, i)
                    vj = T.axis.spatial(128, j)
                    T.reads(Y[vi, vj])
                    T.writes(C[vi, vj])
                    C[vi, vj] = T.max(Y[vi, vj], T.float32(0))

使用语法糖简化​

为了简化代码编写,我们可以使用以下语法:

  • 使用 T.grid 来压缩嵌套循环
  • 使用 T.axis.remap 来简化 block 迭代器注解
  • 对于可以从 block 主体中推导出读写信息的 block,可以省略 T.reads 和 T.writes
@I.ir_module
class ConciseModule:
    @T.prim_func
    def mm_relu(
        A: T.Buffer((128, 128), "float32"),
        B: T.Buffer((128, 128), "float32"),
        C: T.Buffer((128, 128), "float32"),
    ):
        Y = T.alloc_buffer((128, 128), dtype="float32")
        for i, j, k in T.grid(128, 128, 128):
            with T.block("Y"):
                vi, vj, vk = T.axis.remap("SSR", [i, j, k])
                with T.init():
                    Y[vi, vj] = T.float32(0)
                Y[vi, vj] = Y[vi, vj] + A[vi, vk] * B[vk, vj]
        for i, j in T.grid(128, 128):
            with T.block("C"):
                vi, vj = T.axis.remap("SS", [i, j])
                C[vi, vj] = T.max(Y[vi, vj], T.float32(0))

我们可以通过以下代码验证两个模块是否等价:

print(tvm.ir.structural_equal(MyModule, ConciseModule))

输出:

True

与 Python 变量的交互​

尽管 TVMScript 不能被 Python 解释器直接执行,但它可以与 Python 进行一定程度的交互。例如,我们可以使用 Python 变量来指定 TensorIR 的形状和数据类型。

# Python 变量
M = N = K = 128
dtype = "float32"


# 使用 TVMScript 定义的 IRModule
@I.ir_module
class ConciseModuleFromPython:
    @T.prim_func
    def mm_relu(
        A: T.Buffer((M, K), dtype),
        B: T.Buffer((K, N), dtype),
        C: T.Buffer((M, N), dtype),
    ):
        Y = T.alloc_buffer((M, N), dtype)
        for i, j, k in T.grid(M, N, K):
            with T.block("Y"):
                vi, vj, vk = T.axis.remap("SSR", [i, j, k])
                with T.init():
                    Y[vi, vj] = T.cast(T.float32(0), dtype)
                Y[vi, vj] = Y[vi, vj] + A[vi, vk] * B[vk, vj]
        for i, j in T.grid(M, N):
            with T.block("C"):
                vi, vj = T.axis.remap("SS", [i, j])
                C[vi, vj] = T.max(Y[vi, vj], T.cast(T.float32(0), dtype))

检查等价性:

print(tvm.ir.structural_equal(ConciseModule, ConciseModuleFromPython))

输出:

True

使用动态形状的 TensorIR 函数​

尽管 TVMScript 不能被 Python 解释器直接执行,但它可以与 Python 进行一定程度的交互。例如,我们可以使用 Python 变量来指定 TensorIR 的形状和数据类型。

@I.ir_module
class DynamicShapeModule:
    @T.prim_func
    def mm_relu(a: T.handle, b: T.handle, c: T.handle):
        # 动态形状定义
        M, N, K = T.int32(), T.int32(), T.int32()

        # 使用动态形状绑定输入缓冲区
        A = T.match_buffer(a, [M, K], dtype)
        B = T.match_buffer(b, [K, N], dtype)
        C = T.match_buffer(c, [M, N], dtype)
        Y = T.alloc_buffer((M, N), dtype)
        for i, j, k in T.grid(M, N, K):
            with T.block("Y"):
                vi, vj, vk = T.axis.remap("SSR", [i, j, k])
                with T.init():
                    Y[vi, vj] = T.cast(T.float32(0), dtype)
                Y[vi, vj] = Y[vi, vj] + A[vi, vk] * B[vk, vj]
        for i, j in T.grid(M, N):
            with T.block("C"):
                vi, vj = T.axis.remap("SS", [i, j])
                C[vi, vj] = T.max(Y[vi, vj], T.cast(T.float32(0), dtype))

接下来,我们来测试运行时的动态形状推理:

def evaluate_dynamic_shape(lib: tvm.runtime.Module, m: int, n: int, k: int):
    A = tvm.runtime.tensor(np.random.uniform(size=(m, k)).astype("float32"))
    B = tvm.runtime.tensor(np.random.uniform(size=(k, n)).astype("float32"))
    C = tvm.runtime.tensor(np.zeros((m, n), dtype="float32"))
    lib(A, B, C)
    return C.numpy()


# 只需编译一次
dyn_shape_lib = tvm.compile(DynamicShapeModule, target="llvm")
# 支持不同的输入形状
print(evaluate_dynamic_shape(dyn_shape_lib, m=4, n=4, k=4))
print(evaluate_dynamic_shape(dyn_shape_lib, m=64, n=64, k=128))

输出:

[[1.6744074  1.8393843  0.9076001  0.32640088]
 [1.3455076  1.5298209  0.75502187 0.32371795]
 [1.9979694  2.221868   1.0828729  0.43582058]
 [1.7054784  1.8512932  0.89285195 0.34154552]]
[[30.544813 29.938599 33.654526 ... 29.934391 30.73088  25.106636]
 [30.644558 31.062693 32.34803  ... 29.584583 32.756992 25.280499]
 [33.73643  33.23441  34.2736   ... 34.284283 35.100815 27.748833]
 ...
 [31.313179 30.462463 30.996958 ... 28.831778 32.279408 25.663143]
 [33.129818 31.630735 33.334507 ... 29.682335 32.925854 26.043703]
 [32.44726  30.645096 33.926357 ... 29.750242 32.810432 25.420698]]

使用 Tensor Expression 创建 TensorIR​

通常情况下,我们不直接关注 TensorIR 的具体细节,而是更倾向于用一种更简洁的方式描述计算过程,这时 Tensor Expression(TE)就派上了用场。

Tensor Expression 是一种领域特定语言(DSL),它使用类似表达式的 API 来描述一系列计算过程。

备注

Tensor 表达式(TE)包含了 TVM 堆栈中的两个组件:表达式和调度。表达式是领域特定语言,体现了计算模式,这正是我们在本节中讨论的内容。相反,TE 调度是传统的调度方法,已经被 TVM Unity 堆栈中的 TensorIR 调度所取代。

创建静态形状函数​

我们仍然使用上一小节中的 mm_relu 示例来演示如何使用 TE 创建函数。

from tvm import te

A = te.placeholder((128, 128), "float32", name="A")
B = te.placeholder((128, 128), "float32", name="B")
k = te.reduce_axis((0, 128), "k")
Y = te.compute((128, 128), lambda i, j: te.sum(A[i, k] * B[k, j], axis=k), name="Y")
C = te.compute((128, 128), lambda i, j: te.max(Y[i, j], 0), name="C")

在这里,te.compute 的函数签名是 te.compute(output_shape, fcompute)。其中 fcompute 函数用于描述每个索引位置上元素 Y[i, j] 的计算方式:

lambda i, j: te.sum(A[i, k] * B[k, j], axis=k)

上面 lambda 表达式定义了如下计算:Yi,j=∑kAi,k×Bk,jYi,j​=∑k​Ai,k​×Bk,j​。定义完计算后,我们就可以结合输入输出参数创建对应的 TensorIR 函数。这个例子中,我们希望构建一个具有两个输入参数 A、B 和一个输出参数 C 的函数。

te_func = te.create_prim_func([A, B, C]).with_attr({"global_symbol": "mm_relu"})
TEModule = tvm.IRModule({"mm_relu": te_func})
TEModule.show()

输出:

# from tvm.script import ir as I
# from tvm.script import tir as T

@I.ir_module
class Module:
    @T.prim_func
    def mm_relu(A: T.Buffer((128, 128), "float32"), B: T.Buffer((128, 128), "float32"), C: T.Buffer((128, 128), "float32")):
        T.func_attr({"tir.noalias": True})
        # with T.block("root"):
        Y = T.alloc_buffer((128, 128))
        for i, j, k in T.grid(128, 128, 128):
            with T.block("Y"):
                v_i, v_j, v_k = T.axis.remap("SSR", [i, j, k])
                T.reads(A[v_i, v_k], B[v_k, v_j])
                T.writes(Y[v_i, v_j])
                with T.init():
                    Y[v_i, v_j] = T.float32(0.0)
                Y[v_i, v_j] = Y[v_i, v_j] + A[v_i, v_k] * B[v_k, v_j]
        for i, j in T.grid(128, 128):
            with T.block("C"):
                v_i, v_j = T.axis.remap("SS", [i, j])
                T.reads(Y[v_i, v_j])
                T.writes(C[v_i, v_j])
                C[v_i, v_j] = T.max(Y[v_i, v_j], T.float32(0.0))

创建动态形状函数​

我们也可以使用 Tensor Expression 创建动态形状的函数。唯一的区别是我们需要将输入张量的形状指定为符号变量。

# 定义符号变量
M, N, K = te.var("m"), te.var("n"), te.var("k")
A = te.placeholder((M, N), "float32", name="A")
B = te.placeholder((K, N), "float32", name="B")
k = te.reduce_axis((0, K), "k")
Y = te.compute((M, N), lambda i, j: te.sum(A[i, k] * B[k, j], axis=k), name="Y")
C = te.compute((M, N), lambda i, j: te.max(Y[i, j], 0), name="C")

dyn_te_func = te.create_prim_func([A, B, C]).with_attr({"global_symbol": "mm_relu"})
DynamicTEModule = tvm.IRModule({"mm_relu": dyn_te_func})
DynamicTEModule.show()

输出:

# from tvm.script import ir as I
# from tvm.script import tir as T

@I.ir_module
class Module:
    @T.prim_func
    def mm_relu(var_A: T.handle, var_B: T.handle, var_C: T.handle):
        T.func_attr({"tir.noalias": True})
        m, n = T.int32(), T.int32()
        A = T.match_buffer(var_A, (m, n))
        k = T.int32()
        B = T.match_buffer(var_B, (k, n))
        C = T.match_buffer(var_C, (m, n))
        # with T.block("root"):
        Y = T.alloc_buffer((m, n))
        for i, j, k_1 in T.grid(m, n, k):
            with T.block("Y"):
                v_i, v_j, v_k = T.axis.remap("SSR", [i, j, k_1])
                T.reads(A[v_i, v_k], B[v_k, v_j])
                T.writes(Y[v_i, v_j])
                with T.init():
                    Y[v_i, v_j] = T.float32(0.0)
                Y[v_i, v_j] = Y[v_i, v_j] + A[v_i, v_k] * B[v_k, v_j]
        for i, j in T.grid(m, n):
            with T.block("C"):
                v_i, v_j = T.axis.remap("SS", [i, j])
                T.reads(Y[v_i, v_j])
                T.writes(C[v_i, v_j])
                C[v_i, v_j] = T.max(Y[v_i, v_j], T.float32(0.0))
深度学习编译器TVM核心:TensorIR创建与优化实战指南 在深度学习模型部署中,高层框架描述与底层硬件高效执行之间存在显著鸿沟,这催生了深度学习编译器的需求。其核心原理在于通过中间表示(IR)将计算图转换为可优化、可移植的底层代码,从而提升硬件利用率与执行效率。TensorIR作为TVM(Tensor Virtual Machine)的关键抽象层,正是这一技术的具体实现,它通过Block和PrimFunc等结构精确描述张量计算,支持循环变换、内存布局优化等底层调度。其技术价值在于赋予开发者对计算内核的精细控制能力,实现跨CPU、GPU等硬件的性能优化。在模型部署、 阅读详情

相关推荐

TVM TensorIR实战:从零手写中间表示与调度优化

在深度学习编译器的技术栈中,中间表示(IR)是连接高层计算图与底层硬件指令的关键桥梁。TVM作为业界主流的编译器框架,其新一代TensorIR摒弃了传统表达式自动推导的间接层,以显式描述循环、块和缓冲区的方式,赋予开发者对算子实现细节的绝对控制权。这种设计将计算定义与调度策略彻底解耦,使得面向不同硬件架构的循环分块、向量化、并行化及存储映射等优化操作变得可预测、可复现。深度学习模型的高效部署往往依赖于对核心算子的极致打磨,而TensorIR正是算子开发与性能调优的底层语言。本文通过向量加法与矩阵乘法的完整实

weixin_34246529的博客 112

【TVM教程】创建 Relax

本教程演示了如何使用 TVMScript、NNModule API、Block Builder API 以及 PackedFunc API,根据不同的应用场景来创建 Relax 程序(可右键另存为下载)。

HyperAI超神经 297

使用 DeepSeek 配合 即梦AI 生成视频的详细教程

访问即梦AI官网,选择“AI作图”功能,将DeepSeek生成的提示词逐条粘贴至输入框,选择适配的模型(如“通用XL Pro”)和参数(如画幅比例、风格强度)1113。“我要制作一个关于普洱茶文化的宣传视频,请设计一个30秒的脚本,包含时间轴、画面描述、文案和分镜提示词,以表格形式输出。:云南古茶树群,清晨薄雾,金色晨光,露珠特写,国风山水画质感,16:9画幅,使用Nikon D850参数模拟513。:结合DeepSeek生成的知识点脚本与即梦AI的插画风格,制作科普动画211。

weixin_48995695的博客 3万+

tvm relax教程(四) ------Relax 程序创建

需要注意:Block Builder API 不如上述 API 友好,但它是最底层的 API,与 IR 定义结合最紧密。它是更底层的 IR builder API,在 TVM 内部逻辑中广泛使用,例如编写自定义 Pass。本教程演示了如何针对不同场景,使用 TVMScript、NNModule API、Block Builder API 以及 PackedFunc API 创建 Relax 程序。本节展示如何仅用高层 Relax 算子,通过 TVMScript 定义一个简单的 MLP 模型。

happyAnger6的专栏 208

组态王7.5和SQLsever数据库交互

摘要:本文详细介绍了组态王7.5与SQL Server 2016数据库交互的实现流程,包括建立连接、数据存储与查询操作。主要内容涵盖ODBC数据源配置、数据库表格创建、数据插入及查询功能实现(含日期控件查询)

gsjkwg的博客 1580

MATLAB 论文复现——面向电量-调频-容量市场的数据中心园区算力及电力资源规划

如何在保证数据中心服务质量的前提下,考虑数据中心负荷转移特性,并对其进行合理规划,对降低数据中心规划总成本及提升新型电力系统灵活性均有显著意义。然后,根据不同电力市场的结算规则,研究了数据中心园区参与电量-调频-容量市场的方式和经济收益。在此基础上,以综合成本最小化为目标,优化数据中心园区发电机、储能的建设容量以及服务器的建设数量。最后,以阿里巴巴公开运行数据为例,证明考虑多元电力市场能够大大降低数据中心规划成本,激励数据中心园区投资建设更多灵活性资源,为电网提供有效的调频服务和容量支撑。

sjr1478的博客 667

【TVM教程】理解 TensorIR 抽象

TVM 现已更新到 0.21.0 版本,TVM 中文文档已经和新版本对齐。 Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。

HyperAI超神经 642

TMS320F28377D的sys/bios双核工程配置详解——从零搭建到RAM优化

本文详细解析了TMS320F28377D双核系统在sys/bios环境下的工程配置与RAM优化策略。从开发环境搭建、SYS/BIOS工程创建到双核CMD文件配置,提供了实战技巧和常见问题解决方案,帮助开发者高效实现电力电子控制系统中的双核协作与性能优化。

weixin_28292761的博客 600

【TVM 学习资料】TensorIR 快速入门

TensorIR 是深度学习领域的特定语言,主要有两个作用:1.在各种硬件后端转换和优化程序。2.自动 _tensorized_ 程序优化的抽象。

HyperAI超神经 901

AM243x多核MCU启动流程解析与OSPI Flash烧录实战

嵌入式系统开发中,引导加载器是芯片上电后执行的第一段软件,负责初始化硬件、加载操作系统或应用程序。其工作原理通常遵循多级引导链,从ROM固件到用户可定制的二级引导程序,逐级建立完整的软件运行环境。这一机制的技术价值在于实现可靠的系统启动、支持安全校验,并为多核异构架构提供协同基础。在应用场景上,引导加载器广泛应用于工业控制、汽车电子和物联网设备,确保设备能从非易失性存储器中自主启动。本文聚焦于TI AM243x这类高性能多核MCU,深入剖析其包含RBL和SBL在内的三级启动流程,并详细演示如何通过UART接

weixin_28703451的博客 582

【iceberg数据一致性】iceberg如何保证高并发数据一致性

那么在高并发的时候,同时操作某张表时是如何运作的呢?其实这里iceberg引用了乐观锁的方法。其实在写入数据的时候是有一个验证的操作的,即在准备写入时会检查原文件和带写入文件的差异,如果存在本次写入数据以外的数据,则代表有其他操作已经更新了原文件,那么本次写入会取消,并重试写入的步骤,知道验证完成,写入完成,如此就保证了数据的一致性,并且也解决了HMS锁的问题。在使用iceberg写数据时,一直弄不清楚为什么iceberg写入快,并且能够保证数据的一致性。今天决定搞清楚这个问题,经过查询和理解,写下来。

你的博客 1043

深度学习编译器TVM核心:TensorIR创建与算子优化实践

在深度学习模型部署中,算子实现与计算图优化是连接高级框架与底层硬件的关键。其核心原理在于通过中间表示(IR)对计算过程进行抽象与变换,以弥合不同硬件平台间的性能鸿沟。这一技术价值在于实现了计算与调度的分离,使得开发者可以专注于定义计算逻辑,再通过多种调度策略为特定硬件寻找最优执行方案,从而显著提升模型推理效率。在应用场景上,无论是为新型AI加速芯片编写自定义算子,还是对现有模型进行深度性能调优,掌握领域专用中间表示的创建都是基础且必要的技能。本文以TVM的TensorIR为例,详细解析了如何从零开始手动创建

weixin_30410119的博客 373

飞腾D2000开发板实战:手把手教你为UEFI/EDK2驱动SD3077 RTC时钟芯片

本文详细介绍了在飞腾D2000开发板上为UEFI/EDK2环境驱动SD3077 RTC时钟芯片的全流程开发指南。从硬件连接到软件适配,包括引脚复用配置、电源管理优化以及UEFI驱动的深度定制,帮助开发者解决嵌入式系统中的时间同步问题,确保RTC芯片的稳定性和准确性。

weixin_30892037的博客 423

深入理解TVM中的TensorIR抽象

深入理解TVM中的TensorIR抽象 【免费下载链接】tvm Open deep learning compiler stack for cpu, gpu and specialized accelerators 项目地址: h...

gitblog_00289的博客 406

【华为OD机试真题】458、堆内存申请 | 机试真题+思路参考+代码解析(CD卷)(C++、Java、Py)

题目描述 >有一个总空间为100字节的堆,现要从中新申请一块内存,内存分配原则为优先紧接着前一块已使用内存分配空间足够且最接近申请大小的空闲内存。

KJ.JK 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TVM TensorIR创建实战:用TVMScript直写可调度算子

编译器中间表示(IR)是连接高层计算逻辑与底层硬件执行的桥梁,理解它对于算子开发至关重要。TVM作为深度学习编译器,其层次化IR设计使得循环优化、内存访问变换等关键操作得以显式表达。其中TensorIR作为一种可编程、可调度的中间表示形态,为开发者提供了直接操控循环、缓冲区(Buffer)与计算块(Block)的能力。通过TVMScript脚本化前端,开发者能够像写普通Python代码一样定义IR结构,极大降低了手写算子的门槛。从逐元素算子到复杂规约计算,TensorIR在矩阵分块、向量化、并行化等经典编译

weixin_32830601的博客 187

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Apache TVM TensorIR 抽象入门:理解 Primitive Tensor Function、Block 与迭代注解

TensorIR 是 Apache TVM 编译器栈中的核心张量程序抽象,用于表示与优化"原始张量函数"(primitive tensor function)。本文以官方文档 [abstraction.rst](https://link.gitcode.com/i/25c5a8d2f3eeab0b177a17aa82681b08) 为主体,结合仓库内 [learning.rst](https://

gitblog_00922的博客 999

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【TVM教程】TensorIR

TVM 现已更新到 0.21.0 版本,TVM 中文文档已经和新版本对齐。 Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。

HyperAI超神经 251

深入理解 TVM TensorIR 抽象:从 NumPy 到 TVMScript 的张量程序建模

TensorIR 是 Apache TVM 中用于描述与优化张量程序(tensor program)的核心抽象,其目标是以可调度、可变换的形式刻画循环结构以及与之相关的硬件加速手段——包括线程绑定、专用硬件指令(如 Tensor Core)与内存访问方式。本文以神经网络中最常见的「矩阵乘法 + ReLU 激活」算子(`mm_relu`)为贯穿案例,从等价的 NumPy 实现出发,逐步拆解 Tens

gitblog_00883的博客 433

Apache TVM TensorIR 深度解析:从张量程序抽象、TVMScript 编写到 DLight 与 MetaSchedule 自动化调度

TensorIR 是 Apache TVM 编译器栈中的核心抽象层,用于表示与优化"原语张量函数"(primitive tensor function)。本文以 [docs/deep_dive/tensor_ir/index.rst](https://link.gitcode.com/i/76b7a89fe62e9fd2bc3ae0c4e1f36ee9) 为主线,完整梳理 TensorIR 的两大

gitblog_00523的博客 666

TVM User Tutorial -- Blitz Course to TensorIR

Author: Siyuan Feng TensorIR 是一种特定领域语言,用于深度学习项目,有两个广泛的用途: 在各种硬件后端上实现转换和优化程序。 自动张力化程序优化的抽象。 import tvm from tvm.ir.module import IRModule from tvm.script import tir as T import numpy as np IRModule IRModule 是TVM的中心数据结构,它包含深度学习程序。它是研究IR变换和建模的基本对象。 这是IRMo

zachariah2000的博客 501

【MLC】 TensorIR 练习

这两天重新看了一下天奇的mlc课程文档,把里边儿的TensorIR 练习写了一下,顺便推广一下相关资料MLC-机器学习编译-B站MLC-文档bbuf老哥-B站Archer哥的二三事。

椰子奶糖的博客 924

TVM Monthly - August 2021

TVM Monthly - August 2021 As discussed by the TVM PMC, our goal is to provide a monthly summary of the project so users and developers can get a better understanding of the goings on of the TVM community. Feedback and suggestions are welcomed so that we

HanBlogs 804

TensorIR创建的四种方式:从TVMScript到Relay Lower全解析

在深度学习编译器中,中间表示(IR)是连接高层计算描述与底层代码生成的关键桥梁。算子级IR承载着循环结构、缓存布局与数据访问模式,直接决定了后续向量化、并行化等优化的可能性。TVM中的TensorIR便是这样的算子级IR,它通过将语义与执行顺序分离,使调度器能够自由变换循环而不影响计算正确性。掌握TensorIR的创建是进行算子定制与整网调优的前提。TVM提供了多样化的创建路径:既可通过TVMScript这种Python方言直接描述算子,也可通过te.create_prim_func将传统Tensor Ex

weixin_29038303的博客 199

【TVM教程】设计与架构

IRModule:包含 relay.Function 和 tir.PrimFuncruntime.Module:包含 runtime.PackedFunc编译基本是在进行关键数据结构之间的转换。relay/transform 和 tir/transform 是确定性的基于规则的转换meta-schedule 则包含基于搜索的转换最后,编译流程示例只是 TVM 堆栈的一个典型用例。将这些关键数据结构和转换提供给 Python 和 C++ API。

HyperAI超神经 1245

深度学习0:数学知识:正态分布1

步骤内容结果1引入e−x2e^{-x^2}e−x2钟形曲线2算它的面积I∫−∞∞e−x2dxI∫−∞∞​e−x2dx3平方变成二重积分I2I^2I24换极坐标简化计算5算出I2πI^2 = \piI2πIπIπ​6代入σ\sigmaσ和μ\muμ做变量替换得到σ2πσ2π​7除以它归一化得到正态分布公式2π2π​不是随便写的,它来自高斯积分∫−∞∞e−x2。

tellmewhoisi的博客 197
上一篇: MOSS-TTS:基于 CAT 架构的解耦式生产级语音生成模型;打破单细胞分析壁垒:Pan-Cancer scRNA-Seq 数据集构建跨癌种免疫图谱基准
下一篇: 【Triton 教程】triton_language.cos
HyperAI超神经
博客等级 码龄7年 8873粉丝 1753原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值