Example #1
0
def new_player():
    model = mock_model.MockModel()
    config = utility.load_player_conf("Player/default_config.yaml")
    new_p = player.Player(color=BLACK, \
            model=model, \
            rollouts_per_move=10, \
            **(config.player.as_dictionary()))
    return new_p
Example #2
0
def new_match():
    model = mock_model.MockModel()
    conf = utility.load_player_conf("Player/default_config")
    player_one = player.Player(model=model, \
            rollouts_per_move=10, \
            **(conf.player.as_dictionary()))
    player_two = player.Player(model=model, \
            rollouts_per_move=10, \
            **(conf.player.as_dictionary()))
    new_match = match.Match(player_one, player_two)
    return new_match
Example #3
0
def parallel_matches_with_preloaded_model(yamlpath,
                                          model,
                                          handle,
                                          rollouts_per_move,
                                          num_of_parallel_processes,
                                          num_of_games_per_process,
                                          fork_method="spawn"):
    '''
    this version of parallel matches takes a preloaded
    model as input and creates a deepcopy for each thread
    to achieve real parallel processing without loading
    the model n-times from the mlflow server
    '''

    # according to
    # https://docs.python.org/3/library/multiprocessing.html
    if multiprocessing.get_start_method(allow_none=True) is None:
        multiprocessing.set_start_method(fork_method)

    processes = []
    selfplays = []

    for _ in range(num_of_parallel_processes):
        # create a model copy for each parallel
        # process
        # modelcopy = copy.deepcopy(model)
        players = [
            utility.load_player_with_model(
                model=model, config=utility.load_player_conf(yamlpath))
            for _ in range(2)
        ]

        # self play, so both sides are played by
        # same player
        selfplay = contest.Contest(player_one=players[0],
                                   player_two=players[1],
                                   rollouts_per_move=rollouts_per_move,
                                   game_id=handle,
                                   show_game=False)
        selfplays.append(selfplay)

    for i in selfplays:
        process = multiprocessing.Process(target=i.start,
                                          args=(num_of_games_per_process, ))
        process.start()
        processes.append(process)

    for i in processes:
        i.join()
Example #4
0
def parallel_matches_with_preloaded_models(yamlpaths, \
        models, \
        handle, \
        rollouts_per_move, \
        num_of_parallel_processes, \
        num_of_games_per_process, \
        fork_method="spawn"):
    '''
    this version of parallel matches takes a preloaded
    model as input and creates a deepcopy for each thread
    to achieve real parallel processing without loading
    the model n-times from the mlflow server
    '''

    # according to
    # https://docs.python.org/3/library/multiprocessing.html
    if multiprocessing.get_start_method(allow_none=True) is None:
        multiprocessing.set_start_method(fork_method)

    processes = []
    selfplays = []

    for _ in range(num_of_parallel_processes):
        # create a model copy for each parallel
        # process
        players = [utility.load_player_with_model(model=i, \
                config = utility.load_player_conf(j)) for i, j in zip(models, yamlpaths)]

        # self play with different players
        selfplay = contest.Contest(player_one=players[0],
                                   player_two=players[1],
                                   rollouts_per_move=rollouts_per_move,
                                   game_id=handle,
                                   show_game=False)
        selfplays.append(selfplay)

    for i in selfplays:
        process = multiprocessing.Process(target=i.start, \
                args=(num_of_games_per_process,))
        process.start()
        processes.append(process)

    for i in processes:
        i.join()

    # just to make sure: clean up
    for i in selfplays:
        del i
Example #5
0
    parser.add_argument("-s", "--selflearnruns", type=int, \
            default=5, \
            help="number of self learn runs to perform. " \
            + "Default: 5.")

    args = parser.parse_args()

    players = [args.trainee, args.player_one, args.player_two]
    models = []

    # only load models for players which have been set:
    for i, j in enumerate(players):
        new_model = None
        if i == 0:
            # trainee is always loaded
            new_model = utility.load_model(utility.load_player_conf(j))
        elif players[i] != players[0]:
            # players are only loaded if they differ from trainee
            # and are defined
            new_model = utility.load_model(utility.load_player_conf(j)) \
                    if j else None
        else:
            new_model = None
        models.append(new_model)

    # set reference to trainee-model for each model which is None:
    for i, _ in enumerate(models):
        models[i] = models[i] if models[i] else models[0]

    # if player is set to None, take trainee:
    for i, _ in enumerate(players):
Example #6
0
                        "--epochs",
                        type=int,
                        default=50,
                        help="number of epochs per training iteration. " +
                        "Default: 50.")
    parser.add_argument("-s",
                        "--selflearnruns",
                        type=int,
                        default=5,
                        help="number of self learn runs to perform. " +
                        "Default: 5.")

    args = parser.parse_args()

    # first load model from mlflow server
    model = utility.load_model(utility.load_player_conf(args.player))

    for _ in range(args.selflearnruns):
        handle = utility.get_unused_match_handle(args.player, args.player)
        log.info(f"starting matches with handle {handle}")

        parallel_matches_with_preloaded_model(
            yamlpath=args.player,
            model=model,
            handle=handle,
            rollouts_per_move=args.rollouts_per_move,
            num_of_parallel_processes=args.num_of_parallel_processes,
            num_of_games_per_process=args.num_of_games_per_process,
            fork_method=args.fork_method)

        assemble_dataset(handle=handle)