1. 为什么要在本机把 Deepseek-coder 跑起来
Deepseek-coder 是 DeepSeek 系列里专门面向代码补全与对话的模型,能在 Vscode 里做行内补全、函数解释、单元测试生成。Ollama 是一个把模型权重、量化、推理引擎打包好的本地运行工具,内置 llama.cpp,一条ollama pull就能把模型拉下来,再用ollama serve暴露一个 OpenAI 兼容的 11434 端口。Vscode 的 Continue 插件则负责把编辑器里的光标上下文、选中代码、聊天面板拼成请求,发给这个端口。
这套组合适合三类人:一是手里有 8GB 左右显存的单机开发者,想在不依赖外部网络的情况下做代码补全;二是想对比本地模型和云端模型效果的人;三是需要把 Continue 的 Base URL 统一到一个 Key 通道、方便做连通性验证的人。我这次的目标很明确:先在 Windows/Linux 单机上用 Ollama 拉起 Deepseek-coder,确认 CUDA 与显存占用,再用 Modelfile 固定上下文与温度,最后把 Continue 的 Base URL 改到 TaoToken 统一 Key 通道,做一次 curl 验证,确保本地补全和对话一次跑通。
需要提前说清楚的是,Ollama 默认监听127.0.0.1:11434,Continue 的 config.json 里apiBase指向它就能用本地模型;而 TaoToken 的 API 地址是https://taotoken.net/api,它提供的是 OpenAI 兼容的 Key 通道。两者可以并存:本地模型走 Ollama,云端模型走 TaoToken,Continue 里配多个 provider 即可。下面按“环境确认 → 拉模型 → 写 Modelfile → 配 Continue → curl 验证 → 排错”的顺序走一遍。
2. 先确认 CUDA 与显存占用,再决定拉哪个 Deepseek-coder
2.1 检查驱动与 CUDA 版本
Linux 下先看驱动和 CUDA:
nvidia-smi nvcc --versionnvidia-smi右上角会显示CUDA Version: 12.x,这是驱动支持的最高 CUDA 版本,不是已安装的 toolkit 版本。nvcc --version才是实际安装的编译器版本。Ollama 自带 CUDA 运行时,通常不需要你单独装完整 CUDA toolkit,只要驱动够新即可。如果nvidia-smi报command not found,说明驱动没装或没进 PATH,先处理驱动。
Windows 下在 PowerShell 里执行同样的nvidia-smi,或者在“任务管理器 → 性能 → GPU”里看显存。GTX1080 单卡 8GB,两张卡共 16GB,但 Ollama 默认只用第一张卡,除非显式设置CUDA_VISIBLE_DEVICES。
2.2 显存与模型大小的对应关系
Deepseek-coder 在 Ollama 上有几个常用 tag:
| 模型 tag | 参数量 | 量化 | 磁盘占用 | 8GB 显存可行性 |
|---|---|---|---|---|
| deepseek-coder:1.3b | 1.3B | Q4 | 约 0.8GB | 轻松,可长上下文 |
| deepseek-coder:6.7b | 6.7B | Q4 | 约 4GB | 可跑,上下文建议 4096 |
| deepseek-coder-v2:16b | 16B MoE | 自动 | 可能超 8GB | 单卡 8GB 需谨慎 |
6.7B Q4 的权重约 4GB,KV Cache 随上下文线性增长。8GB 显存下,num_ctx=4096大约再占 1.5–2GB,加上推理时的临时缓冲,整体在 6–7GB,能稳住。如果拉到 8192,很容易触发回退到 CPU,速度会掉到每秒几个 token。所以第一步不是急着 pull,而是先确认显存余量。
2.3 拉取模型并观察显存
ollama pull deepseek-coder:6.7b ollama list下载过程中如果速度掉下来,可以 Ctrl+C 再重跑同一条命令,Ollama 会断点续传,已下载的分片不会丢。模型落在:
- Linux/macOS:
~/.ollama/models - Windows:
C:\Users\<用户名>\.ollama\models
拉完后启动服务:
ollama serve另开一个终端跑一次推理,同时用nvidia-smi -l 1观察显存:
ollama run deepseek-coder:6.7b "用 Python 写一个快速排序"如果nvidia-smi里 Ollama 进程的显存占用稳定在 6GB 左右,说明 GPU 加速生效;如果几乎不占显存、CPU 占用飙高,就是回退了。这时要么换 1.3b,要么把num_ctx降到 2048。
3. 用 Modelfile 固定上下文与温度,并接入 TaoToken 统一 Key 通道
3.1 写一个可复用的 Modelfile
Ollama 支持用 Modelfile 派生自定义模型,把num_ctx、temperature这些参数固化下来,避免每次 run 都手敲。新建一个文件Modelfile.deepseek-coder:
FROM deepseek-coder:6.7b # 上下文长度,8GB 显存建议 4096 PARAMETER num_ctx 4096 # 代码补全场景温度低一些,减少胡编 PARAMETER temperature 0.2 # 重复惩罚,避免循环输出 PARAMETER repeat_penalty 1.1 # 系统提示词,约束它只做代码相关回答 SYSTEM """ 你是一个代码助手,只回答与编程、调试、代码解释相关的问题。 输出代码时使用 Markdown 代码块,并标注语言。 """构建:
ollama create deepseek-coder-local -f Modelfile.deepseek-coder ollama list之后用ollama run deepseek-coder-local启动的就是带固定参数的版本。num_ctx改大要重新 create,因为 KV Cache 是在加载时分配的。
3.2 Continue 的 config.json 配置
Continue 插件的配置文件在 Vscode 里通过命令面板Continue: Open Config打开,路径通常是:
- Linux/macOS:
~/.continue/config.json - Windows:
C:\Users\<用户名>\.continue\config.json
下面这份配置同时挂了本地 Ollama 和 TaoToken 两个 provider,本地走补全,云端走对话:
{ "models": [ { "title": "Deepseek-coder Local (Ollama)", "provider": "ollama", "model": "deepseek-coder-local", "apiBase": "http://127.0.0.1:11434", "contextLength": 4096, "completionOptions": { "temperature": 0.2, "maxTokens": 512 } }, { "title": "TaoToken GPT (统一 Key 通道)", "provider": "openai", "model": "gpt-4o-mini", "apiBase": "https://taotoken.net/api", "apiKey": "sk-你的TaoTokenKey", "contextLength": 128000 } ], "tabAutocompleteModel": { "title": "Deepseek-coder Local Autocomplete", "provider": "ollama", "model": "deepseek-coder-local", "apiBase": "http://127.0.0.1:11434" }, "allowAnonymousTelemetry": false }这里三件套要写全:Base URL、Key、Model ID。本地 Ollama 的 Base URL 是http://127.0.0.1:11434,不需要 Key;TaoToken 的 Base URL 是https://taotoken.net/api,Key 在控制台生成,Model ID 按你实际用的填。Continue 里provider写openai是因为 TaoToken 提供 OpenAI 兼容接口,不是指必须用 OpenAI 的模型。
注意:
apiBase末尾不要带/v1,Continue 会自己拼/v1/chat/completions。如果带上/v1会变成/v1/v1/...,直接 404。
3.3 在 Vscode 里切换模型
装好 Continue 后,侧边栏会出现 Continue 面板。点模型下拉框,能看到Deepseek-coder Local (Ollama)和TaoToken GPT两个选项。补全走tabAutocompleteModel,对话走当前选中的模型。改完 config.json 保存,Continue 会自动重载,不需要重启 Vscode。
4. 验证请求:curl 打通 Ollama 与 TaoToken
4.1 验证 Ollama 的 OpenAI 兼容接口
Ollama 从 0.1.24 起提供/v1/chat/completions,可以直接用 curl 测:
curl http://127.0.0.1:11434/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-coder-local", "messages": [ {"role": "user", "content": "写一个 Python 函数判断回文"} ], "temperature": 0.2, "max_tokens": 256 }'返回里choices[0].message.content就是模型输出。如果返回{"error":"model not found"},说明model字段和ollama list里的名字不一致,注意deepseek-coder-local是你 create 出来的名字,不是deepseek-coder:6.7b。
4.2 验证 TaoToken 通道
curl https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-你的TaoTokenKey" \ -d '{ "model": "gpt-4o-mini", "messages": [ {"role": "user", "content": "只回复两个字:连通"} ] }'返回choices[0].message.content里出现“连通”就说明 Key 通道正常。这一步的意义在于:当 Continue 里云端模型报错时,你可以先用 curl 排除是插件配置问题还是 Key/网络问题。
4.3 在 Continue 里做一次端到端验证
打开一个.py文件,选中一段函数,按Ctrl+L(默认快捷键)把代码送进 Continue 对话,问“解释这段代码”。如果本地模型在跑,回答会带一点延迟但内容完整;切到 TaoToken 模型,回答速度取决于网络。补全则是在你打字时自动触发,如果没反应,先看 Continue 面板底部有没有报错。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
5.1 401 Unauthorized
Continue 里云端模型报 401,九成是apiKey写错或没填。检查 config.json 里apiKey字段是不是sk-开头,有没有多余空格。TaoToken 的 Key 在控制台生成,复制时别漏字符。本地 Ollama 不需要 Key,如果给 Ollama 也填了apiKey,某些版本会把它当 Bearer 发出去,反而被拒,删掉即可。
5.2 local proxy failed / connection refused
报local proxy failed或ECONNREFUSED 127.0.0.1:11434,说明 Ollama 服务没起来。Linux 下sudo systemctl status ollama看状态,没起就sudo systemctl start ollama;前台跑的话确认ollama serve那个终端还活着。Windows 下检查托盘图标,或者netstat -ano | findstr 11434看端口有没有监听。还有一种情况是 Continue 跑在 WSL 里、Ollama 跑在 Windows 宿主,这时127.0.0.1指向的是 WSL 自己,要改成宿主 IP。
5.3 reading choices / unexpected end of JSON
error reading choices或unexpected end of JSON input,通常是响应被截断。原因可能是max_tokens设太大、模型输出到一半被 Ollama 的默认超时掐断,或者num_ctx太小导致上下文溢出。把maxTokens降到 512,num_ctx提到 4096,再试。如果只在长对话里出现,就是 KV Cache 爆了,换 1.3b 或缩短历史。
5.4 OAuth / 登录态相关报错
Continue 某些版本会提示 OAuth 登录,这是它自带的云端服务,和本地 Ollama、TaoToken 都无关。如果你只用本地模型和 TaoToken,可以在设置里关掉 Continue 的账号同步,或者忽略这个提示。别把 TaoToken 的 Key 填到 OAuth 流程里,两者不是一回事。
5.5 模型加载慢或回退 CPU
ollama run后迟迟不出字,nvidia-smi里显存没涨,就是回退了。检查驱动版本是否支持当前 CUDA,CUDA_VISIBLE_DEVICES=0是否指到了有显存的那张卡。两张 1080 的话,Ollama 默认不跨卡拆分,想用第二张得显式指定。另外num_ctx超过显存容量也会触发回退,先降到 2048 确认能上 GPU,再逐步加。
6. 把本地补全和云端对话串成一条工作流
走到这里,本地 Deepseek-coder 已经在 Ollama 里跑起来,Modelfile 固定了num_ctx=4096和temperature=0.2,Continue 的 config.json 同时挂了本地和 TaoToken 两个 provider,curl 也分别验证过 11434 和https://taotoken.net/api两条通道。日常用法可以这样分:写代码时的行内补全交给本地模型,延迟低、不消耗额度;需要长上下文分析、跨文件重构时,切到 TaoToken 的模型,Key 统一管理,换机器只改 config.json 里的apiBase和apiKey。
如果你后面要接 Claude Code 或做更复杂的 Agent 编排,TaoToken 的 Coding Plan 和 API Keys 页面可以拿到对应的接入信息,文档里也有 Continue、Cline 这类插件的配置示例。本地这套 Ollama + Continue 的好处是离线可用、数据不出机器,适合把补全这种高频低风险的请求留在本地;云端通道则补上长上下文和更强推理的短板。两条路都通,按场景切换就行。