希姆计算:基于 TVM 的 DSA AI 编译器构建

架构对比(CPU、GPU、FPGA、ASIC、DSA……) 收集不同架构的文章进行学习 阅读详情

本文首发自 HyperAI超神经微信公众号~

大家好我是来自希姆计算的淡孝强,今天我将和三位同事一起来给大家分享如何在 TVM 上支持 NPU。

DSA 编译器解决的本质问题就是不同的模型需要部署到硬件上,利用各种抽象层级的优化手段,使得模型尽量打满芯片,也就是要压缩气泡。关于怎么去调度,Halide 描述的调度三角形是这个问题的本质。

DSA 编译器要解决的主要问题是什么?首先我们抽象一个 DSA 的架构,如图所示,habana、Ascend 以及 IPU 上都是这个抽象架构的实例化。一般计算核里每个核有向量、标量以及张量的计算单元。从指令的操作和数据粒度来看,不少 DSA 可能倾向于使用相对粗粒度的指令,例如二维三维的向量和张量的指令,也有不少硬件使用细粒度的指令,例如一维的 SIMD 和 VLIW。指令间的依赖,有一些是通过显式的接口暴露让软件来控制,有的是硬件自己控制。内存是多级内存,大多是 scratchpad memory。并行有各种粒度和维度的并行,比如 stream 并行、cluster 并行、多核并行以及不同计算部件之间的流水并行。
在这里插入图片描述
要支持这样一类架构,从编译器开发者的角度看,是从上述体系结构几个方面对 AI 编译器提出不同的需求,这部分后面我们会展开。

从用户的角度看,首先要有一个稳定和泛化的编译器,尽量多的模型或者算子都可以编译成功,另外,用户希望编译器可以提供一个可编程的界面来进行算法和算子的自定义,以确保可以独立开展一些关键算法的创新工作。最后,对于类似我们这样的团队或者友商也会关注:怎么用 TVM 构建 AI 编译器,比如怎样管理自研和开源的 TVM 代码,怎么搭建一套高效 CI 等等。这就是我们今天要分享的内容,下面由我的同事来讲编译优化的部分。

希姆计算王成科:DSA 的编译优化流程

本部分为希姆计算工程师王成科现场分享。

首先介绍一下希姆编译实践的整体流程概况。

针对刚才提到的架构特性,我们基于 TVM 数据结构构建了自研的优化 pass 再加上对 TVM 的复用,组成了一个新模式实现:tensorturbo。

在这里插入图片描述

我们看到一个比较经典的 DSA 架构,一般会提供一些高效、定制矩阵以及向量层的多核计算核心,拥有一个与之相配合的多层缓存机制,同时也会提供可并行运行的多模组执行单元。相应的我们需要处理以下问题:

  • 对数据计算进行切分、高效绑核以及定制指令的高效向量化;

  • 精细管理有限的片上缓存,在不同的缓存等级上做相应的数据预取;

  • 优化多模组执行的多级流水线,力求得到一个比较好的加速比。
    在这里插入图片描述
    这里红色部分(上图)显示的是整个流程里对 TVM 复用比较高的部分,在 relay 上实现的图层相关比较通用的优化可以直接复用,另外复用程度比较高的是基于 TensorIR 和 custom LLIR 的算子实现部分。像我们刚才提到的跟硬件特性相关的定制优化,则需要更多自研工作。

首先我们来看在图层上自研的一项工作。
在这里插入图片描述
关注最左边这张比较典型的计算流图,可以看到从上到下,整体对缓存的占用及对计算的占用都在不断减少,呈现倒金字塔的状态。对于前半部分,模型规模较大时,我们需要着重解决片上缓存驻留的问题;而后半部分,在模型规模比较小的时候,需要处理计算单元利用率较低的问题。如果简单调整模型规模,比如调整 batch size ,较小的 batch size 可以得到较低的 latency ,而相应的 throughput 会有所降低;同样较大的 batch size 会导致 latency 较高,但是有可能提高整体 throughput。

那么我们就可以用图调度来解决这个问题。首先,允许一个比较大的 batch size 输入,保证全程对计算的利用率比较高,然后对整图做一个存储分析,加上切分和调度策略,使得模型的前半部分结果可以更好地缓存在片上,同时实现计算核心利用率较高的结果。实践来看整体可以实现 latency 和 throughput 都表现较好结果(详细可以关注 OSDI 23 希姆文章:Effectively Scheduling Computational Graphs of Deep Neural Networks toward Their Domain-Specific Accelerators,6 月份可获取链接查看)。

下面介绍另外一个软流水的加速工作。
在这里插入图片描述
关注右上图,实现了一个比较 native 的四级流水线,但明显不是一个高效的流水线。一般高效的流水线,应该是经过几次迭代后,四个执行单元都可以同步并行起来,那么这需要做一些工作,包括 L1 及 L0 上的切分、L1 上跨层的数据预取以及 L0 层级上的 double buffer 操作。通过这些工作我们可以实现像右下图所展示的,加速比较高的流水线。

由此,也会引入一个新的问题,比如当多个执行单元对缓存的同时读写并发数要高于当前缓存可支持的并发数时,就会产生竞争,这个问题会导致访存效率成倍下降,也就是 Bank Conflict 问题。对此,我们会在编译时静态地对流水线进行模拟,提取冲突对象,结合 cost model 对分配地址进行交换和平移,可以极大地降低该问题的影响。
在这里插入图片描述
有了各种 pass 之后,可以以一个简单的 Top-Down 方式把它们组合起来,沿着左图中黑色流程,就得到了一个功能上可行的编译 pipeline。但是实践中发现很多问题,包括思远提到的 pass 与 pass 之间的相互影响、缺少交互逻辑,图层与算子之间缺少沟通逻辑等。可以看到左图中红色部分指示的流程,实践中发现每个路径或者它们的组合都会导致编译失败。如何让其鲁棒性更强?希姆在每个可能失败的 pass 中提供一个反馈路径,在图层和算子之间引入了交互逻辑,进行预分析、 prelower 操作,同时在重点部分引入一些迭代调优机制,最终得到一个泛化性较高且调优能力比较强的整体 pipeline 实现。

我们也留意到,上述工作中对数据结构的改造以及相关设计思想与目前 TVM Unity 设计有较多相似之处,我们也期待 Relax 能够带来更多可能性。

这里展示的是希姆在编译流程中更加细节的 pass,从左到右就是逐层递减的过程,其中红色部分是对 TVM 复用比较高的,越靠近硬件特性部分会有更多的定制 pass。

下面继续对其中的部分模块进行详细介绍。
在这里插入图片描述

希姆计算刘飞:DSA 的向量化和张量化

本部分为希姆计算工程师刘飞现场分享。

这个章节将展开介绍希姆向量化和张量化工作。从指令粒度考虑,指令粒度越粗,越接近 Tensor IR 的多层 loop 表达,所以向量化张量化难度越小,相反,指令粒度越细,难度也就越大,我们的 NPU 指令,支持一维/二维/三维的 tensor 数据计算。希姆也考虑过原生 TVM tensorize 过程,但考虑到 Compute Tensorize 对复杂表达能力有限,例如对 if condition 这种复杂表达式做 Tensorized 就比较困难,而且做 Tensorized 向量化后,无法 schedule。

另外当时 TensorIR Tensorize 在开发当中,不能满足开发需求,所以希姆提供了自己的一套指令向量化流程,我们称之为指令发射。这套流程下我们支持了大概 120 条 Tensor 指令,包括各种维度的指令等。

我们的指令流程大概分为三个模块:

  • 发射前的优化处理。对循环轴的变换,为指令发射提供更多的发射条件和可能;

  • 指令发射模块。分析循环的结果和信息,选择一个最优的指令生成方式;

  • 指令发射后的模块。对指定发射处理失败之后处理,保证在 CPU 上正确执行。
    在这里插入图片描述
    下面是指令发射前的优化和处理模块,都是由一组优化 pass 组成,其中 IfPromotion 是把阻碍循环轴发射的 if 语句尽量外提,PreProcess 是把没有对应指令的 operator 做拆分处理,LoopShift 是对循环轴边界为归一化,LoopCallapse 是对连续的循环轴作尽可能的合并,LoopPartition 是做 if 相关的循环轴拆分,还有 LoopFission 是对循环内多个 store 语句的分裂。

从这个例子可以看到,起初 IR 是不能发射任何指令的,通过优化后,最后可以发射两条 Tensor 指令且所有的循环轴都能够发射指令。
在这里插入图片描述
再就是指令发射模块。首先,指令发射模块会循环分析循环中的结构,从中获取 Optype、dtype、bufferAcess 等信息,有这些信息之后,指令识别会识别出来循环轴可能会发射哪几种指令。因为一种 IR 结构可能对应多种 NPU 指令,所以我们会把所有可能发射的指令都识别出来,由 VectorEngine 搜索引擎去根据指令的 alignment、reshape 等一系列信息去搜索每种指令发射的可能性,最后再由 CostModel 做计算,找到最优发射形式进行发射。
在这里插入图片描述
最后就是指令发射后处理模块。主要是对指令发射失败的 tir 做处理,保证其能在 CPU 上正确运行。还有一些特殊指令,希姆需要在算法前端打一些标记,指令发射模块通过这些标记加上自己的 IR 分析,正确地发射相应的指令。
在这里插入图片描述
以上是希姆整个 DSA 张量化和向量化的流程,我们也在一些方向上做了探索,比如微内核的方案,也是最近讨论比较热烈的方向。它的基本思想是把一个计算过程分成两层,一层用组合微内核的形式去拼接,另一种用搜索的方式去寻找,最终把两层的结果做拼接,选择一个最优结果。这样其优势是充分利用硬件资源的同时,降低搜索的复杂度,提高搜索效率。
在这里插入图片描述
在这里插入图片描述
希姆也在微内核上做了相关探索,但考虑到微内核方案与现在的解决方案相比,并没有在性能等方面有较大提升,所以目前希姆在微内核方向还属于探索阶段。

希姆计算袁晟:DSA 的自定义算子

本部分为希姆计算工程师袁晟现场分享。

首先,我们知道算子开发目前碰到了四个大问题:

  • 需要支持的神经网络算子很多,进行归类后基础算子有 100 多个;

  • 由于硬件架构不停迭代,相应指令以及算子参与的逻辑都需要进行变更;

  • 性能考虑。算子融合(local memory, share memory)以及我前边提到的图算信息传递(切分等);

  • 算子需要开放给用户,用户只能进入软件进行自定义算子。

我主要分成了以下三个方面介绍。首先是图算子,图算子是基于 relay api,把它裁剪成基础的语言算子。

以下图为例:
在这里插入图片描述
第二是元算子,所谓的元算子是基于 TVM Topi 用 compute/schedule 描述算子算法逻辑和循环变换相关逻辑。我们在开发算子时,会发现很多算子的 schedule 是可以复用的,基于这种情况下,希姆提供了一套类似 schedule 的模板。现在,我们把算子分成很多类,基于这些类,新的算子就会大量复用 schedule 模板。

接下来是一个比较复杂的算子,基于 NPU 的情况下,大家会发现 topk、nms 等带控制流的算法,带很多标量计算,目前用 compute/schedule 很难描述,为解决这个问题,希姆提供一个类似 library 库。相当于在 library 库先编译复杂的逻辑,然后通过跟 IR Builder 结合的方式,把整个算子的逻辑输出。
在这里插入图片描述
接下来是算子的切分。对于 NPU,相对 GPU 和 CPU 情况下,TVM 每条指令都会操作连续内存块,同时会有 memory size 限制。同时,在这种情况下,搜索空间不大。基于这些问题,希姆提供了解决办法,首先,会有一个候选集,把可行的解题放到候选集里,其次,对可行性进行解释,主要考虑性能要求以及 NPU 指令限制,最后,会引入 cost function,其中会考虑算子特征以及可能用到的计算单元特征。

再接下来对算子开发比较有挑战性的就是融合算子。目前面临两个爆炸性问题,第一不知道如何将自己的算子和其他算子组合,第二个可以看到 NPU 里有很多 memory 层级,出现爆炸式 memory 层级的融合。希姆 LLB 会有 shared memory 和 local memory 等融合的组合,基于这种情况下,我们也提供一个自动生成框架,先根据图层给的调度信息,插入数据搬移操作,再根据 schedule 里 master op 和 salve op 提炼 schedule info,最后根据当前指令的限制等问题做一个后处理。
在这里插入图片描述
最后主要展示希姆支持的算子。ONNX 算子大概是 124 个,目前支持的大概是 112 个,占比 90.3%,同时希姆有一套随机测试,可以测试大质数、融合组合以及一些 pattern 融合组合。

总结

本部分为希姆计算工程师淡孝强现场分享。

这是希姆基于 TVM 搭的 CI,这上面跑了 200 多个模型以及非常多的单元测试。MR 不抢 CI 资源的情况下,提交一个代码需要 40 多分钟。计算量很大,大概挂了 20 多张自研计算卡以及一些 CPU 机器。
在这里插入图片描述
总结,这是希姆的架构图,如下所示:
在这里插入图片描述
效果来看,性能得到很大提升,另外自动生成与另一个手写模型的团队对标的话,基本上可以达到他们的 90% 以上。
在这里插入图片描述
这是希姆代码的情况,左边是 TVM 和自研代码如何管理,TVM 是作为 third_party 里的数据结构来使用,希姆有自己的 source 和 python 的东西,如果我们需要对 TVM 进行更改,就在 patch 文件夹中对 TVM 进行改动。这里有三个原则:

  • 大部分使用自研的 pass,也自研了 Custom module;

  • patch 会限制少修改 TVM 源代码,能 upstream 就及时 upstream;

  • 定期跟 TVM 社区做同步,更新最新代码到仓库中。

整个代码量也如上图所示。

总结:

  • 我们基于 TVM 端到端支持希姆一代二代芯片;

  • 基于 relay 和 tir 实现所有的编译优化需求;

  • 基于 tir 完成了 100+ 条向量张量指令的自动生成;

  • 基于 TVM 实现了自定义算子方案;

  • 模型一代支持 160+,二代已经使能 20+;

  • 模型性能接近手写极致。

Q&A

Q1:我对融合算子比较感兴趣,它如何跟 TVM 的 tir 结合?

A1:对于右图,同一个算级,第一,如果算子有两个 input 一个 output,那算子形态就有 27 种。第二,各种各样的算子衔接时,scope 有可能是三个之一,所以我们不会假设有固定 pattern。那么如何在 TVM 上实现?首先根据图层调度,决定前后 add 和中间 scope 在哪里,图层是一个非常复杂的过程,输出的结果是决定算子存在于哪个缓存以及可用缓存有多少。有了这个调度的结果,我们在算子层进行自动融合算子生成,比如我们根据 scope 信息进行自动插入数据搬移的操作,完成数据流的构建。

schedule info 里边和 TVM 原生的机制很类似,融合过程中需要考虑每个 member scope 所用的大小,所以这里就是 TVM 原生的东西,我们只是用了一个特别的框架,将其集成到这里,让它自动化。

do schedule 在此基础上,把开发者所需要的 schedule 做出来,可能也会有一些后处理。

Q2:方便透露 CostModel 更多细节吗?cost function 是根据算子层面的 feature 还是根据硬件层面的特性结合设计的?

A1:大思路已经在这了,首先生成一个候选集,生成过程跟 NPL 结构相关,然后会有剪枝的过程,考虑指令限制以及后边的优化,多核、double buffer 等,最后有一个 cost function 对其进行排序。

我们知道优化套路本质是如何把数据搬移隐藏在计算中,无非是对操作照此标准进行模拟,最后计算代价。

Q3:除了 TVM 支持的默认融合规则,希姆有没有产生新的融合规则,比如在计算图层结合不同硬件定制的特有融合。

A3:关于融合,实际上有两个层次,第一,buffer,第二,loop 融合。TVM 融合方式实际上是针对后一种。希姆基本沿用你说的 TVM 融合 pattern 的套路,但是做了一些限制。

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流程的分析,现 阅读详情

相关推荐

RISC-V与DSA计算机架构

RISC-V与DSA计算机架构 相信所有和计算机体系结构打过交道的朋友们都看过David Patterson与John Hennessy的煌煌巨作,《计算机体系架构:量化研究方法》。两位在计算机架构领域鼎鼎大名的教授,一个来自加州大学伯克利分校,另一个来自斯坦福。 首先上场的是David Patterson,为我们带来了关于指令集架构(ISA)的回顾以及RISC-V项目的展望。 (Patterson教授在演讲中) Patterson教授的演讲主题是50年来计算机体系架构(ISA为主)的回顾以及RISC-

吴建明wujianming_110117 3889

谈一谈TVM编译工程师的修炼手册

TVM 之所以被称为编译器,是因为它提供了从模型表示到硬件特定代码生成的完整编译链。在这个过程中,TVM 执行了诸如优化、调度、代码生成等传统编译器的任务,并最终生成了可以在目标硬件上高效运行的代码。每次加载和运行 ONNX 模型时,如果有变化或需要优化,可能会重新编译代码以适应新的硬件配置或运行时环境。编译工程师的工作涉及编译器的开发、硬件适配、代码优化以及性能调优等多个方面。特别是在 NPU 这样的硬件平台上,编译工程师的工作对充分利用硬件资源、提升深度学习模型的执行效率至关重要。

kingking44的博客 2013

自动驾驶芯片的Domain Specific Architecture

例如,芯擎科技的“星辰一号”自动驾驶芯片采用 7nm 车规工艺,符合 AEC-Q100 标准,多核异构架构让智能驾驶算力更加强劲,其具体架构虽未明确提及是否为特定的 domain specific architecture,但该芯片在自动驾驶领域取得重大突破,CPU 算力达 250 KDMIPS,NPU 算力高达 512 TOPS,通过多芯片协同可实现最高 2048 TOPS 算力,集成高性能 VACC 与 ISP,内置 ASIL-D 功能安全岛,拥有丰富接口,可全面满足 L2 至 L4 级智能驾驶需求。

百态·数智思维 | 聚焦大数据、量化与未来AI 1595

软硬件共同定义:超异构开放生态

单服务器的宏系统复杂度,以及超大规模的云和边缘计算,使得“二八定律”在系统中普遍存在,因此,可以把:相对确定的任务沉淀到基础设施层,相对弹性的沉淀到弹性加速部分,其他继续放在CPU(CPU兜底)。GPU平台实现后,可以持续演绎新的领域新的场景。异构的引擎架构越来越多,必须构建高效的、标准的、开放的接口和架构体系,才能构建一致性的宏架构(多种架构组合)平台,才能避免场景覆盖的碎片化。超异构计算,不是简单的集成,而是把更多的异构计算整合重构,各类型处理器间充分的、灵活的数据交互,形成统一的超异构计算宏系统。

usstmiracle的博客 954

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 3209

DSA2011正式版皮肤编辑器3.0

DSA2011正式版皮肤编辑器,最新论坛下载资源,供大家分享。

穷人家的孩子刘强东又投资了一家AI芯片公司

先来看看,京东的概况近日,北京希姆计算科技有限公司发生工商变更,股东新增江苏京东邦能投资管理有限公司,持股比例为2.87%。来源:天眼查天眼查股权穿透数据显示,刘强东为江苏京东邦能...

weixin_45727359的博客 1748

2011DSA编辑器

DSA修改工具,能注册的好东西请参照http://www.sosaw.com/forum43/thread-227614-1-1.html修改谢谢分享

技术选型必看!GPGPU与NPU/DSA对比,国产算力芯片落地指南

对于优快云的技术从业者而言,信创算力选型、AI芯片落地已成为日常工作的核心痛点。GPGPU与NPU/DSA作为国产算力的两大核心路线,究竟该如何选择?本文结合技术特性、落地场景,做干货级对比,帮开发者快速理清选型逻辑,避开踩坑。不同于泛科普,本文聚焦技术落地视角,从核心定位、能力特性、优劣势、选型建议四个维度,精准匹配开发者、运维工程师、技术架构师的核心需求,兼顾专业性与实用性。

OCR_13371621275的博客 458

基于STM32开发的智能语音控制系统

本文将介绍如何使用STM32微控制器开发一个智能语音控制系统,通过语音识别模块、OLED显示屏、Wi-Fi模块等实现对家用电器或其他设备的语音控制。智能语音控制系统的核心是STM32微控制器,通过语音识别模块识别用户的语音指令,并根据指令控制家用电器或其他设备。:定期测试语音识别模块、继电器控制模块、OLED显示屏和Wi-Fi模块的工作状态,确保系统能够在各种情况下正常运行,并保持智能语音控制系统的可靠性。本系统同样适用于办公环境,可以通过语音指令控制办公室设备,如照明、空调等,提供智能化的办公体验。

stm32d1219的博客 6911

碎碎念android eMMC【转】

本文转载自:https://blog.youkuaiyun.com/Fybon/article/details/44242549 一、/dev/blockroot@:/dev/block #lsbootdevicemmcblk0mmcblk0p1mmcblk0p10…….mmcblk0p18mmcblk0p19mmcblk0p2mmcblk0p20……mmcblk0p29mmcblk0p3mmcblk0p3...

zzb2760715357的博客 379

AI编译器对比:TVM vs MLIR vs Triton在大模型部署中的工程选择

当BERT-base的推理延迟突破10ms门槛,我们看到的不仅是数字的变化,更是编译技术对计算本质的重新诠释——‌在抽象与具象之间寻找最优解‌。工程师的选择将决定大模型落地的效率边界:TVM的通用性、MLIR的扩展性、Triton的极致优化,共同构成AI编译器的黄金三角。

像风一样自由 2970

从玩具到工业:手把手教你用Webots仿真Scara抓取(逆解实战篇)

本文详细介绍了如何在Webots仿真环境中实现Scara机械臂的逆解计算与抓取操作,涵盖从环境配置、逆运动学算法到轨迹规划与实时控制的完整流程。通过实战案例演示,帮助读者掌握机械臂逆解的核心技术,并应用于工业自动化场景,提升Scara机械臂的编程与控制能力。

weixin_30932215的博客 504

AI 编译器学习笔记之十六 -- TVM

是 TVM 的 Tensor Expression 层(高层次算子描述)中的调度单元,用于表示计算图中的某个操作及其优化策略(如循环展开、并行化)。是 TVM 的 TensorIR 层(低层级中间表示)中的基本调度单元,直接对应硬件执行逻辑(如循环嵌套、内存访问)1、使用tvm::Dump调试打印,比如 tvm::Dump(sch->stages)在转换为 TIR 时会生成一个对应的。

~ 飞 扬 的 天 空 ~ 696

带有验证码的爆破(包含Burp suite工具爆破)

关于含有验证码爆破的一些总结!

weixin_43960066的博客 8698

语义通信理论必看论文:Towards a Theory of Semantic Communication

了解语义通信发展必看的一篇文章

一去不复返的通信er 3927

转载:【AI系统】NPU 基础

AI 芯片是专门为加速 AI 应用中的大量针对矩阵计算任务而设计的处理器或计算模块。与传统的通用芯片如中央处理器(CPU)不同,AI 芯片采用针对特定领域优化的体系结构(Domain-Specific Architecture,DSA),侧重于提升执行 AI 算法所需的专用计算性能。如下图所示的就是一个典型的 AI 芯片架构,我们假设所有场景围绕应用,那么其周围的例如解码芯片(如图中黄色部分 RSU)、FPGA 芯片(如图中粉色部分)等都是属于针对特定领域优化的芯片结构。

LKGd27WLY的博客 228

在UI界面中播放视频_unity基础开发教程

之前我写过一篇在场景中播放视频的文章,但是在开发中有时候也会在UI的界面中播放视频,这期我们做一下在UI的界面中播放视频。操作步骤比较简单,到这里就完成了,如果有问题的话可以在评论区留言,下期见,拜拜!

为者常成,行者常至! 2011

AI编译器及TVM概述

TVM(TVM stack)是一个深度学习和机器学习的通用端到端支持库和编译器堆栈,旨在为深度学习模型的开发、优化和部署提供全面的支持。TVM的整体架构包括以下几个关键组件:前端(Frontend):TVM支持多种深度学习框架的前端,包括TensorFlow、PyTorch、Keras等。通过前端,用户可以将自己的深度学习模型导入到TVM中进行编译和优化。中间表示(Intermediate Representation,IR):TVM使用一种中间表示来表示深度学习模型。

wsq_zqfl的博客 2511

【原理图PCB专题】Cadence 17.4版本原理图及PCB 模块复用

在我们设计复杂板卡的时候,往往会遇到一部分电路被反复使用的情况。Cadence允许设计者一开始就将复用模块设计好,以后只要直接调用复用模块就可以直接用以设计更复杂的电路板了。这对于大规模集成设计无疑是非常好的选择,它不仅让设计者不必花费时间在相同模块反复设计上,更有利于电路的模块化设计。

一点硬件 2017

手把手教你学PCIE--所有 PF(Physical Function)共同管理和分配 VF

但具体如何分配和使用 VF 取决于硬件设计、驱动程序配置以及实际应用场景。

MHD0815的博客 1464

TVM编译工程师入门指南:从Relay IR到NPU优化的实战解析

本文详细解析了TVM编译工程师如何从Relay IR到NPU优化进行实战操作,包括环境配置、模型导入、Relay IR优化策略、NPU调度设计、内存优化技巧及部署性能分析。通过真实案例展示TVM在深度学习模型部署中的关键作用,帮助开发者高效解决硬件适配问题。

c6d7e8f9g的博客 618

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【AI系统】NPU 基础

AI 芯片是专门为加速 AI 应用中的大量针对矩阵计算任务而设计的处理器或计算模块。与传统的通用芯片如中央处理器(CPU)不同,AI 芯片采用针对特定领域优化的体系结构(Domain-Specific Architecture,DSA),侧重于提升执行 AI 算法所需的专用计算性能。如下图所示的就是一个典型的 AI 芯片架构,我们假设所有场景围绕应用,那么其周围的例如解码芯片(如图中黄色部分 RSU)、FPGA 芯片(如图中粉色部分)等都是属于针对特定领域优化的芯片结构。

ZOMI酱 6118

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

深度学习工具包 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")

OSDI 2023

OSDI 2023

akdjfhx的博客 2161

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

全面了解MindSporeLite轻量化推理工具(概念版)

全面了解MindSporeLite轻量化推理工具(概念版)

IT菜鸟 2426

从编译原理到NPU加速:TVM工程师必须掌握的4个硬件适配技巧

本文深入探讨TVM工程师在NPU加速中必须掌握的4个硬件适配技巧,包括内存访问模式优化、指令集微观适配、AutoTVM模板设计及混合精度计算实现。通过实战案例展示如何提升深度学习模型在专用加速器上的性能,帮助开发者突破硬件适配瓶颈,实现高效部署。

ujm56789012的博客 281
上一篇: HyperAI超神经已加入群聊,思否 AIGC Hackathon 扩列
下一篇: Science AI 大潮已至,科技部亲自下场出大动作
HyperAI超神经
博客等级 码龄7年 8873粉丝 1753原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值