执行摘要
- 一句话:新增主动中断推理请求的/v1/abort_requests端点,支持中止特定或全部请求。
- 推荐动作:建议精读此PR以理解主动控制接口的设计模式,特别关注并发安全和API一致性讨论。对于类似功能开发,可参考其实现,但需注意修复review中提出的风险点,如加锁保护、统一参数名和补充测试。
功能与动机
PR body中说明:'Currently, the logic for interrupting requests and stopping inference can only be triggered by the client disconnecting. Since there is no interface for active triggering, this new endpoint is required to encapsulate and expose the existing internal capabilities.' 即需提供主动触发接口来封装和暴露现有内部能力。
实现拆解
- API层:在
fastdeploy/entrypoints/openai/api_server.py和fastdeploy/router/router.py新增/v1/abort_requests端点,处理HTTP请求并转发控制方法。
- Engine层:在
fastdeploy/engine/common_engine.py新增_control_abort_requests方法,根据参数abort_all或req_ids确定目标请求列表,收集部分结果并触发中止逻辑,包括调用resource_manager.add_abort_req_ids。
- 资源管理:在
fastdeploy/engine/sched/resource_manager_v1.py新增get_reqs_in_aborting方法,支持查询中止中请求状态。
- 响应处理:在
fastdeploy/entrypoints/openai/serving_chat.py和serving_completion.py中,根据错误消息标记aborted请求的finish_reason为'abort'。
- 文档更新:在
docs/online_serving/README.md和router.md中添加端点说明和使用示例。
- 测试:新增测试文件覆盖api_server、router和engine的功能。
关键文件:
fastdeploy/entrypoints/openai/api_server.py(模块 APIServer): 新增/v1/abort_requests端点,处理API请求并调用engine控制方法,是用户直接交互的接口。
fastdeploy/router/router.py(模块 Router): 新增/v1/abort_requests端点,转发请求到所有服务器并聚合结果,支持分布式环境下的请求中止。
fastdeploy/engine/common_engine.py(模块 Engine): 实现_control_abort_requests方法,包含核心中止逻辑、并发处理和部分结果收集,是功能的核心实现。
fastdeploy/engine/sched/resource_manager_v1.py(模块 Scheduler): 新增get_reqs_in_aborting方法,支持查询中止中请求状态,是资源管理的关键扩展。
tests/engine/test_common_engine.py(模块 Testing): 新增测试覆盖_control_abort_requests方法,验证功能正确性和边界条件,但review指出测试可能不足。
关键符号:_control_abort_requests, abort_requests, get_reqs_in_aborting
评论区精华
- 参数命名争议:mitu626评论'abort_all 还是 stop_all',Copilot指出文档使用
stop_all而实现使用abort_all,导致API不一致,建议统一字段名。
- 并发安全风险:Copilot评论在
_control_abort_requests中遍历resource_manager.requests和scheduler.requests时未加锁,可能抛出'dictionary changed size during iteration'异常;get_reqs_in_aborting方法中集合运算也存在并发问题,建议加锁或使用线程安全接口。
- 测试覆盖不足:Copilot建议为router和api_server的新端点补充单元测试,以确保关键行为(如转发逻辑、参数校验)得到覆盖。
- 协议兼容性问题:Copilot指出
finish_reason值'abort'不在协议定义中,可能导致Pydantic校验错误,建议修改为合法值或更新协议。
- 超时设置缺失:Copilot评论router端请求转发时未设置超时,可能导致线程挂起,建议添加超时配置。
- 参数命名一致性 (design): 未解决,建议统一字段名(如使用abort_all)并更新文档。
- 并发安全风险 (correctness): 建议在resource_manager和scheduler中加锁保护或使用线程安全接口,但当前实现未修复。
- 测试覆盖不足 (testing): PR中已添加部分测试(如test_common_engine.py),但router端测试可能不充分,建议进一步补充。
- 协议兼容性问题 (correctness): 未解决,需调整代码或协议以避免运行时错误。
风险与影响
- 风险:1. 并发安全风险:在
fastdeploy/engine/common_engine.py的_control_abort_requests方法中,直接遍历self.resource_manager.requests.keys()和self.scheduler.requests.keys(),未加锁保护,在多线程环境下可能引发运行时错误。
2. API不一致风险:文档中参数名为stop_all,而代码实现使用abort_all,客户端调用时可能导致400错误或功能失效,影响用户体验。
3. 协议错误风险:finish_reason值'abort'未在协议文件(如protocol.py)中定义,非流式路径中可能触发Pydantic校验失败,导致接口返回500错误。
4. 测试覆盖不足风险:尽管已添加部分测试,但router端和api_server端的新端点测试可能不充分,回归风险较高。
5. 超时风险:router端请求转发时未设置超时,当服务器不可达时可能导致请求挂起,影响系统稳定性。
- 影响:1. 用户影响:提供了主动中断推理请求的能力,便于资源管理和调试,但需注意API参数名可能变更,需更新客户端代码。
2. 系统影响:增强了控制平面功能,可释放GPU内存(KV Cache)和计算资源,可能影响现有请求调度和资源回收逻辑。
3. 团队影响:工程师需关注并发安全和API设计一致性,后续维护中需解决review中未决的疑虑,如参数命名和协议更新。
- 风险标记:并发安全风险, API不一致, 缺少测试覆盖, 协议错误
关联脉络
- PR #7042 [RL] Adapt async rollout checkpoint update flow: 同样涉及控制接口(update_weights)的修改,共享设计模式和APIServer集成,可作为参考。
参与讨论