最近折腾了一下本地大模型,发现 M1 Max 跑 32B 的模型还行,记录一下搭建过程
设备:M1 Max 有 64GB 内存
安装 Ollama
curl -fsSL https://ollama.com/install.sh | sh
就这一行命令,装完就行
模型选择
试了几个,最终定下来用 qwen2.5-coder-32b。原因很简单:内存够用,代码能力不错,响应速度也能接受
ollama pull qwen2.5-coder:32b
下载大概要十几分钟,模型文件有 20GB 左右。
其他备选:
- deepseek-coder-v2-16b:轻一点,内存紧张可以用
- llama3.1-8b:更轻,但代码能力差点意思
启动服务
# 默认端口 11434
ollama serve
# 或者自定义端口
OLLAMA_HOST=0.0.0.0:8080 ollama serve
调用方式
普通请求
async function ask(prompt) {
const res = await fetch("http://localhost:8080/api/generate", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
model: "qwen2.5-coder:32b",
prompt,
stream: false,
}),
});
const data = await res.json();
return data.response;
}
流式输出
async function streamAsk(prompt, onChunk) {
const res = await fetch("http://localhost:8080/api/generate", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
model: "qwen2.5-coder:32b",
prompt,
stream: true,
}),
});
const reader = res.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const text = decoder.decode(value);
const lines = text.split("\n").filter(Boolean);
for (const line of lines) {
const data = JSON.parse(line);
onChunk(data.response);
}
}
}
踩过的坑
内存不够
刚开始同时跑了两个模型,结果内存爆了。后来发现可以限制加载数量:
OLLAMA_MAX_LOADED_MODELS=1 ollama serve
上下文太长会变慢
默认上下文是 8192,对于代码生成场景其实不用这么大。改小一点速度稍快一些:
{
"model": "qwen2.5-coder:32b",
"options": {
"num_ctx": 4096
}
}
首次加载慢
第一次调用模型会加载到内存,32B 大概要 10 秒左右。后面就好了,响应比较积极
接入 VS Code
装个 Continue 插件,配置一下:
{
"continue.models": [
{
"title": "Local",
"provider": "ollama",
"model": "qwen2.5-coder:32b",
"apiBase": "http://localhost:8080"
}
]
}
效果
怎么说呢,这个设备下跑的模型和在线模型比还是有很大差距
日常写个函数、解释个代码片段、重构一下逻辑,只能说能用,速度也不快
最重要的是:不花钱,不用联网,不用担心泄露问题
对于个人来说,适合折腾一下,仅此而已