Prhub

#32095 Add Inkling per-commit server test

原始 PR 作者 ispobock 合并时间 2026-07-22 23:56 文件变更 1 提交数 1 评论 3 代码增减 +191 / -0

执行摘要

添加 Inkling per-commit 端到端服务器测试

Inkling 模型使用了混合注意力(SWA/sconv)和 MoE 等多层架构,需要频繁的代码变更。此前只有 8-GPU nightly 测试覆盖准确率,缺乏快速提交级测试来捕获代码路径崩溃或回归。该 PR 添加了一个约 5 分钟的服务器测试,在每次提交时验证生成、推理解析器、多模态和 radix tree 一致性,作为 CI 门禁。

该 PR 展示了如何为复杂模型设计快速端到端 CI 测试,值得借鉴在测试中启动服务器、配置特定参数、覆盖多模态等做法。但测试本身较为简单,没有深入验证数值正确性。建议后续可以增加对输出的结构验证和更广泛的多模态场景。

讨论亮点

该 PR 没有产生 Review 讨论。评论仅包括机器人自动回复的 rerun 测试命令和结果。PR 由作者自行合并。

实现拆解

  1. 创建测试文件 test/registered/models/test_inkling.py,包含 TestInklingServer 类继承 CustomTestCase
  2. setUpClass 类方法通过 popen_launch_server 启动一个小的 Inkling 模型服务器(使用 HF test 修订版检查点),指定必要参数如 --attention-backend fa4--page-size 128--mamba-radix-cache-strategy extra_buffer--reasoning-parser inkling--enable-multimodal 等。同时设置环境变量 SGLANG_ENABLE_UNIFIED_RADIX_TREE=1 以启用统一 radix tree 用于日志一致性测试。
  3. tearDownClass 终止服务器进程。
  4. 定义辅助方法 _chat 用于发送聊天请求。
  5. 实现三个测试用例:
    • test_generation_basic:通过 /generate 端点测试文本生成,确保返回非空文本。
    • test_reasoning_parser_separates_thinking:测试 inkling 推理解析器,当设置 thinking=True 时,模型应该将推理过程放入 reasoning_content 字段,最终回答放入 content
    • test_multimodal_image_is_consumed:构造一个包含图片的对话,验证服务端能够处理图片并返回非空回复。
  6. 此外,导入了 kl_test_utils 中的 assert_logprobs_match 函数,用于统一 radix tree 日志一致性验证(当前测试组中没有直接调用,可能是框架预留)。
  7. 通过 register_cuda_ci 注册该测试到 CI,分配 base-b 阶段,使用 1-gpu-large 运行器,预计耗时 600 秒。
文件 模块 状态 重要度
test/registered/models/test_inkling.py 测试 added 7.64

关键符号

_small_image_data_uri setUpClass tearDownClass _chat test_generation_basic test_reasoning_parser_separates_thinking test_multimodal_image_is_consumed

关键源码片段

test/registered/models/test_inkling.py test-coverage

唯一的变更文件,新增 Inkling 模型的 per-commit 端到端测试,覆盖生成、推理解析、多模态和 radix tree 日志一致性。

    def test_generation_basic(self):
        # 使用三个简单提示逐一测试基本文本生成
        prompts = [
            'The capital of France is',
            '1 + 2 + 3 + 4 + 5 =',
            'Write a haiku about silicon:',
        ]
        for prompt in prompts:
            resp = requests.post(
                f'{self.base_url}/generate',
                json={
                    'text': prompt,
                    'sampling_params': {'temperature': 0.0, 'max_new_tokens': 16},
                },
                timeout=60,
            )
            # 检查 HTTP 响应状态码
            self.assertEqual(resp.status_code, 200, resp.text)
            data = resp.json()
            # 验证存在文本字段且非空
            self.assertIn('text', data, data)
            self.assertGreater(len(data['text'].strip()), 0, data)

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

主要风险来自测试环境和外部依赖:测试需要下载 Hugging Face 检查点,如果网络不稳定可能导致超时;测试需要 PIL 库(生成图片),若缺失会导致测试失败;测试服务器启动依赖于 GPU 可用性,多测试并行可能导致资源竞争;测试未覆盖准确率,不能发现模型质量退化;测试断言较为简单,可能遗漏某些非崩溃性错误。

对用户无直接影响。对开发团队:在 CI 中增加约 5 分钟的测试运行时间,提高了 Inkling 模型代码变更的信心。对 CI 流水线:新增一个 base-b 阶段任务,需要 1-GPU 资源。对后续开发:每次修改 Inkling 相关代码都会触发该测试,有助于及早发现回归。

测试环境稳定性 外部库依赖(PIL) 无准确率验证

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论