Skip to main content

Library for balanced assignment optimization

Project description

Rebalancer

Rebalancer Logo

Rebalancer is an assignment solver library that provides a generic and intuitive API for defining any assignment problem and the ability to optimize the assignment given a variety of implemented algorithms.

An assignment problem is any problem that can be defined as a decision of how to assign objects to containers, such that each object is assigned to exactly one container, given that it satisfies a set of constraints/rules and optimizes a set of objectives/goals.

The core solver is written in C++ and runs in a single process with multi-threaded parallelism. Currently, it can handle problems with ~1M objects and containers reasonably well. It's easily extensible to support new solving algorithms and expressions. Independent of the problem definition the user can choose from multiple solving algorithms. The most common are:

  • Local search starts with an arbitrary assignment, and keeps performing simple moves (such as moving an object to a different container, swapping two objects, etc.) that are valid and improve the objective, until it can't find new improvements (or hits a user-defined moves limit or time limit). This solver is not guaranteed to find a global optimal solution, but it scales very well and can handle big problems.
  • Optimal solver (mixed-integer programming) represents the problem as a set of mixed-integer programming expressions, and solves it using a generic external library (Rebalancer currently supports two commercial solvers, FICO Xpress and Gurobi as well as the open source solver HiGHS). These solvers will find optimal solutions given enough time, but they don't scale to handle huge problems well.

There is a finite (but easily extensible) set of predefined expressions that can be used to represent goals and constraints. A few examples of popular ones:

  • Balance: make a given dimension balanced across containers. For example, say the objects are shards and containers are hosts, each shard has a given CPU utilization, and it is desired to distribute shards across hosts in a way that overall CPU utilization of all hosts is as similar as possible.
  • Capacity: limit a dimension within containers. For example, say each shard (object) has a memory requirement (dimension), each host (container) has a memory capacity (dimension), and it is required that the sum of memory required by all shards in a host doesn't exceed the memory capacity of the host.

Users interact with Rebalancer via an interface which is available in C++ and Python.

Installation

Ubuntu

# Prereqs
sudo apt install git pip python3-pex libfast-float-dev libgoogle-glog-dev clang-19 clang-tools-19 clang-format-19

# Build Thrift and Folly from source
git clone https://github.com/facebook/fbthrift.git
cd fbthrift/
./build/fbcode_builder/getdeps.py install-system-deps --recursive fbthrift
pip3 install pex --user
./build/fbcode_builder/getdeps.py --scratch-path ./installed --allow-system-packages build fbthrift
cd ..

# Clone
git clone https://github.com/facebookincubator/rebalancer.git

# Configure and build
cd rebalancer/build
cmake -GNinja \
  -DCMAKE_COLOR_DIAGNOSTICS=ON \
  -DCMAKE_PREFIX_PATH="$HOME/fbthrift/installed/installed/folly/lib/cmake/folly;$HOME/fbthrift/installed/installed/fbthrift/lib/cmake/fbthrift;$HOME/fbthrift/installed/installed/fmt/lib/cmake/fmt" \
  -DCMAKE_MODULE_PATH="$HOME/fbthrift/build/fbcode_builder/CMake" \
  -DCMAKE_BUILD_TYPE=Debug ..
ninja

HiGHS (open source MIP solver)

Pick one of the following:

# Option 1: Install via conda
conda install conda-forge::highs

# Option 2: Install via pip
pip install highspy

# Option 3: Build from source
git clone https://github.com/ERGO-Code/HiGHS.git
cd HiGHS && mkdir build && cd build
cmake -GNinja .. && ninja

macOS

Prerequisite: Install Homebrew if you don't have it. After installing, open a new terminal so the brew command is available (or run the eval "$(/opt/homebrew/bin/brew shellenv)" line the installer prints).

# Install dependencies
brew install cmake ninja boost fmt folly googletest fbthrift

# Clone
git clone https://github.com/facebookincubator/rebalancer.git

# Configure and build
cd rebalancer/build
cmake -GNinja \
  -DCMAKE_COLOR_DIAGNOSTICS=ON \
  -DCMAKE_PREFIX_PATH="/opt/homebrew/lib/cmake/folly;/opt/homebrew/lib/cmake/fbthrift;/opt/homebrew/lib/cmake/fmt" \
  -DCMAKE_BUILD_TYPE=Debug ..
ninja

Fedora

sudo dnf install boost-devel.x86_64 fbthrift-devel.x86_64 glog-devel.x86_64 gtest-devel.x86_64 gmock-devel.x86_64 fmt-devel.x86_64

Development Setup

Pre-commit hooks

This project uses pre-commit to run clang-format automatically before each commit.

pip install pre-commit
pre-commit install

To manually check all files:

pre-commit run --all-files

Notes on Contributing

A complexity of contributing to rebalancer is that it must compile both on Meta's build infrastructure as well as in the open source world. This dual requirement has led to a somewhat strange CMake design where CMake searches the entire directory tree for files it can build and then classifies them as library files, tests, benchmarks, or other executables. Anything that isn't a test, benchmark, or executable is bundled into the Rebalancer library which is linked against the executables. This means that if you add files to the project, you'll need to re-run CMake manually to ensure that it detects these files and bundles them.

Document/website development

  • Development
    • Enter the website/ directory.
    • Run yarn to install all the various things you'll want and need.
    • Run npm build to build the site.
    • Run npm run start to start a development server to preview the site.
  • Deployment
    • If you push a branch or make a pull request containing changes to the website/ directory or docs.yml that will launch a GitHub Action to rebuild the docs.
    • The deployment step will only step will only be run if the base branch is main or docs. This branches can only be committed to by members of the core development team.
  • View the website at: https://facebookincubator.github.io/rebalancer/

License

Rebalancer is licensed under the Apache 2.0 License. A copy of the license can be found here.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rebalancer-1.0.2.tar.gz (2.2 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rebalancer-1.0.2-cp314-cp314-manylinux_2_28_x86_64.whl (13.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

rebalancer-1.0.2-cp314-cp314-macosx_14_0_arm64.whl (25.4 MB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

rebalancer-1.0.2-cp313-cp313-manylinux_2_28_x86_64.whl (13.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

rebalancer-1.0.2-cp313-cp313-macosx_14_0_arm64.whl (25.4 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

rebalancer-1.0.2-cp312-cp312-manylinux_2_28_x86_64.whl (13.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

rebalancer-1.0.2-cp312-cp312-macosx_14_0_arm64.whl (25.4 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

File details

Details for the file rebalancer-1.0.2.tar.gz.

File metadata

  • Download URL: rebalancer-1.0.2.tar.gz
  • Upload date:
  • Size: 2.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rebalancer-1.0.2.tar.gz
Algorithm Hash digest
SHA256 7e02bacfd5ba4f63c61529d088083f5d642468a09ab75589091fedf0dd6369ac
MD5 86056eb957219f32cc0e80aed52be7b9
BLAKE2b-256 3081a498c637e75d0ddd324dd6980a4ac43c122c85ad72ebbce9cb6bce57b18c

See more details on using hashes here.

Provenance

The following attestation bundles were made for rebalancer-1.0.2.tar.gz:

Publisher: release.yml on facebookincubator/rebalancer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rebalancer-1.0.2-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for rebalancer-1.0.2-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 02c06e14b0e94b4aab9852728599f13816452f8517fce4a8a35711cbe6a3f7c0
MD5 3843d84ba144304702e2e698bbec2cd7
BLAKE2b-256 e4b64133499b89b85b2f9342ad9e597c8c4a9593fb26043a67bab34345419bc7

See more details on using hashes here.

Provenance

The following attestation bundles were made for rebalancer-1.0.2-cp314-cp314-manylinux_2_28_x86_64.whl:

Publisher: release.yml on facebookincubator/rebalancer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rebalancer-1.0.2-cp314-cp314-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for rebalancer-1.0.2-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 f8c18d3ecf2b609f169e88cae7fca73cabcacb039e9908be13a200a9cfcc5333
MD5 4d4135910883405228d59b386c22a353
BLAKE2b-256 b51446d20cf5ebe8e607d6c2b252028148b6343e4850bf071d0d018b8686b937

See more details on using hashes here.

Provenance

The following attestation bundles were made for rebalancer-1.0.2-cp314-cp314-macosx_14_0_arm64.whl:

Publisher: release.yml on facebookincubator/rebalancer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rebalancer-1.0.2-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for rebalancer-1.0.2-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a8617d72c5ff42d70b6d89e55c409cbd98fb51beb98218efa44a989c8032c982
MD5 d44d5fb61cf54978450c0937408320bc
BLAKE2b-256 8b4cc2f371f77b75de33e12706795d56a2662aee03095959ace40667a83a6167

See more details on using hashes here.

Provenance

The following attestation bundles were made for rebalancer-1.0.2-cp313-cp313-manylinux_2_28_x86_64.whl:

Publisher: release.yml on facebookincubator/rebalancer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rebalancer-1.0.2-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for rebalancer-1.0.2-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 57fe2923370d07eedf62980f1becf6867e2532f2e9f7e8570f7056269416b792
MD5 5c7c86d4dbee95482f94036c293e4a5b
BLAKE2b-256 6c3db6603008fda887ce727456e83d839206545ce7cddd4b4baec05b18ea8717

See more details on using hashes here.

Provenance

The following attestation bundles were made for rebalancer-1.0.2-cp313-cp313-macosx_14_0_arm64.whl:

Publisher: release.yml on facebookincubator/rebalancer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rebalancer-1.0.2-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for rebalancer-1.0.2-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 636774d099866c8b7d6061ca39d44e9f4d6c015ce666aed09f59ea04978f40b3
MD5 be02e7883901ace0ee1efdb5b9e6cfb7
BLAKE2b-256 4a80776f02ba8f3d052e8316a2be14aa4123e0a5f91ac9ef727b7d8a9c2e3bcd

See more details on using hashes here.

Provenance

The following attestation bundles were made for rebalancer-1.0.2-cp312-cp312-manylinux_2_28_x86_64.whl:

Publisher: release.yml on facebookincubator/rebalancer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rebalancer-1.0.2-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for rebalancer-1.0.2-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 0bf65cd00c385ceb88bc114751f12f4d7a759a7e151deaf750c35b852f348027
MD5 9e04a78ce29d2c4c65a348c245ea0859
BLAKE2b-256 324a39a5ed5d3f1d8ad452ac667cf7dd58c0a9f00f26f135bb15f5657248b113

See more details on using hashes here.

Provenance

The following attestation bundles were made for rebalancer-1.0.2-cp312-cp312-macosx_14_0_arm64.whl:

Publisher: release.yml on facebookincubator/rebalancer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page