"tests/vscode:/vscode.git/clone" did not exist on "8e6fa622a9f418a43b5b8b28f9fd96b4fe8b4598"
test_version_stable.py 3.09 KB
Newer Older
1
2
3
4
5
6
7
import lm_eval.tasks as tasks
import lm_eval.models as models
import lm_eval.evaluator as evaluator
import random
import pytest
import os
import json
8
import hashlib
9
import collections
10
11
12
13
14
15
16
17
18


os.makedirs("tests/testdata", exist_ok=True)


def assert_target(name, ob):
    fname = f"tests/testdata/{name}.json"
    if os.path.exists(fname):
        with open(fname) as fh:
19
20
21
22
23
            # Use relative tolerance of 1e-5 and absolute tolerance of 1e-8 
            # assuming most metrics work on `float32` values, which is the common 
            # default floating type across popular libraries (PyTorch, Tensorflow, and JAX).
            assert flatten(json.load(fh)) == pytest.approx(
                flatten(json.loads(json.dumps(ob, sort_keys=True))), rel=1e-5, abs=1e-8)
24
25
    else:
        with open(fname, 'w') as fh:
26
27
28
29
30
31
32
33
34
35
            json.dump(ob, fh, sort_keys=True)

def assert_target_hashed(name, ob):
    fname = f"tests/testdata/{name}"
    if os.path.exists(fname):
        with open(fname) as fh:
            assert fh.read() == hashlib.sha256(json.dumps(ob, sort_keys=True).encode('utf-8')).hexdigest()
    else:
        with open(fname, 'w') as fh:
            fh.write(hashlib.sha256(json.dumps(ob, sort_keys=True).encode('utf-8')).hexdigest())
36

37
38
39
40
41
42
43
44
45
46
47
            
# from https://stackoverflow.com/a/6027615
def flatten(d, parent_key='', sep='.'):
    items = []
    for k, v in d.items():
        new_key = parent_key + sep + k if parent_key else k
        if isinstance(v, collections.MutableMapping):
            items.extend(flatten(v, new_key, sep=sep).items())
        else:
            items.append((new_key, v))
    return dict(items)
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62

# make sure eval results for a task version are stable

@pytest.mark.parametrize("taskname,Task", tasks.TASK_REGISTRY.items())
def test_versions_stable(taskname, Task):
    task_dict = tasks.get_task_dict([taskname])
    lm = models.get_model('dummy')()

    def ll_fn(reqs):
        for ctx, cont in reqs:
            if len(ctx) == 0: continue
            # space convention
            assert ctx[-1] != ' '
            assert cont[0] == ' ' or ctx[-1] == '\n'
        
63
        assert_target_hashed(f"{taskname}-v{Task.VERSION}-loglikelihood", reqs)
64
65
66
67
68
69
70
71
72
73
74
75
        res = []
        
        random.seed(42)
        for _ in reqs:
            res.append((-random.random(), False))

        return res

    def ll_perp_fn(reqs):
        for string, in reqs:
            assert isinstance(string, str)

76
        assert_target_hashed(f"{taskname}-v{Task.VERSION}-loglikelihood_rolling", reqs)
77
78
79
80
81
82
83
84
85
86
        res = []

        random.seed(42)
        for _ in reqs:
            res.append(-random.random())

        return res
    
    def greedy_until(reqs):
        res = []
87
        assert_target_hashed(f"{taskname}-v{Task.VERSION}-greedy_until", reqs)
88
89
90
91
92
93
94
95
96
97
        
        for ctx, _ in reqs:
            res.append("lol")
            assert ctx.strip() != ''

        return res

    lm.loglikelihood = ll_fn
    lm.loglikelihood_rolling = ll_perp_fn
    lm.greedy_until = greedy_until
98
99
100

    limit = None
    res = evaluator.evaluate(lm, task_dict, False, 0, limit, bootstrap_iters=10)
101
    assert_target(f"{taskname}-v{Task.VERSION}-res", res)