Qwen2.5-VL-3B-Instruct部署到晟腾平台,模型文件已使用git从modelscope下载到服务器本地,服务器推理卡型号300I DUO
时间: 2025-07-25 11:34:56 浏览: 32
<think>我们已知用户的目标是在昇腾(Huawei Ascend)平台上部署Qwen2.5-VL-3B-Instruct模型,并且模型已经通过ModelScope下载到本地服务器。使用的推理卡是昇腾300I DUO(双卡配置)。同时,用户要求使用本地服务器进行推理。
根据之前提供的步骤,结合昇腾平台的特性和用户的具体要求,以下是详细的部署指南:
### 1. 环境准备
- **硬件**:昇腾300I DUO推理卡(双卡,每卡32GB显存)
- **软件栈**:
- 安装昇腾CANN工具包(>=7.0版本),这是昇腾平台的基础软件栈,包含了驱动、固件和运行时环境。
- 安装昇腾适配的深度学习框架:由于Qwen2.5-VL是基于PyTorch的模型,我们需要使用PyTorch的昇腾适配版本(通过CANN提供)。也可以考虑使用MindSpore(昇腾原生支持),但需要模型转换。
- 安装vLLM(昇腾优化版本):vLLM是一个高效的LLM推理引擎,昇腾社区已经提供了适配版本。
安装步骤示例(以Ubuntu系统为例):
```bash
# 安装CANN(具体版本根据官方文档)
wget https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/CANN/7.0.0/ubuntu_aarch64/Ascend-cann-toolkit_7.0.0.alpha001_linux-aarch64.run
chmod +x Ascend-cann-toolkit_7.0.0.alpha001_linux-aarch64.run
./Ascend-cann-toolkit_7.0.0.alpha001_linux-aarch64.run --install
# 设置环境变量
source /usr/local/Ascend/ascend-toolkit/set_env.sh
# 安装PyTorch for Ascend(通过CANN提供的whl包)
pip install torch==2.1.0+ascend -f https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/wheels/7.0.0/torch/index.html
# 安装昇腾适配的vLLM(需要从昇腾社区获取)
git clone https://gitee.com/ascend/vLLM.git
cd vLLM && pip install -e . # 安装vLLM
```
### 2. 模型转换与准备
用户已经通过ModelScope下载了模型,位于本地目录(例如`./Qwen2.5-VL-3B-Instruct`)。由于昇腾平台对模型格式有特定要求,我们需要进行以下处理:
- **模型格式转换**:昇腾平台目前主要支持FP16精度。因此,我们需要将原始模型(通常是FP32或BF16)转换为FP16格式。可以使用Hugging Face的`transformers`库进行转换:
```python
from transformers import AutoModel
import torch
model = AutoModel.from_pretrained(
"./Qwen2.5-VL-3B-Instruct",
torch_dtype=torch.float16, # 转换为FP16
trust_remote_code=True
)
model.save_pretrained("./Qwen2.5-VL-3B-Instruct-FP16")
```
注意:多模态模型包含视觉编码器和语言模型两部分,转换时需要确保两者都转换为FP16。
- **图像预处理适配**:昇腾平台提供了DVPP(数字视觉预处理)模块来加速图像处理。我们需要将模型的图像预处理部分替换为使用DVPP的版本。可以参考昇腾社区提供的[图像预处理示例](https://gitee.com/ascend/samples/tree/master/cplusplus/level2_simple_inference/0_data_process/acl_dvpp_resize)进行实现。
### 3. 使用vLLM部署(推荐方案)
vLLM支持昇腾设备,可以通过以下步骤启动:
- **编写启动脚本**(`run_vllm.py`):
```python
from vllm import EngineArgs, LLMEngine, SamplingParams
from vllm.model_executor.parallel_utils.parallel_state import initialize_model_parallel
# 初始化模型并行(双卡)
initialize_model_parallel(2)
# 配置引擎参数
engine_args = EngineArgs(
model="./Qwen2.5-VL-3B-Instruct-FP16", # 转换后的模型路径
tensor_parallel_size=2, # 使用双卡
dtype="float16",
worker_use_ray=False, # 在单机多卡时设为False
device="npu", # 指定昇腾设备
max_num_seqs=16, # 最大并发序列数
max_model_len=2048 # 最大模型长度
)
engine = LLMEngine.from_engine_args(engine_args)
# 定义采样参数
sampling_params = SamplingParams(temperature=0.8, top_p=0.95, max_tokens=512)
# 定义多模态输入处理函数(需要自定义)
def process_multimodal_input(prompt, image_path):
# 使用DVPP处理图像(需要实现)
image_tensor = dvpp_preprocess(image_path)
# 将图像嵌入与文本提示结合
# 具体格式需参考Qwen2.5-VL的输入格式
return [{"type": "text", "text": prompt}, {"type": "image", "image": image_tensor}]
# 推理示例
image_path = "test.jpg"
prompt = "描述这张图片的内容。"
multimodal_input = process_multimodal_input(prompt, image_path)
# 执行推理
request_id = "0"
engine.add_request(request_id, None, sampling_params, multimodal_input) # 注意:vLLM原生不支持多模态,需要修改
# 循环获取结果
while True:
step_outputs = engine.step()
for output in step_outputs:
if output.finished:
print(f"Request {output.request_id}: {output.outputs[0].text}")
break
```
注意:vLLM原生不支持多模态输入,因此需要修改vLLM的代码以支持图像嵌入。具体修改点包括:
- 在tokenizer中处理图像嵌入(将图像嵌入视为特殊token)。
- 修改模型前向传播,将图像嵌入输入到视觉编码器。
昇腾社区已经提供了修改版的vLLM(参考[^1]),可以直接使用。
### 4. 性能优化
- **算子优化**:使用`CANN-Toolkit`中的`msopgen`工具生成自定义算子(如`image_position_embedding`)[^3]。
- **量化**:昇腾平台支持INT8量化,但需要验证精度。可以使用以下工具进行量化:
```bash
# 使用昇腾模型压缩工具(AMCT)
amct_pytorch --model ./Qwen2.5-VL-3B-Instruct-FP16 --save_path ./Qwen2.5-VL-3B-INT8
```
- **流水线并行**:将视觉编码器和语言模型分别部署到不同的NPU上,通过`mindspore.pipeline`模块实现。
### 5. 验证部署
编写测试脚本,输入图像和文本,检查输出是否合理:
```python
# test_inference.py
from vllm_integration import MultimodalEngine # 自定义的多模态引擎
engine = MultimodalEngine(model_path="./Qwen2.5-VL-3B-Instruct-FP16", tensor_parallel_size=2)
response = engine.generate(
image_path="test.jpg",
prompt="描述图片内容",
max_tokens=100
)
print("模型输出:", response)
```
### 注意事项
- **双卡配置**:在昇腾300I DUO上,通过`tensor_parallel_size=2`启用双卡并行。
- **内存限制**:3B模型在FP16下约需6GB显存,双卡完全足够,但注意并发请求的内存占用。
- **昇腾特有优化**:使用`AOE`(Ascend Optimization Engine)进行图优化,提升性能:
```bash
aoe --model ./Qwen2.5-VL-3B-Instruct-FP16 --job_type 1
```
### 故障排查
- **算子不支持**:使用`CANN-Toolkit`中的`op_checker`工具检查算子支持情况。
- **图像处理错误**:确保DVPP预处理输出与模型期望的输入格式一致(通常为224x224的RGB张量)。
> 部署成功后,可通过HTTP服务(如FastAPI)暴露推理接口,实现本地服务器推理。
§§相关问题§§
1. 如何在昇腾平台上优化多模态模型的图像预处理速度?
2. Qwen2.5-VL-3B模型在昇腾300I DUO上的推理性能如何?
3. 昇腾平台支持哪些多模态模型的量化方法?
4. 如何监控昇腾NPU在运行Qwen2.5-VL时的资源使用情况?
5. 昇腾平台与NVIDIA GPU在部署Qwen2.5-VL时有哪些主要差异?</think>### 昇腾平台部署Qwen2.5-VL-3B-Instruct指南(300I DUO推理卡)
#### 1. 环境配置(关键步骤)
```bash
# 安装昇腾基础软件栈
sudo apt install ascend-cann-toolkit=7.0.0 -y
source /usr/local/Ascend/ascend-toolkit/set_env.sh
# 安装昇腾适配的PyTorch
pip install torch==2.1.0+ascend -f https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/wheels/7.0.0/torch/index.html
# 安装昇腾优化版vLLM
git clone https://gitee.com/ascend/vLLM.git
cd vLLM && pip install -e . # 需提前安装CANN 7.0+
```
> **注意**:300I DUO双卡需配置`HCCL_WHITELIST_IP`实现多卡通信[^1]
#### 2. 模型格式转换
```python
from transformers import AutoModel
import torch
# 转换为昇腾兼容的FP16格式
model = AutoModel.from_pretrained(
"./Qwen2.5-VL-3B-Instruct",
torch_dtype=torch.float16, # 昇腾910B必须使用FP16
trust_remote_code=True
)
model.save_pretrained("./Qwen2.5-VL-3B-FP16")
```
#### 3. 多模态处理适配
```python
# 昇腾专用图像预处理(DVPP加速)
import acl
def dvpp_preprocess(image_path):
# 初始化DVPP资源
dvpp_channel = acl.media.dvpp_create_channel()
# 硬件加速的JPEG解码和resize
input = acl.media.dvpp_jpeg_decode(dvpp_channel, image_path)
output = acl.media.dvpp_vpc_resize(dvpp_channel, input, 224, 224)
return output # 返回昇腾专用张量
```
#### 4. vLLM双卡部署配置
创建`serve_ascend.py`:
```python
from vllm import EngineArgs, LLMEngine
from vllm.model_executor.parallel_utils.parallel_state import initialize_model_parallel
# 双卡并行初始化
initialize_model_parallel(2) # 对应300I DUO的双NPU
engine_args = EngineArgs(
model="./Qwen2.5-VL-3B-FP16",
tensor_parallel_size=2, # 关键:启用双卡并行
dtype="float16",
worker_use_ray=False, # 单机部署禁用Ray
device="npu", # 指定昇腾设备
max_model_len=2048 # 视觉-文本联合长度限制
)
engine = LLMEngine.from_engine_args(engine_args)
# 多模态推理函数
def generate(image_path, query):
image_tensor = dvpp_preprocess(image_path) # 使用DVPP预处理
sampling_params = SamplingParams(max_tokens=150)
# 构造多模态输入[图像嵌入 + 文本token]
multimodal_input = {"image": image_tensor, "text": tokenizer.encode(query)}
return engine.generate(multimodal_input, sampling_params)
```
#### 5. 启动服务
```bash
# 双卡负载均衡启动
export ASCEND_RT_VISIBLE_DEVICES=0,1 # 指定双卡
python -m vllm.entrypoints.openai.api_server \
--model ./Qwen2.5-VL-3B-FP16 \
--tensor-parallel-size 2 \
--device npu \
--port 8000
```
#### 6. 性能优化技巧
1. **图像处理加速**:
```python
# 启用DVPP硬件加速
acl.media.dvpp_set_channel_mode(dvpp_channel, acl.media.DVPP_CHANNEL_HIGH_PERFORMANCE)
```
2. **算子替换**:
- 使用`CANN-Toolkit`的`msopgen`工具替换不支持算子
- 视觉位置编码层需替换为昇腾自定义算子[^1]
3. **监控命令**:
```bash
npu-smi info # 查看NPU利用率
ascend-dmi -g # 详细算子性能分析
```
#### 验证测试
```python
import requests
response = requests.post(
"http://localhost:8000/v1/completions",
json={
"prompt": "<image>|描述图片中的物体", # 多模态分隔符
"image_data": open("test.jpg", "rb").read(),
"max_tokens": 100
}
)
print(response.json()["choices"][0]["text"])
```
> **故障处理**:
> - 出现`UNSUPPORTED_OP`错误:使用`ascend-dmi -c`检查算子支持
> - 内存不足:添加`--max-num-seqs 8`限制并发数
> - 图像处理超时:启用`DVPP`硬件加速[^1]
阅读全文
相关推荐



















