简介:这份PDF图解资料面向对大模型感兴趣的技术爱好者与研发人员,聚焦DeepSeek本地部署与强化学习训练原理,帮助读者在低成本条件下完成本地运行并理解推理模型R1的构建逻辑。资源包共1个PDF文件,大小约2.64MB,以图文并茂的形式呈现,便于对照操作界面逐步学习。内容覆盖本地部署的三个实操步骤与运行演示,并系统梳理LLM基础概念、Transformer架构、预训练、监督微调与强化学习等训练方法,重点拆解DeepSeek-R1完整训练流程,包括含R1-Zero的中间推理模型与通用强化学习两项核心创新。已有2199人学习,适合零基础读者快速上手,也为研究者提供前沿技术参考,兼顾实操性与理论深度。
1. 从一张 10 页图解说起:为什么我把 DeepSeek-R1 塞进了本地笔记本
上周有个做企业知识库的朋友找我,说他们内部文档涉密,不敢往云端大模型接口上送,问我有没有办法在本地跑一个推理能力够用的模型。我第一反应就是 DeepSeek-R1 的蒸馏小参数版本——1.5B 这个量级,普通笔记本 8GB 内存就能跑起来,而且它带思维链(CoT)输出,做逻辑推理类任务比同尺寸的通用模型强不少。这份 10 页的图解 PDF 正好把两件事串起来了:前半部分讲怎么用 ollama 三步把 DeepSeek 拉到本地跑通,后半部分拆解了 R1 的训练流程,包括 R1-Zero 怎么跳过 SFT 直接上强化学习、通用强化学习又怎么补上多任务能力。适合两类人:一是想低成本验证本地大模型可行性的开发者,二是对 LLM 训练流程尤其是强化学习环节感兴趣、但不想啃论文的从业者。下面我按自己复现的路径,把部署、原理、训练流程和踩坑点拆开讲。
2. 用 ollama 把 DeepSeek-R1 拉进本地:三步命令与参数选择
2.1 为什么选 ollama 而不是自己搭推理框架
本地跑大模型的路子有好几条:自己用 transformers 加载权重、用 llama.cpp 编译量化版本、或者用 ollama 这类封装好的管理工具。我一般会先问对方两个问题:你愿不愿意折腾环境依赖?你需不需要频繁切换不同模型?如果答案分别是“不太想”和“需要”,那 ollama 基本是最省事的选择。
它的核心价值在于把模型下载、量化格式转换、推理服务启动这三件事打包成了一条命令。你不需要单独装 CUDA、不需要手动下载 GGUF 文件、不需要配推理后端。安装完 ollama 之后,它自带一个模型仓库的拉取机制,ollama pull后面跟模型名就行。对于 DeepSeek-R1 这种有多个参数版本(1.5B、7B、8B、14B、32B 等)的模型,ollama 的 tag 机制让你可以按硬件条件灵活选。
另一个实际考虑是离线场景。ollama 拉下来的模型存在本地~/.ollama/models目录下,之后断网也能ollama run。这对内网环境或者网络受限的机器很关键——你只需要在能联网的机器上拉一次,把模型目录拷过去就行。
2.2 三步部署的完整命令与参数说明
第一步,安装 ollama。Windows 和 macOS 都有安装包,Linux 用一条脚本。安装完成后在终端输入ollama,能看到它支持的子命令列表,常用的就几个:pull、run、list、rm、serve。
# 安装完成后验证 ollama 是否可用 ollama --version # 查看当前已拉取的模型列表 ollama list第二步,拉取 DeepSeek-R1 的 1.5B 版本。这个版本是蒸馏后的轻量模型,参数量约 15 亿,量化后文件大小在 1GB 出头,普通笔记本跑起来没什么压力。
# 拉取 deepseek-r1 的 1.5b 参数版本 # 如果你内存 16GB 以上,可以换成 7b 或 8b 版本 ollama pull deepseek-r1:1.5b这里有个参数选择的关键点:1.5b里的b是 billion,即十亿参数。1.5B 就是约 15 亿个权重参数加偏置参数的总量。参数越少,模型体积越小、推理越快,但知识广度和推理深度会打折扣。我实测下来,1.5B 版本做简单的代码解释、文本摘要、基础逻辑推理够用,但涉及多步数学推导或者需要大量世界知识的任务,还是建议上 7B 以上。
第三步,启动对话。
# 运行模型并进入交互式对话界面 ollama run deepseek-r1:1.5b执行后会进入一个提示符,直接输入问题就行。DeepSeek-R1 的输出有个特点:它会先输出一段被thinking标签包裹的内容,这是模型的思考过程,然后才是正式回答。如果你用 API 方式调用,可以通过解析这个标签来区分思考段和回答段。
2.3 用 API 方式调用本地模型
除了交互式对话,ollama 默认在11434端口起了一个 HTTP 服务,可以用 curl 或者 Python 脚本调用。这对集成到自己的应用里很有用。
import requests import json # ollama 默认服务地址 url = "http://localhost:11434/api/generate" payload = { "model": "deepseek-r1:1.5b", "prompt": "用 Python 写一个快速排序,并解释时间复杂度", "stream": False # 设为 True 可以流式获取输出 } response = requests.post(url, json=payload) result = response.json() # 输出完整回复 print(result["response"]) # 如果需要分离思考过程和正式回答,可以按 thinking 标签切分 full_text = result["response"] if " thinking" in full_text: think_part = full_text.split("")[0].replace(" thinking", "") answer_part = full_text.split("")[-1] print("=== 思考过程 ===") print(think_part.strip()) print("=== 正式回答 ===") print(answer_part.strip())这段代码的逻辑是:向本地 ollama 服务发一个 POST 请求,model字段指定用哪个模型,prompt是输入,stream控制是否流式返回。返回的 JSON 里response字段就是模型输出。参数方面,stream=False适合一次性拿完整结果,stream=True适合做打字机效果的前端展示。如果你需要控制生成长度,可以加options字段,里面设num_predict来限制最大 token 数。
3. 看懂 DeepSeek-R1 的训练流程:从 R1-Zero 到通用强化学习
3.1 预训练、SFT、RL 三段式在 R1 里怎么变的
常规 LLM 的训练流程是预训练 → 监督微调 → 人类反馈强化学习。预训练阶段用海量无标注文本让模型学会预测下一个词,SFT 阶段用人工标注的问答对教模型怎么回答问题,RLHF 阶段用人类偏好数据训练奖励模型再优化生成策略。
DeepSeek-R1 的特别之处在于它把中间那段改了。它的起点是 DeepSeek-V3 的基础版本,然后走了一条不寻常的路:先做一个叫 R1-Zero 的中间模型,这个模型完全跳过了 SFT 阶段,直接拿强化学习去训。训出来的结果推理能力很强,但有两个毛病——回复时中英文混杂,非推理类任务表现差。于是第二步在 R1-Zero 的基础上做通用强化学习,引入帮助性和安全性奖励模型,把多任务能力补回来,最终得到 R1。
这个流程的核心创新点在于验证了一件事:纯强化学习也能大幅提升推理能力,不一定非要先做 SFT。R1-Zero 生成的思维链数据反过来又可以用来做 SFT 的训练材料,形成一种自举。
3.2 R1-Zero 的纯强化学习训练:奖励信号从哪来
R1-Zero 跳过 SFT 直接上 RL,那它的奖励信号怎么设计?这是整个流程里最值得琢磨的地方。常见做法是设计两类奖励:一类是准确性奖励,比如数学题有标准答案,模型输出和标准答案一致就给正奖励;另一类是格式奖励,要求模型把思考过程放在指定标签里,格式对了才给分。
这种设计的好处是不依赖人工标注的偏好数据,只需要题目和答案对就行。对于数学、代码这类有明确对错的任务,奖励信号很干净。但问题也出在这里:模型会为了拿奖励而过度优化推理能力,忽略了语言一致性和通用对话能力,所以才会出现中英文混杂的情况。
我自己的理解是,R1-Zero 相当于一个“偏科生”,在推理这个科目上考了高分,但其他科目不及格。通用强化学习阶段就是给它补课。
3.3 通用强化学习的奖励模型设计
通用强化学习阶段在 R1-Zero 的基础上做了两件事:一是用 R1-Zero 生成的推理数据做 SFT,让模型学会用规范的格式输出;二是在 RL 阶段引入帮助性和安全性两个奖励模型。
帮助性奖励模型判断回答是否对用户有帮助,安全性奖励模型判断回答是否包含有害内容。这两个奖励模型的训练数据来自人工标注,和 RLHF 里的做法类似。最终 R1 在推理任务和非推理任务上都有不错的表现,而不是只擅长做题。
从工程角度看,这个两阶段设计的好处是分工明确:第一阶段专注把推理能力拉满,第二阶段专注把通用性和安全性补上。如果一上来就同时优化所有目标,奖励信号会互相干扰,训练难度大很多。
4. 本地部署的避坑与排查:显存、量化、输出格式那些事
4.1 拉取模型时卡住或报错
现象:执行ollama pull deepseek-r1:1.5b后进度条长时间不动,或者报网络超时。
原因:ollama 的模型仓库服务器在境外,国内网络环境下拉取大文件容易断连。另外磁盘空间不足也会导致拉取失败。
解决:先检查磁盘剩余空间,1.5B 版本需要约 1.5GB,7B 版本需要约 5GB。网络问题可以尝试更换 DNS 或者用代理(注意:这里指的是 HTTP 代理,用于软件包下载,不是其他用途)。如果实在拉不下来,可以在能正常拉取的机器上执行ollama pull,然后把~/.ollama/models目录整体拷贝到目标机器。
4.2 运行时报内存不足
现象:ollama run之后模型加载到一半报错退出,提示 out of memory。
原因:模型加载需要的内存大约是文件大小的 1.2 到 1.5 倍。1.5B 量化版本文件约 1GB,运行需要 2GB 左右内存。如果你选的是 7B 版本,文件约 4.5GB,运行需要 6GB 以上内存。
解决:先确认自己机器的可用内存。Windows 上看任务管理器,Linux 用free -h。如果内存不够,换更小参数的版本,比如从 7B 降到 1.5B。另外关闭其他占内存的程序,浏览器开几十个标签页的情况很常见。
4.3 输出里思考过程太长影响阅读
现象:模型回复时thinking标签里的内容特别长,正式回答被推到很后面。
原因:DeepSeek-R1 的推理模型特性决定了它会先生成较长的思维链。1.5B 版本因为参数少,有时会陷入重复思考的循环。
解决:如果通过 API 调用,可以在options里设num_predict限制总生成长度,或者用stop参数在检测到 `` 后停止思考段。交互式使用时,直接等它输出完就行,或者按 Ctrl+C 中断。我一般会在 prompt 里加一句“请直接给出答案,不需要展示思考过程”,但效果不稳定,模型有时还是会先想再答。
4.4 中文回答里夹杂英文
现象:模型用中文提问,但回答里混了不少英文单词或整句英文。
原因:这是 R1-Zero 阶段遗留的问题,纯强化学习训练时没有专门做语言一致性约束。1.5B 小模型比大模型更容易出现这个情况。
解决:在 prompt 里明确要求“请用中文回答”,或者在系统提示里设定语言。如果还是不行,换 7B 以上版本,大模型的语言一致性明显更好。另外可以在 API 调用时加system字段设定角色和语言要求。
5. 进阶用法:用 Modelfile 定制本地模型行为
ollama 支持通过 Modelfile 自定义模型的系统提示、参数和模板。这个功能对本地部署来说很实用,你可以把常用的系统提示固化进去,不用每次都在 prompt 里重复写。
# 创建一个自定义 Modelfile cat > Modelfile << 'EOF' FROM deepseek-r1:1.5b # 设定系统提示,要求中文回答且简洁 SYSTEM "你是一个中文技术助手,回答请用中文,尽量简洁,代码要有注释。" # 调整生成参数 PARAMETER temperature 0.6 PARAMETER top_p 0.9 PARAMETER num_predict 2048 EOF # 基于 Modelfile 创建新模型 ollama create my-deepseek -f Modelfile # 运行自定义模型 ollama run my-deepseek这段 Modelfile 里,FROM指定基础模型,SYSTEM设定系统提示,PARAMETER调整生成参数。temperature控制随机性,0.6 比默认值略低,适合技术问答场景,输出更稳定。top_p是核采样阈值,0.9 表示只从累积概率前 90% 的词里采样。num_predict限制最大生成 token 数,防止输出过长。
创建完之后用ollama list能看到my-deepseek出现在列表里,和普通模型一样用。如果改坏了,ollama rm my-deepseek删掉重建就行。
验证自定义模型是否生效,可以问一个需要中文回答的问题,观察输出语言和长度是否符合预期。我一般会连续问三个问题:一个代码题、一个概念解释题、一个需要多步推理的题,看模型在不同任务类型上的表现是否稳定。
从那以后我每次部署新模型,都会先写一个 Modelfile 把系统提示和参数固定下来,再跑一轮验证问题。这样换机器或者换模型版本时,行为一致性有保障,不用靠记忆去复现配置。希望帮到你。
本文还有配套的精品资源,点击获取