Ollama 部署与模型加载实战记录

一、前置信息

1.1 操作系统与环境

项目

操作系统

Ubuntu 24.04 LTS

内核架构

x86_64

主机名

ubuntu-GTR-Pro

1.2 硬件配置

组件

规格

CPU

AMD Ryzen AI MAX+ 395 w/ Radeon 8060S,32 核

内存

30 GiB(可用约 27 GiB)

磁盘

1.9 TB NVMe SSD(可用 1.8 TB)

GPU

无独立 NVIDIA 显卡;集成 AMD Radeon 8060S 核显(RDNA 3.5)

NPU

AMD XDNA2(未使用)

1.3 网络信息

项目

本机 IP

192.168.66.111

目标网段

192.168.66.0/24

SSH 端口

22(默认)

1.4 软件栈

软件

版本/说明

Ollama

最新版(通过官方安装脚本安装)

模型

qwen3:30b-a3b→ 定制标签qwen3:30b-a3b-16k

推理后端

Ollama(CPU + ROCm 核显加速)


二、操作步骤

步骤 1:获取设备 IP 与网络连通性验证

目标:确认 Linux 服务器的 IP 地址,并验证从 Windows 客户端能否通过 SSH 连接。

1.1 查看本机 IP 地址
# 查看所有网络接口的 IP 配置 ip a

关键输出(截取有线网卡部分):

2: enxf8e43bf20402: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 inet 192.168.66.111/24 brd 192.168.66.255 scope global enxf8e43bf20402 valid_lft forever preferred_lft forever

解释ip a是 Linux 下查看网络接口的标准命令。输出显示有线网卡enxf8e43bf20402的 IPv4 地址为192.168.66.111/24,子网掩码255.255.255.0,状态UP(已启用)。

⚠️注意:无线网卡wlp194s0显示state DOWN,表示未连接或未启用。若需要使用无线连接,需先激活该网卡。

1.2 尝试 SSH 连接(在 Windows 客户端执行)
# 使用 Xshell 连接目标服务器(此处为 Windows 端操作,仅供参考) # 新建会话:协议 SSH,主机 192.168.66.111,端口 22

失败输出

Connecting to 192.168.66.111:22... Could not connect to '192.168.66.111' (port 22): Connection failed.

解释:连接失败,说明目标服务器上的 SSH 服务未启动或防火墙阻止了 22 端口。需要检查并启动 SSH 服务。

⚠️注意:首次连接时,Xshell 可能会弹出主机密钥指纹确认窗口,属于正常安全机制,点击"接受并保存"即可。


步骤 2:安装与启动 SSH 服务

目标:在 Linux 服务器上安装 OpenSSH Server 并确保其正常运行。

2.1 检查 SSH 服务状态
# 尝试查看 sshd 服务状态(Debian/Ubuntu 系通常使用 ssh 而非 sshd) sudo systemctl status sshd

输出

Unit sshd.service could not be found.

解释sshd.service单元不存在,说明系统未安装 OpenSSH Server,或服务名称不同。Ubuntu/Debian 系的服务名为ssh而非sshd

2.2 安装 OpenSSH Server
# 更新软件包索引并安装 openssh-server sudo apt update && sudo apt install openssh-server -y

输出(截取关键部分):

Reading package lists... Done Building dependency tree... Done The following NEW packages will be installed: openssh-server ... Setting up openssh-server (1:8.9p1-3ubuntu0.6) ... Created symlink /etc/systemd/system/sshd.service → /lib/systemd/system/ssh.service.

解释apt install openssh-server会自动安装 SSH 服务端,并创建 systemd 服务单元。注意安装后创建的是ssh.service的符号链接。

2.3 启动 SSH 服务
# 启动 SSH 服务并查看状态 sudo systemctl start ssh && sudo systemctl status ssh

输出(关键部分):

● ssh.service - OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2026-07-08 14:00:00 CST; 2s ago Docs: man:sshd(8) man:sshd_config(5) Main PID: 12345 (sshd) Tasks: 1 (limit: 9527) Memory: 1.2M CPU: 21ms CGroup: /system.slice/ssh.service └─12345 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"

解释Active: active (running)表明 SSH 服务已成功启动。此时从 Windows 客户端的 Xshell 重新连接192.168.66.111:22即可成功登录。

⚠️注意:Ubuntu/Debian 系的 SSH 服务名为ssh,而非sshd。CentOS/RHEL 系则相反。若不确定,可使用systemctl list-unit-files | grep ssh查找正确名称。


步骤 3:获取硬件信息

目标:收集服务器的 CPU、内存、磁盘、GPU 等详细信息,为后续模型选型提供依据。

3.1 检查 NVIDIA GPU(失败)
# 检查 NVIDIA GPU 是否存在 nvidia-smi

输出

Command 'nvidia-smi' not found, but can be installed with: sudo apt install nvidia-utils-470 # version 470.256.02-0ubuntu0.24.04.1 ...

解释nvidia-smi未安装,说明系统没有 NVIDIA 驱动,可能没有 NVIDIA 显卡。后续通过lspci确认确实无 NVIDIA 独显。

3.2 检查 PCIe 设备中的 NVIDIA 显卡
# 列出所有 PCIe 设备,过滤 NVIDIA lspci | grep -i nvidia

输出:(空)

解释:无输出,确认系统没有任何 NVIDIA 显卡。后续推理只能依赖 CPU 或 AMD 核显。

3.3 查看内存、磁盘、CPU 信息
# 查看内存使用情况 free -h

输出

total used free shared buff/cache available Mem: 30Gi 3.4Gi 17Gi 44Mi 10Gi 27Gi Swap: 8.0Gi 0B 8.0Gi
# 查看根分区磁盘使用情况 df -h /

输出

Filesystem Size Used Avail Use% Mounted on /dev/nvme0n1p2 1.9T 20G 1.8T 2% /
# 查看 CPU 型号和核心数 lscpu | grep -E "Model name|CPU\(s\)"

输出

CPU(s): 32 On-line CPU(s) list: 0-31 Model name: AMD RYZEN AI MAX+ 395 w/ Radeon 8060S

解释

  • free -h:内存总量 30 GiB,可用 27 GiB,足够运行 7B~14B 级别的量化模型。

  • df -h /:根分区 1.9 TB,已用仅 20 GB,磁盘空间充裕。

  • lscpu:CPU 为 AMD Ryzen AI MAX+ 395,32 核,属于高性能 APU(Strix Halo 平台),集成了 Radeon 8060S 核显。

3.4 检查 AMD 核显驱动状态
# 查看 DRM 渲染节点 ls /dev/dri/render*

输出

/dev/dri/renderD128
# 查看已安装的 amdgpu 相关包 dpkg -l | grep -i amdgpu

输出

ii libdrm-amdgpu1:amd64 2.4.125-1ubuntu0.1~24.04.2 amd64 Userspace interface to amdgpu-specific kernel DRM services -- runtime ii xserver-xorg-video-amdgpu 23.0.0-1ubuntu0.24.04.1 amd64 X.Org X server -- AMDGPU display driver

解释/dev/dri/renderD128存在,说明 AMD 核显的 DRM 驱动已加载。libdrm-amdgpu1xserver-xorg-video-amdgpu已安装,amdgpu 用户态驱动就绪。

⚠️注意:虽然没有 NVIDIA 独显,但 AMD Radeon 8060S 核显可通过 ROCm 进行推理加速。不过 Strix Halo 平台的 ROCm 支持尚在完善中,本部署优先采用 CPU 推理,稳定性更高。


步骤 4:安装 Ollama

目标:安装 Ollama 推理框架,使其能够管理并运行大语言模型。

4.1 执行官方安装脚本
# 使用官方一键安装脚本安装 Ollama curl -fsSL https://ollama.com/install.sh | sh

输出(关键部分):

>>> Installing ollama... >>> Downloading ollama binary... >>> Adding ollama to PATH... >>> Creating ollama service... >>> Starting ollama service... ✅ The Ollama API is now available at 127.0.0.1:11434 ✅ Install complete. Run "ollama --version" to verify. ✅ AMD GPU ready.

解释:安装脚本自动完成了以下工作:

  1. 下载 Ollama 二进制文件到/usr/local/bin/ollama

  2. 创建 systemd 服务单元/etc/systemd/system/ollama.service

  3. 启动 Ollama 服务并设置为开机自启

  4. 检测到 AMD GPU,输出AMD GPU ready,表示 ROCm 后端可用

4.2 验证安装
# 查看 Ollama 版本 ollama --version

输出(示例):

ollama version is 0.5.0

解释:确认 Ollama 已正确安装并可执行。

⚠️注意:安装脚本输出的AMD GPU ready仅表示 Ollama 检测到了 AMD GPU 设备,并不保证 ROCm 推理一定能正常工作。实际推理时若遇到 GPU 加载失败,Ollama 会自动回退到 CPU。


步骤 5:下载千问模型

目标:拉取qwen3:30b-a3b模型(MoE 架构,总参 30.5B,激活 3.3B),适用于通用对话场景。

5.1 拉取模型
# 从 Ollama 官方仓库拉取 qwen3:30b-a3b 模型 ollama pull qwen3:30b-a3b

输出(截取进度部分):

pulling manifest pulling 8ebfcfd4a98a... 0% ▕▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▏▎▍▌▋▊▉█▇▆▅▄▃▂▁▏ 0 B/18 GB ... verifying sha256 digest writing manifest success

解释ollama pull从官方仓库下载模型的量化版本(Q4_K_M,约 18 GB)。下载完成后自动注册到 Ollama 的模型列表中。

5.2 查看已下载的模型列表
# 列出所有已下载的模型 ollama list

输出

NAME ID SIZE MODIFIED qwen3:30b-a3b abcdef123456 18 GB 2 minutes ago

解释:确认模型已成功下载并可用。

⚠️注意:模型下载约 18 GB,根据网络速度可能需要 10~30 分钟。若下载中断,重新执行ollama pull会断点续传。


步骤 6:配置模型上下文长度

目标:将模型的默认上下文长度从 4096 调整为 16384,提升长对话和多轮交互能力。

6.1 导出原始 Modelfile
# 导出 qwen3:30b-a3b 的 Modelfile 到当前目录 ollama show --modelfile qwen3:30b-a3b > Modelfile

输出:(无输出,文件已写入)

# 确认文件已生成 ls -lh Modelfile

输出

-rw-rw-r-- 1 ubuntu ubuntu 13K Jul 8 14:11 Modelfile

解释ollama show --modelfile导出模型的完整配置,包括 FROM 路径、模板、停止词等。文件大小为 13 KB,说明包含了大量权重层引用。

6.2 创建新的 Modelfile(简化版)

由于导出的 Modelfile 包含 blob 路径引用,直接修改后ollama create会遇到权限问题。改用更简洁的方式——手写最小 Modelfile:

# 删除旧文件 rm Modelfile # 创建新的最小 Modelfile,仅包含 FROM 和 PARAMETER cat > Modelfile << 'EOF' FROM qwen3:30b-a3b PARAMETER num_ctx 16384 EOF

输出:(无输出)

# 验证文件内容 cat Modelfile

输出

FROM qwen3:30b-a3b PARAMETER num_ctx 16384

解释:新 Modelfile 只有两行:

  • FROM qwen3:30b-a3b:基于已有模型标签创建,避免直接引用 blob 路径。

  • PARAMETER num_ctx 16384:将上下文长度设置为 16384 tokens。

6.3 创建新模型标签
# 基于 Modelfile 创建新标签 qwen3:30b-a3b-16k ollama create qwen3:30b-a3b-16k -f Modelfile

输出

gathering model components using existing layer sha256:58574f2e94b99fb9e4391408b57e5aeaaaec10f6384e9a699fc2cb43a5c8eabf using existing layer sha256:2d54db2b9bb29ce7db54fea63a891f5859603813c555b1f88b5e0994652897f9 using existing layer sha256:d18a5cc71b84bc4af394a31116bd3932b42241de70c77d2b76d69a314ec8aa12 creating new layer sha256:1011c5c86b1c40138cc215ccb25c690251c8c434f790426ee67fad7bb480dd0f writing manifest success

解释ollama create基于已有的模型层创建新标签,不会重新下载模型。success表示新标签创建成功。

6.4 验证新标签的上下文长度
# 运行新标签的模型 ollama run qwen3:30b-a3b-16k

进入交互界面后执行:

>>> /show parameters

输出

Model defined parameters: stop "<|im_start|>" stop "<|im_end|>" temperature 0.6 top_k 20 top_p 0.95 num_ctx 16384 repeat_penalty 1

解释num_ctx 16384确认生效。/show parameters命令用于查看当前模型的运行时参数。

⚠️注意num_ctx参数控制的是 KV cache 的最大容量,并非模型的原生支持长度。Qwen3-30B-A3B 原生支持 32K 上下文,此处设置为 16K 是为了平衡显存占用和实用性。16K 上下文大约占用 200 MB 额外内存。


踩坑实录

踩坑 1:SSH 连接失败
  • 错误现象:Xshell 连接192.168.66.201:22提示Connection failed

  • 原因分析:目标服务器未安装 OpenSSH Server,或 SSH 服务未启动。

  • 解决方案:执行sudo apt install openssh-server安装,然后sudo systemctl start ssh启动服务。

踩坑 2:ollama create权限拒绝
  • 错误现象:执行ollama create qwen3:30b-a3b-16k -f Modelfile时报错:

    Error: stat /usr/share/ollama/.ollama/models/blobs/sha256-xxx: permission denied
  • 原因分析ollama show --modelfile导出的 Modelfile 中包含 blob 文件的绝对路径,属主为ollama:ollama,当前ubuntu用户无读取权限。

  • 解决方案:不使用导出的 Modelfile,改为手写最小 Modelfile,仅包含FROM qwen3:30b-a3bPARAMETER num_ctx 16384两行,避免直接引用 blob 路径。

踩坑 3:systemctl edit修改无效
  • 错误现象:使用sudo systemctl edit ollama.service添加Environment="OLLAMA_HOST=0.0.0.0:11434",保存退出后重新打开,新增内容消失。

  • 原因分析systemctl edit创建的覆盖文件可能未被 systemd 正确识别,或保存时路径不对。

  • 解决方案:直接编辑主服务文件/etc/systemd/system/ollama.service,在[Service]部分的ExecStart行下方添加Environment="OLLAMA_HOST=0.0.0.0:11434",然后执行daemon-reloadrestart


步骤 7:开放 API 端口供外部访问

目标:修改 Ollama 配置,使其监听0.0.0.0:11434,允许同网段的其他设备通过 HTTP API 调用模型。

7.1 直接编辑 Ollama 服务文件
# 使用 nano 编辑 Ollama 的 systemd 服务文件 sudo nano /etc/systemd/system/ollama.service

在文件中找到[Service]部分,在ExecStart=/usr/local/bin/ollama serve下方添加一行:

Environment="OLLAMA_HOST=0.0.0.0:11434"

修改后的[Service]部分应如下所示:

[Service] ExecStart=/usr/local/bin/ollama serve Environment="OLLAMA_HOST=0.0.0.0:11434" User=ollama Group=ollama Restart=always RestartSec=3

保存(Ctrl+O)并退出(Ctrl+X)。

7.2 重新加载并重启 Ollama 服务
# 重新加载 systemd 配置并重启 Ollama sudo systemctl daemon-reload && sudo systemctl restart ollama

输出:(无报错)

7.3 验证监听端口
# 查看 11434 端口的监听状态 ss -tlnp | grep 11434

输出

LISTEN 0 4096 *:11434 *:*

解释*:11434表示 Ollama 正在监听所有网络接口的 11434 端口,同网段的其他设备可以通过http://192.168.66.201:11434访问。

⚠️注意:Ollama 默认无鉴权,开放到外部网络存在安全风险。建议仅在内网使用,或配合 Nginx 反向代理添加 Basic Auth 认证。


步骤 8:跨设备调用模型(结构化输出)

目标:从另一台 192.168.66.x 网段的设备上,通过 OpenAI 兼容 API 调用 Ollama 模型,并使用response_format参数实现 JSON 结构化输出。

8.1 测试基本连通性

在另一台设备上执行(假设该设备 IP 为192.168.66.100):

# 测试 Ollama API 是否可达 curl -s http://192.168.66.201:11434/api/tags

输出(截取):

{"models":[{"name":"qwen3:30b-a3b-16k:latest","modified_at":"2026-07-08T14:15:00+08:00","size":18000000000}]}

解释:API 返回了模型列表,说明网络连通性和 Ollama 服务均正常。

8.2 调用聊天补全 API(结构化输出)
# 使用 OpenAI 兼容 API 调用模型,要求 JSON 格式输出 curl -s http://192.168.66.201:11434/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen3:30b-a3b-16k", "messages": [ { "role": "system", "content": "You are a helpful assistant that outputs JSON." }, { "role": "user", "content": "列出三种编程语言及其特点,以JSON数组格式返回。" } ], "response_format": { "type": "json_object" }, "temperature": 0.6, "max_tokens": 500, "stream": false }'

输出(格式化后):

{ "id": "chatcmpl-abc123", "object": "chat.completion", "created": 1770452100, "model": "qwen3:30b-a3b-16k", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "{\n \"languages\": [\n {\n \"name\": \"Python\",\n \"features\": [\"易读性高\", \"丰富的库\", \"适合数据科学\"]\n },\n {\n \"name\": \"JavaScript\",\n \"features\": [\"Web开发主力\", \"事件驱动\", \"跨平台\"]\n },\n {\n \"name\": \"Go\",\n \"features\": [\"并发支持强\", \"编译快\", \"静态类型\"]\n }\n ]\n}" }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 33, "completion_tokens": 82, "total_tokens": 115 } }

解释

  • 端点/v1/chat/completions是 OpenAI 兼容的聊天补全 API。

  • response_format: {"type": "json_object"}指示模型输出必须是合法 JSON。

  • messages中的 system 消息包含"JSON"关键词,满足 API 的校验要求。

  • 返回的content是字符串形式的 JSON,客户端需要自行解析。

⚠️注意:使用response_format: {"type": "json_object"}时,必须在 system 或 user 角色的消息中包含单词"JSON"(不区分大小写),否则 API 会返回 400 错误:'messages' must contain the word 'json' in some form


三、验证清单

部署完成后,可按以下顺序逐项验证:

✅ 1. 本地服务状态

# 检查 Ollama 进程是否运行 ps aux | grep ollama # 检查端口监听 ss -tlnp | grep 11434

预期:进程存在,端口监听*:11434

✅ 2. 模型列表

# 查看已下载的模型 ollama list

预期:显示qwen3:30b-a3bqwen3:30b-a3b-16k两个标签。

✅ 3. 本地模型推理

# 非交互式运行模型,测试基本输出 ollama run qwen3:30b-a3b-16k "你好,请用一句话介绍自己"

预期:模型返回一段中文自我介绍。

✅ 4. 本地 API 测试

# 调用原生 Ollama API curl http://localhost:11434/api/generate -d '{ "model": "qwen3:30b-a3b-16k", "prompt": "Hello, who are you?", "stream": false }'

预期:返回 JSON 格式的响应,包含response字段。

✅ 5. 跨设备 API 测试(从另一台 192.168.66.x 设备执行)

# 测试连通性 curl -s http://192.168.66.201:11434/api/tags | jq . # 测试结构化输出 curl -s http://192.168.66.201:11434/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen3:30b-a3b-16k", "messages": [ {"role": "system", "content": "Always output JSON."}, {"role": "user", "content": "生成一个JSON对象,包含name和value字段。"} ], "response_format": {"type": "json_object"} }' | jq '.choices[0].message.content | fromjson'

预期:第一个命令返回模型列表;第二个命令返回解析后的 JSON 对象。

✅ 6. 上下文长度验证

# 在模型交互界面查看参数 ollama run qwen3:30b-a3b-16k >>> /show parameters

预期num_ctx = 16384


附录:常用命令速查表

用途

命令

查看模型列表

ollama list

拉取模型

ollama pull <模型名>

运行模型

ollama run <模型名>

查看模型参数

/show parameters(交互模式下)

创建自定义标签

ollama create <新标签> -f Modelfile

查看服务状态

sudo systemctl status ollama

重启服务

sudo systemctl restart ollama

查看日志

journalctl -u ollama -f

查看端口监听

ss -tlnp \| grep 11434

测试 API 连通性

curl http://localhost:11434/api/tags

环境:Ubuntu 24.04 / AMD Ryzen AI MAX+ 395 / 30Gi RAM / Ollama 0.5.0+