markdown 继电器IR介绍
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown 继电器IR介绍相关的知识,希望对你有一定的参考价值。
[TOC]
# Relay IR介绍
Relay IR是第二代NNVM。这里简单总结设计目标,在后面对每个要点进行详细介绍。
- 支持传统的数据流编程和转换。
- 支持functional-style scoping,让它绑定和构造成功能完整的不同语言。
- 允许用户混合两种编程风格
## 使用Relay构建计算图
传统的深度学习框架使用计算图作为其中间表示IR。计算图(或数据流图)是表示计算的有向无环图(DAG)。尽管由于缺乏控制流,数据流图在它们能够表达的计算方面受到限制,但是它们的简单性使得更容易实现异构执行环境的自动区分和编译(例如,在专用硬件上执行图的部分)。
![](https://raw.githubusercontent.com/tvmai/tvmai.github.io/master/images/relay/dataflow.png)
你可以使用Relay构建计算(数据流)图。具体来说,上面的代码显示了如何构造一个简单的双节点图。你可以发现该示例的语法与现有的计算图形IR(如NNVMv1)没有区别,唯一的区别在于术语:
- 现有框架通常使用图和子图
- Relay使用函数(例如,`fn(%x)`)表示图
每个数据流节点都是Relay中的CallNode。 Relay Python DSL允许你快速构建数据流图。我们要在上面的代码中强调一件事 - 我们显式构造了一个Add节点,其输入点都指向%1。当深度学习框架评估上述程序时,它将按拓扑顺序计算节点,而%1将仅计算一次。虽然这件事对于深度学习框架构建者来说非常自然,但这可能会让PL研究人员首先感到惊讶。如果我们实现一个简单的访问者打印出结果并将结果视为嵌套的Call表达式,它将变为log(%x)+ log(%x)。
当DAG中存在共享节点时,这种不明确性是由程序语义的不同解释引起的。在正常的函数式编程IR中,嵌套表达式被视为表达式树,而不考虑%1实际上在%2中重复使用两次的事实。
Relay IR与传统深度学习框架的细微差异在于,通常深度学习框架用户以这种方式构建计算图,其中经常发生DAG节点重用。当我们以文本格式打印出中继程序时,我们每行打印一个CallNode并为每个CallNode分配一个临时id(%1,%2),以便在程序的后续部分中引用每个公共节点。
## Module:支持多函数(Graphs)
以上是关于markdown 继电器IR介绍的主要内容,如果未能解决你的问题,请参考以下文章
[笔记]Learning to Rank算法介绍:RankSVM 和 IR SVM
homekit四路继电器使用介绍
gan充电器意思详细介绍
LLVM 之 IR 篇:零基础快速入门 LLVM IR
LLVM 之 IR 篇:如何使用 LLVM IR 优化器
LLVM 之 IR 篇:如何扩展 LLVM IR 优化器