跳转至

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)

工作流程

客户端请求 --> NaiveRouter --> 选择负载最低的 worker --> 转发请求
                                                      --> 返回结果
  1. 路由器接收到推理请求
  2. 查看所有 worker 的当前负载(正在处理的请求数)
  3. 选择负载最低的 worker
  4. 将请求转发给该 worker
  5. 返回 worker 的响应

核心类/函数列表

名称 类型 说明
NaiveRouter 类 FastAPI 负载均衡路由器
worker_loads 属性 记录每个 worker 的当前负载
launch_router_process 函数 在新进程中启动路由器

与其他模块的关系

  • 被 RewardModelManager(reward_model.py)使用
  • 与 inner_sglang_router.py 是可互换的路由器实现

小结

NaiveRouter 是一个极简的负载均衡器。它的"naive"体现在使用最简单的最低负载策略,没有复杂的健康检查、重试机制或一致性哈希。对于奖励计算这种场景已经足够。