qwen2.5-vl复现日志
本文不生产技术,只做技术的搬运工!!!
前言
作者使用A100-40G*4进行qwen2.5-vl本地部署。
环境配置
git clone https://github.com/QwenLM/Qwen2.5-VL.git
cd Qwen2.5-VL
conda create -n qwen2.5-vl python=3.11 -y
pip install -r requirements_web_demo.txt
pip install flash-attn==2.6.1
pip install vllm==0.7.3
pip install autoawq --no-deps
单卡加载
7B
vllm serve /data/qwen2.5-vl/model-7b/ --port 8084 --host 0.0.0.0 --dtype bfloat16 --limit-mm-per-prompt image=5,video=5 --max-model-len 3840
7B-awq
vllm serve /data/qwen2.5-vl/model-7b-awq/ --port 8084 --host 0.0.0.0 --dtype bfloat16 --limit-mm-per-prompt image=5,video=5 --max-model-len 3840.8
多卡加载
7B
CUDA_VISIBLE_DEVICES=0,1,2,3 vllm serve /data/qwen2.5-vl/model-7b/ --port 8084 --host 0.0.0.0 --dtype bfloat16 --limit-mm-per-prompt image=5,video=5 --max-model-len 3840 --tensor-parallel-size 4 --gpu-memory-utilization 0.8
7B-awq
CUDA_VISIBLE_DEVICES=0,1,2,3 vllm serve /data/qwen2.5-vl/model-7b-awq/ --port 8084 --host 0.0.0.0 --dtype bfloat16 --limit-mm-per-prompt image=5,video=5 --max-model-len 3840 --tensor-parallel-size 4 --gpu-memory-utilization 0.8
72B-awq
相较于7b-awq的加载,72b-awq加载时会报错:
KeyboardInterrupt: MQLLMEngine terminated
这里作者并没有找到更好的解决方案,只是根据推理时的报错推测和cuda有关,因此在启动命令上增加了--enforce-eager参数解决了该问题,但是感觉并没有在根本上解决该问题,只是将其掩盖能凑活使用罢了
CUDA_VISIBLE_DEVICES=0,1,2,3 vllm serve /data/qwen2.5-vl/model-72b-awq/ --port 8084 --host 0.0.0.0 --dtype bfloat16 --limit-mm-per-prompt image=5,video=5 --max-model-len 3840 --tensor-parallel-size 4 --gpu-memory-utilization 0.8 --enforce-eager
实验
代码
from openai import OpenAI
import time
# Set OpenAI's API key and API base to use vLLM's API server.
openai_api_key = "EMPTY"
openai_api_base = "http://0.0.0.0:8084/v1"
client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)
times = [] # 记录每次调用的时间
for i in range(20):
start_time = time.time() # 开始时间
chat_response = client.chat.completions.create(
model="/data/qwen2.5-vl/model-72b-awq/",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": "https://modelscope.oss-cn-beijing.aliyuncs.com/resource/qwen.png"
},
},
{"type": "text", "text": "描述一下这张图像"},
],
},
],
)
end_time = time.time() # 结束时间
elapsed_time = end_time - start_time # 计算耗时
times.append(elapsed_time) # 添加到列表中
print(f"第 {i + 1} 次调用结果: {chat_response.choices[0].message.content}")
print(f"第 {i + 1} 次调用耗时: {elapsed_time:.4f} 秒")
# 去掉最大值和最小值
if len(times) >= 3:
times.remove(max(times))
times.remove(min(times))
# 计算平均耗时
average_time = sum(times) / len(times) if times else 0
print(f"去掉一个最大值和一个最小值后,平均每次调用耗时: {average_time:.4f} 秒")