cost_estimate.py 2.81 KB
Newer Older
Leo Gao's avatar
Leo Gao committed
1
import random
2

Leo Gao's avatar
Leo Gao committed
3
import transformers
4

Baber's avatar
Baber committed
5
from lm_eval import evaluator
6
from lm_eval.api.model import LM
Leo Gao's avatar
Leo Gao committed
7
8
9
10
11


class DryrunLM(LM):
    def __init__(self):
        self.tokencost = 0
Fabrizio Milo's avatar
Fabrizio Milo committed
12
        self.tokenizer = transformers.GPT2TokenizerFast.from_pretrained("gpt2")
Leo Gao's avatar
Leo Gao committed
13
        self.tokenizer.pad_token = "<|endoftext|>"
Baber's avatar
Baber committed
14
15
        self._rank = 0
        self._world_size = 1
Leo Gao's avatar
Leo Gao committed
16
17
18
19
20
21
22

    @classmethod
    def create_from_arg_string(cls, arg_string):
        return cls()

    def loglikelihood(self, requests):
        res = []
Baber's avatar
Baber committed
23
        for ctx, cont in [req.args for req in requests]:
Leo Gao's avatar
Leo Gao committed
24
            res.append((-random.random(), False))
Baber's avatar
nit  
Baber committed
25
            # we do not generate for loglikelihood but
Baber's avatar
Baber committed
26
27
            # +1 for API models as they require at least on gen token
            self.tokencost += len(self.tokenizer.tokenize(ctx + cont)) + 1
Leo Gao's avatar
Leo Gao committed
28
29

        return res
Fabrizio Milo's avatar
Fabrizio Milo committed
30

31
    def generate_until(self, requests):
Leo Gao's avatar
Leo Gao committed
32
        res = []
Fabrizio Milo's avatar
Fabrizio Milo committed
33

Baber's avatar
Baber committed
34
        for ctx, gen_kwargs in [reg.args for reg in requests]:
Leo Gao's avatar
Leo Gao committed
35
            res.append("lol")
Baber's avatar
Baber committed
36
37
38
            max_new = gen_kwargs.get("max_gen_toks", 256)
            # assume worst case - generates until max_new tokens
            self.tokencost += len(self.tokenizer.tokenize(ctx)) + max_new
Leo Gao's avatar
Leo Gao committed
39
40

        return res
Fabrizio Milo's avatar
Fabrizio Milo committed
41

Leo Gao's avatar
Leo Gao committed
42
43
    def loglikelihood_rolling(self, requests):
        res = []
Fabrizio Milo's avatar
Fabrizio Milo committed
44
45

        for (s,) in requests:
Leo Gao's avatar
Leo Gao committed
46
47
48
49
            # assume worst case: extra full context
            self.tokencost += len(self.tokenizer.tokenize(s)) + 2048

        return res
Leo Gao's avatar
Leo Gao committed
50
51
52
53


def main():
    lm = DryrunLM()
Fabrizio Milo's avatar
Fabrizio Milo committed
54

Leo Gao's avatar
Leo Gao committed
55
    task_list = "arc_challenge,arc_easy,boolq,cola,copa,headqa,hellaswag,lambada,logiqa,mathqa,mc_taco,mrpc,multirc,openbookqa,piqa,prost,pubmedqa,qnli,qqp,race,record,rte,sciq,sst,triviaqa,webqs,wic,wikitext,winogrande,wnli,wsc"
Leo Gao's avatar
Leo Gao committed
56
    values = []
Leo Gao's avatar
Leo Gao committed
57
    for taskname in task_list.split(","):
Leo Gao's avatar
Leo Gao committed
58
        lm.tokencost = 0
59
        evaluator.simple_evaluate(
Baber's avatar
Baber committed
60
61
            model=lm,
            tasks=[taskname],
62
63
64
65
            num_fewshot=0,
            limit=None,
            bootstrap_iters=10,
        )
Leo Gao's avatar
Leo Gao committed
66
67

        print(taskname, lm.tokencost)
Fabrizio Milo's avatar
Fabrizio Milo committed
68
69
70
71
72
73
74
75
76
77
        values.append(
            [
                taskname,
                lm.tokencost,
                lm.tokencost / 1000 * 0.0008,
                lm.tokencost / 1000 * 0.0012,
                lm.tokencost / 1000 * 0.006,
                lm.tokencost / 1000 * 0.06,
            ]
        )
Leo Gao's avatar
Leo Gao committed
78
79
80
    from pytablewriter import MarkdownTableWriter

    writer = MarkdownTableWriter()
Leo Gao's avatar
Leo Gao committed
81
    writer.headers = ["Task", "Tokens", "Ada", "Babbage", "Curie", "Davinci"]
Leo Gao's avatar
Leo Gao committed
82
83
84

    values.sort(key=lambda x: -x[1])
    totcost = sum([x[1] for x in values])
Fabrizio Milo's avatar
Fabrizio Milo committed
85
86
87
88
89
90
91
92
93
94
    values.append(
        [
            "**Total**",
            totcost,
            totcost / 1000 * 0.0008,
            totcost / 1000 * 0.0012,
            totcost / 1000 * 0.006,
            totcost / 1000 * 0.06,
        ]
    )
Leo Gao's avatar
Leo Gao committed
95
96
97
98

    writer.value_matrix = values

    print(writer.dumps())
Fabrizio Milo's avatar
Fabrizio Milo committed
99
100


Leo Gao's avatar
Leo Gao committed
101
102
if __name__ == "__main__":
    main()