🧑 博主简介CSDN博客专家「历代文学网」(PC端可以访问:https://lidaiwenxue.com/#/?__c=1000)总架构师,首席架构师,也是联合创始人!16年工作经验,精通Java编程高并发设计分布式系统架构设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
🤝商务合作:请搜索或扫码关注微信公众号 “ 心海云图

在这里插入图片描述


在这里插入图片描述

GLM-4-9B-Chat-1M 模型在 openEuler 系统上的完整部署文档

文档说明

本文档记录了在 华为 openEuler 操作系统上,使用 llama.cpp 框架纯 CPU 推理部署 GLM-4-9B-Chat-1M 模型的完整流程。

部署环境

  • 操作系统:华为 openEuler(最新版本)
  • CPU:48 核心
  • 内存:112 GB(虚拟机分配)
  • 磁盘:320 GB(/data 目录)
  • GPU:无(纯 CPU 推理)

目录

  1. 环境准备
  2. 下载 GGUF 模型文件
  3. 编译 llama.cpp
  4. 启动 API 服务
  5. 验证服务
  6. 后台运行配置
  7. Java 程序调用示例
  8. 常见问题排查

1. 环境准备

1.1 更新系统并安装基础依赖

# 更新系统包
sudo yum update -y

# 安装编译工具链和依赖
sudo yum groupinstall -y "Development Tools"
sudo yum install -y cmake git python3 python3-pip gcc gcc-c++

1.2 创建工作目录

所有文件统一存放在 /data 目录下:

mkdir -p /data/models
mkdir -p /data/llama.cpp
cd /data

1.3 安装 Python 依赖

pip3 install huggingface-hub

注意:如果出现 WARNING: Running pip as the 'root' user 警告,可以忽略,不影响使用。huggingface-cli 已被弃用,后续使用 hf 命令替代。


2. 下载 GGUF 模型文件

2.1 配置国内镜像源(解决网络问题)

由于 Hugging Face 服务器在海外,下载可能超时,需配置国内镜像源:

# 临时使用(推荐)
export HF_ENDPOINT=https://hf-mirror.com

# 永久生效(可选)
echo 'export HF_ENDPOINT=https://hf-mirror.com' >> ~/.bashrc
source ~/.bashrc

2.2 下载模型

进入模型目录并下载 Q5_K_M 量化版本(约 6.8GB):

cd /data/models

hf download bartowski/glm-4-9b-chat-1m-GGUF \
    --include "glm-4-9b-chat-1m-Q5_K_M.gguf" \
    --local-dir ./

2.3 验证下载

ls -lh /data/models/glm-4-9b-chat-1m-Q5_K_M.gguf

预期输出:

-rw-r--r--. 1 root root 6.8G  7月11日 16:04 /data/models/glm-4-9b-chat-1m-Q5_K_M.gguf

说明Q5_K_M 是量化级别,在精度和性能间取得良好平衡。如果内存充裕,可改用 Q6_KQ8_0 版本。


3. 编译 llama.cpp

3.1 克隆代码仓库

cd /data
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp

如果 git clone 速度慢或失败,可使用代理:

git clone https://gitclone.com/github.com/ggerganov/llama.cpp.git

3.2 使用 CMake 编译

llama.cpp 已弃用传统 make,改用 CMake:

# 配置 CMake 构建系统
cmake -B build -DCMAKE_BUILD_TYPE=Release

# 编译(利用48核并行加速)
cmake --build build --config Release -j 48

3.3 验证编译结果

ls -la /data/llama.cpp/build/bin/ | grep llama-server

预期输出应包含 llama-server 可执行文件。

重要:可执行文件名为 llama-server,而非 server


4. 启动 API 服务

4.1 前台启动(测试用)

cd /data/llama.cpp
./build/bin/llama-server -m /data/models/glm-4-9b-chat-1m-Q5_K_M.gguf \
    -t 32 \
    -c 0 \
    --host 0.0.0.0

参数说明

参数 说明
-m 模型文件路径
-t 32 推理线程数(建议设为物理核心数的 60%~75%)
-c 0 不限制上下文长度(支持 1M)
--host 0.0.0.0 允许外部 IP 访问

启动成功后,看到 HTTP server listening on http://0.0.0.0:8080 即表示服务就绪。

4.2 后台启动(生产环境)

前台启动无法退出终端,需使用 nohup 后台运行:

nohup /data/llama.cpp/build/bin/llama-server \
    -m /data/models/glm-4-9b-chat-1m-Q5_K_M.gguf \
    -t 32 \
    -c 0 \
    --host 0.0.0.0 \
    > /data/llama.log 2>&1 &

说明

  • nohup:忽略挂断信号,终端关闭不影响进程
  • > /data/llama.log 2>&1:将标准输出和错误输出重定向到日志文件
  • &:放到后台执行

5. 验证服务

5.1 检查健康状态

curl http://localhost:8080/health

预期返回:ok

5.2 测试聊天接口

curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "glm-4-9b-chat-1m",
    "messages": [{"role": "user", "content": "你好,请用一句话介绍自己"}]
  }'

预期返回 JSON 格式的模型回复。

5.3 查看实时日志

tail -f /data/llama.log

Ctrl + C 退出日志查看(不影响服务运行)。


6. 后台运行配置

6.1 使用 systemd 服务(推荐,支持开机自启)

创建服务文件:

sudo vi /etc/systemd/system/glm-server.service

写入以下内容:

[Unit]
Description=GLM-4-9B-Chat-1M API Server
After=network.target

[Service]
Type=simple
WorkingDirectory=/data/llama.cpp
ExecStart=/data/llama.cpp/build/bin/llama-server -m /data/models/glm-4-9b-chat-1m-Q5_K_M.gguf -t 32 -c 0 --host 0.0.0.0
Restart=always
RestartSec=10
User=root

[Install]
WantedBy=multi-user.target

启动并设置开机自启:

sudo systemctl daemon-reload
sudo systemctl start glm-server
sudo systemctl enable glm-server

管理命令:

sudo systemctl status glm-server   # 查看状态
sudo systemctl stop glm-server     # 停止服务
sudo systemctl restart glm-server  # 重启服务
sudo journalctl -u glm-server -f   # 查看实时日志

6.2 使用 nohup(备选)

# 启动
nohup /data/llama.cpp/build/bin/llama-server -m /data/models/glm-4-9b-chat-1m-Q5_K_M.gguf -t 32 -c 0 --host 0.0.0.0 > /data/llama.log 2>&1 &

# 停止(查找进程并杀掉)
ps aux | grep llama-server | grep -v grep
kill <PID>

7. Java 程序调用示例

7.1 添加 Maven 依赖

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.12.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

7.2 Java 调用代码

import okhttp3.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.IOException;

public class LlamaClient {

    // 服务地址(根据实际情况修改 IP 和端口)
    private static final String BASE_URL = "http://你的服务器IP:8080";
    private static final String API_URL = BASE_URL + "/v1/chat/completions";

    private final OkHttpClient client = new OkHttpClient();
    private final ObjectMapper mapper = new ObjectMapper();

    public String chat(String userMessage) throws IOException {
        // 1. 构建请求体(OpenAI 兼容格式)
        ObjectNode messageNode = mapper.createObjectNode();
        messageNode.put("role", "user");
        messageNode.put("content", userMessage);

        ObjectNode requestBody = mapper.createObjectNode();
        requestBody.put("model", "glm-4-9b-chat-1m");
        requestBody.set("messages", mapper.createArrayNode().add(messageNode));
        requestBody.put("stream", false);

        // 2. 创建 HTTP 请求(无需 API Key)
        Request request = new Request.Builder()
                .url(API_URL)
                .post(RequestBody.create(
                        mapper.writeValueAsString(requestBody),
                        MediaType.parse("application/json; charset=utf-8")
                ))
                .build();

        // 3. 执行请求
        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                throw new IOException("请求失败: " + response.code());
            }
            return response.body().string();
        }
    }

    public static void main(String[] args) throws IOException {
        LlamaClient client = new LlamaClient();
        String reply = client.chat("请用中文简单介绍一下李白。");
        System.out.println(reply);
    }
}

7.3 重要说明

  • 无需 API Keyllama.cpp 默认不启用身份验证,直接调用即可
  • 如需启用 API Key,启动服务时加 --api-key your-secret-key 参数
  • 服务地址中的 IP 需替换为实际服务器 IP

8. 常见问题排查

8.1 下载模型卡住/超时

现象hf download 命令长时间无响应,报 Connection timed out

解决方案

export HF_ENDPOINT=https://hf-mirror.com
hf download bartowski/glm-4-9b-chat-1m-GGUF --include "glm-4-9b-chat-1m-Q5_K_M.gguf" --local-dir ./

8.2 make: 没有指明目标并且找不到 makefile

原因llama.cpp 已改用 CMake 构建

解决方案

cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release -j 48

8.3 找不到 server 可执行文件

原因:可执行文件名为 llama-server

解决方案

/data/llama.cpp/build/bin/llama-server   # 正确路径

8.4 端口被占用

现象:启动时报 Address already in use

解决方案

# 查看占用 8080 端口的进程
netstat -tlnp | grep 8080

# 杀掉占用进程,或换用其他端口
./build/bin/llama-server ... --port 8081

8.5 服务启动慢

原因:6.8GB 模型文件加载需要时间

正常等待时间:10~30 秒(取决于磁盘 I/O 速度)

8.6 性能调优

参数 建议值 说明
-t 线程数 28~36 设为物理核心数的 60%~75%
内存预留 100% 在 ESXi 中预留全部 112GB 内存
量化级别 Q5_K_M 平衡性好;内存充裕可换 Q8_0

9. 快速命令参考

操作 命令
启动服务(前台) /data/llama.cpp/build/bin/llama-server -m /data/models/glm-4-9b-chat-1m-Q5_K_M.gguf -t 32 -c 0 --host 0.0.0.0
启动服务(后台) nohup ... > /data/llama.log 2>&1 &
查看日志 tail -f /data/llama.log
健康检查 curl http://localhost:8080/health
测试接口 curl http://localhost:8080/v1/chat/completions -H "Content-Type: application/json" -d '{"model":"glm-4-9b-chat-1m","messages":[{"role":"user","content":"你好"}]}'
systemd 启动 sudo systemctl start glm-server
systemd 状态 sudo systemctl status glm-server

10. 参考资料


文档版本:1.0
创建日期:2026年7月11日
适用系统:华为 openEuler(最新版本)

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐