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

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 OpenAI

client = 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.content
            if content:
                # print(content, end='', flush=True)
                pass
        return True
    except 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  # 计算 QPS
    return qps, successful_requests, duration

req_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  # 如果成功接收到响应,返回 True
    except 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  # 计算 QPS
    return qps, successful_requests, duration

req_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
### 测量 MMSegmentation 模型推理时间的方法 为了测量 MMSegmentation 中模型推理时间,可以通过 Python 脚本实现。以下是具体方法: #### 方法概述 1. 使用 `time` 或 `torch.utils.benchmark` 库来记录模型前向传播的时间消耗。 2. 加载预训练模型并设置为评估模式 (`model.eval()`)[^1]。 3. 对输入张量进行多次推断以减少单次运行带来的误差[^2]。 #### 实现代码示例 以下是一个完整的代码示例,展示如何测量 SegFormer 模型在 Cityscapes 数据集上的推理时间: ```python import torch from mmseg.apis import init_segmentor, inference_segmentor import time # 配置文件路径和检查点路径 config_file = 'configs/segformer/segformer_mit-b5_8xb1-160k_cityscapes-1024x1024.py' checkpoint_file = 'checkpoint/segformer_mit-b5_8x1_1024x1024_160k_cityscapes_20211206_072934-87a052ec.pth' # 初始化模型 model = init_segmentor(config_file, checkpoint_file, device='cuda:0') model.eval() # 创建虚拟输入 (假设输入大小为 1024x1024) input_tensor = torch.randn(1, 3, 1024, 1024).to('cuda') # 进行多次推理以获得平均时间 num_runs = 100 total_time = 0 with torch.no_grad(): # 禁用梯度计算以加快速度 for _ in range(num_runs): start_time = time.time() output = model(input_tensor, return_loss=False) # 前向传播 end_time = time.time() total_time += (end_time - start_time) average_inference_time = total_time / num_runs print(f'Average Inference Time per Image: {average_inference_time:.4f} seconds') ``` 上述代码通过多次运行模型推理并取平均值的方式减少了随机波动的影响。 --- ### 注意事项 1. **设备选择**:确保模型和输入张量都位于同一设备上(CPU 或 GPU)。如果使用 GPU,则需显式指定 `'cuda:0'`。 2. **批量大小**:调整输入张量的形状以匹配实际应用场景中的批量大小。 3. **环境配置**:确认已安装最新版本的 PyTorch 和 MMSegmentation,并且 CUDA 版本兼容。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值