simple_streaming_demo.py — 一个独立的演示脚本¶
文件路径: verl/experimental/fully_async_policy/unittest/simple_streaming_demo.py
文件概述¶
一个独立的演示脚本,展示了全异步训练中使用的流式处理模式。它不依赖 verl 的任何组件,纯粹用 asyncio 演示了"数据流 -> 并发处理 -> 结果消费"的三协程架构。
关键代码讲解¶
核心架构¶
class SimpleStreamingSystem:
def __init__(self, max_concurrent_tasks=4):
self.data_queue = asyncio.Queue() # 待处理数据队列
self.result_queue = asyncio.Queue() # 处理结果队列
async def run_demo(self):
# 三个并行协程
stream_task = asyncio.create_task(self.data_stream()) # 数据流(生产者)
submit_task = asyncio.create_task(self._submit_worker()) # 提交处理(调度器)
consumer_task = asyncio.create_task(self._consumer_worker()) # 消费结果
三个协程的职责¶
- data_stream - 模拟数据产生
async def data_stream(self):
test_data = [{"id": f"task_{i}", "content": f"data_{i}"} for i in range(8)]
await self.add_data_stream(test_data)
await asyncio.sleep(3) # 模拟间隔
extra_data = [{"id": f"extra_{i}", ...} for i in range(5)]
await self.add_data_stream(extra_data)
await self.data_queue.put("DONE") # 终止信号
- _submit_worker - 并发控制
async def _submit_worker(self):
active_tasks = set()
while True:
data_item = await self.data_queue.get()
if data_item == "DONE":
await asyncio.gather(*active_tasks, return_exceptions=True)
break
# 并发控制
while len(active_tasks) >= self.max_concurrent_tasks:
done_tasks, active_tasks = await asyncio.wait(
active_tasks, return_when=asyncio.FIRST_COMPLETED
)
task = asyncio.create_task(self._process_data_async(data_item))
active_tasks.add(task)
- _consumer_worker - 结果消费
async def _consumer_worker(self):
while True:
result = await asyncio.wait_for(self.result_queue.get(), timeout=2.0)
self.consumer_count += 1
print(f"Consumed: {result['id']}")
与全异步训练的对应关系¶
| 演示组件 | 全异步训练对应 |
|---|---|
data_stream |
FullyAsyncRollouter._feed_samples() |
_submit_worker |
FullyAsyncRollouter._processor_worker() |
_consumer_worker |
FullyAsyncTrainer._get_samples_from_queue() |
data_queue |
pending_queue |
result_queue |
MessageQueue |
核心类/函数列表¶
| 名称 | 类型 | 说明 |
|---|---|---|
SimpleStreamingSystem |
类 | 流式处理演示系统 |
main() |
异步函数 | 演示入口 |
与其他模块的关系¶
- 独立的演示脚本,不被任何模块依赖
- 展示了
FullyAsyncRollouter使用的核心异步模式
小结¶
这是一个教学用的演示脚本,帮助理解全异步训练的核心模式:数据流式输入、并发处理、结果异步消费。可以独立运行 python simple_streaming_demo.py 查看效果。