cuDNN-Graph API

Graph API

为了适应越来越重要的算子融合需求,cuDNN8.0版本引入了Graph API,以提供更灵活的API接口。Graph API提供一个声明式的编程模型,此模型将计算操作描述为计算图。

用户首先需要构建操作图。从高层面来说,用户其实是在描述各operations所操作的tensor的数据流图。一旦一个graph最终确定,用户需要选择并配置一个engine,用于执行该graph。选择并配置engines的方法不止一种,这些方法都是在易用性,运行时开销,以及engine性能间进行权衡。

Graph API有如下两种入口点:

  • Backend Descriptor Types(最底层Graph API的入口点)
  • NVIDIA cuDNN Frontend API

基于以下几点原因,我们期望用户使用cuDNN frontend API

  • frontend API使用简单,不那么冗长,通过backend API可访问的所有功能,也可以通过frontend API访问。
  • frontend API在backend API之上添加了一些功能,比如错误过滤以及autotuning。
  • frontend API是开源的。

无论是frontend API还是backend API,他们的高层概念是相同的。

核心概念

就像之前提到过的,graph API的核心概念是:

  • Operations and Operation Graphs
  • Engines and Engine Configurations
  • Heuristics

下面我们先展开聊聊,最后用一个例子讲它们串起来。

Operations and Operation Graphs

一个计算图实际就是各operations所操作tensor的数据流图。该图是一个数学规范,与底层执行该数学操作的engines进行解耦,因为对于一个给定的计算图,底层可能有多个engine可用。

输入/输出 tensor隐式定义了operation之间的连接,例如:operation A以tensor X为输出,然后该tensor X作为operation B的输入,此过程隐含说明operation B依赖operation A。

Engines and Engine Configurations

对于一个给定的计算图,底层可能有多个候选engine可以用于实现该图。查找候选engine列表的典型方式是通过启发式查找(heuristics query,后面会介绍)。

一个engine会有一些knobs,用于配置engine的相关属性(如 tile size,相关信息请参考cudnnBackendKnobType_t)

Heuristics

对于一个给定的计算图来说,heuristic代表一种获取engine配置列表的方法,使用这些配置的engine可以执行该计算图,同时,heuristic方法会对这些配置按照性能从高到低进行排序。目前cuDNN内置了三种模式:

  • CUDNN_HEUR_MODE_A:旨在提供更快的性能,同时能够处理大部分计算图模式。它返回一个按预期性能排序的engine配置列表。
  • CUDNN_HEUR_MODE_B:通常比CUDNN_HEUR_MODE_A具备更高的计算精度,但是是以更高的CPU延迟作为代价。在确定模式A可以做得更好的情况下,底层实现可能会回退到模式A heuristic。
  • CUDNN_HEUR_MODE_FALLBACK:目标也是提供更快的性能,但是可能为了满足功能而回退到非最佳性能的配置上。

推荐的工作流是先查询模式A和B,看是否有engine配置支持当前计算图。第一个支持当前计算图的配置就是性能最好的配置。

用户可以选择自己进行"auto-tune",也就是说,在一个特定的device上,对一个特定的问题,迭代所有engine配置,并对它们进行计时,然后选择性能最好的一个。cuDNN frontend API提供了一个方便的函数cudnnFindPlan()来做这件事。

如果所有的engine配置都不被支持,再使用CUDNN_HEUR_MODE_FALLBACK回退,以此来优先满足功能需求。

高级用户可能想要根据engine的某些属性来过滤engine配置(如通过数值注释,行为注释或者adjustable knobs来过滤)。Numerical notes告知用户engine的数值属性,例如engine是否对输入或输出的datatype执行down conversion。Behavior notes可以包含一些底层实现的信息,例如,底层实现是否采用了运行时编译等。Adjustable knobs允许对engine的行为和性能进行更精细的控制。

Graph API Example with Operation Fusion

接下来,作为示例,我们使用graph API实现convolution+bias+activation的算子融合。

Creating Operation and Tensor Descriptors to Specify the Graph Dataflow

首先,创建三个cuDNN backend operation descriptors。

如下图所示,用户指定了一个前向卷子操作(使用CUDNN_BACKEND_OPERATION_CONVOLUTION_FORWARD_DESCRIPTOR),一个用于添加bias的pointwise操作(使用CUDNN_BACKEND_OPERATION_POINTWISE_DESCRIPTOR),一个用于ReLU激活的pointwise操作(使用CUDNN_BACKEND_OPERATION_POINTWISE_DESCRIPTOR并设置模式为CUDNN_POINTWISE_RELU_FWD)。如何设置这些descriptor的属性可以参考Backend Descriptor Types 。关于如何设置forward convolution,可以参考另一个示例:Setting Up An Operation Graph For A Grouped Convolution use case。

用户还需要为这些operations创建用于输入和输出的tensor descriptor。图的数据流由这些tensor的关系确定,例如,将backend tensor Tmp0指定为convolution operation的输出,同时将其指定为bias operation的输入,cuDNN就可以推导出数据流是从卷积流向bias。同样的规则适用于tensor Tmp1。如果用户不需要将中间值Tmp0Tmp1用作其他用途,则可以将它们指定为virtual tensors,这样的话内存I/O操作可以被优化掉。

  • 拥有1个以上operation节点的图,不支持in-place operations(也就是说,任意的输入tensor的UIDs和输出tensor的UIDs不能相同)。
  • operation descriptors可以以任意顺序创建并传递给cuDNN,因为使用tensor的UIDs就可以决定计算图的依赖顺序。
    请添加图片描述

Finalizing The Operation Graph

第2步,用户finalizes操作图。作为finalization的一部分,cuDNN执行数据流分析,以建立operations之间的依赖关系,并连接计算图的边,如下图所示。在这一步,cuDNN执行大量检查以确定图的有效性。
请添加图片描述

Configuring An Engine That Can Execute The Operation Graph

第3步,对于一个给定的finalized计算图,用户必须选择并配置一个engine,形成一个execution plan,以执行该图。

正如Heuristics小节提到的,这一步的典型方法如下:

  1. 查询heuristics模式A和B。

  2. 查找第一个支持该计算图的engine config(或者对所有engine configs执行auto-tune,并找到一个支持的)

  3. 如果在2)中,找不到可用的engine config,则尝试fallback heuristic。

Executing The Engine

最后,execution plan已经构建好,是时候去运行它了。用户应该提供workspace指针,UID数组以及device指针数组来构建backend参数包。UID数组和指针数组应该一一对应。使用handle,execution plan以及参数包,execution API可以被调用,然后计算操作被下发到GPU上。

最新文章和代码都放在github master-cudnn上,期待star。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/4338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Swift - Playground

文章目录 Swift - Playground1. 新建Playground2. View3. 图片4. ViewController5. Playground - 多Page6. 注释6.1 Playground的注释支持markup语法(与markdown相似)6.1.1 语法 Swift - Playground Playground可以快速预览代码效果,是学习语…

设计模式(九):组合模式

设计模式(九):组合模式 1. 组合模式的介绍2. 组合模式的类图3. 组合模式的实现 1. 组合模式的介绍 组合模式(Composite Pattern)属于结构型模式,是用于把一组相似的对象当作一个单一的对象。 组合模式依据…

基于SpringBoot+Vue校园二手交易系统的设计与实现

系统介绍 自从新冠疫情爆发以来,各个线下实体越来越难做,线下购物的人也越来越少,随之带来的是一些不必要的浪费,尤其是即将毕业的大学生,各种用品不方便携带走导致被遗弃,造成大量的浪费。本系统目的就是让…

基于Spring Boot的旅游管理系统设计与实现

基于Spring Boot的旅游管理系统设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 前台浏览管理界面图,通过内容列表可以获取网…

PotatoPie 4.0 实验教程(41) —— FPGA实现RISC-V 扩展 GPIO UART Timer功能

TD工程介绍 我们提供的TD工程里的RISC-V核默认就开启了GPIO UART扩展,可以看到还有SPI和I2C扩展。因此后面的实验中TD的工程我们基本不怎么修改TD的内容,只需要修改TD工具中Soc_Top.v文件中的TCM0_INITFILE为FD生成的固件名称即可,主要修我以…

【mysql】mysql命令使用大全,你想要的都在这里

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

go设计模式之工厂方法模式

工厂方法模式 什么是工厂方法模式 工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化推迟到其子类。 这个接口就是工厂接口,子类就是具体工厂类,而需要创…

《QT实用小工具·四十三》历史编辑器(支持历史搜索 关键字匹配)

1、概述 源码放在文章末尾 该项目实现了在输入框中输入部分信息能全部展现之前的历史输入信息&#xff0c;支持历史搜索和关键词匹配&#xff0c;项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #include "historymodel.h" #include <QM…

实时通讯技术 WebRTC 介绍

WebRTC WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音对话或视频对话的技术。 历史 2010年5月&#xff0c;Google以6820万美元收购VoIP软件开发商Global IP Solutions的GIPS引擎&#xff0c;并改为名为“WebRTC”。WebRTC使用…

大语言模型Ollama

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Ollama简介 Ollama是一个开源的大语言模型平台&#xff0c;它允许用户在本地环境中运行、创建和共享大型语言模型。Ollama提供了丰富的功能和特性&#xff0c;使得用户可以…

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务&#xff08;Spring MVC Springboot&#xff09;同时允许跨域 Tomcat 配置允许跨域Web 项目配置允许跨域Tomcat 同时允许静态文件和 Web 服务跨域 偶尔遇到一个 Tomcat 部署项目跨域问题&#xff0c;因为已经处理过…

mysql-sql-练习题-1

文章目录 环境注释建表 5张建库学生表课程表教师表分数表总表 语法书写顺序in学过/没学过完全相同 环境 Windows cmd&#xff08;普通用户/管理员&#xff09; mysql -uroot -pmysql版本&#xff0c;模式&#xff08;可自定义&#xff09; select version(),global.sql_mode…

在PR中使用 obs 和 vokoscreen 录制的视频遇到的问题

1. obs 录制的视频 在 Adobe Premiere Pro CS6 中只有音频没有视频 2. vokoscreen 录制的视频&#xff0c;没有声音 这是是和视频录制的编码有关系&#xff0c;也和显卡驱动关系 首先 obs 点击 文件 ---> 设置 录制的视频都是可以正常播放的&#xff0c;在PR不行。更…

用NuGet安装 Oracle ODP.NET

oracle官网原文&#xff1a;Using NuGet to Install and Configure Oracle Data Provider for .NET Using NuGet to Install and Configure Oracle Data Provider for .NET In this section, you will install ODP.NET NuGet packages from nuget.org. Select View > Solut…

【网站项目】图书推荐系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

C++高级特性:C/C++内存结构模型(十一)

1、内存结构 C/C语言一只被认为是一种底层语言&#xff0c;与其他语言不一样&#xff0c;对内存结构理解是C/C程序员从入门到入土的开端。 其他编程语言对内存管理是透明的&#xff0c;程序员无序关心可以认为是一个黑盒&#xff1b;而C/C不一样理解好内存结构有利于编写健壮性…

使用C++实现尾插式循环链表结构

在编码中避免不了使用链表&#xff0c;特别是循环链表&#xff0c;很多同学使用时为了省事直接使用C STL库中的链表实现&#xff0c;这样当然很简单也不容易出错&#xff0c;但同时也不可避免的带来了一些问题&#xff1a; 是半个黑盒&#xff0c;虽然能看源码&#xff0c;但是…

【禅道客户案例】同方智慧能源数智化转型新实践 禅道助力前行

同方智慧能源是同方股份有限公司的骨干企业。依托中核集团、清华大学的科技优势&#xff0c;坚持技术和资源双核驱动&#xff0c;基于30多年行业积淀&#xff0c;面向建筑、交通、工业、北方供热、数据中心等主要用能场景提供设计咨询、产品技术、投资建设、运营服务&#xff0…

DELL PowerEdge服务器通过iDRAC升级BIOS遇到的问题

本文对PowerEdge 12G系统&#xff0c;也就是iDRAC 7版本升级BIOS中遇到的几个问题做个总结&#xff0c;对于其他版本理论上应该也是适用的。如果还遇到其他问题&#xff0c;可以添加VX&#xff0c;VX号为 StorageExpert 进行进一步的分析探讨。 第一个问题&#xff0c;成功下载…

Android 11 裁剪系统显示区域(适配异形屏)

概述 在显示技术中&#xff0c;"OverScan"&#xff08;超扫描&#xff09;是一种调整显示图像边界的技术。通常情况下&#xff0c;OverScan 会在显示屏的边缘周围裁剪一小部分图像。这种裁剪是为了确保显示内容在屏幕上的完整可见性&#xff0c;尤其是在老式电视或投…