简介面向希望搭建私有AI环境的个人开发者与小型企业这份PDF图文教程系统讲解在Windows上通过ollama本地部署DeepSeek的完整流程。它解决了官方安装默认占用C盘、命令行操作不直观等痛点重点覆盖环境变量修改模型存储位置、OLLAMA_HOST与OLLAMA_ORIGINS配置、防火墙放行11434端口等关键环节并给出1.5b/7b/8b/14b等不同规模模型的选择建议。资源为1个PDF文件共802KB步骤配有界面示意与命令示例适合零基础用户按图操作。从环境变量设置到模型下载安装再到Chatbox可视化界面接入均给出可复现的操作路径让部署后即可直接对话使用。已有1530人学习下载按教程可避开常见权限和端口障碍快速完成私有化部署满足数据不出本地的日常AI问答需求。1. 本地部署 DeepSeek 到底在解决什么问题先想清楚再动手「本地部署 DeepSeek 教程」这几个字搜索量一直很高但点进来的人诉求其实分两种一种是受够了 API 调用延迟波动想把模型放进自己电脑另一种是数据出网不放心想把推理服务完全收进内网。这两类诉求落到技术上方向是一样的——把权重文件下载到本地用你自己的硬件跑推理不依赖任何外部接口。这个教程不打算讲大理论直接给可复现的路径先判断硬件够不够格再选量化版本然后用 Ollama 快速跑通够用了就停要上生产就换 llama.cpp 或 vLLM最后把五个高频翻车现场一次性讲完。适合谁有一张 8G 显存以上显卡、或者 16G 内存以上电脑的开发者想给团队搭内部推理服务的工程同学。不适合谁没有现成硬件还指望跑 70B 以上大模型的人——先看完第 2 章再决定别下载 40GB 的文件回家当摆设。正文按「硬件选型 → 最小部署 → 生产部署 → 避坑调优」推进命令都是可抄的。开始。2. 硬件底线与模型选型先判断你的机器够不够格2.1 为什么量化等级是第一道选择题DeepSeek 的权重以 FP16 格式存储时每一亿参数大约要占 200MB 空间7B 模型就是接近 14GB32B 超过 60GB个人电脑直接没戏。所以本地部署的第一步不是下载而是把模型压缩到你的硬件装得下的程度这个压缩动作就是量化把权重从 16 位浮点压到 8 位、5 位或者 4 位表示。你在 GGUF 文件名里看到的 Q4_K_M、Q5_K_S 这些记号就是量化方案和精度的标记K 表示用了 K-quant 算法M/S 表示中/小规格。这里有个新人常踩的误区以为量化只是单纯压缩体积、质量成比例变差。实际不是。K 系列量化专门针对分布做了优化Q4_K_M 与早期 Q4_0 相比体积接近但质量损失小得多。我自己的经验是7B 级别的模型用 Q4_K_M和全精度版本Q8_0并排做同一组测试题输出质量差距肉眼几乎分辨不出来但显存占用少一半。所以选量化档位不是越低越好而是「你的机器装不下时降到哪一档还能保持可用」。具体对照如下数值是常见 GGUF 转换的近似结果不同量化脚本有小数差异量化档位7B 模型文件大小质量损失适用场景Q8_0约 8GB几乎无损显存富余、重视质量Q6_K约 5.9GB极小显存 10G 左右Q5_K_M约 5.1GB小大众均衡点Q4_K_M约 4.7GB可接受最常用覆盖 8G 显卡Q3_K_M约 3.7GB明显显存小但想跑 7BQ2_K约 2.8GB严重不推荐跑起来也难受除了权重显存里还要给 KV cache 留位置。上下文长度开到 8192 时7B 模型的 KV cache 大约吃掉 1~2GB 显存取决于模型的层数和注意力头数上下文越长这一项涨得越快。后面章节讲的 OOM 事故绝大多数不是因为权重超了而是权重 KV cache 一起爆。还有一条 DeepSeek 特有的规律大参数版本是 MoE 架构推理时只激活部分专家速度快但所有权重依然要常驻显存。别被「激活参数少」这类宣传带偏该占多少还是多少选型时只看权重文件大小就对了。2.2 一张表定位自己该跑哪个版本DeepSeek 开源的模型里R1 系列有 1.5B、7B、8B、14B、32B、70B以及 671B 的 MoE 大模型。个人机器上现实的选择是前五个70B 需要双卡或超大显存671B 是机房级别的话题。我按日常部署经验把「能跑」和「跑得舒服」分开列显存要求按上下文 4096 估算模型规模Q4_K_M 权重GPU 最低显存推荐配置备注1.5B约 1.1GB4G纯 CPU 也能跑上手试用7B约 4.7GB8G8G 显卡 16G 内存个人电脑甜点区14B约 9GB12G12G 显卡 32G 内存效果明显更好32B约 19GB24G24G 显卡 32G 内存接近在线版体验70B约 40GB48G双卡或单 48G 卡需要认真组机器动手之前先把家底摸清楚三条命令搞定nvidia-smi # 看显卡型号、显存总量和当前占用 free -h # 看内存和 swap 占用 df -h /data # 看模型存放的磁盘剩余空间如果 nvidia-smi 命令本身报错说明显卡驱动或 CUDA 环境有问题这是所有部署的前置条件先修好再谈模型。内存同理纯 CPU 推理时模型文件多大内存就要比它多出 2~4GB 余量16G 内存跑 7B 勉强跑 14B 会很吃力。我的判断标准很简单跑之前先看 swap 有没有被大量占用swap 一上来速度立刻崩。2.3 下载权重官方仓库与托管平台怎么选选定版本后就是拉权重。常见做法是直接从 DeepSeek 官方在 Hugging Face 上的组织仓库 clone或者从 ModelScope 这类模型托管平台拉官方上传的同源权重。两个渠道的内容一致按你方便的方式选一个就行# 方式一Hugging Face 官方组织仓库 git lfs install git clone https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B # 方式二ModelScope 上的官方同源权重 git clone https://modelscope.cn/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B.git逻辑说明这种方式拉下来的是 HF 格式包含 safetensors 权重、tokenizer 和 config.json适合 vLLM 和 transformers 直接加载。git lfs install 必须优先执行否则大文件会被替换成几 KB 的指针文件clone 完看起来目录齐全实际没有权重。下载完看一眼目录里 safetensors 文件的大小正常应该是 GB 级几 KB 就是没装 LFS。如果你打算用 llama.cpp 或 Ollama 跑需要的是 GGUF 格式。GGUF 可以从 HF 权重自行转换也可以直接在社区量化仓库下载现成文件。Ollama 内部自带转换好的版本拉模型不用操心llama.cpp 则两步搞定第 4 章给命令。无论哪种格式落地后先确认磁盘剩余空间7B 的 HF 格式权重约 15GBFP16GGUF 的 Q4 约 4.7GB磁盘低于 20GB 就别拉大模型了因为后面服务运行还会产生额外的缓存和日志。3. 用 Ollama 半小时跑通最小可用环境安装、拉模型与首次对话3.1 Ollama 安装与首次拉取模型如果你只是想在自己的电脑上快速用起来别折腾编译直接用 Ollama。它把模型下载、量化格式、服务启动都封装好了装完到能对话不超过半小时。安装按系统来# macOS 与 Linux 一条命令装完 curl -fsSL https://ollama.com/install.sh | sh # Windows 直接到官网下载安装包双击装完 # 装完先验证 ollama --version逻辑说明安装脚本在 Linux 上会把二进制放进 PATH 并注册 systemd 服务Windows 安装包做了同样的事。看到版本号输出程序就是好的。接下来拉模型# 拉取 DeepSeek R1 的 7B 量化版本默认 Q4 ollama pull deepseek-r1:7b # 列出本地已有模型 ollama listpull 会从 Ollama 模型库把 GGUF 权重拉到本地模型目录并生成配套的模型配置。tag 里的 7b 指的是 R1-Distill-Qwen-7B想试小一点拉deepseek-r1:1.5b想效果好一点拉deepseek-r1:14b或deepseek-r1:32b前提是显存内存够。我的习惯是拉之前先看一眼模型库页面上的 tag 列表避免误拉deepseek-r1:671b这种你机器根本装不下的版本。3.2 修改模型存储路径别让系统盘爆炸Ollama 默认把模型放在用户目录Linux 是~/.ollama/modelsWindows 是C:\Users\用户名\.ollama\models。7B 的 Q4 文件 4.7GB32B 接近 20GB连续拉几个版本系统盘必挂。这个坑我踩过装完一路往 C 盘拉模型某天突然报「磁盘空间不足」翻配置才发现默认目录没改。# Linux/macOS在 shell 配置里加一行然后 source export OLLAMA_MODELS/data/ollama/models source ~/.bashrc # 重启 ollama 服务让新路径生效 systemctl restart ollama # Windows新建系统环境变量 OLLAMA_MODELSD:\ollama\models # 然后右键退出 Ollama 托盘进程并重新启动参数说明OLLAMA_MODELS 是 Ollama 唯一的模型目录环境变量。重点如果在目录里已经有模型之后再改路径旧模型不会自动迁移得重新 pull。所以最省事的做法是第一次 pull 之前就设好。查定位也没必要翻目录直接全盘搜.ollama文件夹里的 gguf 大文件或者用文件管理器按大小排序一眼就能看出模型到底放在哪块盘。3.3 跑通第一个对话REPL 与 HTTP 接口参数模型拉完交互式对话只需要一条命令ollama run deepseek-r1:7b进入 REPL 后可以直接打字提问CtrlD 退出。脚本验证场景用非交互方式把问题作为参数传进去ollama run deepseek-r1:7b 用一句话介绍什么是显存Ollama 同时内置 HTTP 接口默认监听 11434 端口。代码里更推荐直接调 API因为返回值结构化、好解析curl http://localhost:11434/api/generate -d { model: deepseek-r1:7b, prompt: 为什么显存越大能处理的上下文越长, stream: false, options: { temperature: 0.6, top_p: 0.95, num_ctx: 8192 } }参数说明stream 设 false 会一次性返回完整结果做前端打字机效果就改 true 走 SSE 流式。options 里的 temperature 和 top_p 是 R1 系列的关键参数官方推荐是 0.6 和 0.95细节第 6 章展开。num_ctx 是上下文窗口长度默认 4096处理长文档务必调大代价是 KV cache 占用显存上升。另外 Ollama 也暴露了 OpenAI 兼容的/v1/chat/completions接口地址是http://localhost:11434/v1这意味着你已有代码里的 openai SDK 只要把 base_url 改一下就能用第 4 章给完整示例。到这里你已经有了一个能对话的本地 DeepSeek。剩下的问题是Ollama 适不适合直接上生产我的判断个人开发、内部试用、快速验证完全够用但它把调度细节都藏起来了参数可控性差一些。要接几十个并发请求、做高吞吐推理服务还是得看下一章的 vLLM。4. 进阶部署llama.cpp 与 vLLM 怎么选、怎么配4.1 llama.cpp从源码编译到 CPU/GPU 混合推理llama.cpp 是 GGUF 格式的原生推理实现主打轻量、跨平台、CPU 友好。选它的场景很明确没有 NVIDIA 显卡、想用 CPU 硬跑显卡显存小、需要精确控制 GPU 层数或者想自己动手量化权重。编译安装git clone https://github.com/ggerganov/llama.cpp cd llama.cpp # Linux 下开启 CUDA 支持 cmake -B build -DCMAKE_BUILD_TYPERelease -DGGML_CUDAON cmake --build build -j$(nproc)参数说明-DGGML_CUDAON需要本机装好 CUDA toolkit 或 cuBLAS没有 NVIDIA 卡就关掉这个选项纯 CPU 编译一样能跑。苹果电脑把开关换成-DGGML_METALON。还有一个容易被忽略的选项-DGGML_NATIVEON不开它编译产物会用兼容指令集老 CPU 能跑但速度慢一截自己的机器建议打开。Windows 用户直接用官方 release 页的预编译包更省事源码编译在 MSVC 环境下容易踩路径和依赖的坑。推理命令长这样./build/bin/llama-cli \ -m /data/models/deepseek-r1-7b.Q4_K_M.gguf \ -p 9.11 和 9.8 哪个大 \ -n 512 -c 8192 \ --temp 0.6 --top-p 0.95 --repeat-penalty 1.0参数说明-m指向 GGUF 文件路径-n是生成 token 数上限512 足够一次简短回答-c是上下文长度OOM 时优先砍这个数字--temp和--top-p是采样参数--repeat-penalty是重复惩罚R1 系列建议贴近 1.0调太大会打断推理链表现为答到一半戛然而止。GPU 分层卸载是 llama.cpp 的核心能力适合显存不够但想跑大一号模型的场景# 8G 显存跑 7B Q4把 33 层模型的前 28 层放 GPU ./build/bin/llama-cli -m model.gguf --n-gpu-layers 28 -p 你好 -n 128--n-gpu-layers的语义是把前 N 层放到 GPU剩余层在 CPU 上算。显存不够就调小这个数速度跟着降显存还有富余就往大调直到刚好不爆。启动日志里会打印一行offloaded 28/33 layers to GPU以这个数字为准。经验是别一次开满从 60% 层数开始往上试每次加两层找到临界点。如果你只有 HF 格式权重想转成 GGUF 再量化两行命令python convert_hf_to_gguf.py /data/models/DeepSeek-R1-Distill-Qwen-7B \ --outfile /data/models/deepseek-r1-7b-fp16.gguf ./build/bin/llama-quantize deepseek-r1-7b-fp16.gguf \ deepseek-r1-7b.Q4_K_M.gguf Q4_K_M第一行把 HF 权重转成 FP16 的 GGUF第二行压到 Q4_K_M。Q4_K_M是量化方法名支持 Q4_K_S、Q5_K_M、Q8_0 等。自己转的好处是量化档位完全可控代价是转换脚本版本必须与模型兼容旧脚本处理新模型可能报 shape 不匹配这类问题通常升级 llama.cpp 到最新版就能解决。4.2 vLLMGPU 生产环境的服务化部署vLLM 和 llama.cpp 解决的问题不同它优化的是高并发下的吞吐量和显存利用率。团队内部搭推理服务、同时接几十个调用用 vLLM 是当前的主流做法。vLLM 直接加载 HF 格式权重目录不需要 GGUF这也是我在第 2 章让你保留 HF 格式的原因。pip install vllm python -m vllm.entrypoints.openai.api_server \ --model /data/models/DeepSeek-R1-Distill-Qwen-7B \ --max-model-len 8192 \ --gpu-memory-utilization 0.9 \ --tensor-parallel-size 1 \ --port 8000参数说明--model指向 HF 格式目录目录里必须有 safetensors 权重和 config.json--max-model-len是上下文上限直接决定 KV cache 预留量--gpu-memory-utilization 0.9意思是 vLLM 最多占用 90% 显存剩下的留给 CUDA context 和其他开销0.9 是我常用的安全值拉到 0.95 有时会因剩余显存不足直接启动失败--tensor-parallel-size多卡时设为显卡数量单卡必须保持 1。启动成功的标志是日志出现Uvicorn running on http://0.0.0.0:8000然后验证接口curl http://localhost:8000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: DeepSeek-R1-Distill-Qwen-7B, messages: [{role: user, content: 实现一个斐波那契函数}], max_tokens: 1024, temperature: 0.6 }curl 里的 model 参数要和--model传入的目录名保持一致目录叫什么就填什么。如果启动报CUDA out of memory先调低--max-model-len或--gpu-memory-utilization不要一上来就换小模型——很多时候只是上下文预留开太大了。多卡场景把--tensor-parallel-size设为卡数比如两张 24G 卡跑 32B显存能叠加使用要注意卡间通信依赖 NCCL环境不对会一直卡在启动阶段不动。4.3 接入 OpenAI 兼容接口改两行代码切换后端Ollama 和 vLLM 都实现了 OpenAI 兼容的/v1/chat/completions接口这是本地部署最有价值的一点应用代码不需要为本地模型重写。下面这段代码原本对接线上 API现在只需要改 base_url 就能切到本地from openai import OpenAI # 切到本地 vLLM 服务 client OpenAI( base_urlhttp://localhost:8000/v1, api_keyanything, # 本地服务不校验 key随便占位 ) # 换 Ollama 的话 base_url 改成 http://localhost:11434/v1 # model 参数改成 ollama 的 tag比如 deepseek-r1:7b resp client.chat.completions.create( modelDeepSeek-R1-Distill-Qwen-7B, messages[{role: user, content: 写一个 Python 装饰器示例}], temperature0.6, max_tokens1024, ) print(resp.choices[0].message.content)逻辑说明openai SDK 的create方法签名两边完全通用streamTrue的流式请求也兼容。这意味着你只要在配置中心把 base_url 切一下后端逻辑一行不用动团队就能共用一套代码在线上和本地环境之间切换。本地接口省了调用成本也把数据留在了自己手里这是部署这件事最核心的红利。需要提醒一句vLLM 和 Ollama 默认都没有鉴权谁连上谁就能用你的显卡。内部网络部署没问题对外暴露必须套一层网关或转发层做身份校验别裸奔到公网。5. 本地部署避坑指南五个高频翻车现场与排查顺序5.1 启动就 OOM显存被谁吃掉了现象vLLM 或 llama.cpp 一启动就报CUDA out of memory或failed to allocate有时候连模型加载都过不去。原因显存里不只有权重。KV cache 随上下文长度线性增长7B 模型开 32768 上下文时KV cache 能吃掉 5~8GB 显存再加上 CUDA context 本身的几百 MB8G 显卡瞬间见底。绝大多数人只算了权重体积忘了这一块。解决先砍上下文长度-c 4096或--max-model-len 4096再看量化档位Q4 不够就 Q3最后才考虑换更小的模型。vLLM 场景下调低--gpu-memory-utilization到 0.85 给系统留出余地。我的经验值8G 显卡跑 7B 模型上下文开 8192 就是舒服的上限再大就开始各种报错。5.2 跑起来了但慢得没法忍现象每秒只出几个 tokenCPU 占用拉满、显卡占用却是个位数或者 GPU 占用不高但生成速度依然很低。原因三类情况。一是权重全在 CPU 上GPU 层数是 0等于纯 CPU 推理二是物理内存不够系统在疯狂读写 swap三是 WSL2 环境里 CUDA 驱动没打通推理框架根本识别不到显卡。解决先看启动日志里offloaded那行确认放了几层到 GPU再用nvidia-smi确认显卡有进程、显存有占用最后free -g看 swap 是否是 0。WSL2 的典型故障是 Windows 侧显卡驱动太旧先在 Windows 里更新驱动再进 WSL2 跑nvidia-smi能识别到显卡再回来说推理。还有一个隐蔽因素llama.cpp 编译时没开-DGGML_NATIVE纯 CPU 推理能差接近一倍的 token 速度。5.3 回答中途断掉或空回复现象模型答到一半突然收尾think标签刚打开就结束极端情况下直接返回空字符串。原因R1 这类推理模型对采样参数极其敏感。temperature 太高会让概率分布趋平模型在句子中间就敢输出结束符repeat_penalty 调太强会反复惩罚常用 token把推理链拦腰打断。另外一个隐蔽原因是上下文窗口太小推理链还没走完空间就耗尽了。解决R1 系列单独用一套参数temperature 0.6、top_p 0.95、repeat_penalty 1.0上下文长度给到 8192 起步不要在 system prompt 里塞过多额外约束推理模型让它按自己的节奏走。我在 Ollama 和 vLLM 上都踩过这个坑最后把参数统一写死在服务配置里不再让调用方随手传问题才消停。5.4 中文乱码与首 token 延迟高现象CLI 里中文输出变成方框或问号第一次请求等了十几秒才出第一个字。原因终端编码不对是 Windows 老问题默认代码页不是 UTF-8中文全被按错误编码解析首 token 慢则通常是模型权重放在机械盘每次加载要把几个 GB 读进内存冷启动本来就慢硬盘再拉胯就雪上加霜。解决Windows Terminal 里执行chcp 65001切到 UTF-8 代码页模型文件务必放 SSD机械盘当模型盘基本告别体验。测性能要用连续两个相同请求计时第二个才接近真实水平。这个坑很容易被误判成「模型不行」其实换块盘就解决了。5.5 下载中断、磁盘残留与文件损坏现象ollama pull卡在某个百分比不动重启后从头下载git clone 完发现权重文件只有几 KB模型加载时报magic number mismatch或直接崩溃。原因网络中断导致 blob 残留git lfs 没装导致大文件全是指针文件下载不完整导致 GGUF 文件头对不上。解决Ollama 先ollama rm 模型名清掉半成品再重新 pullgit 场景先确认git lfs install执行过再 cloneGGUF 文件可以用llama-cli -m 文件验证能否加载报 magic number 就是文件损坏重新下载。大模型权重文件动辄几 GB我习惯下载完用sha256sum对比上游校验值宁可多等几秒校验也别让一个坏文件干扰整个部署排错。5.6 排错顺序先看日志再动参数上面五个坑有个共同点症状都很明显但根因藏在环境里。我给自己定了一个固定的排错顺序按这个走九成问题半小时内能定位看服务启动日志里的 GPU 层数、显存申请结果、模型加载状态用nvidia-smi确认显卡被识别、显存确实被模型进程占用用相同的请求连打两次排除冷启动干扰把采样参数恢复成官方推荐值确认不是参数问题最后才怀疑模型文件本身做一次 sha256 校验。切忌一上来就换模型、改参数那是在碰运气不是排查。6. 让本地 DeepSeek 更好用的三个调优习惯6.1 为推理模型单独准备一套采样参数DeepSeek-R1 系列和普通对话模型的采样参数不能共用。R1 官方推荐 temperature 0.6、top_p 0.95、重复惩罚接近 1.0而通用对话模型常见的 0.8 / 1.1 用在 R1 上会明显破坏推理链。对比一下模型类型temperaturetop_prepeat_penaltyR1 推理系列0.60.951.0普通通用对话0.7~0.80.91.1temperature 控制随机性越低越确定top_p 做概率截断repeat_penalty 惩罚重复 token。R1 的推理链很长重复惩罚稍微强一点模型就开始绕圈最后提前终止。我在 Ollama 和 vLLM 里都是把这三个值写死在服务配置里的不让调用方随意覆盖。6.2 用固定测试集验收而不是靠感觉本地部署有个玄学换了个量化档位聊两句觉得「差不多」真上线被业务方说变笨了。原因是没用固定测试集做量化对比。我习惯准备一组覆盖数学推理、代码生成、中文常识的问题每次调参后整套跑一遍import time test_cases [ 9.11 和 9.8 哪个大, 用 Python 写一个二分查找处理空数组输入, 太阳从哪边升起限 20 字以内回答, 把 17 转换为二进制, ] for q in test_cases: t0 time.time() resp client.chat.completions.create( modelDeepSeek-R1-Distill-Qwen-7B, messages[{role: user, content: q}], temperature0.6, max_tokens1024, ) answer resp.choices[0].message.content print(fQ: {q}\n len{len(answer)}, cost{time.time()-t0:.2f}s)逻辑说明每次记录回答长度和耗时换量化档位、上下文长度、采样参数后再跑同一组用数据说话。判断回答质量时不仅有「对不对」还有「是不是变啰嗦了」——长度突变通常意味着参数跑偏。团队内部可以把这套脚本放进 CI模型文件一有变更就自动跑一轮防止谁半夜换了模型没同步。6.3 控制上下文长度并善用前缀缓存R1 会先输出一大段推理过程再给答案单轮调用轻松吃掉几百到上千 token做长文档问答时很快顶到窗口上限。我的处理习惯是进入 prompt 之前先做文本切片只保留与问题相关的段落同时把系统提示词和固定指令做成完全一致的前缀方便 vLLM 的前缀缓存命中——相同前缀的请求能复用已计算的 KV cache长文档场景能省掉一半以上的首 token 延迟这个加速是默认开启的白捡的性能。Ollama 那边对应的是 keep_alive 参数默认 5 分钟无请求就卸载模型频繁调用时把它调长省去反复加载权重的等待内存紧张就设成 0用后即卸。这三个习惯配合前面的部署方案本地 DeepSeek 才算真正「能用且可维护」。我自己一直保持一个习惯任何参数改动前先记录基线速度改完再跑同一组测试集这个习惯帮我挡掉了无数次「感觉变快了」的假判断。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?