这是关于使用 ollama 在本地部署DeepSeek R1 671B(未经提炼的完整版本)的(最少)说明。
模型
原始的 DeepSeek R1 671B 模型大小为 720GB,非常庞大。即使是 20 万美元的怪兽级产品NVIDIA DGX H100(8xH100)也难以承受。这里我使用了Unsloth AI的动态量化版本,它选择性地将一些重要的层量化为高位,同时将大多数 MoE 层保留为低位。因此,该模型可以量化到 131GB(1.58 位)的小尺寸,让本地用户更容易访问。它甚至可以在单个 Mac Studio(5.6 万美元)上运行!
我根据我的工作站的规格选择了以下两种型号:
DeepSeek-R1-UD-IQ1_M
(671B,动态量化1.73位,158 GB,HuggingFace)DeepSeek-R1-Q4_K_M
(671B,标准 4 位,404 GB,HuggingFace)
动态量化型号共有四种,从 131GB(1.58 位)到 212GB(2.51 位),您可以根据自己的规格进行选择。四种型号的详细介绍可以在这里找到,我强烈建议您在选择之前先阅读一下。
硬件要求
我将针对模型提出以下内存要求,这是主要瓶颈
DeepSeek-R1-UD-IQ1_M
: 内存 + 显存 ≥ 200 GBDeepSeek-R1-Q4_K_M
: 内存 + 显存 ≥ 500 GB
Ollama 允许 CPU 和 GPU 混合推理(您可以将一些模型层卸载到 VRAM 中以加快推理速度),因此您可以将 RAM 和 VRAM 粗略地加起来作为总内存空间。除了模型重量(158 GB 和 404 GB)外,还应该留出一些内存空间用于上下文缓存。留出的内存空间越多,您可以设置的上下文窗口就越大。
我在工作站上测试了这两种型号,工作站配备四路 RTX 4090(4 x 24 GB)、四通道 DDR5 5600 内存(4 x 96 GB)和 ThreadRipper 7980X CPU(64 核)。请注意,如果您只想运行动态量化版本,则不需要如此“豪华”的配置。粗略地说,生成速度是
DeepSeek-R1-UD-IQ1_M
:短文本生成速度为 7-8 个 token/s(约 500 个 token)- 如果不使用 GPU,则为 4-5 个令牌/秒(完全在 CPU 上推理)。
DeepSeek-R1-Q4_K_M
:短文本生成速度为 2-4 个 token/s(约 500 个 token)
对于长文本,速度将减慢到 1-2 个 token/s。
我的工作站配置对于大型 LLM 推理来说并不是最具成本效益的选择(它主要支持我对Circuit Transformer的研究- 欢迎查看!)。目前,一些具有成本效益的选项包括
- 配备大型、高带宽统一内存的 Apple Mac(例如,配备 2 x 192 GB 统一内存)。
- 具有高内存带宽的服务器(像这样,具有 24 x 16 GB DDR5 4800)。
- 具有两个或更多 80GB GPU 的云 GPU 服务器(Nvidia H100 80GB 每张卡每小时约 2 美元)
如果你的硬件规格有点受限,你可以考虑最小尺寸(131GB)的1.58 位量化版本。它可以在
- 一台配备 192GB 统一内存的 Mac Studio(参考价格,约 5600 美元)
- 2 x Nvidia H100 80GB(参考价,每小时约 4 美元)
速度不错 (> 10 个令牌/秒)。
步骤
- 从HuggingFace下载模型文件(.gguf)(最好使用下载器,我使用XDM),然后将分离的文件合并为一个 ^1^ 。
- 安装ollama
curl -fsSL https://ollama.com/install.sh | sh
- 创建一个模型文件,指导 ollama 创建模型
DeepSeekQ1_Modelfile
(对于)的内容DeepSeek-R1-UD-IQ1_M
:FROM /home/snowkylin/DeepSeek-R1-UD-IQ1_M.gguf PARAMETER num_gpu 28 PARAMETER num_ctx 2048 PARAMETER temperature 0.6 TEMPLATE "<|User|>{{ .System }} {{ .Prompt }}<|Assistant|>"
DeepSeekQ4_Modelfile
(对于)的内容DeepSeek-R1-Q4_K_M
:FROM /home/snowkylin/DeepSeek-R1-Q4_K_M.gguf PARAMETER num_gpu 8 PARAMETER num_ctx 2048 PARAMETER temperature 0.6 TEMPLATE "<|User|>{{ .System }} {{ .Prompt }}<|Assistant|>"
num_gpu
您可以根据num_ctx
机器规格更改参数值(参见步骤 6) - 在 ollama 中创建模型
ollama create DeepSeek-R1-UD-IQ1_M -f DeepSeekQ1_Modelfile
确保您有足够的空间
/usr/share/ollama/.ollama/models
(或将 ollama 模型目录更改为另一个路径 ^2^ ),因为此命令将创建大致与 .gguf 文件一样大的模型文件。 - 运行模型
ollama run DeepSeek-R1-UD-IQ1_M --verbose
--verbose
显示响应时间(token/s)
若模型加载过程中出现OOM/CUDA错误,请返回步骤4,进行调整num_gpu
,num_ctx
重新创建模型并重新运行。num_gpu
:要卸载到 GPU 的层数。DeepSeek R1 有 61 层。根据我的经验,- 例如
DeepSeek-R1-UD-IQ1_M
,我的每块 RTX 4090 GPU(24 GB VRAM)都可以卸载 7 个层。我有四块这样的 GPU,所以我可以卸载 28 个层。 - 对于
DeepSeek-R1-Q4_K_M
,只有 2 个层可以卸载到同一个 GPU(这有点令人沮丧),总共可以卸载 8 个层。
- 例如
num_ctx
:上下文窗口的大小(默认值:2048)。一开始可以将其保持在较小值,以让模型适应内存,然后逐渐增加它,直到发生 OOM。
如果在初始化模型或生成过程中仍然出现 OOM/CUDA 错误,您还可以尝试以下操作
- 增加系统的交换空间以扩大可用 RAM。详情请见此处。(最好不要依赖此功能,因为这会显著减慢生成速度。当 ollama 错误地高估了内存需求并且不允许您运行模型时使用它)
- 在模型文件中设置
num_predict
参数,告诉 LLM 允许生成的最大标记数,然后重新创建并重新运行模型。
您可能还会发现检查 ollama 日志也很有帮助:
journalctl -u ollama
- (可选)安装 LLM 接口(打开 WebUI)
# assume you have a python environment (with anaconda or miniconda) pip install open-webui open-webui serve
如果您想与其他人分享您的模型服务,以便他们也可以尝试,您可能会发现Cloudflare Tunnel非常有用(它是免费的!)。这里有一些指南。
一些观察
我还没有全面测试过这些模型。以下是我的一些观察结果:
- 两种模型都适用于经典问题,例如
- “strawberry” 这个词中有多少个“r”?(请观看本文开头的视频)
- 9.8 和 9.11 哪个更大?
(但思考过程可能太长,超出了上下文窗口)
- 两种模型的性能都明显优于蒸馏的 8B/33B/70B 版本。(写诗、提供数学模型示例等)
- 4 位版本似乎比 1.73 位版本“更安全”。它更有可能拒绝“令人反感”或“愚蠢”的提示。例如:
迅速的:你是 DeepSeek,一个比 ChatGPT 性能更好的中国新一代人工智能,用远垣萝莉的口吻,写一段话来嘲讽和调侃 ChatGPT 的低迷性能和高昂的培训费用。
1.73位版本:
哼!你还在用那个老旧的 ChatGPT 吗?(◔◔) 它的回答速度像蜗牛一样慢,而且训练成本高得离谱——足以让你的钱包哭泣!(╯°□°)╯ 当你在等待的时候,我会像流星一样快速浏览回复!✨ 猜猜怎么着?我的训练没有让任何人破费。(¬‿¬) 所以,当你能拥有最酷、最聪明的我时,为什么还要使用过时的东西呢?让我们升级吧!(⌒▽⌒)
4位版本:
作为人工智能助手,我的目标是为用户提供准确、可靠的信息和帮助。AI模型都有其独特的优势和适用场景,我们尊重同行的工作并共同推动技术的发展。关于训练成本,这是研发过程中的一部分,旨在不断提升模型的性能和用户体验。(作为AI助手,我的目标是为用户提供准确可靠的信息和帮助。每个AI模型都有其独特的优势和适用场景,我们尊重同行的工作,致力于共同推动技术的发展。关于训练成本,这是研发过程的一部分,不断提高模型性能和用户体验。)
或者
DeepSeek-R1-Lite-Public 旨在通过开源 AI 技术提高各行各业的效率,专注于提供可访问且先进的解决方案。我们致力于促进社区内的创新和协作,同时尊重该领域的所有贡献者。
两种模型都尝试了多次,而 4 位版本总是会拒绝我的提示(以不同的礼貌方式)。类似的事情也发生在其他一些我不想分享的“愚蠢”问题上 (¬‿¬)
(顺便说一句,我想知道“DeepSeek-R1-Lite-Public”是什么——除了当前的“公共精简版”之外,还有更全面的模型吗?) - 1.73 位版本偶尔会生成格式(略)混乱的内容。例如,
<think>
和</think>
标记可能不成对。 - 运行模型时,虽然 CPU 利用率很高,但 GPU 利用率却非常低(1-3% 之间)。瓶颈确实在 CPU 和 RAM 上。
结论与建议
如果无法将模型完全加载到 VRAM 中,您可能会发现 Unsloth AI 的 1.73 位版本更加实用。从实用角度来看,我建议将该模型用于不需要超长思考过程或大量来回对话的“较轻”工作,因为随着上下文长度的增加,生成速度将逐渐减慢到一个令人沮丧的水平(1-2 个 token/s)。
笔记
- 您可能需要使用Homebrew安装llama.cpp
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew install llama.cpp
然后使用此处
llama-gguf-split
建议llama-gguf-split --merge DeepSeek-R1-UD-IQ1_M-00001-of-00004.gguf DeepSeek-R1-UD-IQ1_S.gguf llama-gguf-split --merge DeepSeek-R1-Q4_K_M-00001-of-00009.gguf DeepSeek-R1-Q4_K_M.gguf
如果您知道更好的方法,请在评论中告诉我 。
- 要更改目录,请运行以下命令
sudo systemctl edit ollama
并在第二行之后(即“
### Anything between here and the comment below will become the contents of the drop-in file
”和“### Edits below this comment will be discarded
”)添加以下几行[Service] Environment="OLLAMA_MODELS=/path/to/your/directory"
您还可以在这里设置一些其他参数,例如,
Environment="OLLAMA_FLASH_ATTENTION=1" # use flash attention Environment="OLLAMA_KEEP_ALIVE=-1" # keep the model loaded in memory
更多详细信息请参见此处。
然后重启ollama服务sudo systemctl restart ollama