OpenNetLab / AlphaRTC

Evaluation framework for RL-based bitrate control for WebRTC
BSD 3-Clause "New" or "Revised" License
94 stars 37 forks source link

AlphaRTC

main
dev
issues
commits

Motivation

AlphaRTC is a fork of Google's WebRTC project using ML-based bandwidth estimation, delivered by the OpenNetLab team. By equipping WebRTC with a more accurate bandwidth estimator, our mission is to eventually increase the quality of transmission.

AlphaRTC replaces Google Congestion Control (GCC) with two customized congestion control interfaces, PyInfer and ONNXInfer. The PyInfer provides an opportunity to load external bandwidth estimator written by Python. The external bandwidth estimator could be based on ML framework, like PyTorch or TensorFlow, or a pure Python algorithm without any dependencies. And the ONNXInfer is an ML-powered bandwidth estimator, which takes in an ONNX model to make bandwidth estimation more accurate. ONNXInfer is proudly powered by Microsoft's ONNXRuntime.

If you are preparing a publication and need to introduce OpenNetLab or AlphaRTC, kindly consider citing the following paper:

@inproceedings{eo2022opennetlab,
  title={Opennetlab: Open platform for rl-based congestion control for real-time communications},
  author={Eo, Jeongyoon and Niu, Zhixiong and Cheng, Wenxue and Yan, Francis Y and Gao, Rui and Kardhashi, Jorina and Inglis, Scott and Revow, Michael and Chun, Byung-Gon and Cheng, Peng and Xiong, Yongqiang},
  booktitle={Proceedings of the 6th Asia-Pacific Workshop on Networking},
  pages={70--75},
  year={2022}
}

Environment

We recommend you directly fetch the pre-provided Docker images from opennetlab.azurecr.io/alphartc or Github release

From docker registry

docker pull opennetlab.azurecr.io/alphartc
docker image tag opennetlab.azurecr.io/alphartc alphartc

From github release

wget https://github.com/OpenNetLab/AlphaRTC/releases/latest/download/alphartc.tar.gz
docker load -i alphartc.tar.gz

Ubuntu 18.04 or 20.04 is the only officially supported distro at this moment. For other distros, you may be able to compile your own binary, or use our pre-provided Docker images.

Compilation

Option 1: Docker (recommended)

To compile AlphaRTC, please refer to the following steps

  1. Prerequisites

    Make sure Docker is installed on your system and add user to docker group.

    # Install Docker
    curl -fsSL get.docker.com -o get-docker.sh
    sudo sh get-docker.sh
    sudo usermod -aG docker ${USER}
  2. Clone the code

    git clone https://github.com/OpenNetLab/AlphaRTC.git
  3. Build Docker images

    cd AlphaRTC
    make all

    You should then be able to see two Docker images, alphartc and alphartc-compile using sudo docker images

Option 2: Compile from Scratch

If you don't want to use Docker, or have other reasons to compile from scratch (e.g., you want a native Windows build), you may use this method.

Note: all commands below work for both Linux (sh) and Windows (pwsh), unless otherwise specified

  1. Grab essential tools

    You may follow the guide here to obtain a copy of depot_tools

  2. Clone the repo

    git clone https://github.com/OpenNetLab/AlphaRTC.git
  3. Sync the dependencies

    cd AlphaRTC
    gclient sync
    mv src/* .
  4. Generate build rules

    Windows users: Please use x64 Native Tools Command Prompt for VS2017. The clang version comes with the project is 9.0.0, hence incompatible with VS2019. In addition, environmental variable DEPOT_TOOLS_WIN_TOOLSCHAIN has to be set to 0 and GYP_MSVS_VERSION has to be set to 2017.

    gn gen out/Default
  5. Compile

    ninja -C out/Default peerconnection_serverless

    For Windows users, we also provide a GUI version. You may compile it via

    ninja -C out/Default peerconnection_serverless_win_gui

Demo

AlphaRTC consists of many different components. peerconnection_serverless is an application for demo purposes that comes with AlphaRTC. It establishes RTC communication with another peer without the need of a server.

In order to run the application, you will need a configuration file in json format. The details are explained in the next chapter.

In addition to the config file, you will also need other files, such as video/audio source files and an ONNX model.

To run an AlphaRTC instance, put the config files in a directory, e.g., config_files, then mount it to an endpoint inside alphartc container

sudo docker run -v config_files:/app/config_files alphartc peerconnection_serverless /app/config_files/config.json

Since peerconnection_serverless needs two peers, you may spawn two instances (a receiver and a sender) in the same network and make them talk to each other. For more information on Docker networking, check Docker Networking

Configurations for peerconnection_serverless

This section describes required fields for the json configuration file.

Use PyInfer or ONNXInfer

PyInfer

The default bandwidth estimator is PyInfer, You should implement your Python class named Estimator with required methods report_states and get_estimated_bandwidth in Python file BandwidthEstimator.py and put this file in your workspace. There is an example of Estimator with fixed estimated bandwidth 1Mbps. Here is an example BandwidthEstimator.py.

class Estimator(object):
    def report_states(self, stats: dict):
        '''
        stats is a dict with the following items
        {
            "send_time_ms": uint,
            "arrival_time_ms": uint,
            "payload_type": int,
            "sequence_number": uint,
            "ssrc": int,
            "padding_length": uint,
            "header_length": uint,
            "payload_size": uint
        }
        '''
        pass

    def get_estimated_bandwidth(self)->int:
        return int(1e6) # 1Mbps
ONNXInfer

If you want to use the ONNXInfer as the bandwidth estimator, you should specify the path of onnx model in the config file. Here is an example configuration receiver.json

Run peerconnection_serverless

Who Are We

The OpenNetLab is an open-networking research community. Our members are from Microsoft Research Asia, Tsinghua Univeristy, Peking University, Nanjing University, KAIST, Seoul National University, National University of Singapore, SUSTech, Shanghai Jiaotong Univerisity.

WebRTC

You can find the Readme of the original WebRTC project here