Exemple #1
0
def attach_plot_components(
    video: str,
    server: Server,
    trace: Optional[str] = None,
    bandwidth: Optional[int] = None,
    no_plot: bool = False,
) -> Dict[str, LivePlot]:
    """
    Attach multiple plot components with diverse metrics to react to and plot
    Monitor-generated metrics.
    """
    segments = get_video_chunks(video) + 1
    max_playback = int(1.25 * get_approx_video_length(video))

    if no_plot:
        (server.add_post('/raw_qoe', do_nothing).add_post(
            '/rebuffer', do_nothing).add_post('/quality', do_nothing).add_post(
                '/vmaf',
                do_nothing).add_post('/vmaf_qoe',
                                     do_nothing).add_post('/bw', do_nothing))
        return {}
    plots = {
        'raw_qoe':
        LivePlot(figure_name='qoe', y_label='raw qoe', range_size=segments),
        'rebuffer':
        LivePlot(figure_name='rebuffer',
                 y_label='rebuffer',
                 range_size=segments),
        'quality':
        LivePlot(figure_name='quality', y_label='quality',
                 range_size=segments),
        'vmaf':
        LivePlot(figure_name='vmaf', y_label='vmaf', range_size=segments),
        'vmaf_qoe':
        LivePlot(figure_name='vmaf_qoe',
                 y_label='vmaf qoe',
                 range_size=segments),
        'bw':
        BandwidthPlot(
            figure_name='bw',
            y_label='bw estimation(mbps)',
            trace=trace,
            bandwidth=bandwidth,
            range_size=max_playback,
        ),
    }
    (server.add_post('/raw_qoe', plots['raw_qoe']).add_post(
        '/rebuffer',
        plots['rebuffer']).add_post('/quality', plots['quality']).add_post(
            '/vmaf', plots['vmaf']).add_post('/vmaf_qoe',
                                             plots['vmaf_qoe']).add_post(
                                                 '/bw', plots['bw']))
    return plots
Exemple #2
0
def run(args: Namespace) -> None:
    path = Path(args.path)

    if getattr(args, 'headless', False):
        set_headless_plots()

    print(f'Running leader with {args.instances} instances.')
    shutil.rmtree(path, ignore_errors=True)
    os.system(f"mkdir -p {path}")

    controller = LeaderController(
        instances=args.instances,
        network=Network(
            bandwidth=getattr(args, 'bandwidth', None),
            delay=getattr(args, 'delay', None),
            burst=getattr(args, 'burst', 20000),
            trace_path=getattr(args, 'trace', None),
        ),
        port=args.port,
    )

    directory = Path(os.path.dirname(os.path.realpath(__file__)))
    script = str(directory / '..' / 'quic' / 'run.sh')
    os.system(f'{script} --certs')

    server = Server('experiment', args.port)
    plots = attach_plot_components(
        args.video,
        server,
        trace=getattr(args, 'trace', None),
        bandwidth=getattr(args, 'bandwidth', None),
        no_plot=not args.plot,
    )
    (server.add_post('/start', controller.on_start()).add_post(
        '/destroy',
        multiple_sync(OnComplete(path, 'leader', plots, args.video),
                      controller.on_destroy())).add_logger(
                          'leader', str(Path(path) / f'sanic_leader.log')))
    server.run()
Exemple #3
0
def run(args: Namespace) -> None:
    # give arguments
    directory = Path(args.dir)
    video = args.video
    name = args.name

    print(f'Replaying {directory} @ {video}')

    # default arguments
    port = 5000

    # find the logs
    files = [
        f for f in listdir(str(directory))
        if isfile(str(directory / f)) and "metrics" in f
    ]
    algo_to_log_dir = {f.split('_')[0]: str(directory / f) for f in files}
    algo_to_log = {}
    for algo, log_path in algo_to_log_dir.items():
        log = get_replay_log(algo, log_path)
        algo_to_log[algo] = log

    monitors = {}
    server = Server('experiment', port)
    for algo in algo_to_log.keys():
        # add post for each metrics
        monitors[algo] = Monitor(
            video=args.video,
            path=directory,
            name=algo,
            plot=True,
            request_port=port,
            port=port,
            training=False,
            log_to_file=False,
        )

    # attach plotter
    plots = attach_plot_components(
        video,
        server,
        trace=getattr(args, 'trace', None),
        no_plot=False,
    )
    server.add_post(
        '/complete',
        multiple_sync(OnComplete(directory, name, plots, video), on_complete))

    futures = []
    for algo, log in algo_to_log.items():
        futures.append(replay_async(algo, log, monitors[algo]))

    # run monitors
    def start():
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        asyncio.ensure_future(complete_after(futures, port))
        loop.run_forever()

    multiprocessing.Process(target=start).start()
    server.run()
Exemple #4
0
def run(args: Namespace) -> None:
    path = Path(args.path)
    name = args.name

    if getattr(args, 'headless', False):
        set_headless_plots()

    if not args.leader_port:
        shutil.rmtree(path, ignore_errors=True)
        os.system(f"mkdir -p {path}")

    if args.algo is not None:
        if args.dash is None:
            args.dash = []
        if args.algo in ABR_ALGORITHMS:
            args.dash.append(f'fe={args.algo}')

    server = Server('experiment', args.port)

    # Handle Abr requests
    if args.algo in PYTHON_ABR_ALGORITHMS:
        if args.algo in ['robustMpc', 'minerva', 'minervann']:
            from abr.robust_mpc import RobustMpc
            server.add_post('/decision', RobustMpc(args.video))
        elif args.algo == 'pensieve':
            from abr.pensieve import Pensieve
            server.add_post('/decision', Pensieve(args.video))

    traffic_generator = EmptyTrafficGenerator()
    if getattr(args, 'traffic', False):
        traffic_generator = TrafficGenerator(
            time_log_path=path,
            light=getattr(args, 'light', False),
            single_flow=getattr(args, 'single_flow', False),
        )

    # Add controller for launching the QUIC server and browser
    controller = Controller(
        name=name,
        site=args.site,
        cc=args.cc,
        abr=args.server_algo,
        network=Network(
            bandwidth=getattr(args, 'bandwidth', None),
            delay=getattr(args, 'delay', None),
            trace_path=getattr(args, 'trace', None),
            burst=getattr(args, 'burst', None),
            ports=[args.quic_port] + traffic_generator.ports,
        ),
        dash=args.dash,
        quic_port=args.quic_port,
        only_server=args.only_server,
        port=args.port,
        path=path,
        leader_port=args.leader_port,
        video=args.video,
        headless=getattr(args, 'headless', False),
    )

    # Handle controller communication and metrics
    request_port = args.leader_port if args.leader_port else args.port
    (server.add_extra_logger(controller).add_post(
        '/init', controller.on_init()).add_post(
            '/start',
            multiple_sync(
                controller.on_start(),
                traffic_generator.on_start(),
            )).add_post(
                '/metrics',
                Monitor(
                    video=args.video,
                    path=path,
                    name=name,
                    plot=args.plot or (args.leader_port != None),
                    request_port=request_port,
                    port=args.port,
                    training=args.training,
                )).add_post('/destroy', controller.on_destroy()))

    # Handle live plots
    plots = attach_plot_components(
        args.video,
        server,
        trace=getattr(args, 'trace', None),
        no_plot=not args.plot,
    )

    # Handle stream completion in the Browser
    server.add_post(
        '/complete',
        multiple_sync(
            OnComplete(path, name, plots, args.video),
            controller.on_complete(),
            traffic_generator.on_complete(),
        )).add_logger(name, str(Path(path) / f'sanic_{name}.log'))
    server.run()