使用 Ollama 本地部署 Qwen3.5-4B 多模态模型
使用 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>
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)