如何计算VLLM本地部署Qwen3-4B的GPU最小配置应该是多少?多人并发访问本地大模型的GPU配置应该怎么分配?

news2025/5/24 23:47:14

本文一定要阅读我上篇文章!!!

超详细VLLM框架部署qwen3-4B加混合推理探索!!!-CSDN博客

本文是基于上篇文章遗留下的问题进行说明的。

一、本文解决的问题

问题1:我明明只部署了qwen3-4B的模型,为什么启动VLLM推理框架后能占到显存的0.9,占了22GB显存?

问题2:VLLM框架部署Qwen3-4B的GPU最小配置应该是多少,怎么计算?

问题3:VLLM框架预留更多的GPU资源对模型推理速度影响多大?

问题4:并发处理10-20人的访问本地模型请求,GPU配置应该怎么计算,怎么分配?

二、解决问题1

问题1:我明明只部署了qwen3-4B的模型,为什么启动VLLM推理框架后能占到显存的0.9,占了22GB显存?

官网回答图片,可以知道VLLM框架是预置了0.9的显存给这个模型,但是模型实际不一定需要要那么多显存。还有最大输入的token默认值是40960,正常我们输入的长文本不需要那么大。

因此可以自定义分配GPU显存给VLLM服务,测试一下,当然你分配的显存越少,推理速度越慢。

比如我分配了0.5的显存重启VLLM服务,就可以看到分配的显存就是0.5左右。

vllm serve /root/lanyun-tmp/modle/Qwen3-4B --max-model-len 10000 --gpu-memory-utilization 0.5 

三、解决问题2

问题2:VLLM框架部署Qwen3-4B的GPU最小配置应该是多少,怎么计算?

执行完下述命令后

 vllm serve /root/lanyun-tmp/modle/Qwen3-4B --max-model-len 10000 --gpu-memory-utilization 0.5 

首先先分析配置日志

  • ​显存占用​

    • ​模型加载​​:7.552 GiB(主模型权重)。
    • ​KV缓存​​:17,440 tokens(具体显存需结合模型参数,但日志未直接给出数值)。
    • ​图捕获阶段​​:0.58 GiB(动态编译优化时的临时占用)。
    • ​总计显存​​:主模型+临时操作约为 ​​8.13 GiB左右​​(KV缓存需额外计算,但日志未明确)。
  • ​总计显存​​:主模型+临时操作约为 ​​8.13 GiB左右​

也就是说,除了自定义的KV缓存,至少8.13GB

 我们还可以自己计算KV显存,根据模型的配置文件和下述公式,得到缓存是1.37GB,也可以直接把模型配置发给deepseek叫它计算。

KV缓存总量 = batch_size × 序列长度 × 模型层数 × 2 × d_model × sizeof(float16)    

因此VLLM部署Qwen3-4B的在--max-model-len 10000GPU的情况下模型占用的GPU资源是,8.13GB+1.37GB=9.5GB

如果是默认情况--max-model-len 40960,模型占用的GPU资源是,8.13GB+5.62GB=13.75GB

小技巧,如果你不相信AI计算的结果,可以执行默认的最长输入命令。

vllm serve /root/lanyun-tmp/modle/Qwen3-4B  --gpu-memory-utilization 0.5 

发现报错

 raise ValueError( ValueError: To serve at least one request with the models's max seq len (40960), (5.62 GiB KV cache is needed, which is larger than the available KV cache memory (2.39 GiB). Based on the available memory, Try increasing `gpu_memory_utilization` or decreasing `max_model_len` when initializing the engine. 

 错误提示显示5.62 GiB KV cache is needed,而当前可用显存仅2.39 GiB。KV缓存用于存储Transformer模型中各层的键值向量。

我们就可以自己计算,10000的token所占用的应该KV缓存的GPU大小,10000/40960*5.62GB=1.37GB。说明AI计算的是正确的。

四、解决问题3

问题3:VLLM框架预留更多的GPU资源对模型推理速度影响多大?

使用下面代码进行测试分配不同的GPU,推理时间变化多少。因为每次生成的token数量不一样,所以我们主要是以tokens/s为衡量标准进行测试。

import time
from openai import OpenAI

# 初始化客户端
openai_api_key = "EMPTY"
openai_api_base = "http://localhost:8000/v1"

client = OpenAI(
    api_key=openai_api_key,
    base_url=openai_api_base,
)

# 使用高精度计时器
start_time = time.perf_counter()  # 比time.time()精度更高[3](@ref)

chat_response = client.chat.completions.create(
    model="/root/lanyun-tmp/modle/Qwen3-4B",
    messages=[
        {"role": "user", "content": "你有什么功能"},
    ],
    max_tokens=8192,
    temperature=0.7,
    top_p=0.8,
    presence_penalty=1.5,
    extra_body={
        "top_k": 20, 
        "chat_template_kwargs": {"enable_thinking": True},
    },
)

end_time = time.perf_counter()
elapsed = end_time - start_time

print("Chat response:", chat_response)
print(f"\n[性能报告] 请求耗时: {elapsed:.4f}秒")
print(f"生成token数: {chat_response.usage.completion_tokens} tokens")
print(f"每秒生成速度: {chat_response.usage.completion_tokens/elapsed:.2f} tokens/s")

情况一,设置最大10000token数量,分配0.5GPU,12.7GB给VLLM服务,除去大模型的启动占用9.5GB,还给VLLM服务预留空间为3.2GB。

vllm serve /root/lanyun-tmp/modle/Qwen3-4B --max-model-len 10000 --gpu-memory-utilization 0.5 

有思考83.71 tokens/s,无思考79.53 tokens/s

    情况二,设置最大10000token数量,分配0.8GPU,20GB给VLLM服务,除去大模型的启动占用9.5GB,还给VLLM服务预留空间为10.5GB。

    vllm serve /root/lanyun-tmp/modle/Qwen3-4B --max-model-len 10000 --gpu-memory-utilization 0.8

    有思考77.09 tokens/s,无思考 78.18 tokens/s

    通过两个情况的对比,预留给VLLM服务的GPU空间大小没有对速度有太大影响,甚至空间小一定,生成速度还更多,但是多运行几次,发现速度是差不多的。 

    五、解决问题4

    问题4:如何测试多人并发访问大模型服务,多少人是上限,生成的速度变化是怎么样的?

    我们可以创建一个并发测试的代码concurrency_test.py

    # concurrency_test.py

    import argparse

    import threading

    import time

    from queue import Queue

    # qwen3-4B_test.py

    import time

    from openai import OpenAI

    def send_request(prompt="你有什么功能", max_tokens=8192, temperature=0.7):

        """单次请求测试函数"""

        client = OpenAI(

            api_key="EMPTY",

            base_url="http://localhost:8000/v1",

        )

       

        start_time = time.perf_counter()

        try:

            response = client.chat.completions.create(

                model="/root/lanyun-tmp/modle/Qwen3-4B",

                messages=[{"role": "user", "content": prompt}],

                max_tokens=max_tokens,

                temperature=temperature,

                extra_body={"top_k": 20}

            )

            elapsed = time.perf_counter() - start_time

            return {

                "success": True,

                "time": elapsed,

                "tokens": response.usage.completion_tokens,

                "speed": response.usage.completion_tokens/elapsed,

                "response": response.choices[0].message.content

            }

        except Exception as e:

            return {

                "success": False,

                "error": str(e),

                "time": time.perf_counter() - start_time

            }

    class ConcurrentTester:

        def __init__(self, num_users):

            self.num_users = num_users

            self.results = Queue()

            self.start_barrier = threading.Barrier(num_users + 1)  # 同步所有线程同时启动

           

        def _worker(self, user_id):

            """单个用户的请求线程"""

            self.start_barrier.wait()  # 等待所有线程就绪

            result = send_request(prompt=f"测试用户{user_id}的并发请求")

            self.results.put((user_id, result))

        def run(self):

            # 创建并启动所有线程

            threads = []

            for i in range(self.num_users):

                t = threading.Thread(target=self._worker, args=(i+1,))

                t.start()

                threads.append(t)

           

            # 等待所有线程准备就绪

            self.start_barrier.wait()

            start_time = time.perf_counter()

           

            # 等待所有线程完成

            for t in threads:

                t.join()

               

            total_time = time.perf_counter() - start_time

           

            # 统计结果

            success = 0

            total_tokens = 0

            speeds = []

            errors = []

           

            while not self.results.empty():

                user_id, res = self.results.get()

                if res['success']:

                    success += 1

                    total_tokens += res['tokens']

                    speeds.append(res['speed'])

                else:

                    errors.append(f"用户{user_id}错误:{res['error']}")

           

            return {

                "total_time": total_time,

                "success_rate": success/self.num_users,

                "avg_speed": sum(speeds)/len(speeds) if speeds else 0,

                "total_tokens": total_tokens,

                "errors": errors

            }

    if __name__ == "__main__":

        parser = argparse.ArgumentParser()

        parser.add_argument("--users", type=int, required=True,

                           help="并发用户数量")

        args = parser.parse_args()

       

        tester = ConcurrentTester(args.users)

        print(f"开始{args.users}用户并发测试...")

        results = tester.run()

       

        print("\n测试报告:")

        print(f"总耗时:{results['total_time']:.2f}秒")

        print(f"成功请求:{results['success_rate']*100:.1f}%")

        print(f"平均生成速度:{results['avg_speed']:.2f}tokens/s")

        print(f"总生成token数:{results['total_tokens']}")

       

        if results['errors']:

            print("\n错误列表:")

            for err in results['errors']:

                print(f"• {err}")

    分别测试上述两个情况:

    情况一,设置最大10000token数量,分配0.5GPU,12.7GB给VLLM服务,除去大模型的启动占用9.5GB,还给VLLM服务预留空间为3.2GB。

    vllm serve /root/lanyun-tmp/modle/Qwen3-4B --max-model-len 10000 --gpu-memory-utilization 0.5 

    情况二,设置最大10000token数量,分配0.8GPU,20GB给VLLM服务,除去大模型的启动占用9.5GB,还给VLLM服务预留空间为10.5GB。

    vllm serve /root/lanyun-tmp/modle/Qwen3-4B --max-model-len 10000 --gpu-memory-utilization 0.8

     

    情况三,设置最大10000token数量,分配0.5GPU,12.7GB给VLLM服务,除去大模型的启动占用9.5GB,还给VLLM服务预留空间为3.2GB。

    vllm serve /root/lanyun-tmp/modle/Qwen3-4B --max-model-len 10000 --gpu-memory-utilization 0.5 

    终极测试500个并发请求,可以看到VLLM框架一次性是处理11个请求,然后分批次排队处理这么多的并发请求。然后越到后面处理的请求越少。

    结论,VLLM处理框架处理并发的能力是可以的,它是通过并发处理11给请求,别的请求是排队处理。所以只要模型通过VLLM部署起来,理论上它解决无上限的并发请求,就是要排队等着大模型回复。 

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2384957.html

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

    相关文章

    Attu下载 Mac版与Win版

    通过Git地址下载 Mac 版选择对于的架构进行安装 其中遇到了安装不成功,文件损坏等问题 一般是两种情况导致 1.安装版本不对 2.系统权限限制 https://www.cnblogs.com/similar/p/11280162.html打开terminal执行以下命令 sudo spctl --master-disable安装包Git下载地…

    V2X协议|如何做到“车联万物”?【无线通信小百科】

    1、什么是V2X V2X(Vehicle-to-Everything)即“车联万物”,是一项使车辆能够与周围环境实现实时通信的前沿技术。它允许车辆与其他交通参与者和基础设施进行信息交互。通过V2X,车辆不仅具备“远程感知”能力,还能在更大…

    [测试_3] 生命周期 | Bug级别 | 测试流程 | 思考

    目录 一、软件测试的生命周期(重点) 1、软件测试 & 软件开发生命周期 (1)需求分析 (2)测试计划 (3)测试设计与开发 (4)测试执行 (5&am…

    RabbitMQ ⑤-顺序性保障 || 消息积压 || 幂等性

    幂等性保障 幂等性(Idempotency) 是计算机科学和网络通信中的一个重要概念,指的是某个操作无论被执行多少次,所产生的效果与执行一次的效果相同。 应用程序的幂等性: 在应用程序中,幂等性就是指对一个系统…

    java基础知识回顾1(可用于Java基础速通)考前,面试前均可用!

    目录 一、初识java 二、基础语法 1.字面量 2.变量 3.关键字 4.标识符 声明:本文章根据黑马程序员b站教学视频做的笔记,可对应课程听,课程链接如下: 02、Java入门:初识Java_哔哩哔哩_bilibili 一、初识java Java是美国 sun 公…

    云原生CICD-Tekton入门到精通

    文章目录 一、Tekton介绍二、Tekton组件介绍三、执行流程四、安装Tekton管道五、安装Tekton Dashboard六、安装Tekton Cli七、运行单Task八、运行流水线九、在流水线中使用secret十、taskSpec、taskRef、pipelineRef、pipelineSpec使用pipelineRef与taskRef结合使用(推荐)pipel…

    opencv 图像的平移和旋转

    warpAffine函数讲解,图片可自行下载,也可用自己的图片 原图im 平移im_shifted 旋转im_rotated # 图像仿射变换 # 步骤: 读取图像 -> 创建仿射变换矩阵 -> 仿射变换计算 # 平移变换矩阵:一种写法,直接写死 # 旋转变…

    IDEA2025版本使用Big Data Tools连接Linux上Hadoop的HDFS

    目录 Windows的准备 1. 将与Linux上版本相同的hadoop压缩包解压到本地 ​编辑2.设置$HADOOP HOME环境变量指向:E:\hadoop-3.3.4 3.下载hadoop.dll和winutils.exe文件 4.将hadoop.dll和winutils.exe放入$HADOOP HOME/bin中 IDEA中操作 1.下载Big Data Tools插件 2.添加并连…

    hysAnalyser特色的TS流编辑、剪辑和转存MP4功能说明

    摘要 hysAnalyser 是一款特色的 MPEG-TS 数据分析工具,融合了常规TS文件的剪辑,转存功能,可用于平常的视频开发和测试。 本文详细阐述了对MPEG-TS 流的节目ID,名称,PID,时间戳,流类型&#xff…

    Google机器学习实践指南(学习速率篇)

    🔥Google机器学习核心概念精讲(学习速率) Google机器学习实战(7)-5分钟掌握学习速率。 学习速率:模型训练的关键超参数 学习速率是指在训练模型时用于梯度下降的一个标量。在每次迭代期间,梯度下降法都会将学习速率…

    使用KubeKey快速部署k8s v1.31.8集群

    实战环境涉及软件版本信息: 使用kubekey部署k8s 1. 操作系统基础配置 设置主机名、DNS解析、时钟同步、防火墙关闭、ssh免密登录等等系统基本设置 dnf install -y curl socat conntrack ebtables ipset ipvsadm 2. 安装部署 K8s 2.1 下载 KubeKey ###地址 https…

    leetcode hot100:十四、解题思路大全:真·大全!

    因为某大厂的算法没有撕出来,怒而整理该贴。部分题目有python版本的AC代码。本贴耗时4天呜呜呜 1.哈希 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下…

    kali的简化安装

    首先点击kali的官网 https://www.kali.org/get-kali/#kali-platforms 点击虚拟机版本 下载VMware版本的压缩包 解压后 点击 后缀名为 .vmx的文件 原始账号密码为 kali kali 这样安装 就不需要我们再去配置镜像 等等复杂操作了

    Vortex GPGPU的github流程跑通与功能模块波形探索(三)

    文章目录 前言一、./build/ci下的文件结构二、基于驱动进行仿真过程牵扯的文件2.1 blackbox.sh文件2.2 demo文件2.3 额外牵扯到的ramulator2.3.1 ramulator简单介绍2.3.2 ramulator使用方法2.3.3 ramulator的输出2.3.4 ramulator的复现2.3.4.1 调试与验证(第 4.1 节…

    实用蓝牙耳机哪款好?先做好使用场景分析!

    市面上的蓝牙耳机款式繁多,618到来之际,消费者如何选择适合自己的蓝牙耳机?实用蓝牙耳机哪款好?关键在于做好使用场景分析!今天,就带大家结合不同的使用场景,分享三款倍思音频的精品蓝牙耳机。 …

    防火墙NAT地址组NAT策略安全策略

    本文仅供学习交流,所涉及的知识技术产权归属华为技术有限公司所有!!! 本文仅供学习交流,所涉及的知识技术产权归属华为技术有限公司所有!!! 本文仅供学习交流,所涉及的…

    Windows 使用 WSL 安装 Ubuntu

    一,前言 Windows 上轻松跑 Linux 又不想用笨重的VMware 和VirtualBox ,怎么办? 开源项目 Windows Subsystem for Linux (WSL)。它解决了许多开发者在 Windows 和 Linux 间切换的痛点,实现在 Windows 上无缝跑 Linux 工具和命令。…

    第九天的尝试

    目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 创造美好的代价是努力,失望以及毅力,首先是痛苦,然后才是欢乐。 时间是快的,看怎么利用,安排好一切事情,才能从容面对…

    流程自动化引擎:重塑企业数字神经回路

    在数字经济高速发展的今天,企业运营的核心逻辑正在经历一场静默的革命。流程自动化引擎作为这场变革的中枢神经系统,通过智能化的技术手段重构企业的业务逻辑与决策链路,将原本离散的“数字神经元”编织成高效协同的神经网络。这种技术不仅打…

    nginx web服务日志分析

    特点: 实时分析:支持实时分析 Nginx 日志,无需预先存储大量日志数据,能即时反馈网站的访问情况。轻量级高效:资源占用少,运行速度快,适合处理高流量网站的日志分析。多种输出格式:除…