[2026春季][T2-1-2]DiFanrui#495
Open
DiFanrui wants to merge 3 commits into
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
伊里斯-赛题报告
摘要
本提交针对 InfiniLM 在 RTX 4090 24GB 上运行 Llama-3.1-8B-Instruct 的高并发与长文本服务场景进行调度优化。本组成员在调测过程中发现,原始调度在部分长输入或高并发 prefill/decode 交叠场景下会触发
cudaMalloc failed,使 RankWorker 停止并导致服务 unhealthy。改动将 prefill 与 decode 的 batch 上限拆分,并对真正的长输入实施保守保护,在保持小规模请求性能无明显下降的同时,提升高并发短输出场景吞吐,并消除已复现的长输入服务失效。受当前可用硬件与模型存储条件限制,本次提交仅完成 8B 模型的完整测试矩阵与优化验证,未对 70B 模型给出实测结果。本文所有性能数据、截图和结论均以 8B 模型为准;调度策略本身不依赖 8B 特有结构,理论上可迁移到 70B 服务,但仍需要在具备足够显存、模型存储和多卡通信条件的环境中单独验证。
环境与复现
InfiniLM commit:
7c1efb5模型:
Llama-3.1-8B-InstructGPU: NVIDIA RTX 4090 24GB, TP=1
KV cache:
--num-blocks 64,--block-size 256测试工具:
vllm bench serve测试范围:官方 8B 测试矩阵,共 30 个点
说明:本节参数为本组在 RTX 4090 24GB 单卡环境下针对 8B 测试矩阵调测得到的稳定配置,并不宣称为所有硬件和模型上的全局最优配置。
关键参数选择:
--num-blocks 64:在 4090 24GB 上可稳定运行完整 8B 矩阵。--max-batch-size 64:保留高并发请求的 admission 上限,实际 prefill/decode 批次由调度器环境变量进一步约束。INFINILM_PREFILL_BATCH_CAP=8:限制 prefill 阶段瞬时显存峰值。INFINILM_DECODE_BATCH_CAP=24:允许 decode 阶段使用更大的安全批次,提高输出吞吐。INFINILM_LONG_CONTEXT_THRESHOLD=4096与INFINILM_LONG_CONTEXT_MAX_BATCH=1:对真正长输入请求进行保守保护。INFINILM_DECODE_FIRST_WHEN_RUNNING=1:已有 decode 请求运行时延后新的长输入 prefill,避免长 prefill 与 decode 叠加触发 OOM。反例参数:
num-blocks=80/96:服务可启动,但在长输入 forward 时触发 OOM。block-size=128:触发 paged-attention/graph 编译失败。max-batch-size到 2 或 3:仍不能稳定解决长输入卡点,说明问题不只是请求数,而是 prefill/decode 阶段显存压力不同。复现启动命令:
优化内容
修改文件:
python/infinilm/llm/scheduler.py。INFINILM_PREFILL_BATCH_CAP与INFINILM_DECODE_BATCH_CAP:允许 prefill 保持保守批次以控制瞬时显存,同时让 decode 使用更大的安全批次以提升输出吞吐。INFINILM_LONG_CONTEXT_MAX_BATCH:默认只将prompt_len >= 4096的请求视为长上下文,避免把短输入、长输出误串行化。INFINILM_DECODE_FIRST_WHEN_RUNNING:当已有 decode 在运行时,延后新的长输入 prefill,避免长 prefill 与长 decode 重叠导致 OOM。问题与验证
本组在原始配置调测过程中,于以下点复现
cudaMalloc failed、RankWorker stopped与/health异常:启用本文调度策略后,长输入卡点稳定完成:
高并发分相位限批的消融结果:
边界与解释
output=4096的高并发受 KV 容量而非 decode kernel 限制。以input=256, output=4096为例,每个请求约需要ceil((256+4096)/256)=17个 block;64 个 block 只能容纳约 3 个完整请求。因此con=16测得 137.23 tok/s、Mean TPOT 19.61ms、Mean TTFT 176.76s。该现象是安全 admission 导致的排队,服务保持 healthy。不采用“只少预留几个 block”的激进策略,因为没有 KV swap/preemption 时,请求会在生成中途耗尽 block,风险从排队变成失败。
8B 测试矩阵运行结果
按照赛题给出的 8B 测试矩阵,本组共完成 30 个测试点,所有测试点均成功返回,服务保持 healthy。其中
con=16/64, in=256, out=256/1024采用参数扫描阶段中与官方矩阵完全相同配置的成功结果,其余高并发点来自最终续跑目录。结果上,短输出场景受益最明显:
con=64, in=32, out=256输出吞吐达到 1052.16 tok/s,con=64, in=256, out=256达到 725.92 tok/s。长输出场景的 TPOT/ITL 仍保持在约 19-21ms,但 TTFT 会随 KV 容量排队显著升高,这是 24GB 单卡与 64 个 KV block 下的容量边界。单并发基线与 decode 稳定性
为确认问题并非来自单请求 decode 性能,本组首先记录了 8B 模型在单并发下的基线表现。以下结果均使用 Flash Attention 与 Paged Attention,每个测试点 20 个请求。
结论:单流 decode 始终约 56 tok/s、TPOT 约 18ms;4096 输入主要增加 prefill/TTFT,而未破坏 decode 路径。这为后续将问题定位到“并发调度时的瞬时显存峰值”提供了对照。
并发基线与故障复现
在进一步调测中,
con=4, in=4096, out=1024于原始实现下复现cudaMalloc failed、RankWorker stopped和服务 unhealthy;con=16, in=256, out=256也复现相同类型的 failure。这说明仅按请求数准入并不足以覆盖长 prefill 或高并发 prefill/decode 交叠时的临时显存开销。参数扫描:排除不可靠路径
num-blocks=96/ block 256num-blocks=80/ block 256num-blocks=128/ block 128这组反例说明,问题不能通过单纯扩大 KV cache 或全局降低 batch size 稳定解决。最终方案需要区分 prefill 与 decode 阶段的显存压力,为两类阶段设置不同的安全上限。
优化迭代与消融
长输入保护的两次迭代
第一版策略仅限制同一轮 schedule 中的长输入请求数量,但新的长输入 prefill 仍可能与已经在运行队列中的 decode 请求交叠。在
con=4, in=4096, out=1024场景下,该版本仍会触发服务 unhealthy。第二版加入 decode-first 保护:当 running queue 非空时,新的长输入 prefill 会被延后调度,优先让已有 decode 请求继续推进。该策略避免了长输入 prefill 与 decode 阶段叠加造成的瞬时显存峰值,
con=4, in=4096, out=1024最终稳定完成 40/40 请求。随后,本组将 long-context 判定从“总长度达到 4096”收窄为默认仅
prompt_len >= 4096。这样可以只保护真正的长输入请求,避免把短输入、长输出请求误判为长上下文并强制串行化。以con=4, in=32, out=4096为例,该调整使输出吞吐从 108.46 提升到 137.01 tok/s,Median TTFT 从 73100ms 降至 66ms,同时长输入卡点仍保持稳定。长输入保护解决了服务稳定性问题,但高并发短输出场景仍会受到全局 batch 上限限制。为此,本组进一步将 prefill 与 decode 的 batch cap 拆分,使 prefill 保持保守批次以控制显存峰值,同时让 decode 使用更大的安全批次提升输出吞吐。
分相位 batch cap
从消融结果看,
decode=24对 con=16 场景收益有限,但在 con=64 短输出场景中,将输出吞吐从 631.06 提升到 725.92 tok/s,并将 Mean TPOT 从 29.07ms 降至 24.19ms、Mean ITL 从 28.96ms 降至 24.09ms。因此,本次 8B 提交采用prefill=8/decode=24作为最终配置。调度策略说明
该策略将稳定性保护集中在真正的长输入 prefill 上,同时避免短输入、长输出请求被不必要地串行化。对于普通短/中输入请求,decode 阶段可以使用更大的 batch cap 提升吞吐;对于真正长输入请求,则避免其 prefill 与正在执行的 decode 阶段叠加到不安全的瞬时显存峰值。
结果文件与审计
/root/autodl-tmp/bench-results-official-8b/*.log/root/autodl-tmp/bench-results-official-8b/*.json/root/autodl-tmp/bench-results-param-scan/doc_extern/实验过程记录与卡点分析.md最后 6 个测试矩阵点已由
doc_extern/run_remaining_official_8b.sh顺序完成;所有点均有日志或 JSON 可追溯。PR内容包括:
python/infinilm/llm/scheduler.pyT2-1-2_伊里斯_赛题报告.md测试结果截图
HONOR_CODE.md
2026 春季启元人工智能大赛诚信守则(Honor Code)
本人作为 2026 春季启元人工智能大赛(以下简称"比赛")的参赛选手,郑重承诺严格遵守比赛规则及本诚信守则,秉持诚信、公正、廉洁的参赛原则,自觉维护比赛的公平性与严肃性。本人充分理解并认可,违反本准则将导致参赛资格被取消、比赛成绩作废等相应后果,且愿意承担由此产生的一切责任。
一、参赛诚信承诺
本人保证所提交的赛题PR(Pull Request)中包含的算子实现代码及相关文档,均为本人(及参赛团队,如为团队参赛)在比赛期间独立完成或在明确标注参考来源的基础上进行开发,不存在任何欺诈、抄袭、作弊行为。
本人承诺主动、全面、真实地披露赛题实现过程中所有参考的外部资源,尤其是开源代码资源,不隐瞒任何可能影响比赛公平性的信息。
本人保证不采用任何不正当手段获取比赛优势,包括但不限于窃取其他参赛选手的代码成果、利用非比赛允许的工具或技术、与他人串通作弊等。
二、参考资源说明
本人确认已按比赛要求,将本次赛题实现过程中涉及的参考资源信息单独撰写至
REFERENCE.md文件中,该文件将与本诚信守则一同作为PR附件提交。REFERENCE.md需根据实际参考情况,按以下要求完整填写,信息不完整或虚假填写将视为违反本准则:情况1:无参考外部开源代码及核心实现思路
REFERENCE.md中需明确声明:"本次赛题提交的算子代码、核心算法逻辑及实现方案均为本人(及参赛团队)独立设计与开发,未参考任何外部开源项目、技术文档中的核心代码片段或实现思路,未接受任何第三方的技术指导或代码支持。"情况2:有参考外部开源代码及相关资源
对每个参考资源提供以下信息陈述:
参考开源项目/资源名称
参考资源链接(GitHub/Gitee/论文/技术文档等)
参考的具体内容(请明确说明参考的代码片段、算法逻辑、实现思路等,需标注对应资源的具体位置,如文件路径、代码行数等)
本人对参考内容的修改与优化说明:(请详细说明在参考基础上,本人所做的独立开发、修改、优化工作,体现自身技术贡献)
若是开源项目,提供参考资源的开源协议类型:(如MIT、Apache 2.0、GPL等)
其他需要补充说明的信息
三、禁止行为确认
本人明确知晓并承诺避免以下违反比赛公平性的行为,若存在以下任一情况,自愿接受比赛组委会的相应处罚:
未经授权复制、抄袭他人(包括其他参赛选手、开源项目、商业代码)的代码、算法或技术方案,且未进行明确标注;
隐瞒或虚假披露参考资源信息,包括遗漏重要参考来源、伪造参考内容说明等;
与其他参赛选手或第三方串通,进行代码共享、成果交换等违规协作;
利用比赛平台漏洞、技术缺陷或非比赛允许的工具获取不正当利益;
伪造比赛相关证明材料、提交虚假信息;
其他违反比赛规则及公序良俗的不诚信行为。
四、责任与确认
本人充分理解,比赛组委会将对所有提交的PR进行代码溯源、参考信息核查等公平性审查,若发现本人存在违反本准则的行为,有权随时取消本人的参赛资格、作废比赛成绩,情节严重的将在比赛相关平台进行公示。
若因本人违反本准则导致比赛争议或第三方权益受损(如开源协议侵权等),本人将独立承担全部法律责任及相关损失,与比赛组委会无关。
本人确认已仔细阅读并完全理解本诚信守则的全部内容,自愿签署本准则,接受比赛组委会的监督与审查。
五、签署信息
参赛选手姓名:李源,王柯翰,狄凡瑞
签署日期:2026年7月12日
REFERENCE
本次提交未复制外部开源项目的核心实现代码。优化工作基于比赛提供的 InfiniLM 仓库现有调度器实现,在
python/infinilm/llm/scheduler.py内进行小范围修改,并通过 vLLM benchmark 工具进行服务能力测试。1. 比赛提供的 InfiniLM 仓库
python/infinilm/llm/scheduler.py中已有 waiting/running queue、Paged Attention KV cache admission、prefill/decode scheduling 流程。2. vLLM benchmark serve
vllm bench serve作为压测工具,采集 TTFT、TPOT、ITL、吞吐等指标。3. AI工具