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

4090单卡挑战DeepSeek r1 671b:尝试量化后的心得的分享

引言:

最近,DeepSeek-R1在完全开源的背景下,与OpenAI的O1推理模型展开了激烈竞争,引发了广泛关注。为了让更多本地用户能够运行DeepSeek,我们成功将R1 671B参数模型从720GB压缩至131GB,减少了80%,同时保持了强大的功能。

通过研究 DeepSeek R1 的架构,我们设法选择性地将某些层量化为更高的位(如 4 位),并将大多数 MoE 层(如 GPT-4 中使用的层)保留为 1.5 位(参见Unsloth 动态 4 位).天真地量化所有层会完全破坏模型,导致无限循环和乱码输出。动态量化解决了这个问题。 

1.58 位量化应该适合 160GB 的 VRAM 以进行快速推理(2x H100 80GB),每秒达到大约 140 个令牌。您不需要 VRAM (GPU) 来运行 1.58 位 R1,只需 20GB 的 RAM (CPU) 就可以工作,但可能会很慢。为了获得最佳性能,我们建议 VRAM + RAM 的总和至少为 80GB+。

1:使用动态量化版本

使用重要性矩阵来校准量化过程(通过 llama.cpp 的 imatrix)以允许较低位的表示。

MoE Bits

Disk Size

Type

Quality

Link

Down_proj

1.58-bit

131GB

IQ1_S

Fair

Link

2.06/1.56bit

这些指令适用于R1蒸馏版和非蒸馏版模型,但请注意,它们对硬件的要求不同。

2. 基准和消融

为了测试所有量化模型,我们没有依赖通用基准,而是让DeepSeek r1创建一个有3次尝试机会的Flappy Bird游戏(pass@3),并根据10项标准对其进行评分(例如使用随机颜色、随机形状、是否能在Python解释器中运行等)。我们使用了种子3407、3408和3409,并采用了建议的温度值0.6~0.7之间

3:原创和量化后的对比数据

我们惊讶地发现,我们的动态1.58位版本似乎仍然能够生成有效的输出! 然而,如果你不使用我们的动态1.58位版本,而是简单地量化所有层,你将会得到无限重复的内容,比如在种子3407中:“Colours with dark Colours with dark Colours with dark Colours with dark Colours with dark”,或者在种子3408中:“Set up the Pygame's Pygame display with a Pygame's Pygame's Pygame's Pygame's Pygame's Pygame's Pygame's Pygame's Pygame's”。 同样地,如果你不使用我们的动态版本,而是将所有层量化为1.75比特(149GB),无限重复会停止,但结果完全错误。

Model Size

Dynamic Quant

Model Size

Basic Quant

131GB

6.92

133GB

0

1.58比特的动态量化有时会每8000个token产生1个错误的token,我们需要将其注释掉。使用min_p = 0.10.05应该可以缓解1.58比特版本生成单个错误token的问题。

4.利用DeepSeek R1的架构

     在我们之前对DeepSeek V3模型的分析中,该模型使用DeepSeek r1进行合成数据生成,我们注意到DeepSeek的前3层是完全密集的,而不是MoE(混合专家)。作为回顾,MoE(混合专家)层允许我们增加模型中的参数数量,而不会增加使用的FLOPs(浮点运算次数),因为我们动态地将大多数条目屏蔽为0,因此我们基本上跳过了对零化条目进行矩阵乘法运算。

MoEs(混合专家模型)的目标是“绕过”扩展定律,因为我们在不改变计算成本的情况下增加了参数数量。有关MoEs的更多笔记以及一种名为Memory Layers的新方法(旨在比MoEs做得更好),请参见这条推文:x.com/danielhanchen/status/1868748998783517093

通过结合以下四种方法,包括: 我们的4位动态量化方法 1.58位LLMs论文 Llama.cpp的1.5位量化 超级权重论文 我们成功应用了以下见解:

  1. 前三个密集层使用了所有权重的0.5%。我们将这些保持为4位或6位。

  2. MoE层使用共享专家,使用了1.5%的权重。我们将使用6位。

  3. 我们可以将所有MLA注意力模块保持为4位或6位,使用不到5%的权重。我们应该量化注意力输出(3%),但最好保持其较高精度。

  4. down_proj对量化最为敏感,尤其是在前几层。我们通过超级权重论文、我们的动态量化方法和llama.cpp的GGUF量化方法验证了我们的发现。因此,我们将前3到6个MoE down_proj矩阵保持较高精度。例如,在超级权重论文中,我们看到几乎所有不应被量化的权重都在down_proj中。

关于为什么所有的“超级权重”或最重要的权重都在 down_proj 中的主要见解是因为 SwiGLU 的操作:

[ [f(XW_{gate}) * (XW_{up})]W_{down} ] 这意味着 up 和 gate 投影本质上会相乘形成较大的数值,而 down_proj 必须将它们缩小——这意味着量化 down_proj 可能不是一个好主意,尤其是在 Transformer 的早期层中。

  1. 我们应该将 embedding 和 lm_head 分别保留为 4 位和 6 位。MoE 路由器和所有层归一化保留为 32 位。

  2. 这使得约 88% 的权重成为 MoE 权重!通过将它们量化为 1.58 位,我们可以大幅缩小模型!

  3. 我们提供了动态量化代码作为 llama.cpp 的一个分支:github.com/unslothai/llama.cpp

  4. 我们利用了 Bartowski 的重要性矩阵来进行低位量化

开始模板问题

所有蒸馏版本和主要的67IB R1模型使用相同的聊天模板:

< begin_of_sentence > < 用户 > 1+1等于多少?
< 助手 > 等于2。< end_of_sentence >
| 用户 | > 再解释一下!< 助手 |

在推理过程中,强制添加了BOS(开始符),并且每个交互之间用EOS(结束符)分隔。为了避免在推理过程中出现双BOS标记,你应该只调用tokenizer.encode(..., add_special_tokens = False),因为聊天模板会自动添加BOS标记。对于llama.cpp / GGUF推理,你应该跳过BOS,因为它会自动添加。

< 用户 > 1+1等于多少?< 助手 >

和标记有自己指定的标记。对于Qwen和Llama的蒸馏版本,一些标记被重新映射,例如Qwen没有BOS标记,所以必须使用<\object_ref_start>代替。所有蒸馏版和原始 R1 版本似乎意外地将填充标记分配给了 < | end_of_sentence | >,这通常不是一个好主意,特别是如果你想在这些推理模型的基础上进一步微调。这将导致无限生成,因为大多数框架会将 EOS 标记屏蔽为 -100。 我们修复了所有蒸馏版本和原始R1版本,使用了正确的填充标记(Qwen使用<|vision_pad|>,Llama使用<|finetune_right_pad_id|>,而R1使用<|PAD▁TOKEN|>或我们自己添加的填充标记)。

DeepSeek R1有61层。例如,使用24GB GPU或80GB GPU时,您可以预期在向下取整后卸载(如果内存不足,减少11)

要运行模型,我们将K缓存量化为4bit。量化V缓存需要为llama.cpp编译flash attention内核。我们使用机器上的所有线程,并使用DeepSeek推荐的温度0.6。上下文大小是您希望模型生成的令牌数量。

到此我可以尝试一下用运行量化后的deepseek R1 671B后版本试试,但是可能也会失败的。只能说有这样挑战和冒险。

相关文章:

4090单卡挑战DeepSeek r1 671b:尝试量化后的心得的分享

引言&#xff1a; 最近&#xff0c;DeepSeek-R1在完全开源的背景下&#xff0c;与OpenAI的O1推理模型展开了激烈竞争&#xff0c;引发了广泛关注。为了让更多本地用户能够运行DeepSeek&#xff0c;我们成功将R1 671B参数模型从720GB压缩至131GB&#xff0c;减少了80%&#xff…...

SpringBoot速成(12)文章分类P15-P19

1.新增文章分类 1.Postman登录不上&#xff0c;可以从头registe->login一个新的成员:注意&#xff0c;跳转多个url时&#xff0c;post/get/patch记得修改成controller类中对应方法上写的 2.postman运行成功&#xff1a; 但表中不更新&#xff1a;细节有问题&#xff1a; c是…...

C++17中的clamp函数

一、std::clamp() 其实在前面简单介绍过这个函数&#xff0c;但当时只是一个集中的说明&#xff0c;为了更好的理解std::clamp的应用&#xff0c;本篇再详细进行阐述一次。std::clamp在C17中其定义的方式为&#xff1a; template< class T > constexpr const T& cl…...

配置Open-R1,评测第三方蒸馏模型的性能1

年前DeepSeek不温不火&#xff0c;问题的响应极。一回车&#xff0c;就看模型如口吐莲花般&#xff0c;先是输出思维过程&#xff0c;虽然中间绕来绕去&#xff0c;但是输出回答时还是准确而简洁的。比如&#xff0c;用它来读当时出来的几篇文章&#xff0c;确实大大提升了效率…...

Chrome插件开发流程

Chrome插件开发流程可以分为以下几个主要步骤&#xff1a; ### 1. 确定插件功能和目标 在开始开发之前&#xff0c;首先需要明确插件的功能和目标。这包括&#xff1a; - **功能定义**&#xff1a;确定插件要解决的问题或提供的功能。 - **市场分析**&#xff1a;了解目标用户群…...

物联网行业通识:从入门到深度解析

物联网行业通识&#xff1a;从入门到深度解析 &#xff08;图1&#xff1a;物联网生态示意图&#xff09; 一、引言&#xff1a;万物互联时代的到来 根据IDC最新预测&#xff0c;到2025年全球物联网设备连接数将突破410亿&#xff0c;市场规模达1.1万亿美元。物联网&#xff…...

【做一个微信小程序】校园事件页面实现

前言 为了进一步扩展校园事件页面的功能,我们可以添加 搜索、分类筛选 和 渐变卡片色 等特性。以下是详细的方案和源码实现。 扩展功能设计 1. 搜索功能 在页面顶部添加搜索框,用户输入关键词后,筛选出匹配的事件。2. 分类筛选 在页面顶部添加分类标签(如“全部”、“活动…...

C++基础系列【14】继承与多态

博主介绍&#xff1a;程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章&#xff0c;首发gzh&#xff0c;见文末&#x1f447;&#x1f…...

DeepSeek-R1 大模型本地部署指南

文章目录 一、系统要求硬件要求软件环境 二、部署流程1. 环境准备2. 模型获取3. 推理代码配置4. 启动推理服务 三、优化方案1. 显存优化技术2. 性能加速方案 四、部署验证健康检查脚本预期输出特征 五、常见问题解决1. CUDA内存不足2. 分词器警告处理3. 多GPU部署 六、安全合规…...

在conda环境下,安装Pytorch和CUDA

系统 : Ubuntu20.04 显卡&#xff1a;NVIDIA GTX1650 显卡驱动已经装好&#xff08;命令 nvidia-smi 查看显卡配置&#xff09; &#xff08;主要看一下第一行的参数&#xff0c;最大支持的CUDA版本为12.4 &#xff09; Aanconda 版本&#xff08;安装指南&#xff09;(似乎…...

Java里int和Integer的区别?

大家好&#xff0c;我是锋哥。今天分享关于【Java里int和Integer的区别&#xff1f;】面试题。希望对大家有帮助&#xff1b; Java里int和Integer的区别&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Java 中&#xff0c;int 和 Integer 都是用来表…...

【第13章:自监督学习与少样本学习—13.4 自监督学习与少样本学习的未来研究方向与挑战】

凌晨三点的实验室里,博士生小张盯着屏幕上的训练曲线——他设计的跨模态少样本学习模型在医疗影像诊断任务上突然出现了诡异的性能断崖。前一秒还在92%的准确率高位运行,下一秒就暴跌到47%。这个看似灾难性的现象,却意外揭开了自监督学习与少样本学习技术深藏的核心挑战… 一…...

【NLP】文本预处理

目录 一、文本处理的基本方法 1.1 分词 1.2 命名体实体识别 1.3 词性标注 二、文本张量的表示形式 2.1 one-hot编码 2.2 word2vec 模型 2.2.1 CBOW模式 2.2.2 skipgram模式 2.3 词嵌入word embedding 三、文本数据分析 3.1 标签数量分布 3.2 句子长度分布 3.3 词…...

deepseek r1从零搭建本地知识库10:嵌入模型和知识库建设

一、嵌入模型&#xff08;Embedding Model&#xff09;是什么&#xff1f; 1. 定义 嵌入模型是一种将文本、图像、音频等非结构化数据转化为**低维稠密向量&#xff08;Dense Vector&#xff09;**的算法模型&#xff0c;这些向量&#xff08;通常几百到几千维&#xff09;能够…...

Linux-文件IO

1.open函数 【1】基本概念和使用 #include <fcntl.h> int open(const char *pathname&#xff0c;int flags); int open(const char *pathname&#xff0c;int flags&#xff0c;mode_t mode); 功能: 打开或创建文件 参数: pathname //打开的文件名 f…...

3d pose 学习笔记2025

目录 champ nlf 3dpose 2025 55个关键点 推理代码: 要设置环境变量: 依赖项metrabs 渲染代码: tram4d 脚也不是特别好 GVHMR脚对不齐 推理代码: multiperson 2023年 genhmr还没开源: champ https://zhuanlan.zhihu.com/p/700326554 nlf 3dpose 2025 55个关键点…...

LC-随机链表的复制、排序链表、合并K个升序链表、LRU缓存

随机链表的复制 为了在 O(n) 时间复杂度内解决这个问题&#xff0c;并且使用 O(1) 的额外空间&#xff0c;可以利用以下技巧&#xff1a; 将新节点插入到原节点后面&#xff1a;我们可以将复制节点插入到原节点后面。例如&#xff0c;如果链表是 A -> B -> C&#xff0c…...

静态页面在安卓端可以正常显示,但是在ios打开这个页面就需要刷新才能显示全图片

这个问题可能有几个原因导致,我来分析一下并给出解决方案: 首要问题是懒加载实现方式的兼容性问题。当前的懒加载实现可能在 iOS 上不够稳定。建议修改图片懒加载的实现方式: // 使用 Intersection Observer API 实现懒加载 function initLazyLoading() {const imageObserver…...

四元数如何用于 3D 旋转(代替欧拉角和旋转矩阵)【ESP32指向鼠标】

四元数如何用于 3D 旋转&#xff08;代替欧拉角和旋转矩阵&#xff09; 在三维空间中&#xff0c;物体的旋转可以用 欧拉角、旋转矩阵 或 四元数 来表示。 四元数相比于欧拉角和旋转矩阵有 计算更高效、避免万向锁、存储占用少 等优点&#xff0c;因此广泛用于 游戏开发、机器…...

JavaScript 内置对象-日期对象

在JavaScript中&#xff0c;处理日期和时间是一个常见的需求。无论是显示当前时间、计算两个日期之间的差异&#xff0c;还是格式化日期字符串&#xff0c;Date 对象都能提供强大的支持。本文将详细介绍 Date 对象的使用方法&#xff0c;包括创建日期实例、获取和设置日期值、以…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...