当前位置: 首页 > news >正文

2024.8.13-算法学习(原创+转载)

一、什么是张量并行(Tensor Parallelism) ?

张量并行(Tensor Parallelism) 是一种分布式矩阵算法。

随着模型越来越大,模型内的矩阵也越来越大。一个大矩阵的乘法可以拆分成多个小矩阵的运算,这个些运算就可以充分利用 GPU 的多核还有多 GPU 来进行分布式计算,从而提高运算速度。

1.1 1D Tensor Parallelism 两种矩阵切分方法

1、使用第一种方法:

这样的切分方法需要一个 Reduce 操作,因为要把各部分的结果求和得到最终结果。

2、使用第二种方法:

这样的切分方法需要一个结果 Concat 拼接起来。但是由于每一部分的计算结果都是最终结果的一部分,所以可以不着急 Reduce 结果,可以直接作为下一次并行计算的输入。

组合切分方法:

如果有多个矩阵进行相乘,相邻之间的矩阵可以一个横切,一个纵切,然后放到不同的 device 上。从而达到并行计算的目的。

分割成多个也是类似的结论。所以对于矩阵相乘来说,如果有 N 个 GPU,完全可以将参数平分到 N 个GPU上,每个 GPU 只负责计算  1/N   的参数。

1.2 举例:FFN 的 Tensor Parallelism

Transformers 的 FFN 层涉及两次矩阵乘法。

其中   g   是激活函数 Gelu。激活函数的非线性导致:

由于有这个激活函数的存在,我们最好按照切分方法2 来进行。因为如果采用第一种,那么需要先进行 Reduce 之后才能执行 Gelu 操作。然后再拆分,再 Reduce。这里有2步 Reduce 操作。

如果采用第二种,则仅需要最后一步进行 Reduce 即可,少了中间的 Reduce 再拆分的工作。

原文地址:京东面试官:“ 什么是张量并行(Tensor Parallelism) ?”

 

二、量化模型格式GPTQ、GGUF

首先介绍一下量化的概念:

        大型语言模型由一堆权重和激活表示。这些值通常由通常的32位浮点(float32)数据类型表示。比特的数量告诉你它可以表示多少个值。量化是指将LLM从其原始Float32表示转换为更小的表示。

        如果我们选择较低的位大小,那么模型就会变得不那么准确,但它表示更少的值,从而降低其大小和内存需求。

tips:对哪些值可以进行量化:

可以对模型参数(weight)、激活值(activation)或者梯度(gradient)做量化。

2.1 GPTQ

GPTQ是一种4位量化的训练后量化(PTQ)方法,主要关注GPU推理和性能。

该方法背后的思想是,尝试通过最小化该权重的均方误差将所有权重压缩到4位。

在推理过程中,它将动态地将其权重去量化为float16,以提高性能,同时保持低内存。

所以一般情况下,我们经常使用一种名为4bit-NormalFloat (NF4)的新格式来实现这一点。

这个数据类型做了一些特殊的技巧,以便有效地表示更大的位数据类型。它包括三个步骤:

①归一化:将模型的权重归一化,以便我们期望权重落在一定范围内。这允许更有效地表示更常见的值。

②量化:将权重量化为4位。在NF4中,量化级别相对于归一化权重是均匀间隔的,从而有效地表示原始的32位权重。

③去量化:虽然权重以4位存储,但它们在计算期间被去量化,从而在推理期间提高性能。

2.2 GGUF

如果你的GPU无法处理如此大的模型,那么可使用针对于使用CPU对模型进行量化的方法。典型的就是GGUF。

参考文章:

[1] A Visual Guide to Quantization - Maarten Grootendorst

[2] Which Quantization Method Works Best for You?

[3] https://zhuanlan.zhihu.com/p/667109491

http://www.lryc.cn/news/422784.html

相关文章:

  • beautifulsoup的简单使用
  • 【Python】Jupyter Notebook的安装及简单使用
  • 中国自动驾驶出租车冲击网约车市场
  • 解决浏览器书签同步问题,极空间部署开源免费的跨平台书签同步工具『xBrowserSync』
  • 14个SpringBoot优化小妙招
  • Elasticsearch 度量(Metric)聚合详解及示例
  • 基于 jsp 的健身俱乐部会员系统设计与实现
  • 苍穹外卖项目DAY01
  • SpringBoot(Ⅰ)——HelloWorld和基本打包部署+Pom依赖概述+@SpringBootApplication注解+自动装配原理+约定大于配置
  • [Unity]关闭URP的SRP,开启GPU Instancing。
  • 04创建型设计模式——建造者模式
  • 前端开发中的代码规范
  • WHAT - 远程控制机制
  • 苹果手机录音功能在哪里?3招轻松打开手机录音
  • RCE之突破长度限制
  • Arduino控制带编码器的直流电机速度
  • LangChain与Elasticsearch向量数据库的完美结合
  • element时间段选择器或时间选择器 只设置默认起始时间或者结束时间,不显示问题
  • Vue 3 中,组件间传值有多种方式
  • 前置(3):npm 和npx异同点
  • 笔记(day17)集合概述、List、Set、比较器
  • C语言从头学45——I/O函数(二)
  • Python爬虫——爬取bilibili中的视频
  • 为什么企业电销要用外呼系统
  • Keepalived + Nginx 主备容灾方案介绍
  • PHP、JavaScript代码审计工具
  • 《向量数据库指南》——Ray Data+Anyscale解锁价值评估新篇章
  • 知识改变命运 数据结构【杨辉三角(顺序表)】
  • Docker三剑客之Docker Engine
  • 【Qt】信号与槽(下)