其他分类 · 12 9 月, 2026 0

使用 llama.cpp 在 Windows 本地部署多模态大模型

本文介绍如何在 Windows 上使用 llama.cpp 部署 GGUF 大语言模型,并加载独立的 mmproj 文件启用图像理解能力(注:截至2026年9月12日,Ollama 尚不支持加载独立 mmproj 文件)。文中的命令和参数以 NVIDIA GTX 1080 + Windows 为例,也适用于其他 NVIDIA 显卡。

1. 准备模型文件

一个使用独立视觉投影器的多模态模型通常至少包含两个 GGUF 文件:

Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-IQ2_M.gguf
mmproj-Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-f16.gguf

其中:

  • 主 GGUF 文件包含语言模型权重。
  • mmproj 是视觉编码器/多模态投影器,负责把图片转换成语言模型可以理解的特征。
  • mmproj 不是一个可以单独对话的语言模型,必须和兼容的主模型配套使用。

建议把两个文件放在同一个模型目录中,例如:

D:\APP\OLLAMA_MODELS\import\Qwen3.6-35B-A3B-Uncensored

模型文件较大,启动前请确认磁盘空间充足,并确认下载没有损坏。发布者如果提供 SHA256 校验值,建议额外执行校验。

2. 检查 Windows 环境

检查 NVIDIA 驱动:

nvidia-smi

如果使用 NVIDIA GPU,驱动报告的 CUDA 版本应不低于所下载 llama.cpp 构建所需的 CUDA 版本。本文使用 CUDA 12.4 构建,在 CUDA 12.8 驱动环境中运行。

注意:llama.cpp 的 CUDA 预编译包不一定要求本机安装完整 CUDA Toolkit。只要 NVIDIA 驱动兼容,通常可以直接运行;如果从源码编译,才需要额外准备 CUDA Toolkit、CMake 和编译器。

3. 下载 llama.cpp

llama.cpp 官方 GitHub Release 会提供 Windows 预编译包。对于 NVIDIA 显卡,选择类似下面的 CUDA x64 包:

llama-bXXXXX-bin-win-cuda-12.4-x64.zip

不要选择 ARM64 包。将压缩包解压到一个固定目录,例如:

D:\APP\llama.cpp

解压完成后,目录中应该能看到:

llama-server.exe
llama-cli.exe
ggml-cuda.dll

可以这样确认服务程序可用:

Set-Location D:\APP\llama.cpp
.\llama-server.exe --help

检查多模态参数:

.\llama-server.exe --help | Select-String mmproj

正常情况下可以看到 --mmproj--mmproj-offload 等参数。

4. 启动多模态模型服务

最基本的启动命令如下:

Set-Location D:\APP\llama.cpp

.\llama-server.exe `
  --model "D:\APP\OLLAMA_MODELS\import\Qwen3.6-35B-A3B-Uncensored\Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-IQ2_M.gguf" `
  --mmproj "D:\APP\OLLAMA_MODELS\import\Qwen3.6-35B-A3B-Uncensored\mmproj-Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-f16.gguf" `
  --host 127.0.0.1 `
  --port 8080 `
  --ctx-size 4096 `
  --n-gpu-layers 15 `
  --mmproj-offload

参数说明:

参数 作用
--model 主语言模型 GGUF 文件路径
--mmproj 多模态投影器 GGUF 文件路径
--host 127.0.0.1 只允许本机访问,避免直接暴露到局域网
--port 8080 HTTP 服务端口
--ctx-size 4096 上下文长度。显存不足时应先使用较小值
--n-gpu-layers 15 放入 GPU 的模型层数
--mmproj-offload 尝试把多模态投影器放入 GPU

GPU 层数怎么设置

--n-gpu-layers 越大,通常速度越快,但显存占用也越高。显存不足时,降低这个值即可;剩余层会在 CPU 上运行。

可以尝试以下顺序:

15 -> 20 -> 25

每次调整后观察是否出现 CUDA out of memory。8 GB 显存不一定能完整放下 35B 模型,即使模型采用了较低比特量化,也通常需要 CPU 和 GPU 混合运行。

5. 检查服务状态

启动后检查健康接口:

Invoke-WebRequest `
  -Uri "http://127.0.0.1:8080/health" `
  -UseBasicParsing

模型完成加载后应返回:

{"status":"ok"}

模型仍在加载时可能返回 HTTP 503,这是正常现象,等待模型加载完成即可。

查看 OpenAI 兼容接口中的模型:

Invoke-WebRequest `
  -Uri "http://127.0.0.1:8080/v1/models" `
  -UseBasicParsing

启动日志中应出现类似信息:

loaded multimodal model
model loaded
listening on http://127.0.0.1:8080

其中 loaded multimodal model 是确认 mmproj 被正确加载的关键标志。

6. 使用 llama.cpp 自带 Web UI

较新的 llama.cpp Release 会提供独立的 Web UI 资源包,例如:

llama-bXXXXX-ui.tar.gz

将资源解压到:

D:\APP\llama.cpp\webui\llama-bXXXXX

然后在启动命令中增加:

--path "D:\APP\llama.cpp\webui\llama-bXXXXX"

完整示例:

.\llama-server.exe `
  --model "D:\APP\OLLAMA_MODELS\import\Qwen3.6-35B-A3B-Uncensored\Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-IQ2_M.gguf" `
  --mmproj "D:\APP\OLLAMA_MODELS\import\Qwen3.6-35B-A3B-Uncensored\mmproj-Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-f16.gguf" `
  --path "D:\APP\llama.cpp\webui\llama-bXXXXX" `
  --host 127.0.0.1 `
  --port 8080 `
  --ctx-size 4096 `
  --n-gpu-layers 15 `
  --mmproj-offload

浏览器打开:

http://127.0.0.1:8080

这个 Web UI 直接使用当前 llama-server,不需要 Docker、Node.js 或单独配置后端地址。

7. 使用 OpenAI 兼容 API

llama.cpp server 提供 OpenAI 风格接口,可被很多客户端和前端使用。

文本请求

$body = @{
  model = "Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-IQ2_M.gguf"
  messages = @(
    @{
      role = "user"
      content = "用一句话介绍 llama.cpp。"
    }
  )
  max_tokens = 128
  stream = $false
} | ConvertTo-Json -Depth 8

Invoke-RestMethod `
  -Uri "http://127.0.0.1:8080/v1/chat/completions" `
  -Method Post `
  -ContentType "application/json" `
  -Body $body

图片请求

OpenAI 兼容的多模态消息使用数组形式的 content

$body = @{
  model = "Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-IQ2_M.gguf"
  messages = @(
    @{
      role = "user"
      content = @(
        @{
          type = "text"
          text = "请描述这张图片。"
        }
        @{
          type = "image_url"
          image_url = @{
            url = "data:image/png;base64,<BASE64_IMAGE_DATA>"
          }
        }
      )
    }
  )
  max_tokens = 256
  stream = $false
} | ConvertTo-Json -Depth 10

Invoke-RestMethod `
  -Uri "http://127.0.0.1:8080/v1/chat/completions" `
  -Method Post `
  -ContentType "application/json" `
  -Body $body

实际使用时,把 <BASE64_IMAGE_DATA> 替换为图片的 Base64 内容。许多兼容 OpenAI API 的桌面客户端也可以配置:

API Base URL: http://127.0.0.1:8080/v1
API Key: 任意非空字符串,或按客户端要求填写
Model: 使用 /v1/models 返回的模型名称

本文将服务绑定到 127.0.0.1,因此只能本机访问。如果要让局域网其他设备访问,需要改成:

--host 0.0.0.0

同时应该配置防火墙规则和 API 鉴权,不能把无鉴权的模型服务直接暴露到公网。

8. 使用启动脚本

为了避免每次重复输入长路径,可以创建 start-qwen3.6-vision.ps1

$ErrorActionPreference = "Stop"
$llamaDir = "D:\APP\llama.cpp"
$model = "D:\APP\OLLAMA_MODELS\import\Qwen3.6-35B-A3B-Uncensored\Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-IQ2_M.gguf"
$mmproj = "D:\APP\OLLAMA_MODELS\import\Qwen3.6-35B-A3B-Uncensored\mmproj-Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-f16.gguf"
$webui = "$llamaDir\webui\llama-bXXXXX"

Set-Location $llamaDir
& "$llamaDir\llama-server.exe" `
  --model $model `
  --mmproj $mmproj `
  --path $webui `
  --host 127.0.0.1 `
  --port 8080 `
  --ctx-size 4096 `
  --n-gpu-layers 15 `
  --mmproj-offload

运行:

powershell -ExecutionPolicy Bypass `
  -File D:\APP\llama.cpp\start-qwen3.6-vision.ps1

9. 常见问题

--mmproj 参数不存在

说明使用的 llama.cpp 版本太旧,或者下载的不是完整的 llama-server 构建。升级到较新的官方 Windows Release,并执行:

.\llama-server.exe --help | Select-String mmproj

服务返回 503 Loading model

模型仍在加载。35B 模型和视觉投影器都需要读取大量文件,等待日志出现:

model loaded
listening on http://127.0.0.1:8080

再访问 /health

CUDA out of memory

依次尝试:

  1. 降低 --n-gpu-layers
  2. 降低 --ctx-size,例如改成 2048。
  3. 去掉 --mmproj-offload,让投影器留在 CPU。
  4. 关闭占用显存的其他程序。

页面打开但不能发送图片

检查以下几点:

  • 启动命令包含 --mmproj
  • 日志中出现 loaded multimodal model
  • 主模型和 mmproj 来自同一个模型版本。
  • 使用的是支持多模态消息的 Web UI 或 API 客户端。

模型只输出思考内容

某些模型默认启用 reasoning。可以提高 max_tokens,或者根据当前模型模板和 llama.cpp 版本关闭思考保留功能:

--no-reasoning-preserve

并非所有模型都适合强行关闭 reasoning,建议先观察模型实际行为。

Ollama 能否直接加载这两个文件

Ollama 和 llama.cpp 的模型导入方式不同。mmproj 不能作为普通 Modelfile 的 PARAMETER 使用;即使主模型能被 Ollama 注册,也不代表外置视觉投影器已被加载。对于带独立 mmproj 的 GGUF,llama.cpp 的显式参数更直接:

--model 主模型.gguf --mmproj 投影器.gguf

10. 安全和性能建议

  • 默认绑定 127.0.0.1,只允许本机访问。
  • 不要把无鉴权的服务直接暴露到公网。
  • 先使用较小上下文确认服务稳定,再逐步增大 --ctx-size
  • 根据显存逐步调高 --n-gpu-layers,不要一开始就强行使用 --n-gpu-layers all
  • 图片理解任务建议保留足够的 max_tokens,否则模型可能只输出思考过程就达到上限。
  • 保留主模型和 mmproj 的来源、量化方式和版本信息,避免混用不兼容组件。

总结

部署多模态 GGUF 模型的核心不是把两个文件分别启动,而是使用同一个 llama-server,把主模型和视觉投影器显式关联:

llama-server.exe `
  --model "主模型.gguf" `
  --mmproj "mmproj文件.gguf" `
  --path "Web UI目录" `
  --host 127.0.0.1 `
  --port 8080

服务启动并出现 loaded multimodal model 后,就可以通过浏览器 Web UI、OpenAI 兼容 API 或其他支持 OpenAI API 的客户端进行文本和图像对话。