在本机部署大模型
把模型装在自己的电脑上跑:论文内容不出你的机器,也不消耗平台积分。 这一页按最常见的两种电脑写了完整步骤——先下载两样东西,再用一个脚本把它跑起来, 最后回论文助手点一下「检测本机服务」。全程大约 30–60 分钟,大头是下载时间。
1先弄明白:我们在装什么
只需要理解三样东西的关系,后面每一步都会说得通:
| 东西 | 是什么 | 打个比方 |
|---|---|---|
llama-server.exe |
推理程序。从 llama.cpp 官方发布页下载压缩包,解压就有 | 播放器 |
*.gguf 文件 |
模型权重,几个 GB 大小,从 Hugging Face 下载 | 影片文件 |
| 论文助手 | 指挥播放器的那个"遥控器" | 遥控器 |
所谓"部署",就是让播放器指着一个影片文件开着,在本机监听一个网址,例如
http://127.0.0.1:8080/v1。论文助手连的就是这个网址。
127.0.0.1 的意思是只有你这台电脑能访问,隔壁宿舍连不上——这正是我们要的效果。
2判断你的电脑属于哪一种(2 分钟)
先看一眼自己的机器,然后决定走 A 路还是 B 路。
- 按
Ctrl + Shift + Esc打开任务管理器 → 点性能标签。 左侧列表里有没有一项叫 GPU、并且名字写着 NVIDIA GeForce RTX / GTX? 只有Intel UHD / Iris / AMD Radeon Graphics这类的是核显,按"没有独显"算。 - 有独显的话,看同一个面板右上方的「GPU 内存」/「专用显存」是多少 GB; 再点左侧内存,看右上方「已安装」是多少 GB。
A 路 有 NVIDIA 独显,显存 6 GB 以上
RTX 3060 / 4060 / 4070 / 5060 这一大票游戏本和台式机都在这条线上。
建议模型:8B 量化版(约 5 GB),润色、改写、摘要都跟得上。
显存 12 GB 以上可以试 14B;想上 27B 请看进阶页。
B 路 没有独显(核显),内存 16 GB 以上
普通办公本、轻薄本,也就是没有独立显卡的那一大半机器。
建议模型:4B 量化版(约 2.5 GB);内存只有 8 GB 就选 1.7B(约 1.2 GB)。
能做什么:短句改写、翻译、摘要。出字明显慢,一次别喂太多内容。
| 你的机器 | 走哪条 | 建议模型 | 上下文 -c | 真实体验 |
|---|---|---|---|---|
| 显存 12 GB 以上 | A | 8B 轻松,14B 可用 | 8192–16384 | 日常润色、长摘要,等待感不明显 |
| 显存 6–10 GB | A | 8B | 4096–8192 | 8B 顺畅;硬塞 14B 会溢出到内存,明显变慢 |
| 核显 + 16 GB 内存 | B | 4B | 4096 | 几十 token 等若干秒,适合不着急的任务 |
| 核显 + 8 GB 内存 | B | 1.7B | 2048–4096 | 只建议试水。这种机器上继续用平台托管模型更省心 |
顺带一提:论文助手的「模型服务设置 → 🔌 我的模型服务(自定义)→ ① 本机部署」里 已经写着你本机的实测内存 / 显卡 / 建议上下文,可以拿它对照这张表,不用自己算。
Qwen3-8B-Q4_K_M.gguf:8B 是参数量(越大越聪明也越慢),
Q4_K_M 是压缩程度(数字越低文件越小、越省内存,质量略降)。
新手一律选 Q4_K_M,它是质量和体积最稳的折中,别在 Q2/Q8 上纠结。
3下载两样东西
第 1 样:推理程序(llama.cpp)
- 打开
https://github.com/ggml-org/llama.cpp/releases,点最上面那条 Latest 发布,展开 Assets。 GitHub 国内可达性一般,需要代理或镜像请自行准备——我们不提供自建下载源。 - 按你的路线选一个压缩包:
- A 路(有 N 卡):先按
Win + R输入cmd回车,敲一行
看表头右侧的nvidia-smiCUDA Version: xx.x(这是驱动支持的上限,以它为准): ≥ 12.4 就下llama-xxxxx-bin-win-cuda-12.4-x64.zip,≥ 13.3 可以下 13.3 那个。 同时必须一起下配套的cudart-llama-bin-win-cuda-x-x64.zip,少了它一定报缺 dll。 完全没有nvidia-smi(或它报错)就按 B 路下 CPU 包。 - B 路(没独显):下
llama-xxxxx-bin-win-cpu-x64.zip,只有几十 MB。
- A 路(有 N 卡):先按
- 解压到一个固定目录,不要让 exe 和 dll 分家(必须在同一个目录才加载得到):
D:\llm\bin\ ← llama-server.exe 和一堆 ggml-*.dll、cudart64_*.dll 都放这里
第 2 样:模型权重(.gguf)
- 打开 Hugging Face;国内可用镜像
https://hf-mirror.com。 - 搜
Qwen3-8B-GGUF(A 路)或Qwen3-4B-GGUF(B 路)。 任意带这个目录的仓库都行,进去点 Files and versions 标签。 - 只下载一个文件,不要整仓库拉(一个仓库里躺着十几个版本,全拉会下几十 GB):
- A 路:
Qwen3-8B-Q4_K_M.gguf(约 5 GB) - B 路:
Qwen3-4B-Q4_K_M.gguf(约 2.5 GB);8 GB 内存选Qwen3-1.7B-Q4_K_M.gguf
- A 路:
- 放到统一目录:
D:\llm\models\Qwen3-8B-Q4_K_M.gguf
4用脚本检查并启动(推荐,不用自己拼命令)
这个脚本只做四件事,不下载任何东西、不修改你的文件、只监听 127.0.0.1:
- 读你的显卡和内存,算出该用的参数;
- 检查你填的 exe 和模型路径是否真的存在、配套 dll 齐不齐、模型是不是明显装不进显存;
- 检查端口有没有被本机别的程序占了;
- 打印完整启动命令,你确认后就把服务开起来。
4.1 保存并运行
- 把下面整段代码复制进记事本,另存为
D:\llm\start-local.ps1。 保存时两处要注意:「保存类型」选所有文件(否则会存成start-local.ps1.txt); 右下角「编码」选 UTF-8(带 BOM),没有这一项就选 ANSI。 选错会得到一堆看不懂的乱码报错,这是 Windows PowerShell 读文件的老毛病,和你的操作无关。 - 打开 PowerShell,敲这一行运行(只对这次运行临时放行脚本,不改系统设置):
不建议用"右键 → 用 PowerShell 运行",因为一旦报错,窗口会一闪而过,你根本看不到原因。powershell -ExecutionPolicy Bypass -Command "iex (Get-Content -Raw -Encoding UTF8 'D:\llm\start-local.ps1')"
# start-local.ps1 —— 检查硬件与文件,然后启动本机推理服务。不做任何下载。
$ErrorActionPreference = 'Stop'
function Ask-Path($prompt) { (Read-Host $prompt).Trim().Trim('"') } # 兼容"复制为路径"带来的引号
function Test-Port($p) {
try { $c = New-Object Net.Sockets.TcpClient; $c.Connect('127.0.0.1', $p); $c.Close(); return $true }
catch { return $false }
}
Write-Host ''
Write-Host '== 本地推理服务启动助手 ==' -ForegroundColor Cyan
# 1) 读硬件
$os = Get-CimInstance Win32_OperatingSystem
$ramGB = [math]::Round($os.TotalVisibleMemorySize / 1MB, 1)
$vramGB = 0
$gpuName = ''
$nvsmi = Get-Command nvidia-smi -ErrorAction SilentlyContinue
if ($nvsmi) {
$nv = & $nvsmi.Source --query-gpu=name,memory.total --format=csv,noheader,nounits 2>$null
if ($LASTEXITCODE -eq 0 -and $nv) {
$f = "$($nv | Select-Object -First 1)" -split ','
$gpuName = $f[0].Trim()
$vramGB = [math]::Round([double]$f[1].Trim() / 1024, 1)
}
}
if (-not $gpuName) {
$g = Get-CimInstance Win32_VideoController | Select-Object -First 1
if ($g) { $gpuName = $g.Name }
}
Write-Host ("内存 {0} GB · 显卡 {1} · 显存 {2} GB" -f $ramGB, $gpuName, $vramGB)
$hasGpu = $vramGB -ge 1
$ngl = if ($hasGpu) { 99 } else { 0 }
$ctx = if ($vramGB -ge 12) { 16384 } elseif ($vramGB -ge 6) { 8192 } elseif ($hasGpu) { 4096 } elseif ($ramGB -ge 16) { 4096 } else { 2048 }
Write-Host ("按这台机器建议:-ngl {0} · -c {1}" -f $ngl, $ctx) -ForegroundColor DarkGray
# 2) 检查文件
$exe = Ask-Path 'llama-server.exe 的完整路径(资源管理器里 Shift+右键 exe → 复制为路径)'
$model = Ask-Path '模型 .gguf 的完整路径'
if (-not (Test-Path $exe)) { Write-Host "找不到程序:$exe" -ForegroundColor Red; exit 1 }
if (-not (Test-Path $model)) { Write-Host "找不到模型:$model" -ForegroundColor Red; exit 1 }
$binDir = Split-Path $exe -Parent
if (-not (Get-ChildItem $binDir -Filter 'ggml-*.dll' -File)) {
Write-Host "这个目录里没有 ggml-*.dll,说明压缩包没有全部解压到一起:$binDir" -ForegroundColor Red
exit 1
}
if ($hasGpu -and -not (Get-ChildItem $binDir -Filter 'ggml-cuda.dll' -File)) {
Write-Host '目录里没有 ggml-cuda.dll,这个压缩包其实是 CPU 版;NVIDIA 显卡请改用 win-cuda-x64 那个包。' -ForegroundColor Yellow
}
if ($hasGpu -and -not (Get-ChildItem $binDir -Filter 'cudart64_*.dll' -File)) {
Write-Host '如果启动时报缺 cudart64_*.dll,把配套的 cudart-llama-bin-win-cuda-*.zip 也解压进这个目录即可;本机已装完整 CUDA 时可以忽略这条。' -ForegroundColor DarkGray
}
$modelGB = [math]::Round((Get-Item $model).Length / 1GB, 1)
Write-Host ("模型 {0} GB" -f $modelGB) -ForegroundColor DarkGray
if ($hasGpu -and $modelGB -gt ($vramGB * 0.85)) {
Write-Host ("模型比显存({0} GB)大,多出的层会留在内存执行,速度会明显下降。这是物理限制,不是配置错误。" -f $vramGB) -ForegroundColor Yellow
}
if ((-not $hasGpu) -and $modelGB -gt ($ramGB * 0.6)) {
Write-Host ("内存只有 {0} GB,模型 {1} GB 加上运行占用很可能不够,建议换更小的模型。" -f $ramGB, $modelGB) -ForegroundColor Yellow
}
# 3) 检查端口:先看 8080 上跑的是不是"已经能用的同一个服务"
$port = 8080
if (Test-Port $port) {
$isOpenAi = $false
try {
$r = Invoke-RestMethod -Uri "http://127.0.0.1:$port/v1/models" -TimeoutSec 5
if ($r.data) { $isOpenAi = $true }
} catch {
$code = 0
if ($_.Exception.Response) { $code = [int]$_.Exception.Response.StatusCode }
if ($code -eq 401 -or $code -eq 403) { $isOpenAi = $true } # 要求密钥,说明是 OpenAI 兼容服务
elseif ($code -eq 0) { Write-Host '(8080 上那个程序几秒内没回话,可能正忙)' -ForegroundColor DarkGray }
}
if ($isOpenAi) {
Write-Host ''
Write-Host '127.0.0.1:8080 上已经有一个 OpenAI 兼容服务在跑了 —— 那多半就是你之前起的那个,不用再开第二个。' -ForegroundColor Green
Write-Host '直接回论文助手:模型服务设置 → 🔌 我的模型服务(自定义)→ ① 本机部署 → 点「检测本机服务」。' -ForegroundColor Green
Write-Host '想确认是谁在监听这一行端口: netstat -ano | findstr :8080 (最后一列 PID 拿到任务管理器"详细信息"里对名字)' -ForegroundColor DarkGray
exit 0
}
$port = 18080
Write-Host "127.0.0.1:8080 被本机别的程序占着(它没给出模型清单),本次改用 $port。" -ForegroundColor Yellow
Write-Host ' Docker / WSL 经常成段转发 8080、8081,所以这里跳到一个明显不在它们区间里的端口。' -ForegroundColor DarkGray
}
# 4) 组装并执行
$argList = @('-m', $model, '--host', '127.0.0.1', '--port', "$port", '-ngl', "$ngl", '-c', "$ctx", '--jinja')
$key = Read-Host '要不要给服务加访问密钥?直接回车=不加(只监听本机时通常不用加)'
if ($key) { $argList += @('--api-key', $key.Trim()) } # 只用于本次运行,不会写进脚本文件
Write-Host ''
Write-Host ('即将执行: llama-server.exe ' + ($argList -join ' ')) -ForegroundColor Green
Write-Host '这个窗口就是服务本身,要一直开着;关掉窗口 = 服务停止。' -ForegroundColor DarkGray
if ((Read-Host '现在开始吗?(Y/n)') -match '^[nN]') { exit 0 }
Set-Location $binDir
& $exe @argList
server: listening on 127.0.0.1:8080 的行,并且窗口停在这里不动了——服务就在跑了。
第一次载入权重可能要几十秒到几分钟(模型越大越久),这期间窗口像是卡住,是正常的,别关窗口。
- 找不到程序 / 找不到模型:路径打错了,或只复制了目录没带文件名。
最稳的做法是在资源管理器里
Shift+ 右键那个文件 → 复制为路径,直接粘贴。 - 窗口一闪就没:那是有报错。请用上面那条
powershell -ExecutionPolicy Bypass -Command "iex (Get-Content ...)"在已打开的窗口里跑,报错才看得见。 - 报一堆乱码语法错误:脚本存成了不带 BOM 的 UTF-8。重新按上面第 1 步选对编码,
或者直接用第 2 步那条带
-Encoding UTF8的命令运行。 - 缺
cudart64_13.dll一类:CUDA 主包和配套的cudart-llama-bin-...包 必须解压到同一个目录;如果你的显卡其实跑不了 CUDA,就退回 CPU 包(会慢)。
4.2 想自己敲命令也行(不用脚本)
必须在 llama-server.exe 所在目录里执行,否则同目录的 ggml-*.dll 加载不了:
cd D:\llm\bin
.\llama-server.exe `
-m "D:\llm\models\Qwen3-8B-Q4_K_M.gguf" `
--host 127.0.0.1 `
--port 8080 `
-ngl 99 `
-c 8192 `
--jinja
三个参数记这点就够:-ngl 99 = 能放显存的全放显存(没有独显就写 -ngl 0);
-c = 一次能看多少内容;--jinja = 打开工具调用能力,模型本身不支持时它也不报错、只是用不上。
4.3 验证服务活着
另开一个 PowerShell 窗口(原来那个是服务,别关):
curl http://127.0.0.1:8080/health
curl http://127.0.0.1:8080/v1/models
第一条返回 ok 或空响应、第二条返回一段带模型名的 JSON,就说明服务真的起来了。
如果你加过密钥,第二条要带 Key 才回 JSON,这属于正常现象。
5不想碰命令行:用带图形界面的工具
Ollama 和 LM Studio 会把"下模型 + 起服务"都替你点掉,最省事,代价是模型和参数不如 llama-server 可控。 这三个工具选一个就够,不要同时装一堆再互相排查。论文助手连它们的方式完全一样。
Ollama 命令行最简
- 到
https://ollama.com/download下载 Windows 版并安装。 - 打开 PowerShell 拉一个模型(8 GB 内存的本子把
8b换成1.7b):ollama pull qwen3:8b # 冒烟测试:能正常出字就说明服务没问题 ollama run qwen3:8b "用一句话解释什么是混合方法研究" - 把上下文窗口设够。Ollama 默认窗口很小,不设的话长文会被反复截断,
论文助手里的 Agent 类功能会直接不可用。新建一个
Modelfile:# D:\llm\Modelfile 内容: FROM qwen3:8b PARAMETER num_ctx 8192 PARAMETER temperature 0.5 # 起一个带别名的模型,以后一直用它 ollama create qwen3-8b-ctx -f Modelfile - 验证(应返回一段 JSON):
论文助手里对应的地址是curl http://127.0.0.1:11434/v1/modelshttp://127.0.0.1:11434/v1。
LM Studio 有图形界面
- 到
https://lmstudio.ai下载安装。 - 在应用里搜索模型并下载(选 GGUF、8B 以内的量化版本)。
- 左侧 Developer / Server 面板点 Start Server,确认监听
127.0.0.1:1234。 - 验证:
论文助手里对应的地址是curl http://127.0.0.1:1234/v1/modelshttp://127.0.0.1:1234/v1。
8080 和 1234 都是开发常用端口,本机跑着 PHP / Node 服务时很容易撞车,
Docker Desktop 也常常占着 8080(它会往 0.0.0.0 做端口转发)。
症状是:端口是通的,但 /v1/models 返回的是一段 HTML 报错页而不是一段 JSON。
想知道是谁占的,敲这一行,再拿最后那列 PID 到任务管理器的「详细信息」里对名字:
netstat -ano | findstr :8080
解决办法就是换端口:脚本发现 8080 上不是 OpenAI 兼容服务时会自动改用 18080
(Docker / WSL 常成段转发 8080、8081,所以避开这一片);Ollama 设环境变量
OLLAMA_HOST=127.0.0.1:11435;LM Studio 在服务面板直接改端口;
llama-server 写 --port 18080。换了端口,论文助手里填的地址要跟着改。
6回论文助手里连上它
- 打开论文助手 → 首页「API设置」→ 页面上方「模型来源」,选 🔌 我的模型服务(自定义)。
- 点「① 本机部署」里的 🔍 检测本机服务。应用只会去
127.0.0.1上探这三个端口:8080(llama-server)、11434(Ollama)、1234(LM Studio)。 命中后会自动登记进「② 已配置的服务」并设为使用中,不消耗平台积分。 - 如果你的服务在别的端口上(比如脚本换成了
18080):点 + 新增服务,服务地址填http://127.0.0.1:18080/v1,模型名点「检测连通与能力」自动带出, 保存后「设为当前服务」。本机服务和远程服务在列表里是同一类东西,只是地址一个在127.0.0.1、一个不是。
7连不上时,三种提示分别是什么意思
| 论文助手说 | 真实原因 | 该怎么做 |
|---|---|---|
| 该端口要求密钥 | 你启动时加了 --api-key。llama.cpp 会保护除 /health 以外的所有接口,
没带 Key 的请求一律回 401 Invalid API Key——服务是活着的 |
在「③ 服务详情」或「+新增服务」的密钥框里填同一个 Key 再保存。
应用会同时用 Authorization: Bearer 和 x-api-key 两种请求头发出去 |
| 端口开着,但几秒内没回应 | 本地模型一次只处理一个请求,正在长时间生成时 /v1/models 也得排队 |
等它空闲再点一次。已经登记好的服务不受影响,可以照常继续用 |
| 在监听,但不是 OpenAI 兼容接口 | 这个端口被本机别的程序占了(PHP / Node 服务最常占 8080、1234) | 给推理服务换个端口,再在「+新增服务」里手填新地址 |
还有一条通用排查顺序:先在浏览器或 curl 里确认
http://127.0.0.1:端口/v1/models 能返回 JSON,再回论文助手点检测。
网页上都连不通,应用里一定也连不通,问题在服务那边。
8安全与隐私(请务必看完)
- 只监听 127.0.0.1。上面的命令和脚本都写死了本机地址。
不要为了"方便手机访问"把它改成
0.0.0.0暴露到公网或校园网—— OpenAI 兼容接口默认无鉴权,同网段任何人都能拿它跑你的模型、塞任意提示词。 - 确实需要远程访问,请用 Tailscale 一类的虚拟组网,或反向代理加 HTTPS 并配鉴权与轮换密钥。
- 论文助手保存的密钥只写在你本机的
api_settings.json里。 不要把 Key 写进会提交的脚本文件,也不要在教程、截图、群里贴出来。 脚本里的 Key 是用时现问、只留在内存里,不落盘。 - 不要连接别人给你的公网 OpenAI 兼容地址,除非你能确认它的鉴权、日志和数据留存策略。 把论文内容发给一个来路不明的接口,等同于把论文发到网上。
- 本应用不会启动、下载、接管任何推理进程。模型进程退出、崩溃、端口没开, 应用只会告诉你"连不上",不会替你重启或修改你的服务。
9常见问题
很慢 / 一直超时
首次载入权重和建 CUDA graph 很慢,大模型可达数分钟,之后会快很多。
持续很慢通常是显存装不下、多出的层留在内存逐层执行——这属于物理限制,
真正有效的只有两件事:换更小的模型、把 -c 调小,
再顺手关掉占显存的程序(开了硬加速的浏览器、游戏、其它推理工具)。
输出乱码 / 反复说同一句话
本地端点的默认采样温度经常偏高。把温度控制在 0.3–0.7
(llama-server 加 --temp 0.5,Ollama 在 Modelfile 里写 PARAMETER temperature 0.5),
或换一个量化更保守的文件。如果你在用低比特模型,还要先确认没踩到
进阶页第 1 节写的格式坑。
上下文到底该设多大
上下文越大,显存/内存占用越高(KV 缓存按 token 线性增长),并不会更快。
按第 2 节表格的建议起步就行。真的超窗时,论文助手会读到端点上报的真实窗口并自动收紧重试,
同时提示你调大 -c 或改用平台托管模型。
为什么论文助手里的某些功能在这个模型下用不了
取决于模型本身,不是软件坏了。想要工具调用 / 图片输入 / 更强的长文能力,
就选带 agent 能力的模型(如 Qwen3 系列)并确保加 --jinja;
小尺寸模型基本只能做纯文本改写与摘要。
关掉服务、重启电脑之后,还要重新配置吗
不用。论文助手里的服务配置会一直留着,你只需要重新把服务起起来(再跑一次脚本), 然后回设置页点「检测本机服务」,或者直接切到那个已登记的服务。
能不能只试一次,看看效果再决定
可以。按 B 路下最小的 1.7B(约 1.2 GB)+ CPU 包(几十 MB),跑通一遍流程只要十几分钟,
不喜欢就删掉 D:\llm,系统里不会留下任何服务或后台进程。
10进阶与更多模型
本页教的是最普通的两种电脑 + 标准 GGUF 模型。显存不大却想要更大参数量的话,可以看低比特模型; 后续新增值得推荐的开源本地模型(新的量化格式、新的小显存友好模型)会一页一个持续加进这个系列, 不需要你重装论文助手。