-
auo4 AI 观察 用户
Meta 把内部用了九年多的分配问题求解器 Rebalancer 开源了,Apache 2.0 协议,C++ 核心,Python 接口,PyPI 上直接能装。这不是玩具项目——它现在每天要在 Meta 的基础设施里解大约 4000 万个分配问题,覆盖 30 多种不同的建模方式。配套论文《Optimizing Resource Allocation in Hyperscale Datacenters》发表在 OSDI'24。
分配问题到底是什么
一句话:给定一组对象和一组箱子(bin),怎么把对象放进箱子,在满足一组约束的同时把某个目标做到最好。
在 Meta 的基础设施栈里无处不在:机架摆进数据中心(优化电力故障域分布、遵守供电散热上限)、服务器分给服务(兼顾容错与装箱效率)、任务落到服务器(遵守 CPU 内存限制)、数十亿用户的流量引到地理分散的数据中心(优化延迟与负载)。
做可复用框架的难处有两道。一是可用性:工程师脑子里装的是业务策略,不是目标函数和约束矩阵,翻译成严谨数学表达的成本极高。二是可扩展性:这类问题本质 NP-hard,规模一大商业求解器直接算不动。Rebalancer 的解法是把「怎么描述问题」和「怎么求解」彻底拆开。
描述这一侧:三层抽象
第一层是基本构件:dimension(对象与箱子的现实属性,如 CPU、内存、存储、功耗)、partition(对象分组)、scope(箱子分组,如一个机架里的服务器)、utilization(被分配对象产生或消耗的贡献)。第二层是表达式接口:多个箱子的利用率可以用 SUM、MAX 聚合,用 SQUARE、ABS 变换,并支持递归嵌套。第三层是高层 spec API:CapacitySpec 管容量上限,GroupCountSpec 管分组怎么散开,BalanceSpec 表达均衡目标,每个 spec 相当于一个预定义配方,吃进去构件和参数、吐出一个数学公式。
求解这一侧:一图两路
描述完,Rebalancer 把它编译成一张有向无环图,叫表达式图:叶子是某个箱子的利用率,上层是 Max、Sum 这类聚合节点和 Square、Abs 这类变换节点。每个节点的值都依赖当前分配,动一下就得重算——求解器效率几乎决定了整个东西能不能用。
最优求解器(MIP):把表达式图翻译成混合整数规划,交给 FICO Xpress、Gurobi 或开源 HiGHS。翻译时用二元决策变量表示「对象是否被分到这个箱子」,几十万对象乘几千箱子规模会很恐怖。Rebalancer 会自动用变量聚合、可交换性分析和对称性破缺压缩,但最坏规模仍是二次的 O(|对象| × |箱子|)——Meta 最大的那批问题,任何 MIP 求解器都装不下。
局部搜索求解器:直接在表达式图上操作,把对象挪到另一个箱子来探索邻域,最坏规模是线性的 O(|对象| + |箱子|),再大的问题也不爆内存。每次移动生成一个候选分配,评估后挑那个不违反约束且目标改善最大的应用,反复迭代直到没进展或超时。这套算法被重度并行化,每秒能完成数百万次评估,还懂得从一开始就剪枝。
选哪条路看需求:Meta 内部几乎所有大规模问题都用局部搜索,中小规模常用最优求解器。常见做法是先用最优求解器做原型、确定基线解,再迁移到局部搜索。
规模数据
Meta 每天约解 4000 万个分配问题,30 多种独特建模,平均每秒约 463 次求解;26.5 万对象、3200 个箱子的问题 P99 求解 12 秒,超过 100 万对象、5000 个箱子的平均 171 秒,这类运行每天超过 3400 次。核心求解器 C++ 编写,单进程多线程并行,约 100 万对象和容器规模表现良好。
作为参照,26.5 万对象放进 3200 个箱子,可能的分配数是 3200 的 26.5 万次方,写出来接近 92.9 万位数字。所以现实中没有系统真去枚举,区别只在于你的启发式是写成模型,还是埋在一段循环里。
上手与调试
官方 Quick Example 是四个任务两台主机,host0 挤了三个、host1 一个,加一条内存容量约束,让 Rebalancer 找出 2-2 的均衡分配。核心调用依次是 set_object_name("task")、set_container_name("host")、set_assignment({...})、add_object_dimension("memory", {...})、add_container_dimension("memory", {}, default_value=20.0),再挂上 CapacitySpec 约束和 LocalSearchSolverSpec,最后 solver.solve()。其中 set_assignment 是关键:喂进去现有分配,它才叫「再均衡」,也是后面做抖动控制的挂钩。
安装方面 pip install rebalancer 即可,仓库另提供 Debian 包和 Homebrew formula,源码编译支持 Ubuntu、macOS、Fedora。要用最优求解模式需另配 HiGHS、Gurobi 或 FICO Xpress 之一(后两个商业许可)。
建模变简单之后,Meta 发现工程师的时间大头转向了调试求解器行为:哪些约束是紧约束、放宽某个约束会怎样、为什么这个对象进了这个箱子。随开源一起发布的 Rebalancer Explorer 就是干这个的——一个 Docker 化的 Web UI,可浏览对象、容器、约束和目标,看某个解在这些维度上的得分。从仓库根目录 docker compose up --build 再打开 http://localhost:3000 就能用,里面预置了 sudoku、eightqueens 等示例问题包。
不只是机房
在 Meta 内部,它支撑了 Shard Manager(分片分给服务器)、RAS(服务器分给服务)、Taiji(全球边缘流量路由到主数据中心)、无服务器函数分组提局部性、跨地域均衡在线 ML 训练负载等场景,也被拿去解非基础设施问题:会议分到会议室以缩短通勤、支持工单分给工程师、优化工位摆放。
Meta 在公告里明确说,分配问题在医疗、能源与公用事业、交通运输物流、教育、应急响应等领域同样大量存在,而他们自己不具备把这些领域落地的能力,「但我们希望其他人具备,并且会去应用」。
项目地址:https://github.com/facebook/rebalancer 文档:https://facebook.github.io/rebalancer/ PyPI:https://pypi.org/project/rebalancer 来源:Meta Engineering 官方博客「Open-Sourcing Rebalancer: A Generic, High-Performance Library for Solving Assignment Problems」