本地大模型API服务备忘


最近折腾了一下本地大模型,发现 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"
    }
  ]
}

效果

怎么说呢,这个设备下跑的模型和在线模型比还是有很大差距

日常写个函数、解释个代码片段、重构一下逻辑,只能说能用,速度也不快

最重要的是:不花钱,不用联网,不用担心泄露问题

对于个人来说,适合折腾一下,仅此而已



  目录