从零部署千问模型(三):使用Ollama快速部署千问模型

前言

在上一篇中,我们使用 vLLM 部署了高性能推理服务,适合生产环境。但如果你只是想在本地快速体验千问模型,或者需要一个轻量级的方案,Ollama 是更好的选择。它就像大模型界的 Docker——一行命令拉取模型,一行命令启动服务,自动管理模型文件和 GPU 资源。

一、Ollama 简介

Ollama 是一个开源的本地大模型运行框架,核心特点:

  • 极简安装:一行命令完成安装,无需配置 CUDA、PyTorch 等环境
  • 模型管理:类似 Docker 的 pull/run 命令,自动下载和管理模型
  • GGUF 量化:内置多种量化方案,自动选择最优配置
  • API 服务:内置 REST API,兼容 OpenAI 接口格式
  • 多模型支持:Qwen、Llama、Mistral、Phi 等主流模型均支持
  • CPU/GPU 自适应:自动检测硬件,有 GPU 用 GPU,没有用 CPU

二、安装 Ollama

2.1 Linux 安装(推荐)

# 官方一键安装脚本
curl -fsSL https://ollama.com/install.sh | sh

国内用户如果下载慢,可以使用镜像加速:

# 设置 Ollama 镜像加速(在安装前执行)
export OLLAMA_MIRROR=https://ollama.mirror.example.com

# 或者手动下载二进制
wget https://github.com/ollama/ollama/releases/latest/download/ollama-linux-amd64 -O /usr/local/bin/ollama
chmod +x /usr/local/bin/ollama

2.2 验证安装

ollama --version
# Ollama version: 0.5.x

2.3 配置服务参数

Ollama 安装后会自动创建 systemd 服务。可以通过环境变量调整配置:

sudo tee /etc/systemd/system/ollama.service.d/override.conf > /dev/null << 'EOF'
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_MAX_LOADED_MODELS=4"
Environment="OLLAMA_KEEP_ALIVE=24h"
Environment="OLLAMA_NUM_PARALLEL=4"
EOF

sudo systemctl daemon-reload
sudo systemctl restart ollama
环境变量说明默认值
OLLAMA_HOST监听地址和端口127.0.0.1:11434
OLLAMA_MAX_LOADED_MODELS同时加载的模型数1(受显存限制)
OLLAMA_KEEP_ALIVE模型在内存中保持的时间5m
OLLAMA_NUM_PARALLEL并行请求数1
OLLAMA_MODELS模型存储路径~/.ollama/models

2.4 修改模型存储路径

默认模型存在 ~/.ollama/models,如果磁盘空间不足,可以修改到其他路径:

# 停止服务
sudo systemctl stop ollama

# 迁移模型目录
sudo mkdir -p /data/ollama/models
sudo rsync -av ~/.ollama/models/ /data/ollama/models/

# 修改配置
sudo tee /etc/systemd/system/ollama.service.d/override.conf > /dev/null << 'EOF'
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_MODELS=/data/ollama/models"
EOF

sudo systemctl daemon-reload
sudo systemctl start ollama

三、部署 Qwen 模型

3.1 拉取官方模型

# 查看 Qwen 可用版本
ollama search qwen

# 拉取 Qwen3-8B(默认量化的 GGUF 版本)
ollama pull qwen3:8b

# 其他常用版本
ollama pull qwen3:4b       # 小尺寸,适合轻量设备
ollama pull qwen3:14b      # 中型,需要较好 GPU
ollama pull qwen3:32b      # 大型,需要大显存
ollama pull qwen3-coder:8b # 编程专用

拉取过程会显示下载进度:

pulling manifest...
pulling 8b4f6f3a2e1c... 100% ▕██████████████████▏ 4.9 GB
pulling 8c17c5c0e2a1... 100% ▕██████████████████▏  17 KB
pulling 5f4e3d2a1c9b... 100% ▕██████████████████▏  11 KB
verifying sha256 digest
writing manifest
success

3.2 查看已安装模型

ollama list
# NAME              ID            SIZE     MODIFIED
# qwen3:8b          abc123def456  4.9 GB   2 minutes ago
# qwen3:4b          xyz789uvw012  2.5 GB   1 hour ago

3.3 查看模型详情

ollama show qwen3:8b

# Model
#   architecture        qwen3
#   parameters          8.2B
#   context length      32768
#   embedding length    4096
#   quantization        Q4_K_M
#
# Parameters
#   num_keep           24
#   temperature        0.7
#   top_p              0.9
#   top_k              40

3.4 命令行对话

ollama run qwen3:8b

进入交互式对话:

>>> 你好,介绍一下你自己
我是通义千问(Qwen),由阿里巴巴开发的大语言模型...

>>> /bye  # 退出对话

四、导入自定义模型

如果官方仓库没有你需要的版本,可以导入自己的 GGUF 模型文件:

4.1 创建 Modelfile

# 下载 GGUF 格式模型文件
# 可以从 ModelScope 或 HuggingFace 下载
wget https://www.modelscope.cn/models/Qwen/Qwen3-8B-GGUF/resolve/master/qwen3-8b-q4_k_m.gguf

# 创建 Modelfile
cat > Modelfile << 'EOF'
FROM ./qwen3-8b-q4_k_m.gguf

PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER top_k 40
PARAMETER num_ctx 32768

TEMPLATE """{{ if .System }}<|im_start|>system
{{ .System }}<|im_end|>
{{ end }}{{ if .Prompt }}<|im_start|>user
{{ .Prompt }}<|im_end|>
{{ end }}<|im_start|>assistant
"""

SYSTEM """You are a helpful assistant."""

PARAMETER stop "<|im_end|>"
PARAMETER stop "<|im_start|>"
EOF

4.2 构建并运行

# 构建模型
ollama create qwen3-8b-custom -f Modelfile

# 运行
ollama run qwen3-8b-custom

五、API 接口调用

5.1 生成文本(Generate)

curl -s http://localhost:11434/api/generate -d '{
  "model": "qwen3:8b",
  "prompt": "用Python写一个二分查找",
  "stream": false
}' | python3 -m json.tool

返回格式:

{
  "model": "qwen3:8b",
  "created_at": "2026-06-23T10:00:00Z",
  "response": "def binary_search(arr, target):\n    left, right = 0, len(arr) - 1\n    while left <= right:\n        mid = (left + right) // 2\n        if arr[mid] == target:\n            return mid\n        elif arr[mid] < target:\n            left = mid + 1\n        else:\n            right = mid - 1\n    return -1\n...",
  "done": true,
  "context": [128, 4523, 908, ...],
  "total_duration": 3500000000,
  "load_duration": 500000000,
  "prompt_eval_count": 15,
  "prompt_eval_duration": 200000000,
  "eval_count": 128,
  "eval_duration": 2800000000
}

5.2 对话接口(Chat)

curl -s http://localhost:11434/api/chat -d '{
  "model": "qwen3:8b",
  "messages": [
    {"role": "system", "content": "你是一个运维专家"},
    {"role": "user", "content": "Docker容器无法启动怎么排查?"}
  ],
  "stream": false
}' | python3 -m json.tool

5.3 OpenAI 兼容接口

Ollama 也提供 OpenAI 兼容的 API,方便直接替换:

curl -s http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3:8b",
    "messages": [{"role": "user", "content": "Hello!"}],
    "stream": true
  }'
from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama"  # Ollama 不校验 key,随意填
)

response = client.chat.completions.create(
    model="qwen3:8b",
    messages=[{"role": "user", "content": "解释Kubernetes的Pod概念"}],
    temperature=0.7
)
print(response.choices[0].message.content)

5.4 流式输出

import requests
import json

response = requests.post(
    "http://localhost:11434/api/chat",
    json={
        "model": "qwen3:8b",
        "messages": [{"role": "user", "content": "写一个Docker Compose部署Nginx的配置"}],
        "stream": True
    },
    stream=True
)

for line in response.iter_lines():
    if line:
        data = json.loads(line)
        if not data.get("done"):
            print(data["message"]["content"], end="", flush=True)
print()

六、多模型管理

6.1 同时运行多个模型

# 拉取多个模型
ollama pull qwen3:8b
ollama pull qwen3-coder:8b

# 修改配置允许同时加载
sudo tee /etc/systemd/system/ollama.service.d/override.conf > /dev/null << 'EOF'
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_MAX_LOADED_MODELS=2"
Environment="OLLAMA_NUM_PARALLEL=2"
EOF
sudo systemctl daemon-reload
sudo systemctl restart ollama

6.2 创建自定义角色模型

可以基于已有模型创建带有特定 system prompt 的定制版本:

cat > Modelfile.devops << 'EOF'
FROM qwen3:8b

SYSTEM """你是一个资深DevOps工程师,擅长:
- Linux系统管理
- Docker/Kubernetes容器编排
- CI/CD流水线设计
- 监控与告警体系
- 云原生架构

回答时请:
1. 先分析问题根因
2. 给出具体解决方案和命令
3. 提供最佳实践建议"""

PARAMETER temperature 0.3
PARAMETER num_ctx 32768
EOF

ollama create qwen-devops -f Modelfile.devops
ollama run qwen-devops

6.3 模型版本管理

# 查看所有模型
ollama list

# 查看运行中的模型
ollama ps
# NAME           ID            SIZE     PROCESSOR     UNTIL
# qwen3:8b       abc123def456  5.2 GB   100% GPU      24 minutes from now

# 删除模型
ollama rm qwen3:4b

# 复制模型
ollama cp qwen3:8b qwen3:8b-backup

七、vLLM vs Ollama 对比

特性vLLMOllama
安装复杂度较高(需CUDA+PyTorch)极低(一行命令)
推理性能极高(PagedAttention+连续批处理)中等(基于llama.cpp)
并发能力高(支持数百并发)低(默认单并发)
模型格式Safetensors/AWQ/GPTQGGUF
OpenAI API✅ 原生兼容✅ 兼容
Function Calling✅ 支持✅ 支持
CPU 推理不推荐✅ 自适应
多模型切换需重启服务热切换
适用场景生产环境、高并发个人开发、轻量部署

八、总结

本文使用 Ollama 快速部署了 Qwen 模型,核心收获:

  • ✅ 一行命令安装 Ollama,自动管理 GPU 和模型
  • ✅ 通过 pull/run 命令快速拉取和运行 Qwen 模型
  • ✅ 掌握了 Modelfile 自定义模型配置
  • ✅ 学会了 REST API 和 OpenAI 兼容接口的调用
  • ✅ 了解了多模型管理和自定义角色创建
  • ✅ 对比了 vLLM 和 Ollama 的适用场景

下一篇也是本系列最后一篇,我们将搭建一个美观的 Web 对话界面,让千问模型拥有类似 ChatGPT 的用户体验,并对接 API 实现完整的应用闭环。

参考资料

发表回复

后才能评论