File size: 3,355 Bytes
a01ef8c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright (c) 2023 Intel Corporation
#
# 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.
#

import numpy as np


def performance(saved_model_dir, batch_size, image_size, dataset_dir, framework, warmup=10, iteration=100,
                cores_per_instance=None, num_of_instance=None, inter_num_of_threads=None, intra_num_of_threads=None):
    """
    Uses the Intel Neural Compressor to get performance metrics for the specified model.
    
    :param saved_model_dir: Model to load
    :param batch_size: Batch size
    :param image_size: Image input size
    :param dataset_dir: Dataset directory (for a custom image classification dataset)
    :param framework: Framework (i.e. tensorflow)
    :param warmup: Number of warmup iterations before running performance tests
    :param iteration: The number of iterations to run for the performance test
    :param cores_per_instance: Number of CPU cores to use per instance
    :param num_of_instance: Number of instances to use for performance testing
    :param inter_num_of_threads: Number of threads to use for inter-thread operations
    :param intra_num_of_threads: Number of threads to use for intra-thread operations
    :return: accuracy, batch_size, result_list
    """

    from neural_compressor.benchmark import fit
    from neural_compressor.config import BenchmarkConfig
    from neural_compressor.utils.create_obj_from_config import create_dataloader

    dataloader_args = {
        'batch_size': batch_size,
        'dataset': {'ImageFolder': {'root': dataset_dir}},
        'transform': {'PaddedCenterCrop': {'size': image_size, 'crop_padding': 32},
                      'Resize': {'size': image_size, 'interpolation': 'bicubic'},
                      'Rescale': {}
                      },
        'filter': None
    }

    eval_dataloader = create_dataloader(framework, dataloader_args)

    conf = BenchmarkConfig(warmup=warmup, iteration=iteration)
    try:
        return fit(model=saved_model_dir, config=conf, b_dataloader=eval_dataloader)
    except Exception:
        # Retry a second time due to the known ZQMError when running from Jupyter
        print("Retrying benchmarking a second time")
        return fit(model=saved_model_dir, config=conf, b_dataloader=eval_dataloader)


def calculate_latency_and_throughput(results):
    """
    Parses the results from the benchmarking function and returns the latency (ms) and throughput (samples/sec)
    
    :param results: Return value from calling the performance util function
    :param batch_size: batch size
    :return: latency (ms) and throughput (images/sec)
    """
    _, batch_size, result_list = results['performance']
    latency = np.array(result_list).mean() / batch_size
    latency_ms = latency * 1000
    throughput = 1. / latency
    return latency_ms, throughput