DeepLearning
文章平均质量分 91
图波列夫
这个作者很懒,什么都没留下…
展开
-
CUTLASS 中的 47_ampere_gemm_universal_streamk 示例
前一篇文章介绍了 Stream-K: Work-centric Parallel Decomposition for Dense Matrix-Matrix Multiplication on the GPU 论文,下面对其代码实现进行分析。cutlass 的 examples/47_ampere_gemm_universal_streamk 展示了 GEMM Stream-K 算法在 Ampere 架构上的使用。对比了普通 Gemm 以及 Split-K 算法和 Stream-K 的性能原创 2024-08-21 19:36:09 · 1084 阅读 · 0 评论 -
onnxruntime 中的 Gather 算子
上一篇文章中介绍了 Division by Invariant Integers using Multiplication 的原理,很多框架均才用该算法优化除法运算。onnxruntime 是已知实现中最为简洁的,因此本文结合 onnxruntime 的 Gather 实现进行介绍。 Gather 算子是一个索引类算子,kernel 中每个线程计算偏移时使用 fast_divmod 避免除法运算。 注意:ONNX 中的 Gather 功能与 numpy.take 相同原创 2024-03-27 19:06:20 · 1897 阅读 · 2 评论 -
Division by Invariant Integers using Multiplication
表 1.1 比较了一些处理器上乘法和除法的时间。这张表展示了乘法和除法时间差距的增长趋势。因此,中提出了使用整数乘法进行任意非零整数常数和运行时不变量之间除法的算法。文档中记录了更广泛的处理指令性能,其中 Intel IceLake 处理器的乘除法指令延迟和吞吐倒数如下表所示:可以看出,在现代 CPU 处理器上除法开销大的情况并未发生改变。NVIDIA 和 AMD GPU 均不支持整数除法指令,CUDA C++ Programming Guide。原创 2024-03-19 20:00:37 · 870 阅读 · 0 评论 -
CUTLASS: Implicit GEMM Convolution
Implicit GEMM 是将卷积操作表述为 GEMM (广义矩阵-矩阵积)。卷积接受激活张量并对其应用滑动滤波器以产生输出张量。二维卷积可以映射到矩阵乘:组建一个包含激活张量元素的卷积矩阵,然后由滤波张量形成的矩阵乘以该矩阵。该算法的最早形式通过通常称为 im2col 的操作显式构造卷积矩阵。生成的矩阵按照滤波器大小复制每个激活元素,消耗额外的存储容量和内存带宽。隐式 GEMM 算法是 CUDA 中分块、分层 GEMM 计算的一种变体:当数据从全局内存加载到共享内存时,通过周密地更新指针和谓词,它翻译 2023-08-15 19:21:06 · 2753 阅读 · 0 评论 -
CUTLASS: Efficient GEMM in CUDA
CUTLASS 实现了 CUTLASS: Fast Linear Algebra in CUDA C++ 和 CUTLASS GTC2018 talk 中描述的分层分块结构。基本的三重嵌套循环计算矩阵乘法可以应用分块和拼贴,以匹配硬件、内存局部性和并行编程模型中的并发性。CUTLASS 中 GEMM 映射到 NVIDIA GPU 的结构如以下嵌套循环所示。翻译 2023-08-10 19:39:18 · 1508 阅读 · 0 评论 -
OneFlow 中的 Softmax
Softmax 是深度学习模型中的常见算子。PyTorch 的 Softmax 算子直接调用 cuDNN 的接口。而 OneFlow 内部针对输入数据的类别数量,采用3个 kernel 来分别处理,在多数情况下都可以获得比 cuDNN 更优的性能表现。下面对其实现进行介绍。OneFlow 的静态分层结构如下图所示:原创 2023-08-10 19:18:13 · 497 阅读 · 0 评论 -
torchvision 中的 deform_conv2d
如 DCNv1 和 DCNv2 论文所述,DeformConv 相比常规卷积的参数量和计算量增加不多,但对网络的提升很大。然而,DeformConv 的计算模式并不利于高效实现,给网络带来的开销比纸面数值大:常规卷积可以采用 Implicit GEMM 的形式,非常高效;DeformConv 需要离散访存和插值,增加了 IO 量和内存占用。在 Torchvision 以及其他框架中,DeformConv2d 采用 Explicit GEMM 的方式实现。具体步骤为:deformable_im原创 2023-07-07 17:53:40 · 2872 阅读 · 3 评论 -
DCN v2阅读笔记
是研究的续作,发表在 CVPR 2019上。作者对的自适应行为进行研究,观察到虽然其神经特征的空间支持比常规的卷积神经网络更符合物体结构,但这种支持可能远远超出感兴趣区域,导致特征受到不相关图像内容的影响。为此,作者提出了改进版的,通过增加建模能力和更强的训练来提高其聚焦于相关图像区域的能力。原创 2023-07-05 12:51:51 · 1021 阅读 · 0 评论 -
DCN v1阅读笔记
视觉识别(例如对象检测和语义分割)中的一个关键挑战是如何适应物体尺度、姿态、视角和零件变形中的几何变化或模型几何变换。以往通过扩充现有数据样本,构建具有足够所需变化的训练数据集来缓解。这两种方法的指导思想为在模块中增加额外偏移量的空间采样位置,并从目标任务中学习偏移量,而无需额外监督。新模块可以很容易地替换现有 CNN 中的普通模块,并且可以通过标准反向传播很容易地进行端到端训练,从而产生。原创 2023-06-26 20:14:14 · 571 阅读 · 0 评论 -
TensorFlow 中的 BatchToSpaceOp
Atrous Convolution 是中提出的卷积运算。不仅能够明确控制在深度卷积神经网络中计算特征响应的分辨率,还可以在不增加参数数量或计算量的情况下,有效地扩大滤波器的视场以纳入更大的上下文。作者通过在 Caffe 框架中的 im2col 层添加对底层特征图进行稀疏采样的选项来实现。而到了发布时,该操作已加入到 TensorFlow 官方支持中,即和。rr2r×r通过将空洞卷积化简为规则卷积,能够使用现有的高度优化的卷积程序。实现原理可参考。和会调用。fill:#333;原创 2023-04-23 19:34:48 · 705 阅读 · 1 评论 -
cuDNN 的初始设计
cuDNN V1.0在2014年的发布,并集成到 Caffe、Paddle 等深度学习框架中。论文介绍了 NVIDIA 对于该库的设计和实现。近十年间,NVIDIA 迭代推出了8代架构,cuDNN 也更新到 8.9。硬件上引入了 Tensor Core,软件方面 cuDNN V8 中的 Graph API 相比之前变化较大。然而,作为深度学习领域影响广泛的软件基础设施,一窥 cuDNN 的初始设计仍是有意义的。cuDNN 类似于 cuBLAS,提供了深度学习原语的高效实现。原创 2023-04-22 20:07:02 · 1165 阅读 · 0 评论 -
TensorFlow 中的 LRNOp
TensorFlow 中的 LRNOp 与 Caffe 的差异:* 直接使用平方和而不是像论文中一样使用平方和的均值,因此算子的推荐参数有所不同;* 仅支持 NHWC 格式的输入;* CPU 后端有多种实现: MKL、SingleThreadedLRN 和带状矩阵乘法实现;* GPU 后端仅有 cuDNN 实现,在前后插入转置操作。原创 2023-01-30 14:24:16 · 507 阅读 · 1 评论 -
Caffe 中的 LRNLayer
Caffe 中的 LRNLayer 支持两种模式: CrossChannel:为人们所熟知的局部响应归一化,在 AlexNet 中提出,在一些早期网络中使用; WithinChannel: Caffe 中独有的实现,未见网络中应用。本文略过。ReLU 具有不需要输入归一化以防止其饱和的理想特性。但 AlexNet 论文中发现 LRN 有助于提高泛化性。LRN CrossChannel 模式公式如下:原创 2023-01-17 11:54:38 · 426 阅读 · 0 评论 -
Understanding Memory Formats
大多数计算都是关于数据的:分析数据、调整数据、读取和存储数据、生成数据等。DNN 领域也不例外。图像、权重/过滤器、声音和文本需要在计算机内存中高效表示,从而以最方便的方式快速执行操作。本文致力于数据格式的一种数据表示形式,它描述了多维数组(nD)如何存储在线性(1D)内存地址空间中,以及为什么这对 oneDNN 很重要。翻译 2022-11-27 20:48:44 · 278 阅读 · 0 评论 -
PyTorch Design Philosophy
本文档旨在帮助贡献者和模块维护者理解 PyTorch 演化出的高层设计原则。这些规则并不是硬性规定的,而是用来作为指南,以帮助权衡不同的关注点,解决开发 PyTorch 时可能出现的分歧。有关贡献、模块维护以及如何将分歧升级至核心维护者的更多信息,请参见 [ PyTorch Governance](https://pytorch.org/docs/master/community/governance.html)。翻译 2022-11-23 16:58:02 · 152 阅读 · 0 评论 -
TensorFlow 中的 Conv2DOp
TensorFlow 中的2D 卷积主要依赖外部库,如 cuDNN、cuBLAS、ROCm 和 hfp/libxsmm,仅 DeepConv2D 为源码实现。Conv2DOpBinaryOpInitConv2DParameters 从 OpKernelConstruction 中读取设置到 Conv2DParameters 并进行检查。CudnnUseAutotune 标识是否开启自动调优。......原创 2022-08-03 10:35:49 · 891 阅读 · 0 评论 -
PaddlePaddle 中的 CTCGreedyDecoder
TensorFlow 中的 CTCGreedyDecoder 仅包含 CPU 实现。而 PaddlePaddle 框架则更贴近实际需求,可以在 GPU 上运行。简单来说,PaddlePaddle 内部通过拼接方式,先通过 topk 算子找到最大类别,然后通过 CTCAlignOp 完成后处理。ctc_greedy_decodercheck_variable_and_dtype 检查变量的类型以及数据类型。LayerHelper 主要是在各个 layers 函数之间共享代码。内部调用 topk 算子得原创 2022-05-04 22:31:01 · 1189 阅读 · 0 评论 -
TensorFlow 中的 CTCGreedyDecoder
CTCGreedyDecoderOp 对输入中给出的 logits 执行贪婪解码(最佳路径)。原创 2022-04-30 21:47:25 · 1957 阅读 · 0 评论 -
Applying the Roofline Model for Deep Learning performance optimizations
Applying the Roofline Model for Deep Learning performance optimizations 以 Intel Xeon 为例,介绍了一种为非统一内存访问( NonUnified Memory Access,NUMA[8])自动创建 Roofline 模型的方法,并对 Intel oneDNN 库中实现的高效深度学习原语进行了评估。2 Description of methodology所有实验均在禁用 Intel Turbo Boost 技术的 Inte原创 2022-01-15 11:49:02 · 994 阅读 · 0 评论 -
Hierarchical Roofline Performance Analysis for Deep Learning Applications
Roofline 模型是劳伦斯伯克利国家实验室在2008年提出的一个性能模型,后续很多工作亦出自该实验室。考虑到分层 Roofline 这一概念已在先前的Hierarchical Roofline analysis for GPUs: Accelerating performance optimization for the NERSC-9 Perlmutter system 和 Hierarchical Roofline Analysis: How to Collect Data using Perfo原创 2021-11-28 21:37:31 · 1058 阅读 · 0 评论 -
TNN MatConverter Resize
TNN 的 resize 虽然分通道提供了多个接口,但底层是一起的。整个实现对于灰度图优化非常有限,而3通道或4通道的图像会有加速。缩放的映射关系较为简单,主要分为三步:原创 2021-05-09 16:53:29 · 894 阅读 · 1 评论 -
TNN MatConverter WarpAffine
TNN 的仿射变换形态介于 OpenCV 和 ncnn 之间。其处理流程与 OpenCV 较为相似并做了一些优化,不同的地方在于数据处理宽度为4,比较小。在性能表现方面中规中矩,小图上不及 ncnn。MatUtils::WarpAffine#mermaid-svg-FNwIOkXOm8kxHfXI .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color原创 2021-05-09 16:42:07 · 519 阅读 · 3 评论 -
ncnn 中的 warpAffine
ncnn 的仿射变换对于深度学习的预处理即小图变换进行了优化,速度可达到 OpenCV 的两倍。详细请参考 [opencv ncnn warpaffine 性能测试](https://zhuanlan.zhihu.com/p/355147243)。在具体实现方面,优点是简洁明快,双线性插值采用10bit 量化,比 OpenCV 精度高;缺点是边界填充仅支持常量值。下面从 ncnn 的测试代码入手进行分析。原创 2021-05-09 16:26:02 · 1257 阅读 · 4 评论 -
CMake 编译 rkmedia
在瑞芯微的使用手册中,rkmedia 库使用 Buildroot 编译。然而由于配置文件众多,不易定位编译过程中的问题,所以本文以 CMake 进行构建。目标平台为 RV1109/1126。编译 libdrm-rockchiprkmedia 中的组件支持选项配置,但 drm 是必需的。所以第一步需要先编译该库。首先在电脑上按照编译过程中会用到的库。sudo apt-get install xutils-devsudo apt-get install libpciaccess-dev获取 lib原创 2021-03-07 20:01:58 · 3306 阅读 · 7 评论 -
TNN MatConverter CvtColor NV21TOBGR
OpenCV 中的 carotene 对于 armv7优化较好,而 armv8下则是 NEON 实现。TNN 提供了一套图像预处理接口并且进行了汇编优化。下面以 NV21TOBGR 为例进行介绍。MatUtils无成员变量,全部为静态函数。public: //copy cpu <-> device, cpu<->cpu, device<->device, src and dst dims must be equal. static Status Co原创 2021-02-21 21:38:45 · 674 阅读 · 0 评论 -
rkmedia 中的行人检测
RKMedia 是瑞芯微提供的媒体处理方案,可支持应用软件快速开发。rkmedia为 C 接口,其实现均在easymedia中。后者提供 C++ 接口。rkmedia中的行人检测示例,执行的操作为: 配置两个 RTSP 会话,初始化媒体处理平台; GetMediaBuffer 线程获取缓存并调用 rockx 进行检测跟踪; MainStream 线程绘制结果。原创 2020-12-26 11:20:21 · 5827 阅读 · 10 评论 -
MNN Interpreter and Session
MNN 中 Interpreter 和 Session 之间的关系如下图所示:Interpreter 为模型解释器,亦为会话管理器,负责从文件加载模型,创建并执行会话;一个 Interpreter 对应到一个 Net,管理基于该网络的多个任务;Session 表示推理任务,由 Pipeline 数组和输入输出张量字典组成;Session 根据 Schedule::schedule 生成的 Schedule::ScheduleInfo 创建;归属于同一 Net 的不同 Session 间不能并发调用原创 2020-09-12 17:56:16 · 2282 阅读 · 0 评论 -
MNN classficationTopkEval
MNN classficationTopkEval.cpp 输入模型和配置文件,测试模型在 ImageNet 数据集上的分类精度。程序分为3部分:ImageProcess 将图像转换为适当格式的 Tensor;Interpreter 由模型文件创建 Net 和 Session 并执行会话;computeTopkAcc 计算分类准确率。main#mermaid-svg-DIh1q4eQfe20BU3X .label{font-family:'trebuchet ms', verdana, ar原创 2020-08-30 14:22:48 · 395 阅读 · 0 评论 -
人脸对齐中的相似性变换
人脸对齐是大多数人脸分析算法中的一个关键模块,在人脸识别、表情识别、人脸建模等领域有着广泛的应用。人脸对齐获取图像中人脸的几何结构,基于平移、缩放和旋转得到对齐后的标准人脸。在欧式几何中,如果两个物体具有相同的形状,或者其中一个物体的形状与另一个物体的镜像相同,那么这两个物体是相似的。更准确地说,可以通过均匀缩放(放大或缩小)并叠加必要的平移、旋转和反射来获得另一个。这意味着任意物体都可以重新缩放、重新定位和反射,以便与另一物体精确重合。如果两个物体相似,则每个物体都与另一个物体的特定均匀缩放结果一致。原创 2020-05-16 15:30:51 · 3442 阅读 · 0 评论 -
用 Neon Intrinsics 优化 C 代码
以下内容翻译自:Optimizing C Code with Neon Intrinsics概述本指南向您展示如何在 C 或 C++ 代码中使用 Neon intrinsics 函数,以利用 Armv8架构中的 Advanced SIMD 技术。这些简单的示例演示了如何使用这些内嵌原语,并提供了一个解释其用途的机会。希望使用 Advanced SIMD 技术的底层软件工程师、库编写人员和其他...翻译 2020-02-01 17:55:49 · 3905 阅读 · 0 评论 -
PDARTS 网络结构搜索程序分析
PDARTS 即 Progressive Differentiable Architecture Search: Bridging the Depth Gap between Search and Evaluation,是对 DARTS 的改进。DARTS 内存占用过高,训练不了较大的模型;PDARTS 将训练划分为3个阶段,逐步搜索,在增加网络深度的同时缩减操作种类。过程如下图所示:此外,算...原创 2019-08-24 11:41:15 · 2968 阅读 · 3 评论 -
PC-DARTS 网络结构搜索程序分析
PC-DARTS 仍出自华为诺亚方舟,相比前作 PDARTS 更加优雅。额外引入的一组权重参数可以提高性能。main if not torch.cuda.is_available(): logging.info('no gpu device available') sys.exit(1) np.random.seed(args.seed) torch.cuda.se...原创 2019-08-24 14:56:40 · 3601 阅读 · 2 评论 -
AnnaAraslanova/FBNet 程序分析
AnnaAraslanova/FBNet 是 FBNet 相对来说比较好的一个第三方实现。延迟测量采用 x86 处理器的结果近似。需要注意的是:PyTorch GPU 并行对输入数据有要求;随机超网络直接使用 BN 层似乎不妥。supernet_main_file.pytrain_supernet 训练随机超网络。sample_architecture_from_the_supern...原创 2019-08-24 18:06:35 · 1255 阅读 · 4 评论 -
pysot 中的异步多进程切图
孪生网络算法对数据需求量较大,训练一般使用多个数据集。检测数据集普遍图大目标多,pysot 第一步准备数据,屏蔽了不同数据集的差异,也提升了数据加载效率。网络设定的模板大小为 127×127127\times 127127×127,搜索区域大约为 255×255255\times 255255×255。为给数据增强留有余地,数据切图大小为 511×511511\times 511511×511。下...原创 2019-08-24 18:49:26 · 1143 阅读 · 15 评论 -
BlazeFace:一种非典型专用检测器
MediaPipe 是谷歌在 CVPR2019会议上开源的一个感知和增强现实的框架。该框架基于图,可在移动设备、工作站和服务器上跨平台运行,并支持移动 GPU 加速。BlazeFace 为其中一个重要的组件,因为检测是绝大多数计算机视觉应用的入口。过往检测算法总是从提升性能出发,即便关注轻量级检测器的文章仍不免要在通用数据集上刷一下榜。而谷歌这篇紧贴实际需求,考虑场景限制条件,打造出一款小而专...原创 2019-08-25 19:54:49 · 5636 阅读 · 5 评论 -
FBGEMM 开源,用于最先进的服务器端推理
以下内容翻译自:Open-sourcing FBGEMM for state-of-the-art server-side inferenceFacebook 正在开源 FBGEMM,这是一个针对服务器端推理进行了优化的高性能内核库。深度学习模型加速会使用低精度计算,与其他常用库不同,FBGEMM 优化了 CPU 上的低精度计算性能。该库已在 Facebook 部署,它的性能与目前的生...翻译 2018-12-07 20:21:45 · 3587 阅读 · 0 评论 -
使用TVM优化深度学习GPU算子:深度卷积实例
以下内容翻译自:Optimize Deep Learning GPU Operators with TVM: A Depthwise Convolution Example高效的深度学习算子是深度学习系统的核心。通常这些算子很难优化,并且需要高性能计算专家的努力。TVM,端到端张量IR/DSL堆栈,使得这项任务更容易。这个博客教你如何在TVM的帮助下编写高性能GPU运算核心。我们使用深度卷...翻译 2018-03-01 20:01:00 · 11361 阅读 · 6 评论 -
网络结构搜索之梯度可微
前面介绍了强化学习方法,但屠龙刀毕竟不是人人有。梯度可微算法在保证精度可接受的前提下大幅缩短了训练周期,开启了网络结构搜索的平民化浪潮。MobileNetV2FBNetShiftNetGumbel-SoftmaxSNASDARTSProxylessNASP-DARTSPC-DARTSDenseNASDARTSDARTS 由 CMU 和 DeepMind 提出,最终发表在 ICLR 2019...原创 2019-08-20 09:28:49 · 3320 阅读 · 0 评论 -
RetinaNet Examples:NVIDIA 一站式训练、推理及模型转换解决方案
retinanet-examples 是英伟达提供的目标检测工程范例,针对端到端 GPU 处理进行了优化:使用基于 Python 多进程的 apex.parallel.DistributedDataParallel 加速分布式训练;apex.amp 优化混合精度训练;NVIDIA DALI 加速数据预处理;推理使用 TensorRT。项目推荐安装 PyTorch NGC docker...原创 2019-08-08 19:24:25 · 2380 阅读 · 11 评论 -
网络结构搜索之强化学习
算力和需求的增长使得神经架构搜索( Neural Architecture Search,NAS)重回人们的视线。NAS 可迁移性更强,能够以快速且简单粗暴的方式获得高精度模型,成为工程师手中称手的砖块。强化学习(RL)可谓 NAS 中的核武器,谷歌开启并引领该方向的工作。由初期燃烧的显卡到专用硬件,对效率的追求犹如挖矿一般。原创 2019-07-30 14:36:26 · 3559 阅读 · 2 评论