aboutsummaryrefslogtreecommitdiff
path: root/utils/CommonGraphOptions.h
blob: d81cd8fbdbe00d4ff90b511a09c2700bec66877b (plain)
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*
 * Copyright (c) 2018-2019 ARM Limited.
 *
 * SPDX-License-Identifier: MIT
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to
 * deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
#ifndef ARM_COMPUTE_EXAMPLES_UTILS_COMMON_GRAPH_OPTIONS
#define ARM_COMPUTE_EXAMPLES_UTILS_COMMON_GRAPH_OPTIONS

#include "utils/command_line/CommandLineOptions.h"
#include "utils/command_line/CommandLineParser.h"

#include "arm_compute/graph/TypeLoader.h"
#include "arm_compute/graph/TypePrinter.h"
#include "arm_compute/runtime/CL/CLTunerTypes.h"

namespace arm_compute
{
namespace utils
{
/* ![Common graph examples parameters] */
/* Common graph parameters
 *
 * --help             : Print the example's help message.
 * --threads          : The number of threads to be used by the example during execution.
 * --target           : Execution target to be used by the examples. Supported target options: NEON, CL, GC.
 * --type             : Data type to be used by the examples. Supported data type options: QASYMM8, F16, F32.
 * --layout           : Data layout to be used by the examples. Supported data layout options : NCHW, NHWC.
 * --enable-tuner     : Toggle option to enable the OpenCL dynamic tuner.
 * --fast-math        : Toggle option to enable the fast math option.
 * --data             : Path that contains the trainable parameter files of graph layers.
 * --image            : Image to load and operate on. Image types supported: PPM, JPEG, NPY.
 * --labels           : File that contains the labels that classify upon.
 * --validation-file  : File that contains a list of image names with their corresponding label id (e.g. image0.jpg 5).
 *                      This is used to run the graph over a number of images and report top-1 and top-5 metrics.
 * --validation-path  : The path where the validation images specified in the validation file reside.
 * --validation-range : The range of the images to validate from the validation file (e.g 0,9).
 *                      If not specified all the images will be validated.
 * --tuner-file       : The file to store the OpenCL dynamic tuner tuned parameters.
 *
 * Note that data, image and labels options should be provided to perform an inference run on an image.
 * Note that validation-file and validation-path should be provided to perform a graph accuracy estimation.
 * Note GLES target is not supported for most of the networks.
 *
 * Example execution commands:
 *
 * Execute a single inference given an image and a file containing the correspondence between label ids and human readable labels:
 * ./graph_vgg16 --data=data/ --target=cl --layout=nhwc --image=kart.jpeg --labels=imagenet1000_clsid_to_human.txt
 *
 * Perform a graph validation on a list of images:
 * ./graph_vgg16 --data=data/ --target=neon --threads=4 --layout=nchw --validation-file=val.txt --validation-path=ilsvrc_test_images/
 *
 * File formats:
 *
 * Validation file should be a plain file containing the names of the images followed by the correct label id.
 * For example:
 *
 * image0.jpeg 882
 * image1.jpeg 34
 * image2.jpeg 354
 *
 * Labels file should be a plain file where each line is the respective human readable label (counting starts from 0).
 * For example:
 *
 * 0: label0_name            label0_name
 * 1: label1_name     or     label1_name
 * 2: label2_name            label2_name
 */
/* ![Common graph examples parameters] */

/** Structure holding all the common graph parameters */
struct CommonGraphParams
{
    bool                             help{ false };
    int                              threads{ 0 };
    arm_compute::graph::Target       target{ arm_compute::graph::Target::NEON };
    arm_compute::DataType            data_type{ DataType::F32 };
    arm_compute::DataLayout          data_layout{ DataLayout::NHWC };
    bool                             enable_tuner{ false };
    arm_compute::CLTunerMode         tuner_mode{ CLTunerMode::EXHAUSTIVE };
    arm_compute::graph::FastMathHint fast_math_hint{ arm_compute::graph::FastMathHint::Disabled };
    std::string                      data_path{};
    std::string                      image{};
    std::string                      labels{};
    std::string                      validation_file{};
    std::string                      validation_path{};
    std::string                      tuner_file{};
    unsigned int                     validation_range_start{ 0 };
    unsigned int                     validation_range_end{ std::numeric_limits<unsigned int>::max() };
};

/** Formatted output of the CommonGraphParams type
 *
 * @param[out] os            Output stream.
 * @param[in]  common_params Common parameters to output
 *
 * @return Modified output stream.
 */
::std::ostream &operator<<(::std::ostream &os, const CommonGraphParams &common_params);

/** Common command line options used to configure the graph examples
 *
 * The options in this object get populated when "parse()" is called on the parser used to construct it.
 * The expected workflow is:
 *
 * CommandLineParser parser;
 * CommonOptions options( parser );
 * parser.parse(argc, argv);
 */
class CommonGraphOptions
{
public:
    /** Constructor
     *
     * @param[in,out] parser A parser on which "parse()" hasn't been called yet.
     */
    CommonGraphOptions(CommandLineParser &parser);
    /** Prevent instances of this class from being copied (As this class contains pointers) */
    CommonGraphOptions(const CommonGraphOptions &) = delete;
    /** Prevent instances of this class from being copied (As this class contains pointers) */
    CommonGraphOptions &operator=(const CommonGraphOptions &) = delete;
    /** Allow instances of this class to be moved */
    CommonGraphOptions(CommonGraphOptions &&) = default;
    /** Allow instances of this class to be moved */
    CommonGraphOptions &operator=(CommonGraphOptions &&) = default;
    /** Default destructor */
    ~CommonGraphOptions() = default;

    ToggleOption                           *help;             /**< Show help option */
    SimpleOption<int>                      *threads;          /**< Number of threads option */
    EnumOption<arm_compute::graph::Target> *target;           /**< Graph execution target */
    EnumOption<arm_compute::DataType>      *data_type;        /**< Graph data type */
    EnumOption<arm_compute::DataLayout>    *data_layout;      /**< Graph data layout */
    ToggleOption                           *enable_tuner;     /**< Enable tuner */
    SimpleOption<arm_compute::CLTunerMode> *tuner_mode;       /**< Tuner mode */
    ToggleOption                           *fast_math_hint;   /**< Fast math hint */
    SimpleOption<std::string>              *data_path;        /**< Trainable parameters path */
    SimpleOption<std::string>              *image;            /**< Image */
    SimpleOption<std::string>              *labels;           /**< Labels */
    SimpleOption<std::string>              *validation_file;  /**< Validation file */
    SimpleOption<std::string>              *validation_path;  /**< Validation data path */
    SimpleOption<std::string>              *validation_range; /**< Validation range */
    SimpleOption<std::string>              *tuner_file;       /**< File to load/store the tuner's values from */
};

/** Consumes the common graph options and creates a structure containing any information
 *
 * @param[in] options Options to consume
 *
 * @return Structure containing the common graph parameters
 */
CommonGraphParams consume_common_graph_parameters(CommonGraphOptions &options);
} // namespace utils
} // namespace arm_compute
#endif /* ARM_COMPUTE_EXAMPLES_UTILS_COMMON_GRAPH_OPTIONS */