极智AI | 教你tensorrt实现mish算子

本文涉及的产品
视觉智能开放平台,视频资源包5000点
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,分割抠图1万点
简介: 本文介绍了使用 tensorrt 实现 mish 算子的方法。

本文介绍了使用 tensorrt 实现 mish 算子的方法。

相信做过目标检测的同学对 yolo 肯定比较熟悉了,yolov4是 2020 年初提出的,相继后来有了 yolov5 和其他一些变体,yolov4 中汇集了很多 tricks,其中 mish 激活函数也在其中。mish 在这篇论文《Mish: A Self Regularized Non-Monotonic Activation Function》里进行了详细介绍,这里我做了一些函数本身的介绍以及 tensorrt 怎么样去实现 mish 算子。


1、mish 函数数学表达

mish 的数学表达式如下:

函数的图像表达如下,其中:

  • 蓝色曲线为:mish
  • 橙色曲线为:ln(1 + e^(x))

让我们来看看 mish 在 yolov4 里的样子:

也可以把 mish 看成由 tanh 和 softplus 组合起来的。让我们来看下,tanh 的数学表达如下:

softplus 的数学表达如下,softplus 可以看作是 relu 的平滑。

以上对比了 mish、tanh、softplus 的数学表达式,你可以很容易就发现 mish 也可以写成这样:


2、mish 对比 relu

relu 因其能克服梯度消失和加快训练收敛,可以说是最常用的激活函数了,relu 是个分段函数,数学表达式如下:

函数图像表达如下:

这里拿 mish 和 relu 作对比,就是有硬碰硬的感觉。拿论文《Mish: A Self Regularized Non-Monotonic Activation Function》的一些实验进行说明。

这是 relu 和 mish 的梯度对比,可以看到 mish 的梯度更加平滑。

精度方面,在 ImageNet-1K 数据集上对 mish、swish、relu、leaky relu 激活函数对网络精度的提升对了对比,数据如下:

以下是在 MS-COCO 目标检测数据集的对比数据:

从实测的精度提升数据来看,mish 具有十分明显的优势。

性能方面,在 pytorch 框架中,对 relu、softplus、mish、mish-cuda (RTX-2070) 在 fp32 和 fp16 精度下进行了性能对比,数据如下,可以看到 relu 在推理效率上要比 mish 快,mish-cuda 在用 cuda 进行优化后性能能提升很多。


3、tensorrt 实现 mish 算子

先让我们来看一下 tensorrt API 直接支持的激活函数算子:

//!
//! \enum ActivationType
//!
//! \brief Enumerates the types of activation to perform in an activation layer.
//!
enum class ActivationType : int32_t
{
    kRELU = 0,             //!< Rectified linear activation.
    kSIGMOID = 1,          //!< Sigmoid activation.
    kTANH = 2,             //!< TanH activation.
    kLEAKY_RELU = 3,       //!< LeakyRelu activation: x>=0 ? x : alpha * x.
    kELU = 4,              //!< Elu activation: x>=0 ? x : alpha * (exp(x) - 1).
    kSELU = 5,             //!< Selu activation: x>0 ? beta * x : beta * (alpha*exp(x) - alpha)
    kSOFTSIGN = 6,         //!< Softsign activation: x / (1+|x|)
    kSOFTPLUS = 7,         //!< Parametric softplus activation: alpha*log(exp(beta*x)+1)
    kCLIP = 8,             //!< Clip activation: max(alpha, min(beta, x))
    kHARD_SIGMOID = 9,     //!< Hard sigmoid activation: max(0, min(1, alpha*x+beta))
    kSCALED_TANH = 10,     //!< Scaled tanh activation: alpha*tanh(beta*x)
    kTHRESHOLDED_RELU = 11 //!< Thresholded ReLU activation: x>alpha ? x : 0
};

可以看到像 relu、sigmoid、tanh ... 这些你都不用自己去写,直接调 trt 的 api 就好了。我们这里的 mish 不是直接支持的,所以用 trt 来实现的话基本有两种思路:

(1) 用已有算子组合,mish 的话可以用 tanh 和 softplus 组合起来;

(2) 用 cuda kernel 实现,用 plugin 注册进 trt 使用;

下面进行介绍。

3.1 已有算子组合实现

这个其实很好写,看看 mish 的数学表达:

所以基本思路就是先调一个 softplus,再调一个 tanh,把 softplus 的结果传给 tanh,tanh 的输出就等效于一个 mish 的输出。关键代码如下:

########### softplus ############
# 需要注意,trt 里的 softplus 长这样:alpha*log(exp(beta*x)+1)
activationSP = network->addActivation(*Layers[inputName], nvinfer1::ActivationType::kSOFTPLUS);
# 将 alpha 和 beta 设置为 1
activationSP->setAlpha(1);
activationSP->setBeta(1);
############# tanh ##############
nvinfer1::ITensor *activationSP_Out = activationSP->getOutput(0);
mish = network->addActivation(*activationSP_Out, nvinfer1::ActivationType::kTANH);

以上就完成了使用 tensorrt 已有算子组合来实现 mish 操作。

3.2 cuda + plugin 实现

将 mish 进行数学等价转换,转换成如下数学表达:

基本思想就是用 cuda 来直接实现,把原来用 tanh 和 softplus 组合需要两个算子变为一个算子。这里不说用 cuda kernel 怎么去实现了,说一下怎么把 .cu 通过 plugin 注册进 tensorrt 把。

首先你需要有个头,类似这样:

/// mish.h
#include<NvInfer.h>
#include<NvInferPlugin.h>
calss MishLayerPlugin : public IPluginExt
{
    void mish_infer(...);
}

然后是 .cu,里面是算子 gpu_infer 的实现,差不多像这样:

/// mish.cu
#include "mish.h"
__global__ void mish(...)
{
    ...;
}
void MishLayerPlugin::mish_infer(...)
{
    mish<<<xx, xx>>>(...);
}

最后是 .cpp 里通过 plugin 注册进 tensorrt,差不多像这样:

/// tensort-mish.cpp
#include "mish.h"
void addmish_layer(...)
{
  nvinfer1::DataType Dtype;
  Dtype = nvinfer1::DataType::kFLOAT;
  nvinfer1::IPluginExt *mish = new MishLayerPlugin(xxx, Dtype);
  nvinfer1::IPluginLayer *mish_layer = m_network->addPluginExt(&Layers[inputName], 1, *mish);
   ...
}


好了,收工~


logo_show.gif


相关文章
|
7月前
|
机器学习/深度学习 人工智能 算法
极智AI | 谈谈多通道img2col的实现
大家好,我是极智视界,本文来谈谈 多通道img2col的实现。
170 1
|
7月前
|
人工智能 JSON API
极智AI | 三谈昇腾CANN量化
大家好,我是极智视界,本文介绍一下 三谈昇腾CANN量化。
106 1
|
7月前
|
人工智能 API Python
极智AI | 再谈昇腾CANN量化
大家好,我是极智视界,本文介绍一下 再谈昇腾CANN量化。
158 1
|
7月前
|
人工智能 自然语言处理 算法
极智AI | TensorRT API构建模型推理流程
大家好,我是极智视界,本文介绍一下 TensorRT API 构建模型推理流程。
529 1
|
7月前
|
人工智能 算法 数据格式
极智AI | 谈谈昇腾CANN量化
大家好,我是极智视界,本文介绍一下 谈谈昇腾CANN量化。
205 0
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术深度解析:从基础到应用的全面介绍
人工智能(AI)技术的迅猛发展,正在深刻改变着我们的生活和工作方式。从自然语言处理(NLP)到机器学习,从神经网络到大型语言模型(LLM),AI技术的每一次进步都带来了前所未有的机遇和挑战。本文将从背景、历史、业务场景、Python代码示例、流程图以及如何上手等多个方面,对AI技术中的关键组件进行深度解析,为读者呈现一个全面而深入的AI技术世界。
52 10
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
转载:【AI系统】AI的领域、场景与行业应用
本文概述了AI的历史、现状及发展趋势,探讨了AI在计算机视觉、自然语言处理、语音识别等领域的应用,以及在金融、医疗、教育、互联网等行业中的实践案例。随着技术进步,AI模型正从单一走向多样化,从小规模到大规模分布式训练,企业级AI系统设计面临更多挑战,同时也带来了新的研究与工程实践机遇。文中强调了AI基础设施的重要性,并鼓励读者深入了解AI系统的设计原则与研究方法,共同推动AI技术的发展。
转载:【AI系统】AI的领域、场景与行业应用
|
5天前
|
机器学习/深度学习 人工智能 算法
探索AI在医疗诊断中的应用与挑战
【10月更文挑战第21天】 本文深入探讨了人工智能(AI)技术在医疗诊断领域的应用现状与面临的挑战,旨在为读者提供一个全面的视角,了解AI如何改变传统医疗模式,以及这一变革过程中所伴随的技术、伦理和法律问题。通过分析AI技术的优势和局限性,本文旨在促进对AI在医疗领域应用的更深层次理解和讨论。
|
11天前
|
人工智能 缓存 异构计算
云原生AI加速生成式人工智能应用的部署构建
本文探讨了云原生技术背景下,尤其是Kubernetes和容器技术的发展,对模型推理服务带来的挑战与优化策略。文中详细介绍了Knative的弹性扩展机制,包括HPA和CronHPA,以及针对传统弹性扩展“滞后”问题提出的AHPA(高级弹性预测)。此外,文章重点介绍了Fluid项目,它通过分布式缓存优化了模型加载的I/O操作,显著缩短了推理服务的冷启动时间,特别是在处理大规模并发请求时表现出色。通过实际案例,展示了Fluid在vLLM和Qwen模型推理中的应用效果,证明了其在提高模型推理效率和响应速度方面的优势。
云原生AI加速生成式人工智能应用的部署构建
|
10天前
|
机器学习/深度学习 人工智能 物联网
AI赋能大学计划·大模型技术与应用实战学生训练营——电子科技大学站圆满结营
12月05日,由中国软件行业校园招聘与实习公共服务平台携手阿里魔搭社区共同举办的AI赋能大学计划·大模型技术与产业趋势高校行AIGC项目实战营·电子科技大学站圆满结营。
AI赋能大学计划·大模型技术与应用实战学生训练营——电子科技大学站圆满结营

热门文章

最新文章

下一篇
DataWorks