AI模型部署基础知识(一):模型权重与参数精度

这篇具有很好参考价值的文章主要介绍了AI模型部署基础知识(一):模型权重与参数精度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一般情况来说,我们通过收集数据,训练深度学习模型,通过反向传播求导更新模型的参数,得到一个契合数据和任务的模型。这一阶段,通常使用python&pytorch进行模型的训练得到pth等类型文件。AI模型部署就是将在python环境中训练的模型参数放到需要部署的硬件环境中去跑,比如云平台和其他cpu、gpu设备中。一般来说,权重信息以及权重分布基本不会变(可能会改变精度、也可能会合并一些权重)。
该部分笔记参考oldpan内容

模型权重

一般我们使用Pytorch模型进行训练。训练得到的权重,我们一般都会使用torch.save()保存为.pth的格式。

pth文件内容

pth是Pytorch使用python中内置模块pickle来保存和读取,pth文件的中主要包含字符段{‘epoch’: 190, ‘state_dict’: OrderedDict([(‘conv1.weight’, tensor([[…,},其中epoch 为pth保存的轮次数、state_dict中包含主要的模型结构名称和对应模型参数值,

state_dict的key:

AI模型部署基础知识(一):模型权重与参数精度,AI部署,人工智能,算法

  • 主要权重结构

在模型训练过程中,有很多需要通过反向传播更新的权重,常见的有:
卷积层(conv.weight \conv.bias)
全连接层 (fc.weight)
批处理化层(BN层、或者各种其他LN、IN、GN)
transformer-encoder层
DCN层
这些层一般都是神经网络的核心部分,当然都是有参数的,一定会参与模型的反向传播更新,是我们在训练模型时候需要注意的重要参数。

  • BN的反向传播与参数更新
    BN层中的可学习参数(如果affine=True)会参与反向传播并在训练过程中更新,而用于归一化的统计量(running_mean和running_var)则通过不同的机制进行更新。

# 截取了Pytorch中BN层的部分代码
def __init__(
    self,
    num_features: int,
    eps: float = 1e-5,
    momentum: float = 0.1,
    affine: bool = True,
    track_running_stats: bool = True
) -> None:
    super(_NormBase, self).__init__()
    self.num_features = num_features
    self.eps = eps
    self.momentum = momentum
    self.affine = affine
    self.track_running_stats = track_running_stats
    if self.affine:
        self.weight = Parameter(torch.Tensor(num_features))
        self.bias = Parameter(torch.Tensor(num_features))
    else:
        self.register_parameter('weight', None)
        self.register_parameter('bias', None)
    if self.track_running_stats:
        # 可以看到在使用track_running_stats时,BN层会更新这三个参数
        self.register_buffer('running_mean', torch.zeros(num_features))
        self.register_buffer('running_var', torch.ones(num_features))
        self.register_buffer('num_batches_tracked', torch.tensor(0, dtype=torch.long))
    else:
        self.register_parameter('running_mean', None)
        self.register_parameter('running_var', None)
        self.register_parameter('num_batches_tracked', None)
    self.reset_parameters()
  • 模型结构无参数层
    网络中其实有很多op,仅仅是做一些维度变换、索引取值或者上/下采样的操作,例如:
    Reshape
    Squeeze
    Unsqueeze
    Split
    Transpose
    Gather
    这些操作没有参数仅仅是对上一层传递过来的张量进行维度变换。有时候在通过Pytorch转换为ONNX的时候,偶尔会发生一些转换诡异的情况。比如一个简单的reshape会四分五裂为gather+slip+concat,这种操作相当于复杂化了,不过一般来说这种情况可以使用ONNX-SIMPLIFY去优化掉,当然遇到较为复杂的就需要自行优化了。此外,对于这些变形类的操作算子,其实有些是有参数的,例如下图的reshap

AI模型部署基础知识(一):模型权重与参数精度,AI部署,人工智能,算法
像这种的op,有时候会比较棘手。如果想要将这个ONNX模型转换为TensorRT,那么100%会遇到问题,因为TensorRT的解释器在解析ONNX的时候,不支持reshape层的shape是输入TensorRT,而是把这个shape当成attribute来处理,而ONNX的推理框架Inference则是支持的。

state_dict的value:

AI模型部署基础知识(一):模型权重与参数精度,AI部署,人工智能,算法
模型训练出的各层参数,都是有固定精度的0-1数据。通常来说,pth文件的参数精度为FP32,然而对于模型参数的部署来说我们需要在硬件中进行精度和推理速度之间的协调。

不过执行模型操作(卷积、全连接、反卷积)的算子会变化,可能从Pytorch->TensorRT或者TensorFlow->TFLITE,也就是实现算子的方式变了,同一个卷积操作,在Pytorch框架中是一种实现,在TensorRT又是另一种实践,两者的基本原理是一样的,但是精度和速度不一样,TensorRT可以借助Pytorch训练好的卷积的权重,实现与Pytorch中一样的操作,不过可能更快些。

参数精度

浮点数精度:双精度(FP64)、单精度(FP32、TF32)、半精度(FP16、BF16)、8位精度(FP8)、4位精度(FP4、NF4)
量化精度:INT8、INT4 (也有INT3/INT5/INT6的)
AI模型部署基础知识(一):模型权重与参数精度,AI部署,人工智能,算法

为什么要有这么多精度

因为成本和准确度。
都知道精度高肯定更准确,但是也会带来更高的计算和存储成本。**较低的精度会降低计算精度,但可以提高计算效率和性能。**所以多种不同精度,可以让你在不同情况下选择最适合的一种。
双精度比单精度表达的更精确,但是存储占用多一倍,计算耗时也更高,如果单精度足够,就没必要双精度。
但如何评估是否要进行精度降低?

不同的浮点数精度

在计算机中,浮点数存储方式,由由**符号位(sign)、指数位(exponent)和小数位(fraction)**三部分组成。符号位都是1位,指数位影响浮点数范围,小数位影响精度。

FP精度

AI模型部署基础知识(一):模型权重与参数精度,AI部署,人工智能,算法

特殊精度

  • TF32(1,8,10)
    其实只有19位,Tensor Float 32,英伟达针对机器学习设计的一种特殊的数值类型,用于替代FP32。首次在A100 GPU中支持。
    AI模型部署基础知识(一):模型权重与参数精度,AI部署,人工智能,算法
  • BF16(1,8,7)
    Brain Float 16,由Google Brain提出,也是为了机器学习而设计。由1个符号位,8位指数位(和FP32一致)和7位小数位(低于FP16)组成。所以精度低于FP16,但是表示范围和FP32一致,和FP32之间很容易转换。在 NVIDIA GPU 上,只有 Ampere 架构以及之后的GPU 才支持。
    AI模型部署基础知识(一):模型权重与参数精度,AI部署,人工智能,算法
  • NF4
    4-bit NormalFloat,一种用于量化的特殊格式,于23年5月由华盛顿大学在QLoRA量化论文中提出,论文地址:https://arxiv.org/abs/2305.14314

NF4是建立在分位数量化技术的基础之上的一种信息理论上最优的数据类型。把4位的数字归一化到均值为 0,标准差为 [-1,1] 的正态分布的固定期望值上,知道量化原理的应该就会理解。

一般情况下,精度越低,模型尺寸和推理内存占用越少,为了尽可能的减少资源占用,量化算法被发明。FP32占用4个字节,量化为8位,只需要1个字节。常用的是INT8和INT4,也有其他量化格式(6位、5位甚至3位)。虽然资源占用减少,但是推理结果差不了多少。那么接下来就是我们说到的量化问题。文章来源地址https://www.toymoban.com/news/detail-809426.html

到了这里,关于AI模型部署基础知识(一):模型权重与参数精度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言基础知识:函数中的参数与返回值

    目录 1.形式参数和实际参数 1.1形式参数 1.2实际参数 2.变量作为函数参数 3.数组作为函数参数 3.1数组元素作为函数参数 3.2一维数组名作为函数参数 3.3数组指针,即数组元素的地址作为函数参数 4.函数返回值 形参出现在被调函数当中,在整个函数体内都可以使用。形参在定义

    2024年02月04日
    浏览(38)
  • C++基础知识 (命名空间、输入输出、函数的缺省参数、函数重载)

    🌠 例1: #include iostream 标准输入输出 std 是 c++ 标准库的命名空间,将标准库的定义实现都放到这个命名空间中 using namespace std 展开 std 里的内容 cout   c 代表的是 console 控制台的意思, out 有输出的意思 流运算符 流插入 endl 等价于 \\\'n\\\' 在 c++ 中,变量、函数和类的名称存在于

    2024年02月15日
    浏览(26)
  • 系统学习Python——装饰器:函数装饰器-[添加装饰器参数:基础知识]

    分类目录:《系统学习Python》总目录 前面文章介绍的计时器装饰器有效运行,但是如果它可配置性更强的话,就会更好一一一例如提供一个输出标签并且可以打开或关闭跟踪消息,这些在一个多用途工具中可能很有用。装饰器参数在这里派上了用场:对它们适当编写后,我们

    2024年02月22日
    浏览(27)
  • 【大模型】二 、大语言模型的基础知识

    大型语言模型是近年来机器学习和自然语言处理领域的一个重要发展趋势。以GPT模型为例,阐述其发展 GPT系列基于Transformer架构,进行构建,旨在理解和生成人类语言。它们通常通过在大量文本数据上进行预训练,学习到语言的各种模式和结构,然后可以进行微调,以适应各

    2024年02月12日
    浏览(25)
  • 【前端知识】React 基础巩固(四十一)——手动路由跳转、参数传递及路由配置

    利用 useNavigate 封装一个 withRouter(hoc/with_router.js) 添加到hoc/index.js文件中 利用withRouter,拦截Home组件,实现手动跳转路由 路由参数传递包括:1.动态路由传参;2.查询字符串传参 改造withRouter,通过 useParams() 和 useSearchParams() 来接收两种参数传递: 在界面中,通过params来接收

    2024年02月14日
    浏览(37)
  • ChatGPT基础知识系列之Embeddings模型

    OpenAI的Embeddings(文本嵌入)测量的是文本字符串的相关性。嵌入通常用于: 搜索(根据与查询字符串的相关性对结果进行排名) 聚类(其中文本字符串按相似性分组) 建议(推荐具有相关文本字符串的项目) 异常检测(识别出相关性很小的异常值) 多样性测量(分析相似性

    2024年02月06日
    浏览(29)
  • UE4的AI行为树基础知识

            在制作游戏时,会制作敌人、怪物、NPC等不被玩家所操作的对象,那么制作这些对象,就需要通过使用AI行为树来为他们编写各自的一些行为逻辑,比如敌人会寻找主角并攻击、怪物会在自己的领域巡逻等等。 NavMeshBoundsVolume:导航网格体边界体积,用作导航寻路,会

    2024年02月11日
    浏览(26)
  • 计算机视觉基础知识(八)--点云模型

    三维图像 一种特殊的信息表达形式; 特征是表达的空间中有三个维度的数据; 是对一类信息的统称; 信息的表现形式: 深度图:以灰度表达物体与相机的距离 几何模型:由cad软件建立 点云模型:所有逆向工程设备都将物体采样为点云 和二维图像相比; 三维图像借助第三

    2024年01月25日
    浏览(38)
  • 大型语言模型基础知识的可视化指南

    如今,LLM(大型语言模型的缩写)在全世界都很流行。没有一天不在宣布新的语言模型,这加剧了人们对错过人工智能领域的恐惧。然而,许多人仍在为 LLM 的基本概念而苦苦挣扎,这使他们难以跟上时代的进步。本文的目标读者是那些希望深入了解此类人工智能模型的内部

    2024年01月24日
    浏览(34)
  • Stable Diffusion扩散模型推导公式的基础知识

    A 和 B 是两个独立事件: ⇒ Rightarrow ⇒ P ( A ∣ B ) = P ( A ) P(A|B)=P(A) P ( A ∣ B ) = P ( A ) , P ( B ∣ A ) = P ( B ) P(B|A)=P(B) P ( B ∣ A ) = P ( B ) , ⇒ Rightarrow ⇒ P ( A , B ∣ C ) = P ( A ∣ C ) P ( B ∣ C ) P(A,B|C)=P(A|C)P(B|C) P ( A , B ∣ C ) = P ( A ∣ C ) P ( B ∣ C ) 贝叶斯公式: P ( A ∣ B ) = P ( B ∣

    2024年04月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包