连续批处理调度器的模拟
目标
分别通过模拟实现静态配对和连续配对,以数字确认处理量差异,并掌握探索满足TTFT SLO的最大同步性的方法。
为什么重要
LLM生成每次请求的输出长度各不相同。有些请求是10个令牌,有些请求是1000个令牌。通过静态分配将32个绑定在一起,即使31个提前结束,直到最长的结束,这些槽位都会空着。GPU会占用32个资源并处理一个。连续分配会在每次解码重复中用结束的槽位填充待命队列的请求。代码上只差一行,但处理量会变化2~5倍。这个练习只通过模拟来重现没有GPU的那个机制。最后8个步骤的顺序是实际工作的核心——从处理量开始最大化,如果延迟在后面看的话,通常无法满足SLO。首先确定TTFT目标,然后找到满足该目标的最大同步性才是正确的顺序。
阶段
/root/lb2/static.py模拟静态配对。请求是/opt/fixtures/llms/requests.json使用(100个,每个都有prompt_tokens和output_tokens),布局大小为16。/root/lb2/static.txt在total_steps=<n> throughput_tps=<수> slot_util=<0~1 소수>写。slot_util必须小于0.7。/root/lb2/continuous.py模拟连续配对。每次重复时,除掉结束的序列,在等待队列中填充。/root/lb2/compare.txt在static_tps=<수> continuous_tps=<수> speedup=<수>写。speedup必须是1.8以上。max_num_seqs=32适用上限。/root/lb2/maxseqs.txt在max_num_seqs=32 peak_running=<n>写peak_running必须在32岁以下。- 将流入率改为每秒5、10、20、40件
/root/lb2/queue.csv在rps,avg_queue,p99_wait_ms写标题和4行。rps越高p99_wait_ms必须增加单调性。 /root/lb2/cost.py是prefill_ms = prompt_tokens * 0.05哇decode_ms = output_tokens * 8.0将费用分开。/root/lb2/cost.txt在total_prefill_ms=<수> total_decode_ms=<수> decode_share=<0~1 소수>写。/root/lb2/tune.txt在target_ttft_ms=200 max_concurrency=<n> throughput_at_target=<수>写。在那个同时性中,p99 TTFT必须在200以下。
参考
- 连续配对的核心是每次重复的插槽重新充电的一行。
- 如果KV缓存不足,抢占顺序的话,就要丢弃缓存重新计算或交换,所以很贵。如果抢占顺序频繁的话,处理量反而会下降。
- 前缀缓存在有共同系统提示时,TTFT最多可以降低8倍。
- 常见的错误1:将两种方式相互比较为不同的请求集合。
- 常见的错误2:将TTFT视为平均值,判断是否遵守SLO——应该看p99。
制作静态配对模拟器
/root/lb2/static.py模拟静态配对。请求是/opt/fixtures/llms/requests.json使用(100个,每个都有prompt_tokens和output_tokens),布局大小为16。
填充配置,直到全部完成为止。关键是每个请求的输出长度都不一样。
静态配对指标复兴
/root/lb2/static.txt在total_steps=<n> throughput_tps=<수> slot_util=<0~1 소수>写。slot_util必须小于0.7。
一起看看处理量和老虎机的利用率。玩的老虎机有多少是问题的规模。
创建连续配对时间表
/root/lb2/continuous.py模拟连续配对。每次重复时,除掉结束的序列,在等待队列中填充。
每次重复时,除了结束的序列外,在等待队列中填充。这一行就是区别所在。
比较两种方式的处理量
/root/lb2/compare.txt在static_tps=<수> continuous_tps=<수> speedup=<수>写。speedup必须是1.8以上。
只有将同一请求集合进行比较才有意义。请计算改善排泄量。
应用同时性上限
max_num_seqs=32适用上限。/root/lb2/maxseqs.txt在max_num_seqs=32 peak_running=<n>写peak_running必须在32岁以下。
不能无限输入。KV缓存设定上限。
查看库深度和p99大气层的关系
将流入率改为每秒5、10、20、40件/root/lb2/queue.csv在rps,avg_queue,p99_wait_ms写标题和4行。rps越高p99_wait_ms必须增加单调性。
随着流入率的提高,可以看到在某个地点p99崩溃。平均值一段时间内还不错。
分开建模prefill和decode的成本
/root/lb2/cost.py是prefill_ms = prompt_tokens * 0.05哇decode_ms = output_tokens * 8.0将费用分开。/root/lb2/cost.txt在total_prefill_ms=<수> total_decode_ms=<수> decode_share=<0~1 소수>写。
两个的成本函数不同。请将与提示长度成正比的和与令牌数量成正比的除以。
找到满足TTFT目标的最大同步性
/root/lb2/tune.txt在target_ttft_ms=200 max_concurrency=<n> throughput_at_target=<수>写。在那个同时性中,p99 TTFT必须在200以下。
首先确定目标,找到满足该目标的最大值。如果从处理量开始最大化,就无法维持SLO。