Windows 11 Arm64 环境使用 Docker 部署本地 SLM

Windows 11 Arm64 环境使用 Docker 部署本地 SLM

前言

随着 ARM 架构的普及和本地大模型的需求增长,越来越多的开发者开始在 Windows 11 Arm64 设备上运行本地 AI 模型。本文将详细介绍如何在 骁龙 X EliteARM64 架构的 Windows 11 Pro 系统上,利用 Docker 部署并运行 Qwen3.5 系列本地化 SLMSmall Language Models, SLMs / 小型语言模型)。

环境准备

硬件要求

  • 处理器 : ARM64 架构(推荐 骁龙 X Elite 12 核
  • 内存 : 建议 16GB 以上,推荐 32GB
  • 存储 : 至少 20GB 可用空间

软件要求

  1. Windows 11 ARM64 系统
  2. Docker Desktop for Windows (确保启用 WSL2 后端)
  3. Python 3.12+ (用于下载模型,此处使用 Python 3.14.3

项目结构

本文使用的项目结构如下:

bash 复制代码
DockerAI/
├── docker-compose-arm64.yaml    # Docker Compose 配置文件
├── download_model.py            # 模型下载脚本
├── gguf-models/                 # 模型文件存储目录
├── ollama/
│   ├── data/                    # Ollama 数据持久化目录
│   └── models/                  # Modelfile 配置文件
└── QUICK_START.md               # 快速开始指南

项目地址:

部署步骤

第一步:下载模型

使用 ModelScope 下载 Qwen3.5-0.8B GGUF 格式的模型:

bash 复制代码
python download_model.py

该脚本会自动下载模型到 gguf-models/ 目录。下载脚本内容如下:

python 复制代码
from modelscope.hub.snapshot_download import snapshot_download
import os

# 确保目标目录存在
os.makedirs('./gguf-models', exist_ok=True)

# 下载模型
model_dir = snapshot_download(
    model_id="unsloth/Qwen3.5-0.8B-GGUF",
    cache_dir="./gguf-models"
)

print(f"Model successfully downloaded to: {model_dir}")

执行脚本输出信息:

第二步:配置 Docker Compose

创建 docker-compose-arm64.yaml 文件,针对 ARM64 架构进行优化:

yaml 复制代码
services:
  ollama:
    image: ollama/ollama:latest
    platform: linux/arm64
    container_name: ollama-server-arm64
    restart: unless-stopped
    ports:
      - "11434:11434"
    volumes:
      - ./ollama/data:/root/.ollama
      - ./gguf-models:/models:ro
    environment:
      - OLLAMA_NUM_PARALLEL=2
      - OLLAMA_MAX_QUEUE=4
      - OLLAMA_LOAD_TIMEOUT=5m
      - OLLAMA_KEEP_ALIVE=30m
      - OLLAMA_DEBUG=1
    command: serve
    shm_size: 2gb
    healthcheck:
      test: ["CMD", "ollama", "list"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

networks:
  default:
    name: qwen-arm64-network

关键配置说明:

  • platform: linux/arm64: 明确指定 ARM64 架构
  • shm_size: 2gb: 设置共享内存为 2GB,提升模型加载性能
  • OLLAMA_NUM_PARALLEL=2: 允许同时处理 2 个请求
  • OLLAMA_MAX_QUEUE=4: 最大队列 4 个请求
  • OLLAMA_KEEP_ALIVE=30m: 模型在内存中保持 30 分钟

浏览器输入 http://localhost:11434/ 查看 ollama 是否运行:

看到如上信息,说明成功运行 ollama

第三步:创建 Modelfile

ollama/models/ 目录下创建 qwen35-08b-gguf.modelfile

dockerfile 复制代码
FROM /models/unsloth/Qwen3___5-0___8B-GGUF/Qwen3.5-0.8B-Q4_K_M.gguf

# 设置系统提示
TEMPLATE """{{ if .System }}<|im_start|>system
{{ .System }}<|im_end|>
{{ end }}{{ if .Prompt }}<|im_start|>user
{{ .Prompt }}<|im_end|>
{{ end }}{{ if .Response }}<|im_start|>assistant
{{ .Response }}<|im_end|>
{{ end }}"""

# 设置系统消息
SYSTEM "You are Qwen3.5, a helpful AI assistant developed by Alibaba Cloud."

# 设置参数
PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER num_ctx 4096
PARAMETER num_thread 10

参数说明:

  • temperature: 创造性参数(0-1),越高越随机
  • top_p: 核采样参数(0-1),控制生成多样性
  • num_ctx: 上下文长度,决定模型能记住多长的对话
  • num_thread: 线程数,建议设置为 CPU 核心数 -2

第四步:启动容器

bash 复制代码
docker-compose -f docker-compose-arm64.yaml up -d

等待容器启动完成(约 30-60 秒)。可以通过以下命令检查状态:

bash 复制代码
docker ps | grep ollama

第五步:创建并运行模型

bash 复制代码
# 复制 Modelfile 到容器
docker cp ollama/models/qwen35-08b-gguf.modelfile ollama-server-arm64:/root/.ollama/models/

# 创建模型(首次需要,约 1-2 分钟)
docker exec ollama-server-arm64 ollama create qwen35 -f /root/.ollama/models/qwen35-08b-gguf.modelfile

# 运行模型测试
docker exec -it ollama-server-arm64 ollama run qwen35 "你好"

本地容器化运行 SLM 模型,聊天测试如下:

docker 容器聊天信息:

API 使用方式

Ollama 提供了 RESTful API,方便在应用中集成。

查看已安装模型

bash 复制代码
curl http://localhost:11434/api/tags

文本生成

bash 复制代码
curl http://localhost:11434/api/generate -d '{
  "model": "qwen35",
  "prompt": "你好,请介绍一下你自己?",
  "stream": false
}'

对话模式

bash 复制代码
curl http://localhost:11434/api/chat -d '{
  "model": "qwen35",
  "messages": [
    {"role": "user", "content": "你好"}
  ],
  "stream": false
}'

模型选择指南

项目提供了多个量化版本的 Qwen3.5-0.8B 模型:

模型文件 大小 特点 推荐场景
Qwen3.5-0.8B-Q4_K_M.gguf 507MB 最佳质量/速度平衡 通用任务 ⭐⭐⭐⭐⭐
Qwen3.5-0.8B-Q4_K_S.gguf 484MB 更高速度 实时响应 ⭐⭐⭐⭐
Qwen3.5-0.8B-IQ4_NL.gguf 483MB 最新量化技术 低内存场景 ⭐⭐⭐⭐

如需切换模型,修改 Modelfile 中的 FROM 路径即可。

性能优化建议

1. 线程数调优

根据 CPU 核心数 调整 num_thread 参数:

dockerfile 复制代码
# 骁龙 X Elite 12 核示例
PARAMETER num_thread 10

建议设置为 CPU 核心数 - 2,为系统保留资源。

2. 并发控制

根据内存大小调整并发参数:

yaml 复制代码
environment:
  - OLLAMA_NUM_PARALLEL=2  # 16GB 内存推荐
  - OLLAMA_NUM_PARALLEL=4  # 32GB 内存推荐

3. 量化选择

  • 内存紧张:使用 IQ4_NL 量化
  • 速度优先:使用 Q4_K_S 量化
  • 质量优先:使用 Q4_K_M 量化

4. 上下文长度

根据需求调整 num_ctx

dockerfile 复制代码
PARAMETER num_ctx 2048   # 短对话,节省内存
PARAMETER num_ctx 4096   # 标准配置
PARAMETER num_ctx 8192   # 长对话,需要更多内存

常用管理命令

  • 容器管理
bash 复制代码
# 查看容器状态
docker ps | grep ollama

# 查看容器日志
docker logs ollama-server-arm64

# 重启容器
docker restart ollama-server-arm64

# 停止容器
docker stop ollama-server-arm64

# 删除容器(保留数据)
docker rm ollama-server-arm64
  • 模型管理
bash 复制代码
# 列出已安装模型
docker exec ollama-server-arm64 ollama list

# 删除模型
docker exec ollama-server-arm64 ollama rm qwen35

# 查看模型信息
docker exec ollama-server-arm64 ollama show qwen35
  • 性能监控
bash 复制代码
# 查看容器资源使用情况
docker stats ollama-server-arm64

# 查看实时日志
docker logs -f ollama-server-arm64

故障排查

容器启动失败

症状 : docker-compose up -d 后容器无法启动

解决方案:

  1. 检查 Docker Desktop 是否运行在 WSL2 模式
  2. 确认端口 11434 未被占用:netstat -ano | findstr 11434
  3. 查看详细日志:docker logs ollama-server-arm64
  4. 检查 Docker Desktop 是否有足够的资源分配

模型创建失败

症状 : ollama create 命令报错

解决方案:

  1. 确认 gguf-models/ 目录存在并包含模型文件
  2. 检查 Modelfile 中的模型路径是否正确
  3. 验证 Modelfile 格式(注意不支持 max_tokens 参数)
  4. 查看详细错误信息:docker exec ollama-server-arm64 ollama create qwen35 -f /path/to/modelfile -v

性能问题

症状 : 响应速度慢或 CPU 占用过高

解决方案:

  1. 调整 num_thread 参数
  2. 使用更小的量化模型(如 IQ4_NL
  3. 检查系统资源使用情况:docker stats
  4. 关闭不必要的后台应用

内存不足

症状: 系统卡顿或应用崩溃

解决方案:

  1. 使用更小的量化模型
  2. 减少 OLLAMA_NUM_PARALLEL
  3. 减少 num_ctx 参数值
  4. 关闭其他占用内存的应用

完整清理

如需完全重置项目:

bash 复制代码
# 停止并删除容器
docker-compose -f docker-compose-arm64.yaml down

# 删除模型数据(可选)
docker exec ollama-server-arm64 ollama rm qwen35

# 删除本地模型文件(可选,谨慎操作)
rm -rf gguf-models/

# 删除 Docker 镜像(可选)
docker rmi ollama/ollama:latest

实际应用场景

1. 本地代码助手

结合 VS Code 插件,实现本地代码补全和解释:

javascript 复制代码
// 示例:使用 Ollama API 进行代码解释
async function explainCode(code) {
  const response = await fetch('http://localhost:11434/api/chat', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      model: 'qwen35',
      messages: [
        {
          role: 'system',
          content: 'You are a coding assistant. Explain the code clearly.'
        },
        {
          role: 'user',
          content: `Explain this code:\n${code}`
        }
      ],
      stream: false
    })
  });

  return await response.json();
}

2. 本地文档问答

基于 RAG(检索增强生成)构建本地知识库问答系统:

python 复制代码
# 示例:结合向量数据库实现文档问答
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_community.chat_models import ChatOllama

# 初始化模型
embeddings = OllamaEmbeddings(model="qwen35")
llm = ChatOllama(model="qwen35")

# 加载文档并创建向量库
vectorstore = Chroma.from_documents(
    documents=documents,
    embedding=embeddings
)

# 问答
query = "如何优化 Docker 容器性能?"
docs = vectorstore.similarity_search(query)
answer = llm.invoke(f"基于以下文档回答问题:\n{docs}\n\n问题:{query}")

3. 本地 API 服务

为其他应用提供本地 AI 能力:

python 复制代码
# 示例:Flask API 服务
from flask import Flask, request, jsonify
import requests

app = Flask(__name__)

@app.route('/api/chat', methods=['POST'])
def chat():
    data = request.json

    response = requests.post(
        'http://localhost:11434/api/chat',
        json={
            'model': 'qwen35',
            'messages': data['messages'],
            'stream': False
        }
    )

    return jsonify(response.json())

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

总结

通过本文的介绍,你可以在 Windows 11 Arm64 设备上成功部署并运行本地 "小模型" 。这种方式具有以下优势:

数据隐私 : 所有数据在本地处理,无需上传云端

零网络依赖 : 断网环境下也能正常使用

成本可控 : 一次部署,无限使用,无 API 调用费用

性能优秀 : ARM64 架构配合优化配置,响应速度快

易于集成 : 提供标准 REST API,方便集成到各类应用

随着硬件性能的提升和模型的不断优化,本地 "小模型" 部署将变得更加普及和高效。希望本文能帮助你在 ARM64 设备上顺利搭建本地 AI 环境。

参考资源


注意 : 本文基于 Qwen3.5-0.8B 模型,如需使用其他模型,请参考对应文档调整配置。不同的模型可能有不同的参数要求和性能特征。

相关推荐
一个处女座的程序猿5 个月前
LLMs之SLMs:《Small Language Models are the Future of Agentic AI》的翻译与解读
人工智能·自然语言处理·小语言模型·slms