Ollama 部署与模型加载实战记录
一、前置信息
1.1 操作系统与环境
项目 | 值 |
|---|---|
操作系统 | Ubuntu 24.04 LTS |
内核架构 |
|
主机名 |
|
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 |
|
目标网段 |
|
SSH 端口 | 22(默认) |
1.4 软件栈
软件 | 版本/说明 |
|---|---|
Ollama | 最新版(通过官方安装脚本安装) |
模型 |
|
推理后端 | 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-amdgpu1和xserver-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.解释:安装脚本自动完成了以下工作:
下载 Ollama 二进制文件到
/usr/local/bin/ollama创建 systemd 服务单元
/etc/systemd/system/ollama.service启动 Ollama 服务并设置为开机自启
检测到 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-a3b和PARAMETER 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-reload和restart。
步骤 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-a3b和qwen3: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。
附录:常用命令速查表
用途 | 命令 |
|---|---|
查看模型列表 |
|
拉取模型 |
|
运行模型 |
|
查看模型参数 |
|
创建自定义标签 |
|
查看服务状态 |
|
重启服务 |
|
查看日志 |
|
查看端口监听 |
|
测试 API 连通性 |
|
环境:Ubuntu 24.04 / AMD Ryzen AI MAX+ 395 / 30Gi RAM / Ollama 0.5.0+