"vscode:/vscode.git/clone" did not exist on "c345053a8bf47d5ef8f1fe15d385108059209fba"
test_benchmark.py 10.4 KB
Newer Older
Sylvain Gugger's avatar
Sylvain Gugger committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Copyright 2020 The HuggingFace Team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

15
16
17
18
19
import os
import tempfile
import unittest
from pathlib import Path

Patrick von Platen's avatar
Patrick von Platen committed
20
from transformers import AutoConfig, is_torch_available
21
from transformers.testing_utils import require_torch, torch_device
22
23
24


if is_torch_available():
25
    from transformers import PyTorchBenchmark, PyTorchBenchmarkArguments
26
27
28
29
30
31
32
33
34
35
36
37
38


@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
39
40
            models=[MODEL_ID],
            training=False,
41
            inference=True,
Patrick von Platen's avatar
Patrick von Platen committed
42
43
            sequence_lengths=[8],
            batch_sizes=[1],
44
            multi_process=False,
45
46
47
48
49
50
        )
        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)

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,
56
            inference=True,
57
58
            sequence_lengths=[8],
            batch_sizes=[1],
59
            multi_process=False,
60
61
62
63
64
65
66
            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)

67
68
69
70
71
    def test_inference_torchscript(self):
        MODEL_ID = "sshleifer/tiny-gpt2"
        benchmark_args = PyTorchBenchmarkArguments(
            models=[MODEL_ID],
            training=False,
72
            inference=True,
73
74
75
            torchscript=True,
            sequence_lengths=[8],
            batch_sizes=[1],
76
            multi_process=False,
Patrick von Platen's avatar
Patrick von Platen committed
77
78
79
80
81
82
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)

    @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,
89
            inference=True,
Patrick von Platen's avatar
Patrick von Platen committed
90
91
92
            fp16=True,
            sequence_lengths=[8],
            batch_sizes=[1],
93
            multi_process=False,
94
95
96
97
98
99
        )
        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
100
    def test_inference_no_model_no_architectures(self):
101
102
103
104
105
106
107
        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,
108
            inference=True,
109
110
            sequence_lengths=[8],
            batch_sizes=[1],
111
            multi_process=False,
112
113
114
115
116
117
        )
        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)

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

    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,
252
                inference=True,
Patrick von Platen's avatar
Patrick von Platen committed
253
254
255
256
257
                sequence_lengths=[8],
                batch_sizes=[1],
                log_filename=os.path.join(tmp_dir, "log.txt"),
                log_print=True,
                trace_memory_line_by_line=True,
258
                multi_process=False,
Patrick von Platen's avatar
Patrick von Platen committed
259
260
261
262
263
264
            )
            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())