使用 Ollama 本地部署 Qwen3.5-4B 多模态模型

背景

对于大模型初学者来说,本地部署的第一步不一定是直接追求最大、最强的模型,而是先把完整流程跑通。一个比较完整的入门流程通常包括:

  • 下载模型
  • 本地运行模型
  • 命令行对话
  • API 调用
  • 图片输入测试
  • 查看显存占用
  • 理解模型量化方式

本次选择的模型是:

qwen3.5:4b

这是 Qwen3.5 系列的 4B 多模态模型,支持文本和图像输入,适合用来学习本地多模态大模型部署。

Ollama 可以简单理解为一个本地大模型运行器。它不是模型本身,而是负责模型下载、模型管理、本地推理和 API 服务。

使用 Ollama 的好处是:

  • 安装和使用比较简单
  • 可以直接下载量化模型
  • 默认提供本地 HTTP API
  • 支持 GPU 加速
  • 适合快速验证模型效果
  • 适合初学者理解本地部署流程

Ollama 和 Python 环境的关系

Ollama 不是 Python 包,也不是安装在 conda 的 base 环境里。

它是一个独立的本地服务。

可以这样理解:

Ollama 负责运行模型。
Python 脚本只是客户端,通过 HTTP 请求调用 Ollama。
conda 环境只影响 Python 代码,不影响 Ollama 本体。

后续 Python 调用 Ollama 时,本质上是访问:

http://localhost:11434/api/chat

所以不用担心 Ollama 会污染 Python 环境。


模型目录规划

Ollama 默认会把模型文件放在系统目录中。随着后续下载的模型越来越多,可能会占用较多系统盘空间。

因此建议提前设置一个独立的模型存储目录,例如:

<OLLAMA_MODELS_DIR>

这里可以替换成自己的数据盘路径。后续所有通过 Ollama 下载的模型,都会统一放在这个目录中,方便管理。

注意:在 systemd 服务配置中,建议使用绝对路径,不要使用 ~,因为服务环境中不一定会自动展开当前用户目录。


安装 Ollama

网络稳定时,可以直接使用官方安装方式:

curl -fsSL https://ollama.com/install.sh | sh

安装完成后检查:

which ollama
ollama -v

如果能看到 Ollama 的路径和版本号,说明安装成功。

如果网络不稳定,直接安装可能会遇到下载中断,例如:

curl: (92) HTTP/2 stream was not closed cleanly
tar: 归档文件中异常的 EOF

这通常表示安装包下载到一半中断,导致压缩包不完整。更稳妥的方式是先完整下载安装包,再手动解压。

创建安装目录:

mkdir -p <APP_DIR>/ollama_install
cd <APP_DIR>/ollama_install

安装下载和解压工具:

sudo apt update
sudo apt install -y aria2 zstd

使用 aria2c 断点续传下载:

aria2c -x 8 -s 8 -k 1M -c \
  "https://ollama.com/download/ollama-linux-amd64.tar.zst" \
  -o ollama-linux-amd64.tar.zst

下载完成后,检查压缩包是否完整:

unzstd -t ollama-linux-amd64.tar.zst

如果没有报错,再解压安装:

sudo tar --use-compress-program=unzstd -xf ollama-linux-amd64.tar.zst -C /usr

再次检查:

which ollama
ollama -v

创建模型存储目录

创建模型目录:

sudo mkdir -p <OLLAMA_MODELS_DIR>

如果是手动安装,系统里可能还没有 ollama 用户。可以先检查:

id ollama

如果提示用户不存在,则创建 Ollama 系统用户:

sudo useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama

然后把模型目录权限交给 Ollama:

sudo chown -R ollama:ollama <OLLAMA_MODELS_DIR>

这样 Ollama 服务才能正常读写模型文件。


配置 Ollama 后台服务

创建 systemd 服务文件:

sudo tee /etc/systemd/system/ollama.service > /dev/null <<'EOF'
[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Environment="OLLAMA_MODELS=<OLLAMA_MODELS_DIR>"

[Install]
WantedBy=multi-user.target
EOF

这里需要把 <OLLAMA_MODELS_DIR> 替换成自己的模型目录绝对路径。

如果需要使用 NVIDIA GPU,建议给 ollama 用户添加显卡访问权限:

sudo usermod -aG video ollama
getent group render >/dev/null && sudo usermod -aG render ollama

重载并启动服务:

sudo systemctl daemon-reload
sudo systemctl enable --now ollama

查看服务状态:

systemctl status ollama --no-pager

如果看到 active (running),说明服务启动成功。

检查模型目录环境变量是否生效:

systemctl show ollama --property=Environment

如果输出中包含:

OLLAMA_MODELS=<OLLAMA_MODELS_DIR>

说明模型目录配置成功。


下载并运行 Qwen3.5-4B

下载模型:

ollama pull qwen3.5:4b

下载成功后,通常会看到类似信息:

verifying sha256 digest
writing manifest
success

查看本地模型列表:

ollama list

检查模型目录大小:

du -sh <OLLAMA_MODELS_DIR>

如果模型目录出现几个 GB 的占用,说明模型已经下载到了指定位置。

启动模型:

ollama run qwen3.5:4b

进入交互界面后,可以直接输入:

你好,请介绍一下你自己。

如果模型正常回复,说明本地模型已经成功运行。

退出交互模式可以使用:

Ctrl + D

或者输入:

/bye

查看模型信息和量化级别

查看模型信息:

ollama show qwen3.5:4b

可以看到类似信息:

architecture        qwen3
parameters          4.7B
context length      262144
embedding length    2560
quantization        Q4_K_M
capabilities        completion, vision, tools, thinking

其中最关键的是:

quantization        Q4_K_M

这说明当前下载的是 4-bit 量化版本。

可以简单理解为:

Q4_K_M 是 GGUF / llama.cpp 体系中的一种 4-bit 权重量化格式。它接近 INT4 级别的压缩,但不是最朴素的 int4,而是包含分组、scale 等机制的量化格式。

这也是为什么模型文件只有几 GB,运行时显存占用也比较低。

如果使用 FP16 原始权重,4B 参数模型理论上仅权重就需要大约 8GB 显存:

4B × 2 bytes ≈ 8GB

这还不包括 KV cache、运行时缓存、视觉编码器开销和上下文长度开销。

而 Ollama 下载的通常是量化模型,例如 Q4_K_M。量化后模型权重明显变小,所以实际显存占用会低很多。


检查是否使用 GPU

可以打开一个新终端,执行:

watch -n 1 nvidia-smi

然后在另一个终端运行模型或发送 API 请求。

如果 nvidia-smi 中出现 Ollama 进程,并且显存占用增加,说明模型正在使用 GPU。

也可以查看当前正在运行的 Ollama 模型:

ollama ps

测试本地 API

Ollama 默认 API 地址是:

http://localhost:11434

可以使用 curl 测试文本输入:

curl http://localhost:11434/api/chat \
  -d '{
    "model": "qwen3.5:4b",
    "messages": [
      {
        "role": "user",
        "content": "你好,请用三句话介绍一下你自己。"
      }
    ],
    "stream": false
  }'

如果返回 JSON,并且其中包含模型回复,说明本地 API 调用成功。

因为 qwen3.5:4b 是多模态模型,所以也可以测试图片输入。

假设有一张图片:

<IMAGE_PATH>

先将图片转成 base64:

IMG=$(base64 -w 0 <IMAGE_PATH>)

然后发送请求:

curl http://localhost:11434/api/chat \
  -d "{
    \"model\": \"qwen3.5:4b\",
    \"messages\": [
      {
        \"role\": \"user\",
        \"content\": \"请描述这张图片,并判断图中是否有车辆、建筑、道路、水体或裸土。请用 JSON 格式输出。\",
        \"images\": [\"$IMG\"]
      }
    ],
    \"stream\": false,
    \"options\": {
      \"temperature\": 0.2,
      \"num_ctx\": 4096
    }
  }"

如果模型能够返回图片描述,说明多模态输入已经跑通。


使用 Python 调用 Ollama API

后续如果要批量处理图片,更推荐使用 Python 调用本地 API。

示例脚本如下:

import base64
import json
import requests
from pathlib import Path

MODEL = "qwen3.5:4b"
URL = "http://localhost:11434/api/chat"
IMAGE_PATH = "<IMAGE_PATH>"

def encode_image(image_path: str) -> str:
    return base64.b64encode(Path(image_path).read_bytes()).decode("utf-8")

def main():
    image_b64 = encode_image(IMAGE_PATH)

    payload = {
        "model": MODEL,
        "messages": [
            {
                "role": "user",
                "content": (
                    "你是一个图像理解助手。"
                    "请判断图像中主要包含什么内容,是否有车辆、建筑、道路、水体或裸土。"
                    "请严格用 JSON 输出,格式为:"
                    "{\"summary\":\"一句话描述\", \"objects\":[\"车辆\",\"建筑\"], \"reason\":\"简短原因\"}"
                ),
                "images": [image_b64]
            }
        ],
        "stream": False,
        "options": {
            "temperature": 0.2,
            "num_ctx": 4096
        }
    }

    response = requests.post(URL, json=payload, timeout=120)
    response.raise_for_status()

    data = response.json()
    content = data["message"]["content"]

    print("模型原始输出:")
    print(content)

    try:
        parsed = json.loads(content)
        print("\n解析后的 JSON:")
        print(json.dumps(parsed, ensure_ascii=False, indent=2))
    except Exception:
        print("\n注意:模型输出不是严格 JSON,后续可以加强提示词或做 JSON 清洗。")

if __name__ == "__main__":
    main()

运行脚本:

python test_qwen35_image.py

常用 Ollama 命令

查看已下载模型:

ollama list

运行模型:

ollama run qwen3.5:4b

查看模型信息:

ollama show qwen3.5:4b

查看正在运行的模型:

ollama ps

删除模型:

ollama rm qwen3.5:4b

查看 Ollama 服务状态:

systemctl status ollama --no-pager

重启 Ollama 服务:

sudo systemctl restart ollama

查看模型目录大小:

du -sh <OLLAMA_MODELS_DIR>
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐