海光服务器调用LLM(Chat)模型及Docker、docker-compose文件编写

相关网站

ModelScope

ModelScope 魔搭社区

海光开发者社区

光源-光合开发者社区

常用命名速查

查看驱动是否安装

1
lsmod | grep hycu

查看显卡型号

1
clinfo | grep -A 2 "Device Type"

可以看到Board name

1
2
3
Device Type:                                   CL_DEVICE_TYPE_GPU
Vendor ID: 1d94h
Board name: K100_AI

GPU使用情况

功能类似于 NVIDIA 的 nvidia-smi 或 AMD 的 rocm-smi,用于监控和管理海光 GPU 的状态。

输入

1
hy-smi

查看剩余显存

1
hy-smi --showmemavailable

显示总显存和已用显存

1
hy-smi --showmeminfo vram

查看是否有进程在使用 GPU

1
hy-smi --showpids

查看显存是否启用 ECC(关键用于稳定性)

1
hy-smi --showmemeccinfo

准备工作

环境测试代码

验证 PyTorch 是否识别海光 GPU

/data/aitest/cuda_test.py

1
2
3
4
5
import torch
print(torch.__version__)
print(torch.cuda.is_available())
print(torch.cuda.device_count())
print(torch.cuda.get_device_name(0))

注意:

在 ROCm 中,torch.cuda 接口仍然可用(AMD/海光做了 CUDA API 兼容层),所以代码无需修改。

代码路径为

1
/data/aitest

下载模型

下载模型

1
modelscope download --model Qwen/Qwen3-8B

模型下载位置为

1
/data/tools/modelscope

步骤

VLLM镜像启动

下载vllm镜像

1
docker pull image.sourcefind.cn:5000/dcu/admin/base/vllm:0.8.5-ubuntu22.04-dtk25.04.1-rc5-das1.6-py3.10-20250724

运行容器

我这里下载镜像的 IMAGE ID是efc1a5d819c4

1
docker run -it --shm-size 64g --network=host --name vllm_085 --privileged --device=/dev/kfd --device=/dev/dri --device=/dev/mkfd --group-add video --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -u root -v /opt/hyhal/:/opt/hyhal/:ro -v /data/tools/modelscope/:/data/tools/modelscope/ -v /data/aitest/:/data/aitest/ efc1a5d819c4 bash

参数说明:

  • -it:以交互模式运行容器,并分配一个伪终端(TTY)。
  • --shm-size 64g:将容器的共享内存(/dev/shm)大小设为 64GB,供 vLLM 等大模型推理使用。
  • --network=host:让容器直接使用宿主机的网络命名空间(端口无需映射)。
  • --name vllm_085:给容器指定名称为 vllm_085
  • --privileged:赋予容器几乎全部系统权限(用于访问硬件设备,但有安全风险)。
  • --device=/dev/kfd:将海光/AMD 的 KFD(Kernel Fusion Driver)计算设备挂载进容器。
  • --device=/dev/dri:挂载 DRI 图形/计算设备节点,用于 GPU/DCU 访问。
  • --device=/dev/mkfd:挂载海光特有的多卡管理设备(如 Multi-KFD)。
  • --group-add video:将容器内用户加入 video 用户组,获得设备访问权限。
  • --cap-add=SYS_PTRACE:授予容器进程跟踪(ptrace)能力,用于调试或性能分析。
  • --security-opt seccomp=unconfined:禁用 seccomp 安全限制,避免 DCU 驱动调用被拦截。
  • -u root:以 root 用户身份在容器内运行。
  • -v /opt/hyhal/:/opt/hyhal/:ro:将宿主机的海光 HAL 驱动库以只读方式挂载到容器内。
  • -v /data/tools/modelscope/:/data/tools/modelscope/:挂载 ModelScope 模型缓存目录,供容器内使用。
  • -v /data/aitest/:/data/aitest/:挂载自定义测试数据或代码目录。
  • efc1a5d819c4:要运行的 Docker 镜像 ID(或可替换为完整镜像名)。
  • bash:容器启动后执行的命令(进入 bash shell)。

如果已经运行可以这样进入

1
docker exec -it vllm_085 bash

vLLM运行模型

容器启动后运行测试代码

1
2
cd /data/aitest
python cuda_test.py

这里显示

1
2
3
4
2.4.1
True
8
K100_AI

安装依赖

1
pip install transformers==4.51.3

运行

/data/aitest/start_qwen3_8b.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 设置容器内可见的设备
export HIP_VISIBLE_DEVICES=0,1
export ALLREDUCE_STREAM_WITH_COMPUTE=1

vllm serve \
/data/tools/modelscope/models/Qwen/Qwen3-8B \
--served-model-name Qwen/Qwen3-8B \
--host 0.0.0.0 \
--port 8000 \
--trust-remote-code \
--dtype bfloat16 \
--tensor-parallel-size 2 \
--gpu-memory-utilization 0.25 \
--max-model-len 32768 \
--override-generation-config '{"temperature": 0.7, "top_p":0.8, "top_k":20, "repetition_penalty": 1.05}' \
--enable-chunked-prefill

设置可执行

1
chmod +x /data/aitest/start_qwen3_8b.sh

运行

1
sh /data/aitest/start_qwen3_8b.sh

参数解释

  • /data/tools/modelscope/models/Qwen/Qwen3-8B:本地模型文件路径。

  • --served-model-name Qwen/Qwen3-8B:设置 API 调用时使用的模型名称,如果不指定会使用上面的本地模型路径。

  • --trust-remote-code:允许加载模型自带的自定义 Python 代码(如 Qwen 的 tokenizer)。

  • --dtype bfloat16:使用 bfloat16 精度运行模型,节省显存并保持数值稳定性。

  • --tensor-parallel-size 2:使用 2 张 GPU/DCU 运行模型。

    这个值必须<=HIP_VISIBLE_DEVICES设置的设备。

    主要作用是高并发请求和扩大可用显存,并不能提升单次回复速度。

  • --gpu-memory-utilization 0.85:最多使用 85% 的显存,避免 OOM。 注意对于小模型又使用多卡,这个值不要太高,他会直接占用85左右的显存。

  • --max-model-len 32768:支持的最大上下文长度为 32768 个 token。

  • --enable-chunked-prefill:启用分块预填充,提升长文本和高并发下的吞吐性能。

--override-generation-config

1
2
3
4
5
6
{
"temperature": 0.7, // 控制随机性(越高越随机)
"top_p": 0.8, // nucleus sampling,累积概率截断
"top_k": 20, // 仅考虑 top-20 个 token
"repetition_penalty": 1.05 // 抑制重复(>1.0 抑制,<1.0 鼓励)
}

调用

查看模型列表

1
curl http://localhost:8000/v1/models

测试

1
2
3
4
5
6
7
8
9
10
11
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3-8B",
"messages": [
{
"role": "user",
"content": "你好"
}
]
}'

禁用思考

1
2
3
4
5
6
7
8
9
10
11
12
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3-8B",
"messages": [
{
"role": "user",
"content": "你好"
}
],
"chat_template_kwargs": {"enable_thinking": false}
}'

Docker

Dockerfile

/data/aitest/Dockerfile

1
2
3
4
5
FROM image.sourcefind.cn:5000/dcu/admin/base/vllm:0.8.5-ubuntu22.04-dtk25.04.1-rc5-das1.6-py3.10-20250724

RUN pip install transformers==4.51.3

EXPOSE 8000

Docker Compose

/data/aitest/docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: '3.8'

services:
vllm_085:
build:
context: ./
dockerfile: Dockerfile
image: vllm_085
container_name: qwen3_8b
privileged: true
network_mode: host
user: root
shm_size: '64g'
cap_add:
- SYS_PTRACE
security_opt:
- seccomp:unconfined
group_add:
- video
devices:
- /dev/kfd
- /dev/dri
- /dev/mkfd
volumes:
- /opt/hyhal/:/opt/hyhal/:ro
- /data/tools/modelscope/:/data/tools/modelscope/
- /data/aitest/:/data/aitest/
command: /data/aitest/start_qwen3_8b.sh

启动

1
docker-compose up -d

停止并删除

1
docker-compose down

判断是否在容器内

执行

1
systemd-detect-virt
  • 容器内可能返回:dockerpodmanlxcprivate-users
  • 宿主机通常返回:nonekvm/vmware(如果是虚拟机)

安装(如未安装):

1
2
apt-get install -y systemd-container  # Debian/Ubuntu
yum install -y systemd # CentOS/RHEL