test_benchmark.py 9.92 KB
Newer Older
1
2
3
4
5
import os
import tempfile
import unittest
from pathlib import Path

Patrick von Platen's avatar
Patrick von Platen committed
6
from transformers import AutoConfig, is_torch_available
7
from transformers.testing_utils import require_torch, torch_device
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27


if is_torch_available():
    from transformers import (
        PyTorchBenchmarkArguments,
        PyTorchBenchmark,
    )


@require_torch
class BenchmarkTest(unittest.TestCase):
    def check_results_dict_not_empty(self, results):
        for model_result in results.values():
            for batch_size, sequence_length in zip(model_result["bs"], model_result["ss"]):
                result = model_result["result"][batch_size][sequence_length]
                self.assertIsNotNone(result)

    def test_inference_no_configs(self):
        MODEL_ID = "sshleifer/tiny-gpt2"
        benchmark_args = PyTorchBenchmarkArguments(
Patrick von Platen's avatar
Patrick von Platen committed
28
29
30
31
32
33
            models=[MODEL_ID],
            training=False,
            no_inference=False,
            sequence_lengths=[8],
            batch_sizes=[1],
            no_multi_process=True,
34
35
36
37
38
39
        )
        benchmark = PyTorchBenchmark(benchmark_args)
        results = benchmark.run()
        self.check_results_dict_not_empty(results.time_inference_result)
        self.check_results_dict_not_empty(results.memory_inference_result)

40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
    def test_inference_no_configs_only_pretrain(self):
        MODEL_ID = "sshleifer/tiny-distilbert-base-uncased-finetuned-sst-2-english"
        benchmark_args = PyTorchBenchmarkArguments(
            models=[MODEL_ID],
            training=False,
            no_inference=False,
            sequence_lengths=[8],
            batch_sizes=[1],
            no_multi_process=True,
            only_pretrain_model=True,
        )
        benchmark = PyTorchBenchmark(benchmark_args)
        results = benchmark.run()
        self.check_results_dict_not_empty(results.time_inference_result)
        self.check_results_dict_not_empty(results.memory_inference_result)

56
57
58
59
60
61
62
63
64
    def test_inference_torchscript(self):
        MODEL_ID = "sshleifer/tiny-gpt2"
        benchmark_args = PyTorchBenchmarkArguments(
            models=[MODEL_ID],
            training=False,
            no_inference=False,
            torchscript=True,
            sequence_lengths=[8],
            batch_sizes=[1],
Patrick von Platen's avatar
Patrick von Platen committed
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
            no_multi_process=True,
        )
        benchmark = PyTorchBenchmark(benchmark_args)
        results = benchmark.run()
        self.check_results_dict_not_empty(results.time_inference_result)
        self.check_results_dict_not_empty(results.memory_inference_result)

    @unittest.skipIf(torch_device == "cpu", "Cant do half precision")
    def test_inference_fp16(self):
        MODEL_ID = "sshleifer/tiny-gpt2"
        benchmark_args = PyTorchBenchmarkArguments(
            models=[MODEL_ID],
            training=False,
            no_inference=False,
            fp16=True,
            sequence_lengths=[8],
            batch_sizes=[1],
            no_multi_process=True,
83
84
85
86
87
88
        )
        benchmark = PyTorchBenchmark(benchmark_args)
        results = benchmark.run()
        self.check_results_dict_not_empty(results.time_inference_result)
        self.check_results_dict_not_empty(results.memory_inference_result)

Stas Bekman's avatar
Stas Bekman committed
89
    def test_inference_no_model_no_architectures(self):
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
        MODEL_ID = "sshleifer/tiny-gpt2"
        config = AutoConfig.from_pretrained(MODEL_ID)
        # set architectures equal to `None`
        config.architectures = None
        benchmark_args = PyTorchBenchmarkArguments(
            models=[MODEL_ID],
            training=True,
            no_inference=False,
            sequence_lengths=[8],
            batch_sizes=[1],
            no_multi_process=True,
        )
        benchmark = PyTorchBenchmark(benchmark_args, configs=[config])
        results = benchmark.run()
        self.check_results_dict_not_empty(results.time_inference_result)
        self.check_results_dict_not_empty(results.memory_inference_result)

107
108
109
    def test_train_no_configs(self):
        MODEL_ID = "sshleifer/tiny-gpt2"
        benchmark_args = PyTorchBenchmarkArguments(
Patrick von Platen's avatar
Patrick von Platen committed
110
111
112
113
114
115
116
117
118
119
120
121
            models=[MODEL_ID],
            training=True,
            no_inference=True,
            sequence_lengths=[8],
            batch_sizes=[1],
            no_multi_process=True,
        )
        benchmark = PyTorchBenchmark(benchmark_args)
        results = benchmark.run()
        self.check_results_dict_not_empty(results.time_train_result)
        self.check_results_dict_not_empty(results.memory_train_result)

Stas Bekman's avatar
Stas Bekman committed
122
    @unittest.skipIf(torch_device == "cpu", "Can't do half precision")
Patrick von Platen's avatar
Patrick von Platen committed
123
124
125
126
127
128
129
130
131
132
    def test_train_no_configs_fp16(self):
        MODEL_ID = "sshleifer/tiny-gpt2"
        benchmark_args = PyTorchBenchmarkArguments(
            models=[MODEL_ID],
            training=True,
            no_inference=True,
            sequence_lengths=[8],
            batch_sizes=[1],
            fp16=True,
            no_multi_process=True,
133
134
135
136
137
138
139
140
        )
        benchmark = PyTorchBenchmark(benchmark_args)
        results = benchmark.run()
        self.check_results_dict_not_empty(results.time_train_result)
        self.check_results_dict_not_empty(results.memory_train_result)

    def test_inference_with_configs(self):
        MODEL_ID = "sshleifer/tiny-gpt2"
Patrick von Platen's avatar
Patrick von Platen committed
141
142
        config = AutoConfig.from_pretrained(MODEL_ID)
        benchmark_args = PyTorchBenchmarkArguments(
Patrick von Platen's avatar
Patrick von Platen committed
143
144
145
146
147
148
            models=[MODEL_ID],
            training=False,
            no_inference=False,
            sequence_lengths=[8],
            batch_sizes=[1],
            no_multi_process=True,
Patrick von Platen's avatar
Patrick von Platen committed
149
150
151
152
153
154
155
156
157
        )
        benchmark = PyTorchBenchmark(benchmark_args, configs=[config])
        results = benchmark.run()
        self.check_results_dict_not_empty(results.time_inference_result)
        self.check_results_dict_not_empty(results.memory_inference_result)

    def test_inference_encoder_decoder_with_configs(self):
        MODEL_ID = "sshleifer/tinier_bart"
        config = AutoConfig.from_pretrained(MODEL_ID)
158
        benchmark_args = PyTorchBenchmarkArguments(
Patrick von Platen's avatar
Patrick von Platen committed
159
160
161
162
163
164
            models=[MODEL_ID],
            training=False,
            no_inference=False,
            sequence_lengths=[8],
            batch_sizes=[1],
            no_multi_process=True,
165
166
167
168
169
170
171
        )
        benchmark = PyTorchBenchmark(benchmark_args, configs=[config])
        results = benchmark.run()
        self.check_results_dict_not_empty(results.time_inference_result)
        self.check_results_dict_not_empty(results.memory_inference_result)

    def test_train_with_configs(self):
172
173
174
175
176
177
178
179
        MODEL_ID = "sshleifer/tiny-gpt2"
        config = AutoConfig.from_pretrained(MODEL_ID)
        benchmark_args = PyTorchBenchmarkArguments(
            models=[MODEL_ID],
            training=True,
            no_inference=True,
            sequence_lengths=[8],
            batch_sizes=[1],
Patrick von Platen's avatar
Patrick von Platen committed
180
            no_multi_process=True,
181
182
183
184
        )
        benchmark = PyTorchBenchmark(benchmark_args, configs=[config])
        results = benchmark.run()
        self.check_results_dict_not_empty(results.time_train_result)
Patrick von Platen's avatar
Patrick von Platen committed
185
186
187
188
189
        self.check_results_dict_not_empty(results.memory_train_result)

    def test_train_encoder_decoder_with_configs(self):
        MODEL_ID = "sshleifer/tinier_bart"
        config = AutoConfig.from_pretrained(MODEL_ID)
190
        benchmark_args = PyTorchBenchmarkArguments(
Patrick von Platen's avatar
Patrick von Platen committed
191
192
193
194
195
196
            models=[MODEL_ID],
            training=True,
            no_inference=True,
            sequence_lengths=[8],
            batch_sizes=[1],
            no_multi_process=True,
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
        )
        benchmark = PyTorchBenchmark(benchmark_args, configs=[config])
        results = benchmark.run()
        self.check_results_dict_not_empty(results.time_train_result)
        self.check_results_dict_not_empty(results.memory_train_result)

    def test_save_csv_files(self):
        MODEL_ID = "sshleifer/tiny-gpt2"
        with tempfile.TemporaryDirectory() as tmp_dir:
            benchmark_args = PyTorchBenchmarkArguments(
                models=[MODEL_ID],
                training=True,
                no_inference=False,
                save_to_csv=True,
                sequence_lengths=[8],
                batch_sizes=[1],
                inference_time_csv_file=os.path.join(tmp_dir, "inf_time.csv"),
                train_memory_csv_file=os.path.join(tmp_dir, "train_mem.csv"),
                inference_memory_csv_file=os.path.join(tmp_dir, "inf_mem.csv"),
                train_time_csv_file=os.path.join(tmp_dir, "train_time.csv"),
                env_info_csv_file=os.path.join(tmp_dir, "env.csv"),
Patrick von Platen's avatar
Patrick von Platen committed
218
                no_multi_process=True,
219
220
221
222
223
224
225
226
            )
            benchmark = PyTorchBenchmark(benchmark_args)
            benchmark.run()
            self.assertTrue(Path(os.path.join(tmp_dir, "inf_time.csv")).exists())
            self.assertTrue(Path(os.path.join(tmp_dir, "train_time.csv")).exists())
            self.assertTrue(Path(os.path.join(tmp_dir, "inf_mem.csv")).exists())
            self.assertTrue(Path(os.path.join(tmp_dir, "train_mem.csv")).exists())
            self.assertTrue(Path(os.path.join(tmp_dir, "env.csv")).exists())
Patrick von Platen's avatar
Patrick von Platen committed
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246

    def test_trace_memory(self):
        MODEL_ID = "sshleifer/tiny-gpt2"

        def _check_summary_is_not_empty(summary):
            self.assertTrue(hasattr(summary, "sequential"))
            self.assertTrue(hasattr(summary, "cumulative"))
            self.assertTrue(hasattr(summary, "current"))
            self.assertTrue(hasattr(summary, "total"))

        with tempfile.TemporaryDirectory() as tmp_dir:
            benchmark_args = PyTorchBenchmarkArguments(
                models=[MODEL_ID],
                training=True,
                no_inference=False,
                sequence_lengths=[8],
                batch_sizes=[1],
                log_filename=os.path.join(tmp_dir, "log.txt"),
                log_print=True,
                trace_memory_line_by_line=True,
Patrick von Platen's avatar
Patrick von Platen committed
247
                no_multi_process=True,
Patrick von Platen's avatar
Patrick von Platen committed
248
249
250
251
252
253
            )
            benchmark = PyTorchBenchmark(benchmark_args)
            result = benchmark.run()
            _check_summary_is_not_empty(result.inference_summary)
            _check_summary_is_not_empty(result.train_summary)
            self.assertTrue(Path(os.path.join(tmp_dir, "log.txt")).exists())