naive_router.py — 实现了一个基于 FastAPI 的简单负载均衡路由器 NaiveRouter¶
文件路径:
verl/experimental/reward_loop/router/naive_router.py
文件概述¶
实现了一个基于 FastAPI 的简单负载均衡路由器 NaiveRouter,用于将推理请求分发到多个 LLM 推理服务实例。采用"最低负载"(least-loaded)策略选择目标服务器。
关键代码¶
NaiveRouter 类¶
class NaiveRouter:
"""基于 FastAPI 的简单负载均衡路由器"""
def __init__(self, worker_urls: list[str]):
self.worker_urls = worker_urls
self.worker_loads = {url: 0 for url in worker_urls}
self.app = FastAPI()
self._setup_routes()
def _setup_routes(self):
@self.app.post("/v1/chat/completions")
async def chat_completions(request: Request):
# 选择负载最低的 worker
target_url = min(self.worker_loads, key=self.worker_loads.get)
self.worker_loads[target_url] += 1
try:
# 转发请求到选中的 worker
response = await self._forward_request(target_url, request)
return response
finally:
self.worker_loads[target_url] -= 1
启动路由器¶
def launch_router_process(worker_urls: list[str], port: int):
"""在独立进程中启动路由器"""
router = NaiveRouter(worker_urls)
import uvicorn
uvicorn.run(router.app, host="0.0.0.0", port=port)
工作流程¶
- 路由器接收到推理请求
- 查看所有 worker 的当前负载(正在处理的请求数)
- 选择负载最低的 worker
- 将请求转发给该 worker
- 返回 worker 的响应
核心类/函数列表¶
| 名称 | 类型 | 说明 |
|---|---|---|
NaiveRouter |
类 | FastAPI 负载均衡路由器 |
worker_loads |
属性 | 记录每个 worker 的当前负载 |
launch_router_process |
函数 | 在新进程中启动路由器 |
与其他模块的关系¶
- 被
RewardModelManager(reward_model.py)使用 - 与
inner_sglang_router.py是可互换的路由器实现
小结¶
NaiveRouter 是一个极简的负载均衡器。它的"naive"体现在使用最简单的最低负载策略,没有复杂的健康检查、重试机制或一致性哈希。对于奖励计算这种场景已经足够。