直接回答
CPU threadCount 是某个运行时后端的配置输入,不是设备核心数的通用测量、并行 worker 数保证或性能结果。要评估它,应固定模型字节、解析后的运行时、backend、提示词或媒体夹具、输出规则、应用构建和设备条件,只改变 API 支持的 CPU 线程设置。比较 native 默认值与一小组预先声明且当前 API 接受的正数值。所有运行都要保留,包括初始化失败、输出错误、超时、热状态变化和用户取消;测试完成后只挑最快的成功样本不构成有效策略。 开始前先固定 API。LiteRT-LM Kotlin Config.kt 在 commit 84d96699d4b8712792c54dcface7a436dd8a4d92 中定义 Backend.CPU.threadCount 为 CPU 后端使用的线程数,并将 numOfThreads 标为弃用。旧字段保持未设置时,null 或 0 交由 native engine 使用默认值;Engine.kt 在 threadCount 为 null 时仍会回退读取 numOfThreads,因此不要混设两个字段,也不要把继承的旧正数值标成默认。这是不可变源码版本的证据,不证明 Cove 的 Gradle 依赖解析到了相同 API。项目构建使用动态依赖选择,因此真实报告应记录解析 artifact,并检查实际构造函数后再说字段存在。 把后端类型与 CPU 线程数分开。只有相关执行器使用 Backend.CPU 时,threadCount 参数才适用。GPU 或 NPU 请求是另一种配置,不能假装 CPU 数值控制了它。EngineConfig 分别包含 backend、visionBackend 和 audioBackend。在固定 Engine.kt 快照中,初始化逻辑为主 backend 与 audioBackend 分别提取 CPU 线程数,并没有展示单独传入 visionBackend 线程数的 native 参数。因此不能假定文本、图像和音频使用相同且可独立调节的线程设置。定义测试行前,要检查准确解析运行时和应用对各模态的配置映射。 当前 Cove InferenceEngine 有 CPU_THREADS 常量 4。它优先请求 GPU,失败时将主 backend 回退到 Backend.CPU(CPU_THREADS);audioBackend 单独配置为 CPU(CPU_THREADS),visionBackend 则复用主 backend。这只是当前源码配置快照,不是实际 worker 数量或四线程更快、更优、所有设备都支持、所有模态都采用同一设置的证据。未来实验可以把它作为一个具名基线,但应标成配置值,记录实际解析依赖和观察到的执行路径,而不是把它写成建议。 先定义任务及验收规则再采集。短文本生成、图像分析和音频转写使用不同执行器与输入预处理,不能混成一条线程数结果。用固定的非敏感夹具,固定语言、提示词、输出限制及语义或结构验收条件。如果某候选更快但没通过必要的内容或解析检查,它就不是等价结果。如果运行时内部线程数或实际后端无法观察,要把请求配置和不可观察边界分开记录。 同时收集任务结果与调度证据。Android Studio system trace 可显示指定交互中的应用和系统线程活动、CPU 核心调度以及 UI 渲染。它适合查看相关工作是否重叠或与 UI 竞争,但 trace 里的线程行不能单独证明哪个 native worker pool 属于 LiteRT-LM,也不能证明 runtime 执行了请求的精确线程数。记录 trace 时间窗和事件边界:引擎初始化、任务开始、首个可接受输出、任务终态及清理。若使用会增加运行开销的插桩 profiler,应记录方法,不能把其耗时直接等同生产运行。 控制试验顺序和热状态漂移。每个候选配置都使用相同充电状态、后台负载、应用状态和热测试规则。可在可行时交错或随机配置顺序,并按书面规则预热;冷初始化与重复推理要分开。记录全部样本、设备和系统构建、制品身份、运行时版本、backend 请求与可观察证据、threadCount 或 native 默认标记、任务夹具、计时边界、可用内存/热观察及失败。不要因为某次慢就丢弃,也不要比较不同夹具或应用构建后声称唯一变化是线程数。 只在测试范围内选择设置。如果显式值没有带来可重复且通过任务验收的好处、trace 显示竞争,或准确运行时无法确认其实际使用情况,工程决策可以保留默认值。也可能为已验证的 CPU 路径选择另一个显式值,但这仍不能证明 GPU、vision 或 audio 路径也应使用同样设置,除非每条路径都实际验证。没有 BENCHMARK-01 要求的原始记录以及 THERMAL-01 要求的重复固定工作负载和热状态证据时,不能发布 tokens/sec、时延提升、电量节省、内存变化或推荐线程数。 当前仓库没有完整真机基准数据。因此本文规定的是可审计的比较流程,不是结果。完整报告要写应用构建、解析运行时、准确 API 源版本、模型制品及摘要状态、设备/系统、后端与模态、线程设置、夹具、测量工具、运行顺序、热测试方法、输出验收及每个失败或不确定样本。无法观察的 backend 内部应标为未知。结论只适用于所测组合,不能变成设备支持声明、普适 CPU 调优规则,或模型与运行时升级后的默认保证。
CPU 回退需要线程设置的受控比较
团队维护一条本地模型路径,先请求 GPU,初始化失败时回退到 CPU。当前源码配置了 CPU 线程常量,但没有真机原始运行证明其他支持的值会改变任务完成、界面响应或热行为。
决策
把源码常量当成配置基线而非最优值,固定已解析的 LiteRT-LM API,并在同一制品、设备和任务下逐次比较 native 默认与明确 CPU 数值。
预期结果
团队可为所测 CPU 路径选择有限策略或保留默认值,同时分开报告请求线程数、观察路径、输出验收及不可见的内部调度。
需要收集的证据
只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:
- BENCHMARK-01:仓库没有完整真机基准集;结果主张需有设备、OS、制品、运行时、后端、输入、时延、内存、热状态和失败原始记录。
- THERMAL-01:单次推理不能证明持续表现;应重复固定工作负载并记录可用热状态、执行路径和失败,不编造结果。
- COVE-CPU-CONFIG-2026-10:固定提交 fbadbb48fd7abd43dd943b38450e8bc6c658fc04 的 InferenceEngine.kt 配置 CPU_THREADS=4;这是源码配置事实,不是测得的 worker 数、性能结果或最佳值。
只有记录了模型身份、构建配置、实际后端、任务样例和失败情况,运行时比较才可复核。
实施流程
- 固定实际解析 API 与执行器. 记录应用构建、解析到的 LiteRT-LM artifact、模型版本、设备/系统及准确 backend 字段。确认解析依赖确有 threadCount;固定上游源码仅是参考,不能证明应用使用同一版本。
- 定义一项工作负载及验收标准. 分别选择文本、视觉或音频任务,固定输入夹具、提示/预处理、输出预留和必要结果属性。引擎初始化和推理阶段要分开记录。
- 预先声明可比配置. 包含 native 默认标记和准确 API 支持的显式值。若相关,可把当前 Cove 常量记录为配置基线;不能称其最优或已经过性能测量。
- 收集计时和调度证据. 定义事件边界,并用 Android system trace 查看线程/核心调度与 UI 交互。记录 trace 能展示什么;它不能单独证明 LiteRT-LM 的每个 native worker 或请求线程数都被准确确认。
- 按受控热方法重复. 保持设备状态和夹具不变,执行同一预热规则,只改变线程设置;可行时交错运行顺序,并保留每次失败、回退及不确定观察。
- 只在证据范围内作决策. 除了资源观察,还要核对任务输出是否通过验收。按执行器和 backend 分开结果;没有有效原始记录时,不发布最佳值、速度、电量或兼容性结论。
让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。
验收标准
- 每次运行都绑定解析后的 LiteRT-LM API、准确制品、设备/系统、执行器/backend、任务夹具和 threadCount 或 native-default 设置。
- 每次只改变线程设置;初始化、首个输出、终态、回退、失败及热条件分别记录。
- 结论只限已测配置;没有原始验证证据时不发布推荐值、速度、电量、内存或设备支持声明。
决策对照表
| 维度 | 选择或证据 | 解读方式 |
|---|---|---|
| Native 默认值 | 在固定 API 中用 null 或 0,且旧 numOfThreads 不设置 | 先核对实际解析 API;默认是基线配置,除非运行时暴露结果,否则不等于已知 worker 数。 |
| 显式 CPU threadCount | 为 CPU 执行器请求一个受支持的正数 | 只测试这项配置,不会自动调整 GPU/NPU 或每一种模态。 |
| System trace 观察 | 查看具名任务中的线程和核心调度 | 提供调度和竞争上下文,但本身不能证明 runtime 内部 worker 精确数量或任务质量。 |
需要避免的失败模式
- 把 threadCount 当成 CPU 核数或实际 worker 数,或把当前源码常量当成经过测量的最佳配置。
- 在改变模型、任务、backend 或音频/视觉配置的同时改线程数,再把结果归因于线程档位。
还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。
最小复现记录
| 层级 | 记录内容 |
|---|---|
| 设备 | 厂商、型号、芯片、内存档位、操作系统版本 |
| 软件 | 应用版本和 Git 提交号 |
| 模型 | 系列、变体、版本、格式、文件长度、摘要、量化方式 |
| 运行时 | 名称、版本、请求后端及实际后端证据 |
| 工作负载 | 样例版本、输入摘要、提示词摘要、输出策略 |
| 结果 | 完成、失败、取消、回退及保护隐私的诊断信息 |
发布检查表
- ☐ 主要搜索问题已回答,且没有未经支持的数字。
- ☐ 所有模型文件和运行时版本均已固定。
- ☐ 代表性任务和失败处理策略均有说明。
- ☐ 生命周期、取消、清理和回退均已测试。
- ☐ 用户内容与网络边界均有说明。
- ☐ 结论只适用于被记录的配置。
- ☐ 新增测试结果时链接到原始方法或证据。
来源与相关证据
- Cove 基准测试方法
- LiteRT-LM 固定提交 Config.kt:CPU threadCount 定义
- LiteRT-LM 同一固定提交 Engine.kt:backend 线程参数传递
- Cove 固定提交 InferenceEngine.kt:当前 CPU 配置(非基准结果)
- Android Studio Profiler:录制 system trace
- Android Developers:线程与 CPU 资源
中文部署与排错专题见。奇连 AI 端侧专题。
常见问题
threadCount 为 4 是否代表使用四个 CPU 核?
不代表。它在固定 API 源码中是 CPU backend 配置值;实际调度、worker 创建、核心占用和任务收益必须在准确解析运行时与设备上另行观察。
null 或 0 是一个线程吗?
不是。固定实现中旧 numOfThreads 未设置时,它交由 native engine 使用默认值;threadCount 为 null 可能继承旧字段的正数。不要混设字段或把继承值误标为默认,实际选择不可观察时保持未知。
CPU 文本测试出的线程数可以用于视觉和音频吗?
不能直接推广。EngineConfig 有不同的 backend、visionBackend 和 audioBackend;固定 Engine 源分别处理主后端和音频 CPU 数量。每条相关路径都应单独核对 API 和测试。
没有真机原始记录可以公布更快的线程设置吗?
不可以。BENCHMARK-01 要求设备、制品、运行时、backend、输入、时延、内存、热状态和失败数据。证据不足时只能发布方法,性能结论保持未知。