test_benchmark.py 9.83 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


if is_torch_available():
11
    from transformers import PyTorchBenchmark, PyTorchBenchmarkArguments
12
13
14
15
16
17
18
19
20
21
22
23
24


@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
25
26
            models=[MODEL_ID],
            training=False,
27
            inference=True,
Patrick von Platen's avatar
Patrick von Platen committed
28
29
            sequence_lengths=[8],
            batch_sizes=[1],
30
            multi_process=False,
31
32
33
34
35
36
        )
        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)

37
38
39
40
41
    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,
42
            inference=True,
43
44
            sequence_lengths=[8],
            batch_sizes=[1],
45
            multi_process=False,
46
47
48
49
50
51
52
            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)

53
54
55
56
57
    def test_inference_torchscript(self):
        MODEL_ID = "sshleifer/tiny-gpt2"
        benchmark_args = PyTorchBenchmarkArguments(
            models=[MODEL_ID],
            training=False,
58
            inference=True,
59
60
61
            torchscript=True,
            sequence_lengths=[8],
            batch_sizes=[1],
62
            multi_process=False,
Patrick von Platen's avatar
Patrick von Platen committed
63
64
65
66
67
68
69
70
71
72
73
74
        )
        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,
75
            inference=True,
Patrick von Platen's avatar
Patrick von Platen committed
76
77
78
            fp16=True,
            sequence_lengths=[8],
            batch_sizes=[1],
79
            multi_process=False,
80
81
82
83
84
85
        )
        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
86
    def test_inference_no_model_no_architectures(self):
87
88
89
90
91
92
93
        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,
94
            inference=True,
95
96
            sequence_lengths=[8],
            batch_sizes=[1],
97
            multi_process=False,
98
99
100
101
102
103
        )
        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)

104
105
106
    def test_train_no_configs(self):
        MODEL_ID = "sshleifer/tiny-gpt2"
        benchmark_args = PyTorchBenchmarkArguments(
Patrick von Platen's avatar
Patrick von Platen committed
107
108
            models=[MODEL_ID],
            training=True,
109
            inference=False,
Patrick von Platen's avatar
Patrick von Platen committed
110
111
            sequence_lengths=[8],
            batch_sizes=[1],
112
            multi_process=False,
Patrick von Platen's avatar
Patrick von Platen committed
113
114
115
116
117
118
        )
        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
119
    @unittest.skipIf(torch_device == "cpu", "Can't do half precision")
Patrick von Platen's avatar
Patrick von Platen committed
120
121
122
123
124
    def test_train_no_configs_fp16(self):
        MODEL_ID = "sshleifer/tiny-gpt2"
        benchmark_args = PyTorchBenchmarkArguments(
            models=[MODEL_ID],
            training=True,
125
            inference=False,
Patrick von Platen's avatar
Patrick von Platen committed
126
127
128
            sequence_lengths=[8],
            batch_sizes=[1],
            fp16=True,
129
            multi_process=False,
130
131
132
133
134
135
136
137
        )
        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
138
139
        config = AutoConfig.from_pretrained(MODEL_ID)
        benchmark_args = PyTorchBenchmarkArguments(
Patrick von Platen's avatar
Patrick von Platen committed
140
141
            models=[MODEL_ID],
            training=False,
142
            inference=True,
Patrick von Platen's avatar
Patrick von Platen committed
143
144
            sequence_lengths=[8],
            batch_sizes=[1],
145
            multi_process=False,
Patrick von Platen's avatar
Patrick von Platen committed
146
147
148
149
150
151
152
153
154
        )
        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)
155
        benchmark_args = PyTorchBenchmarkArguments(
Patrick von Platen's avatar
Patrick von Platen committed
156
157
            models=[MODEL_ID],
            training=False,
158
            inference=True,
Patrick von Platen's avatar
Patrick von Platen committed
159
160
            sequence_lengths=[8],
            batch_sizes=[1],
161
            multi_process=False,
162
163
164
165
166
167
168
        )
        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):
169
170
171
172
173
        MODEL_ID = "sshleifer/tiny-gpt2"
        config = AutoConfig.from_pretrained(MODEL_ID)
        benchmark_args = PyTorchBenchmarkArguments(
            models=[MODEL_ID],
            training=True,
174
            inference=False,
175
176
            sequence_lengths=[8],
            batch_sizes=[1],
177
            multi_process=False,
178
179
180
181
        )
        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
182
183
184
185
186
        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)
187
        benchmark_args = PyTorchBenchmarkArguments(
Patrick von Platen's avatar
Patrick von Platen committed
188
189
            models=[MODEL_ID],
            training=True,
190
            inference=True,
Patrick von Platen's avatar
Patrick von Platen committed
191
192
            sequence_lengths=[8],
            batch_sizes=[1],
193
            multi_process=False,
194
195
196
197
198
199
200
201
202
203
204
205
        )
        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,
206
                inference=True,
207
208
209
210
211
212
213
214
                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"),
215
                multi_process=False,
216
217
218
219
220
221
222
223
            )
            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
224
225
226
227
228
229
230
231
232
233
234
235
236
237

    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,
238
                inference=True,
Patrick von Platen's avatar
Patrick von Platen committed
239
240
241
242
243
                sequence_lengths=[8],
                batch_sizes=[1],
                log_filename=os.path.join(tmp_dir, "log.txt"),
                log_print=True,
                trace_memory_line_by_line=True,
244
                multi_process=False,
Patrick von Platen's avatar
Patrick von Platen committed
245
246
247
248
249
250
            )
            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())