1. 项目概述BurstGPT数据集与LLM服务系统优化如果你正在研究或开发大型语言模型的服务系统那么你肯定遇到过一个核心难题如何设计一个既高效又经济的系统来应对真实世界中千变万化的用户请求是准备海量GPU资源来应对可能出现的流量洪峰还是精打细算冒着服务降级的风险来降低成本这个问题的答案很大程度上取决于你对“真实工作负载”的理解。今天要深入探讨的就是由香港科技大学广州高性能机器学习系统实验室发布的BurstGPT数据集。这不是一个模拟的、理想化的数据而是一个来自微软Azure平台记录了超过1000万次真实GPT-3.5和GPT-4 API调用的“现场实录”。它就像一份珍贵的“病历”记录了LLM服务在连续数月内所经历的所有“病症”——请求的潮汐规律、会话的持续性、突发流量的强度以及各种失败案例。对于系统架构师和研究者而言这个数据集的价值在于它提供了前所未有的“地面真相”。过去我们评估一个调度算法或资源分配策略往往依赖于合成或简化的工作负载其结果在实际部署中可能大打折扣。BurstGPT则让你能在一个接近真实的环境中进行“压力测试”和“性能推演”。你可以用它来验证你的动态批处理策略是否能扛住下午两点的请求高峰你的缓存机制是否有效识别并利用了那些频繁出现的会话模式甚至你的容错设计是否能妥善处理那些导致Response tokens为0的失败请求。简而言之它架起了一座连接学术研究与工业实践的桥梁。接下来我将带你彻底拆解这个数据集。我们会从它的核心设计思路开始理解数据采集背后的考量然后深入每一个数据字段弄明白Session ID和Elapsed time这些关键列能告诉我们什么故事接着我会分享如何在实际研究中高效使用这些数据包括如何缩放流量、建模模式以及利用附带的工具最后结合我处理类似系统数据的经验总结一些关键的注意事项和避坑指南。无论你是想复现论文中的实验还是为自己的LLM服务系统寻找一个可靠的评估基准这篇文章都将提供一份详尽的路线图。2. 数据集核心设计思路与价值解析2.1 为什么我们需要真实世界的LLM服务轨迹在深入BurstGPT的细节之前我们首先要理解为什么一个合成或小规模的数据集不足以支撑LLM服务系统的优化研究。LLM服务负载具有几个极其独特且复杂的特征这些特征只有在大规模、长时间尺度的真实数据中才能被准确捕捉。第一高度的突发性与不可预测性。与传统的Web服务请求相比LLM的请求处理成本计算量、内存、时间与输入/输出的令牌数量直接相关且方差极大。一个简单的分类请求可能只需几十个令牌而一个要求模型撰写长篇报告的用户会话则可能产生数千个令牌的上下文和输出。这种请求成本的“长尾分布”意味着系统在短时间内可能从处理大量轻量请求突然切换到处理少数几个“巨无霸”请求对GPU内存、计算核心的调度和KV缓存管理带来巨大挑战。BurstGPT长达121天和110天的连续记录正是为了捕捉这种长期趋势中的短期突发模式。第二明显的周期性与人类行为模式。从BurstGPT论文中展示的图表可以清晰看到请求速率RPS呈现出强烈的日周期和周期规律。通常工作日的白天是请求高峰深夜和周末则进入低谷。这种模式直接影响着云服务的自动扩缩容策略。如果你的资源分配算法无法敏锐地感知并预测这种周期要么会在低峰期造成大量的资源闲置和金钱浪费要么会在高峰期因准备不足而导致请求排队延迟激增用户体验下降。第三会话Session的上下文关联性。在对话模式下用户的多次请求属于同一个会话上下文。这意味着系统不能将这些请求视为完全独立的它们共享历史上下文对系统的缓存如PagedAttention这类技术和调度提出了特殊要求。BurstGPT数据集新增的Session ID字段正是为了揭示这种会话内请求的关联模式、会话的持续时间、会话内的交互频率等关键信息这对于优化会话感知的调度器至关重要。第四失败请求的宝贵价值。数据集特意包含了Response tokens为0的失败请求记录。在工业级系统中失败是不可避免的——可能由于网络抖动、服务端过载、配额限制或内部错误。分析这些失败请求发生的时间、关联的模型以及当时的系统负载可以帮助我们设计更健壮的容错机制和负载均衡策略。忽略失败数据的研究其结论在实际部署中往往是脆弱的。2.2 BurstGPT数据集的架构与版本演进BurstGPT数据集目前的主体由两个大的时间片段构成在Release v2.0中提供了6个文件这种设计体现了研究者对数据纯净度和研究便利性的双重考量。BurstGPT_1与BurstGPT_2这两个数据集共同覆盖了连续121天约4个月的轨迹。BurstGPT_1包含了前两个月的数据而BurstGPT_2包含了后两个月的数据。每个时间段又分别提供了“包含所有请求”的原始文件如BurstGPT_1.csv和“过滤掉失败请求”的清洁版本如BurstGPT_without_fails_1.csv。这种划分非常实用原始文件含失败适用于研究系统可靠性、失败模式、以及在有噪声环境下的调度算法评估。文件大小约188MB总计约529万行数据足以支撑大规模的模拟实验。清洁文件无失败适用于聚焦于性能评估的研究例如比较不同批处理策略在理想条件下的吞吐量和延迟。你可以排除失败请求的干扰更清晰地观察算法本身的效果。BurstGPT_3这是一个独立的、连续110天的新数据集。它并非前121天的简单延续而是另一个时间段的独立采集。这为研究提供了宝贵的可重复性验证机会。你可以用BurstGPT_1/2数据集训练你的负载预测模型或调优系统参数然后在BurstGPT_3上进行测试检验你的方案是否具有泛化能力而不是过拟合到某个特定时间段的行为模式上。这个数据集体积更大约220MB534万行也可能包含了用户行为或API使用模式上的一些微妙变化。注意版本选择策略对于刚接触的研究者我建议从BurstGPT_without_fails_1.csv开始。它排除了失败请求的复杂性让你能先专注于理解负载的基本模式周期、令牌分布、会话结构。当你需要测试系统的健壮性时再切换到包含失败的完整版本。BurstGPT_3则最好留作最终测试集用于验证模型的泛化性能。3. 数据字段深度解读与实操含义BurstGPT数据集的每个字段都不是随意记录的它们共同刻画了一次LLM API调用的完整生命周期。理解每个字段的精确含义和实操中的对应关系是正确使用该数据集的前提。3.1 时间与标识字段构建请求时空图谱Timestamp(请求提交时间)定义以数据集第一天本地时间00:00:00为原点计算的秒级时间戳。实操要点这是所有时序分析的基石。你需要将其转换为可读的日期时间格式例如使用Python的datetime模块。转换时要注意原始数据已校准到本地时区因此直接加上原点时间即可无需额外时区转换。通过这个字段你可以绘制出请求量的时间序列图分析日/周周期甚至定位具体的流量“暴增”事件。Session ID(会话标识符)定义对话模式下请求的会话ID。属于同一对话的多个请求共享相同的Session IDAPI调用模式非对话的请求此字段可能为空或为特定标识如NaN。实操要点这是分析会话行为的关键。你可以会话切割根据Session ID分组分析单个会话的平均长度请求次数、持续时间首个请求到末个请求的时间差、会话内请求的间隔分布。上下文管理研究模拟需要维护KV缓存的场景。同一Session ID下的后续请求其Request tokens通常包含之前对话的历史这对于研究缓存策略和上下文窗口的利用效率至关重要。区分负载类型通过统计Session ID为空和不为空的请求比例可以了解混合负载中对话式请求和单次API请求的构成。Elapsed time(请求总耗时)定义从提交推理请求到收到完整最终响应包含所有输出令牌所经过的时间单位是秒。特别需要注意这不是TTFT首令牌时间而是包含了整个流式输出过程的端到端延迟。实操要点这是衡量系统服务质量的核心指标。延迟分析可以计算P50、P95、P99分位的延迟评估系统在不同负载下的响应表现。与令牌数的关系通常Elapsed time与Response tokens强相关。你可以建立模型来预测给定输出长度下的预期延迟这对于实现SLO服务等级目标感知的调度非常重要。系统瓶颈诊断如果发现Elapsed time很长但Response tokens并不多可能暗示系统存在排队延迟或计算资源瓶颈而非生成本身慢。3.2 模型与令牌字段量化计算成本Model(调用模型)取值ChatGPT(即GPT-3.5-Turbo) 和GPT-4。实操要点不同模型的成本API价格和计算开销天差地别。GPT-4的推理速度通常远慢于GPT-3.5且更昂贵。在模拟中你必须为不同模型的请求分配不同的处理资源或延迟模型。分析两者请求的比例、时间分布例如GPT-4请求是否更集中在某些时段对于设计多模型混合部署的系统至关重要。Request tokensResponse tokensTotal tokens(请求/响应/总令牌数)定义分别表示输入提示的令牌长度、模型输出响应的令牌长度以及两者之和。实操要点这是计算负载和成本的核心。负载建模Total tokens直接关联到GPU的计算量。你可以统计令牌数的分布如图4所示它通常是一个重尾分布——大部分请求令牌数较少但少数请求非常长。这直接影响批处理Batching策略小请求适合批量处理以提高吞吐大请求则可能独占计算资源。成本估算结合Model字段可以精确估算处理该数据流所需的API成本或自建模型的推理成本。失败请求识别Response tokens为0是标识失败请求的直接方式。需要单独分析这些请求的特征。3.3 日志类型字段区分调用模式Log Type(日志类型)取值Conversation log(对话日志) 和API log(API日志)。实操要点这与Session ID相关联但提供了更明确的分类。对话日志通常来自ChatGPT网页界面或集成了对话功能的客户端其请求模式更贴近人类交互有来有回间隔随机。API日志则可能来自自动化脚本、集成应用其请求模式可能更具爆发性或规律性。在构建负载生成器时需要为这两种类型赋予不同的行为模型。4. 数据集使用指南与高级实践拿到数据只是第一步如何让它为你的研究服务才是关键。以下是我结合论文和实际经验总结的使用方法。4.1 基础使用数据加载与探索首先你需要将数据加载到分析环境中。这里以Python为例import pandas as pd import matplotlib.pyplot as plt # 加载数据以清洁版为例 df pd.read_csv(BurstGPT_without_fails_1.csv) # 查看数据概览 print(df.info()) print(df.head()) # 将Timestamp转换为易读的日期时间 base_time pd.Timestamp(2023-01-01 00:00:00) # 假设数据起始于2023-01-01实际需根据数据集说明确定 df[datetime] pd.to_timedelta(df[Timestamp], units) base_time # 设置时间为索引便于时间序列分析 df.set_index(datetime, inplaceTrue)加载后建议进行以下基础分析以熟悉数据绘制请求速率图按小时或分钟聚合请求数直观感受周期性和突发性。令牌分布分析绘制Request tokens和Response tokens的直方图与CDF累积分布函数理解负载特征。会话分析对非空的Session ID进行分组统计计算会话长度和持续时间的分布。4.2 核心操作流量缩放与模式建模这是BurstGPT数据集最强大的功能之一让你能基于真实模式构造出适合自己实验环境的负载。缩放平均RPS (Requests Per Second)论文中提到你可以根据你的评估设置来缩放轨迹中的平均RPS。假设原始数据集的平均RPS是λ_original而你希望你的模拟系统负载为λ_target。简单线性缩放适用于稳态分析你可以按比例α λ_target / λ_original对请求间隔时间进行缩放。例如如果你想将负载提高一倍可以将数据集中相邻请求的时间差除以2从而让请求来得更快。但这种方法会同时压缩所有时间模式可能失真。更保真的方法我推荐采用时间轴缩放。保持请求间的相对时间关系不变但改变整个时间轴的“流速”。或者更实际的方法是从数据中采样一段时间的请求然后通过控制请求发射器的速率来达到目标RPS同时保留原始请求的令牌数、模型类型等属性的分布。数据集example/目录下的请求生成器Demo正是这个思路的起点。对轨迹中的模式进行建模论文鼓励研究者对轨迹中的模式进行建模。这意味着不仅仅是重放数据而是从中抽象出数学模型以便生成无限长的、具有相同统计特性的合成轨迹。常见的可建模模式包括到达过程请求到达间隔时间Inter-arrival time的分布。它可能不是简单的泊松过程而是具有自相似性或突发性的更复杂分布如马尔可夫调制泊松过程MMPP。令牌数联合分布Request tokens和Response tokens的联合概率分布。你可以用二维直方图、核密度估计或Copula函数来拟合它。会话模型会话到达率、会话内请求数、请求间隔的分布。周期函数用一个以24小时和168小时一周为周期的函数来调制基础的请求速率。建立这些模型后你就可以用代码生成任意时长、任意强度的负载用于压力测试或算法比较而不再受限于原始数据集的长度和规模。4.3 利用示例代码与寻求帮助项目中的example/目录提供了一个简单的请求生成器Demo。这是一个极好的起点。它通常会展示如何读取CSV文件并按照时间戳顺序“回放”请求。你可以在此基础上进行修改加入模型延迟模拟为GPT-3.5和GPT-4设置不同的处理延迟函数。实现一个简单的客户端将生成的请求发送到你正在测试的LLM服务系统。加入流量缩放逻辑。如果你有特定的需求比如需要特定时间段的子集、特定模型的请求流或者对数据格式有疑问作者在README中明确表示欢迎通过邮件联系。在联系前请务必先仔细阅读论文和数据描述明确你的具体问题。5. 基于BurstGPT的LLM服务系统研究思路有了数据我们可以开展哪些具体的研究以下是一些直接且有价值的方向。5.1 研究方向一动态批处理与调度算法评估这是最直接的应用。你可以用BurstGPT作为输入负载在模拟器或测试平台上对比不同调度算法的表现。对比基准比较先进算法如Orca、SpotServe中提出的算法与经典FCFS先到先服务或最大令牌数优先等策略。评估指标关键指标包括吞吐量Tokens per Second、平均延迟、尾延迟P99延迟以及作业完成时间JCT。特别要注意在请求突发时段各种算法的表现差异。加入成本因素如果你的算法涉及权衡延迟与资源利用率成本可以将GPU时间作为成本指标纳入评估。5.2 研究方向二弹性资源分配与自动扩缩容利用数据集中强烈的周期性可以研究预测驱动的资源分配策略。负载预测使用前几周的数据训练时间序列预测模型如LSTM、Transformer预测未来几小时或第二天的请求量和令牌量。扩缩容策略基于预测结果模拟不同的扩缩容策略如阈值触发、预测触发。评估在保证SLO例如P95延迟2秒的前提下哪种策略能最大程度节省资源减少GPU使用小时数。混合部署考量如果数据中GPT-4请求占比可观可以研究异构资源不同型号GPU的分配策略以满足不同模型的差异化需求。5.3 研究方向三会话感知的缓存与优化利用Session ID字段可以深入研究面向对话场景的优化。会话连续性建模分析会话内请求的上下文重叠程度。这能指导KV缓存策略——哪些层的注意力输出可以持久化以加速同一会话内后续请求的推理。缓存策略评估模拟不同的会话缓存分配和淘汰策略如LRU、基于会话活跃度衡量其对减少重复计算、降低平均延迟的效果。长上下文会话处理针对那些Total tokens非常长的会话研究如何高效地进行上下文窗口管理和压缩。5.4 研究方向四失败分析与系统健壮性设计专门研究Response tokens为0的失败请求。失败关联性分析失败是否集中发生在特定时间段如全球高峰时段是否与特定模型GPT-4是否更容易失败或超长请求相关对调度的影响在模拟中引入基于真实失败分布的失败模型。评估你的调度器在遇到失败时是应该立即重试、加入重试队列还是直接返回错误。研究如何设计调度器来最小化局部失败对整体系统的影响。6. 实操注意事项与常见问题排查在实际使用BurstGPT数据集进行研究或开发时你可能会遇到一些典型问题。以下是我总结的一些避坑指南和解决方案。6.1 数据预处理中的陷阱时间戳处理确保正确理解Timestamp的原点。如果转换后的日期时间看起来不合理比如是未来或很久以前的日期很可能是原点设置错误。仔细查阅数据集发布页或论文确认起始日期。缺失值与异常值检查Session ID等字段的缺失值NaN。在分组统计时需要使用dropna()或填充策略。对于Elapsed time或令牌数中的极端大值可能是离群点需要决定是保留作为真实突发的一部分还是截断避免对平均指标产生过大影响。建议在报告中明确说明你的处理方式。内存管理尽管单个CSV文件只有几百MB但用Pandas加载并进行时间序列转换后内存占用会显著增加。如果处理全部数据内存不足可以考虑使用pd.read_csv的chunksize参数进行分块处理。仅加载必需的列usecols参数。将Timestamp等数值列转换为更节省空间的类型如float32。6.2 负载生成与模拟的保真度不要忽略“时间”的关联性最粗糙的负载生成方式是随机独立地采样每条记录的属性模型、令牌数。但这会破坏请求间的时间关联和会话结构导致生成的负载失去真实的突发性和会话连续性。务必保证请求到达时间序列的保真这是负载真实性的核心。模型延迟的模拟在模拟中你需要一个函数来根据Model和Response tokens可能还有Request tokens预测Elapsed time。一个简单的方法是使用数据集中相同条件下的实际延迟分布如分位数进行采样。更复杂的方法是建立一个参数化的延迟模型。切记不要使用一个固定的延迟值否则无法评估调度算法在延迟方差下的表现。资源建模你的模拟器需要有一个合理的底层资源模型如GPU内存带宽、计算能力。将令牌数转化为对这些资源的占用时间和空间是评估不同调度策略的关键。可以参考vLLM、TGI等开源推理引擎的性能剖析数据来构建这个模型。6.3 实验评估的严谨性热身期与稳定期在启动负载测试时系统从空载状态开始初始阶段的指标如延迟可能不具代表性。应在数据分析时剔除初始的“热身期”数据只取系统进入相对稳定状态后的数据。统计显著性由于负载具有随机性仅运行一次模拟就下结论是危险的。对于关键结论应进行多次独立实验例如使用不同的随机种子生成负载并报告指标的平均值和置信区间。对比的公平性对比不同算法时必须确保它们在完全相同的负载序列、相同的资源环境和相同的随机性条件下运行。任何微小的差异都可能导致不公的比较。BurstGPT数据集为我们打开了一扇窥视真实世界LLM服务负载的窗口。它的价值不仅在于其庞大的规模更在于其丰富的细节和真实性。从理解基本的日周期规律到构建复杂的负载模型用于驱动系统研究这个数据集都能提供坚实的基础。我个人的体会是在处理这类数据时耐心和细致至关重要——花时间做好数据探索和清洗理解每个字段背后的系统含义往往能让后续的研究工作事半功倍。最后别忘了参考原论文那里有作者对数据模式的深入分析能给你带来更多灵感。如果你在使用的过程中有新的发现或独特的应用方式也非常欢迎在社区分享共同推动LLM服务系统领域的发展。