コード例 #1
0
def start(config: Config):
    set_session_config(per_process_gpu_memory_fraction=1,
                       allow_growth=True,
                       device_list=config.opts.device_list)
    m = Manager()
    while True:
        model_bt = load_model(config, config.resource.model_best_config_path,
                              config.resource.model_best_weight_path)
        modelbt_pipes = m.list([
            model_bt.get_pipes(need_reload=False)
            for _ in range(config.play.max_processes)
        ])
        model_ng = load_model(config,
                              config.resource.next_generation_config_path,
                              config.resource.next_generation_weight_path)
        while not model_ng:
            logger.info(f"Next generation model is None, wait for 300s")
            sleep(300)
            model_ng = load_model(config,
                                  config.resource.next_generation_config_path,
                                  config.resource.next_generation_weight_path)
        logger.info(f"Next generation model has loaded!")
        modelng_pipes = m.list([
            model_ng.get_pipes(need_reload=False)
            for _ in range(config.play.max_processes)
        ])

        # play_worker = EvaluateWorker(config, model1_pipes, model2_pipes)
        # play_worker.start()
        with ProcessPoolExecutor(
                max_workers=config.play.max_processes) as executor:
            futures = []
            for i in range(config.play.max_processes):
                eval_worker = EvaluateWorker(config,
                                             modelbt_pipes,
                                             modelng_pipes,
                                             pid=i)
                futures.append(executor.submit(eval_worker.start))

        wait(futures)
        model_bt.close_pipes()
        model_ng.close_pipes()
        # compute whether to update best model
        # and remove next generation model
        score = 0
        for future in futures:
            score += future.result()
        game_num = config.eval.game_num * config.play.max_processes
        logger.info(f"Evaluate over, next generation win {score}/{game_num}")
        if score * 1.0 / game_num >= config.eval.next_generation_replace_rate:
            logger.info("Best model will be replaced by next generation model")
            replace_best_model(config)
        else:
            logger.info(
                "Next generation fail to defeat best model and will be removed"
            )
            remove_ng_model(config)
コード例 #2
0
def start(config: Config):
    set_session_config(per_process_gpu_memory_fraction=1,
                       allow_growth=True,
                       device_list=config.opts.device_list)
    m = Manager()
    response = http_request(config.internet.get_evaluate_model_url)
    while int(response['status']) == 0:
        data = response['data']
        logger.info(
            f"评测开始,基准模型:{data['base']['digest'][0:8]}, elo = {data['base']['elo']};"
            f"待评测模型:{data['unchecked']['digest'][0:8]}, elo = {data['unchecked']['elo']}"
        )
        # make path
        base_weight_path = os.path.join(
            config.resource.next_generation_model_dir,
            data['base']['digest'] + '.h5')
        ng_weight_path = os.path.join(
            config.resource.next_generation_model_dir,
            data['unchecked']['digest'] + '.h5')
        # load model
        model_base, hist_base = load_model(config, base_weight_path,
                                           data['base']['digest'])
        model_ng, hist_ng = load_model(config, ng_weight_path,
                                       data['unchecked']['digest'])
        # make pipes
        model_base_pipes = m.list([
            model_base.get_pipes(need_reload=False)
            for _ in range(config.play.max_processes)
        ])
        model_ng_pipes = m.list([
            model_ng.get_pipes(need_reload=False)
            for _ in range(config.play.max_processes)
        ])

        # eval_worker = EvaluateWorker(config, model_base_pipes, model_ng_pipes, 0, data)
        # res = eval_worker.start()
        with ProcessPoolExecutor(
                max_workers=config.play.max_processes) as executor:
            futures = []
            for i in range(config.play.max_processes):
                eval_worker = EvaluateWorker(config, model_base_pipes,
                                             model_ng_pipes, i, data,
                                             hist_base, hist_ng)
                futures.append(executor.submit(eval_worker.start))
                sleep(1)

        wait(futures)
        # close pipe
        model_base.close_pipes()
        model_ng.close_pipes()
        # reset model
        model_base = None
        model_ng = None

        response = http_request(config.internet.get_evaluate_model_url)
    logger.info(f"没有待评测权重,请稍等或继续跑谱")
コード例 #3
0
def start(config: Config):
    set_session_config(per_process_gpu_memory_fraction=1, allow_growth=True, device_list=config.opts.device_list)
    current_model = load_model(config)
    m = Manager()
    cur_pipes = m.list([current_model.get_pipes() for _ in range(config.play.max_processes)])
    # play_worker = SelfPlayWorker(config, cur_pipes, 0)
    # play_worker.start()
    with ProcessPoolExecutor(max_workers=config.play.max_processes) as executor:
        futures = []
        for i in range(config.play.max_processes):
            play_worker = SelfPlayWorker(config, cur_pipes, i)
            logger.debug("Initialize selfplay worker")
            futures.append(executor.submit(play_worker.start))
コード例 #4
0
def start(config: Config):
    set_session_config(per_process_gpu_memory_fraction=1,
                       allow_growth=True,
                       device_list=config.opts.device_list)
    return EvaluateWorker(config).start()