当前位置: 首页 > news >正文

本地部署大模型QPS推理测试

目录

  • 1、测试环境
    • 1.1、显卡
    • 1.2、模型
    • 1.3、部署环境
      • 1.3.1、docker
      • 1.3.2、执行命令
  • 2、测试问题
    • 2.1、20字左右问题
    • 2.2、50字左右问题
    • 2.3、100字左右问题
  • 3、测试代码
    • 3.1、通用测试代码
    • 3.2、通用测试代码(仅供参考)
  • 4、测试结果
    • 4.1、通用测试结果
    • 4.2、RAG测试结果

1、测试环境

1.1、显卡

在这里插入图片描述

1.2、模型

Qwen2.5-32B-Instruct

1.3、部署环境

xinference

1.3.1、docker

docker run  \
-v ~/.xinference:/root/.xinference \
-v ~/.cache/huggingface:/root/.cache/huggingface \
-v ~/.cache/modelscope:/root/.cache/modelscope \
-e XINFERENCE_MODEL_SRC=modelscope \
-p 9998:9997 \
--gpus all \
--shm-size 20g \
--name xinference \
registry.cn-hangzhou.aliyuncs.com/xprobe_xinference/xinference:latest \xinference-local \
-H 0.0.0.0 \
--log-level debug

1.3.2、执行命令

xinference launch --model_path ~/.cache/modelscope/hub/qwen/Qwen2___5-32B-Instruct --model-engine vLLM --model-name qwen2.5-instruct --size-in-billions 32 --model-format pytorch --quantization none --n-gpu 4  --gpu-idx 0,1,2,3

2、测试问题

以下是三个需要模型“深度思考”的问题(用ChatGTP得到):

2.1、20字左右问题

宇宙中是否存在多重宇宙,如果存在,它们之间如何相互影响?

2.2、50字左右问题

人工智能是否可能真正理解“情感”的含义?如果可以,情感的理解会如何影响人类与 AI 的关系?

2.3、100字左右问题

在人类社会的未来发展中,科技不断进步是否会导致人类完全依赖技术?如果技术突然崩溃,人类是否具备足够的韧性重新建立自给自足的社会?如何在高速发展的同时保留这种生存能力?

3、测试代码

3.1、通用测试代码

import requests
import time
from concurrent.futures import ThreadPoolExecutor
import uuid
from openai import OpenAIclient = OpenAI(base_url="http://127.0.0.1:9998/v1", api_key="not used actually")def openai_request():try:response = client.chat.completions.create(model="qwen2.5-instruct",messages=[{"role": "user", "content": "在人类社会的未来发展中,科技不断进步是否会导致人类完全依赖技术?如果技术突然崩溃,人类是否具备足够的韧性重新建立自给自足的社会?如何在高速发展的同时保留这种生存能力?"}],stream=True,)for chunk in response:content = chunk.choices[0].delta.contentif content:# print(content, end='', flush=True)passreturn Trueexcept requests.RequestException as e:print(f"请求失败: {e}")return False# 计算QPS
def calculate_qps(num_requests, num_threads):with ThreadPoolExecutor(max_workers=num_threads) as executor:start_time = time.time()futures = [executor.submit(openai_request) for _ in range(num_requests)]successful_requests = sum([future.result() for future in futures])end_time = time.time()duration = end_time - start_time  # 测试时长qps = successful_requests / duration  # 计算 QPSreturn qps, successful_requests, durationreq_test = [(10,10),(10,20),(10,50),(20,20),(20,50),(50,50),(50,100)]for num_threads,num_requests in req_test:qps, successful_requests, duration = calculate_qps(num_requests, num_threads)print(f"并发请求数: {num_threads}")print(f"请求个数: {num_requests}")print(f"总测试时长: {duration:.2f}秒")print(f"QPS: {qps:.2f} 请求/秒")print(f"成功请求数量: {successful_requests}")print("*"*33)

3.2、通用测试代码(仅供参考)

import requests
import time
from concurrent.futures import ThreadPoolExecutor
import uuid
from openai import OpenAI
# 测试的 URL 和 payload
url = "http://127.0.0.1:7860/v1/chat/completions"
payload = {"conversation_id": "0","messages": [{"role": "user","content": "空调系统由哪几个系统组成"  # 你可以根据需求更换成其他问题},],"stream": True,"temperature": 0
}# 单次请求函数
def send_request():try:payload["conversation_id"] = str(uuid.uuid4())response = requests.post(url, json=payload, stream=True)for chunk in response.iter_content(chunk_size=512):  # 分块接收响应if chunk:chunk = chunk.decode('utf-8', errors='ignore').strip()# 这里可以对流式响应进行处理# print(chunk)  # 可选,输出流式返回的每个部分return True  # 如果成功接收到响应,返回 Trueexcept requests.RequestException as e:print(f"请求失败: {e}")return False# 计算QPS
def calculate_qps(num_requests, num_threads):with ThreadPoolExecutor(max_workers=num_threads) as executor:start_time = time.time()futures = [executor.submit(send_request) for _ in range(num_requests)]successful_requests = sum([future.result() for future in futures])end_time = time.time()duration = end_time - start_time  # 测试时长qps = successful_requests / duration  # 计算 QPSreturn qps, successful_requests, durationreq_test = [(10,10),(10,20),(10,50),(20,20),(20,50),(50,50),(50,100)]for num_threads,num_requests in req_test:qps, successful_requests, duration = calculate_qps(num_requests, num_threads)print(f"并发请求数: {num_threads}")print(f"请求个数: {num_requests}")print(f"总测试时长: {duration:.2f}秒")print(f"QPS: {qps:.2f} 请求/秒")print(f"成功请求数量: {successful_requests}")print("*"*33)

4、测试结果

4.1、通用测试结果

并发请求数请求个数时间s-20QPS-20时间s-50QPS-50时间s-100QPS-100
101025.540.3928.950.3530.560.33
102047.850.4257.460.3564.240.31
1050122.270.41135.080.37151.010.33
202034.520.5835.910.5644.840.45
205083.040.693.560.53106.350.47
505049.911.0054.110.9266.720.75
50100101.470.99110.770.90123.490.81

4.2、RAG测试结果

并发请求数请求个数时间sQPS失败
1010002968.060.330
10100299.890.330
1050178.770.280
102061.240.330
101032.870.30
202054.890.360
2040108.230.361
2050136.970.352
5050120.850.1532
50100224.150.0882

http://www.mrgr.cn/news/80554.html

相关文章:

  • 设计模式12:抽象工厂模式
  • 结构化的Prompt
  • 【YashanDB知识库】kettle同步大表提示java内存溢出
  • VCU--新能源汽车VCU电控开发
  • FFmpeg功能使用
  • .net winform 实现CSS3.0 泼墨画效果
  • gRPC拦截器
  • 【50】Android自定义身份证拍照相机
  • 【前后端】HTTP网络传输协议
  • Qt设置部件的阴影效果
  • 12.17双向链表,循环链表
  • (2024年最新)Linux(Ubuntu) 中配置静态IP(包含解决每次重启后配置文件失效问题)
  • PSIM不放接地原件
  • 那些不熟悉的C语言关键字-const
  • 3D视觉[一]3D计算机视觉
  • QT5.9.9+ARM开发环境搭建【详细步骤】
  • 3.2.1.2 汇编版 原子操作 CAS
  • Canoe CAPL编程
  • 2012年西部数学奥林匹克试题(几何)
  • ASR-LLM-TTS 实时语音对话助手:语音识别、大模型对话、声音生成
  • 算法题(7):n进制乘法表
  • kubeadm_k8s_v1.31高可用部署教程
  • DATA-HUB 安装与启动:
  • vertx idea快速使用
  • Qt WORD/PDF(二)使用 QtPdfium库实现 PDF操作、打印等
  • 生产环境迁移——harbor篇