异步与多线程分别实现批量调用大模型接口
2025-3-11
| 2025-3-12
Words 1486Read Time 4 min
type
Post
status
Published
date
Mar 11, 2025
slug
summary
tags
category
icon
password
😀
前言: 本片文章对大模型接口的调用效率进行测试。
都2025年啦,不会还在用同步的方式一条一条的调用大模型接口吧,效率太低了,在任务中批量调用大模型接口属IO密集型任务,通过多线程或者异步方式可以显著提高效率。
测试数据是138条问题,大模型的任务是每条测试数据生成10个泛化问题,大模型采用Qwen2.5-72b量化版,使用vllm部署在4张L20显卡上。

📝 异步批量一次调用

不推荐这种方式
这种方式相当于同时向大模型接口服务发送了len(data)次请求。
同时发送大量请求给基础大模型接口服务存在以下两个弊端:
  1. 请求会发生异常
    1. notion image
  1. 每个请求的响应时间都会变长。
    1. 对于普通公司普通家庭来说,GPU就那么点,每秒产生的token数量是有限制的,同时处理大量请求,每个请求的token甚至几秒才会gerenate一个,导致每个请求的处理时间都会变长。

🫥 异步队列

推荐
  1. 将所有待处理的数据放到异步队列中
  1. num_workers个任务从队列中取数据,然后调用大模型接口服务
worker数量
时间(单位:秒)
1
838.02
5
183.93
10
114.39

🍖 多线程

将每个调用大模型接口的任务放入线程池中进行执行
线程池数量
耗时(单位:秒)
1
824.72
5
180.45
10
125.61

📎 结论

由于基座大模型服务也有其他任务在执行,对我们的测试结果会有一定的影响,在我们的测试中异步和多线程耗时并没有很明显的区别,为什么?这就涉及到对异步和多线程理解的问题了。
在我们的测试中,不管是异步任务还是多线程任务,都是调用API,没有涉及到其他任务,然而调用API得到响应结果是一个必须要等待的过程,不管你的计算机有多快,发了138次请求,就必须要等待目标服务器处理完了之后才能响应。所以不管是异步队列处理还是多线程处理,要等待的时长都是一样的。
 
异步我们可以理解成一个任务分成多少个步骤做,在一个线程中的,多线程理解成多少个人在同时做任务。例如做早餐这么一个任务
同步的方式:(用时15分钟)
1.取出鸡蛋,面包和锅,然后打开炉子。 2.弄碎鸡蛋并将其倒入锅中。 3.等待鸡蛋煎好。 4.取出鸡蛋并加入调味料。 5.将面包放入烤面包机。 6.等待烤面包机烤完。 7.拿出烤面包。
异步的方式:(用时8分钟)
  1. 取出鸡蛋,面包和锅,然后打开炉子。
  1. 弄碎鸡蛋并将其倒入锅中。
  1. 等待鸡蛋煎好。
  1. 将面包放入烤面包机。
  1. 等待烤面包机烤完。
  1. 鸡蛋煎熟后,取出鸡蛋,然后添加调味料。
  1. 面包烤熟后,取出烤面包。
多线程方式:(用时8分钟)
有可能是凯文执行,有可能是佩奇执行
1.取出鸡蛋,面包和锅,然后打开炉子。 2.弄碎鸡蛋并将其倒入锅中。 1. 凯文将面包放进烤面包机。 3.等待鸡蛋煎好。 2. 凯文等待面包烤完。 4.取出鸡蛋并加入调味料。 3. 凯文拿出面包。
 
💡
有问题,欢迎您在底部评论区留言,一起交流~
ragflow源码解析系列一之Pycharm启动项目进行debug“MySQL性能大揭秘:同步 vs 异步插入,谁更快?”
Loading...