一、前置信息

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+

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐