File size: 1,932 Bytes
4be6a52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
"""Actual pinned unchanged Clef development tournament; no held-out test seeds."""

import argparse
import json
import time
from pathlib import Path

import torch

from stackcraft.clef import ClefPlayer
from stackcraft.engine import new_game
from stackcraft.players import HeuristicPlayer, RandomPlayer, observe
from stackcraft.tournament import run_tournament


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--output", type=Path, required=True)
    parser.add_argument("--episodes", type=int, default=2)
    parser.add_argument("--max-pieces", type=int, default=30)
    args = parser.parse_args()
    if args.output.exists() or not 1 <= args.episodes <= 20:
        parser.error("use a new output and1–20 development episodes")
    args.output.parent.mkdir(parents=True, exist_ok=True)
    torch.set_num_threads(8)
    free, total = torch.cuda.mem_get_info()
    if free < 25 * 1024**3:
        raise RuntimeError(f"insufficient free GPU memory: {free}")
    started = time.monotonic()
    player = ClefPlayer.from_pretrained(trust_pinned_code=True)
    warmup = player.choose(observe(new_game(42)))
    print(
        json.dumps({"warmup": warmup.action_id, "load_seconds": time.monotonic() - started}),
        flush=True,
    )
    result = run_tournament(
        {"random": RandomPlayer, "heuristic": HeuristicPlayer, "clef-base": lambda: player},
        list(range(args.episodes)),
        args.max_pieces,
    )
    result["development_only"] = True
    result["gpu"] = torch.cuda.get_device_name()
    result["peak_allocated_bytes"] = torch.cuda.max_memory_allocated()
    result["peak_reserved_bytes"] = torch.cuda.max_memory_reserved()
    result["elapsed_seconds"] = time.monotonic() - started
    args.output.write_text(json.dumps(result, indent=2, allow_nan=False) + "\n")
    print(json.dumps(result["summary"]), flush=True)


if __name__ == "__main__":
    main()