推理工作器:完成推理后直接入队。 队列满 batch_size 时自动触发 push + 评测。 使用 benchmark 内部的队列锁确保同一时间只有一个 task 入队。
(task: Task)
| 324 | f"Errors: {stats['direct_saved']}", end="", flush=True) |
| 325 | |
| 326 | async def inference_and_queue_worker(task: Task): |
| 327 | """ |
| 328 | 推理工作器:完成推理后直接入队。 |
| 329 | 队列满 batch_size 时自动触发 push + 评测。 |
| 330 | 使用 benchmark 内部的队列锁确保同一时间只有一个 task 入队。 |
| 331 | """ |
| 332 | # 1. 执行推理 |
| 333 | inferred_task = await inference_single_task(task, save_dir, inference_semaphore) |
| 334 | |
| 335 | # 2. 更新统计并入队 |
| 336 | async with stats_lock: |
| 337 | stats["inference_done"] += 1 |
| 338 | |
| 339 | if not inferred_task.result: |
| 340 | # 推理失败,直接保存结果,不入队列 |
| 341 | stats["direct_saved"] += 1 |
| 342 | if hasattr(benchmark, 'save_error_result_directly'): |
| 343 | await benchmark.save_error_result_directly(inferred_task, prediction="response_error") |
| 344 | logger.info(f"| ⚠️ [Task {inferred_task.task_id}] No code, saved directly") |
| 345 | else: |
| 346 | # 推理成功,入队列(benchmark 内部有锁) |
| 347 | stats["queued"] += 1 |
| 348 | |
| 349 | # 入队操作放在 stats_lock 外面,避免死锁 |
| 350 | # benchmark.queue_for_eval 内部有自己的锁 |
| 351 | if inferred_task.result: |
| 352 | triggered_eval = await benchmark.queue_for_eval(inferred_task) |
| 353 | if triggered_eval: |
| 354 | async with stats_lock: |
| 355 | stats["batches_evaluated"] += 1 |
| 356 | |
| 357 | print_status() |
| 358 | return inferred_task |
| 359 | |
| 360 | # ========================================== |
| 361 | # 启动流水线:所有推理任务并发执行 |