DeepSeek R1原本是一个拥有6710亿参数的语言模型,在Unsloth AI团队的努力下,该模型经过了动态量化,成功将大小减少了80%,从720GB压缩到了最低131GB,保持了强大的性能。当加入模型卸载功能后,该模型可以在仅有24GB显存的情况下运行,进行每秒少量token的推理。
大型语言模型的规模为何重要大型语言模型天生就需要大量的存储和计算资源。维持所有参数的全精度表示(通常是FP16或FP32)变得不太现实,尤其是在进行本地推理时,因为这会占用大量的内存。量化——即减少权重的位宽——可以显著减小模型大小和内存占用,从而提供解决方案。然而,整个网络简单地进行均匀量化会导致严重的性能下降,这表现为输出不稳定或重复生成标记。
动态量化:一种量身定制的方法_UNSloth AI团队的方法涉及动态量化技术,根据网络组件的敏感度分配不同的位精度。关键技术见解包括:
-
选择性精度分配:
初始的稠密层和下投影矩阵(down_proj),对于建立稳定表示和管理SwiGLU激活中的缩放属性至关重要,它们保持在较高的精度(4位或6位)。相反,模型中大部分参数,约占88%,主要集中在混合专家(MoE)层中,则被激进地量化到1.5到2位。 -
重要性矩阵校准:
在量化过程中引入一个重要性矩阵,使该方法能够根据各层动态调整精度。这种校准避免了常见的陷阱,比如无限循环和通常由均匀量化引起的无意义输出。 - 层特定敏感性分析:
技术评估表明,尽管MoE层可以容忍较低的精度,但注意力机制、嵌入层和最终输出层需要更多的位数来保持激活分布。这种细致的策略确保了计算图中的关键路径保持足够的精度。
无懈怠AI已经发布了多个动态量化版本,每个都在模型大小和输出质量之间做了权衡。
例如,在一个控制测试中,当模型被要求生成一个 Flappy Bird 游戏的 Python 实现时,即使是最小的 1.58 位版本依然具备相当的功能。相比之下,对所有层进行均匀量化处理则导致了重复输出或完全无法生成连贯的代码或直接失败。
在本地部署DeepSeek R1系统动态量化的模型设计用于在常见的推理引擎上运行,如llama.cpp,该引擎支持Unsloth AI发布的GGUF格式文件。下面是对部署流程的一个概览:
- 构建推理引擎:
接下来,克隆并编译支持 GPU 的llama.cpp
。
`git clone https://github.com/ggerganov/llama.cpp` 可以用来从 GitHub 克隆 llama.cpp 项目。
`cd llama.cpp` 切换到项目目录。
`cmake . -B build -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON -DLLAMA_CURL=ON` 使用 CMake 配置构建环境。
`cmake --build build --config Release -j --clean-first --target llama-quantize llama-cli llama-gguf-split` 使用 CMake 构建指定的目标。
2. 下载模型文件:
使用Hugging Face Hub下载所需的模型版本
从huggingface_hub导入snapshot_download函数
snapshot_download(
repo_id="unsloth/DeepSeek-R1-GGUF",
local_dir="DeepSeek-R1-GGUF",
allow_patterns=["*UD-IQ1_S*"], # 适用于1.58位版本
)
3. 关于GPU卸载处理的考虑:
根据可用的VRAM,按照以下方法确定要转移到GPU的层数:
使用如下方法:
n_offload = floor((GPU_VRAM_GB / Model_FileSize_GB) * (Total_Layers - 4))
# 计算需要卸载的层的数量
- 运行模型:
使用类似的命令来运行模型
./build/bin/llama-cli \
--model DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf \
--cache-type-k q4_0 \
--threads 16 \
--prio 2 \
--temp 0.6 \
--ctx-size 8192 \
--seed 3407 \
--n-gpu-layers 7 \
--no-cnv \
--prompt "<|User|>用Python创建一个Flappy Bird游戏。<|Assistant|>"
让我来讲讲我的一些经历
我想亲自试一试这种动态量化技术。为了测试模型,我在VastAI租了一块80GB的GPU,每小时只需2.7美元(约18.6元人民币)。考虑到原模型的巨大体积,我对量化版本的性能和效率感到相当满意,感觉物超所值。下面是几个我做的测试案例:
- 生成 Flappy Bird 游戏:
模型成功生成了经典的 Flappy Bird 游戏的 Python 实现。尽管在量化过程中出现了一些小问题,核心功能仍然完好无损,并且代码只需稍作修改就能运行。
这个演示来自 unsloth.ai,不过我用 1.58 bit 版本也得到了差不多的结果。
- 运动检测
- 分词注意事项:
如果处理不当,可能会导致诸如重复的BOS标记或错误的EOS屏蔽等问题。 - 参数敏感性:
动态量化有时会在长序列中产生孤立的错误标记。可以调整一些推理参数,比如将min_p
设置为0.1或0.05,帮助减少这些小问题。
DeepSeek R1 由 Unsloth AI 开发的动态量化技术展示了模型压缩技术的重要进展。通过在不同网络层智能分配位精度,这种方法在最多减少模型存储占用达 80% 的同时,保持了必要的计算精度,确保了模型的计算准确性。这意味着最先进的大型语言模型现在更加容易获得,可以在之前被认为不足以运行这些模型的硬件上进行实验和部署。
如果你对这个领域的探索感兴趣,我鼓励你去看看Hugging Face上的模型,还有llama.cpp GitHub仓库。也可以看看他们写的原始文章:查看DeepSeek-R1动态1.58位
祝你量化愉快!加油!
共同学习,写下你的评论
评论加载中...
作者其他优质文章