海光GPU上部署VLM模型Qwen2.5-VL-32B-Instruct

前言

相关网站

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

下载模型

Qwen2.5-VL-32B-Instruct

千问2.5-VL-32B-Instruct · 模型库

下载模型

1
modelscope download --model Qwen/Qwen2.5-VL-32B-Instruct

模型下载位置为

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

查看容器内是否有所需依赖

1
2
3
4
5
pip list | grep transformers
pip list | grep accelerate

# 或者
pip list | grep -E 'transformers|accelerate'

这里是都安装了

1
2
accelerate                               1.9.0
transformers 4.51.1

安装依赖

安装modelscope

安装

1
pip install modelscope

环境变量

创建目录

1
2
mkdir -p /data/tools/modelscope
chmod 755 /data/tools/modelscope

添加环境变量

添加

1
echo 'export MODELSCOPE_CACHE="/data/tools/modelscope"' >> ~/.bashrc

重新加载配置

1
source ~/.bashrc

验证

1
2
echo $MODELSCOPE_CACHE
# 输出应为:/data/tools/modelscope

查看

1
vim ~/.bashrc

安装图片处理工具包

它可以更方便地处理各种类型的视觉输入,就像使用API一样。这包括base64、URL以及混合的图片和视频。

您可以使用以下命令安装它:

1
pip install qwen-vl-utils[decord]==0.0.8

运行模型

/data/aitest/run_qwen_vl.py

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
from modelscope import Qwen2_5_VLForConditionalGeneration, AutoTokenizer, AutoProcessor
from qwen_vl_utils import process_vision_info

# default: Load the model on the available device(s)
model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
"Qwen/Qwen2.5-VL-32B-Instruct", torch_dtype="auto", device_map="auto"
)

# We recommend enabling flash_attention_2 for better acceleration and memory saving, especially in multi-image and video scenarios.
# model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
# "Qwen/Qwen2.5-VL-32B-Instruct",
# torch_dtype=torch.bfloat16,
# attn_implementation="flash_attention_2",
# device_map="auto",
# )

# default processer
processor = AutoProcessor.from_pretrained("Qwen/Qwen2.5-VL-32B-Instruct")

# The default range for the number of visual tokens per image in the model is 4-16384.
# You can set min_pixels and max_pixels according to your needs, such as a token range of 256-1280, to balance performance and cost.
# min_pixels = 256*28*28
# max_pixels = 1280*28*28
# processor = AutoProcessor.from_pretrained("Qwen/Qwen2.5-VL-32B-Instruct", min_pixels=min_pixels, max_pixels=max_pixels)

messages = [
{
"role": "user",
"content": [
{
"type": "image",
"image": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg",
},
{"type": "text", "text": "描述该图片."},
],
}
]

# Preparation for inference
text = processor.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True
)
image_inputs, video_inputs = process_vision_info(messages)
inputs = processor(
text=[text],
images=image_inputs,
videos=video_inputs,
padding=True,
return_tensors="pt",
)
inputs = inputs.to("cuda")

# Inference: Generation of the output
generated_ids = model.generate(**inputs, max_new_tokens=128)
generated_ids_trimmed = [
out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]
output_text = processor.batch_decode(
generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
print(output_text)

运行

1
2
cd /data/aitest
python ./run_qwen_vl.py

Docker

Dockerfile

/data/aitest/Dockerfile

1
2
3
4
5
6
7
8
9
10
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 modelscope
RUN echo 'export MODELSCOPE_CACHE="/data/tools/modelscope"' >> ~/.bashrc
RUN source ~/.bashrc

RUN pip install qwen-vl-utils[decord]==0.0.8

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_qwen25vl:
build:
context: ./
dockerfile: Dockerfile
image: vllm_085_qwen25vl
container_name: vllm_085_qwen25vl_c
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/run_qwen_vl.py

启动

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