ArmNN
 20.11
ProgramOptions Struct Reference

Holds and parses program options for the ExecuteNetwork application. More...

#include <ExecuteNetworkProgramOptions.hpp>

Public Member Functions

 ProgramOptions ()
 Initializes ProgramOptions by adding options to the underlying cxxopts::options object. More...
 
 ProgramOptions (int ac, const char *av[])
 Runs ParseOptions() on initialization. More...
 
void ParseOptions (int ac, const char *av[])
 Parses program options from the command line or another source and stores the values in member variables. More...
 
void ValidateExecuteNetworkParams ()
 Ensures that the parameters for ExecuteNetwork fit together. More...
 
void ValidateRuntimeOptions ()
 Ensures that the runtime options are valid. More...
 

Public Attributes

cxxopts::Options m_CxxOptions
 
cxxopts::ParseResult m_CxxResult
 
ExecuteNetworkParams m_ExNetParams
 
armnn::IRuntime::CreationOptions m_RuntimeOptions
 

Detailed Description

Holds and parses program options for the ExecuteNetwork application.

Definition at line 21 of file ExecuteNetworkProgramOptions.hpp.

Constructor & Destructor Documentation

◆ ProgramOptions() [1/2]

Initializes ProgramOptions by adding options to the underlying cxxopts::options object.

(Does not parse any options)

Definition at line 150 of file ExecuteNetworkProgramOptions.cpp.

References ARMNN_ASSERT_MSG, ARMNN_LOG, armnn::BackendRegistryInstance(), BackendRegistry::GetBackendIdsAsString(), IRuntime::CreationOptions::ExternalProfilingOptions::m_CapturePeriod, m_CxxOptions, ExecuteNetworkParams::m_DequantizeOutput, IRuntime::CreationOptions::m_DynamicBackendsPath, ExecuteNetworkParams::m_EnableBf16TurboMode, ExecuteNetworkParams::m_EnableDelegate, ExecuteNetworkParams::m_EnableFastMath, ExecuteNetworkParams::m_EnableFp16TurboMode, ExecuteNetworkParams::m_EnableLayerDetails, ExecuteNetworkParams::m_EnableProfiling, IRuntime::CreationOptions::ExternalProfilingOptions::m_EnableProfiling, m_ExNetParams, IRuntime::CreationOptions::ExternalProfilingOptions::m_FileFormat, IRuntime::CreationOptions::ExternalProfilingOptions::m_FileOnly, IRuntime::CreationOptions::ExternalProfilingOptions::m_IncomingCaptureFile, ExecuteNetworkParams::m_InferOutputShape, ExecuteNetworkParams::m_Iterations, ExecuteNetworkParams::m_ModelPath, IRuntime::CreationOptions::ExternalProfilingOptions::m_OutgoingCaptureFile, ExecuteNetworkParams::m_ParseUnsupported, ExecuteNetworkParams::m_PrintIntermediate, IRuntime::CreationOptions::m_ProfilingOptions, ExecuteNetworkParams::m_QuantizeInput, m_RuntimeOptions, ExecuteNetworkParams::m_SubgraphId, ExecuteNetworkParams::m_ThresholdTime, IRuntime::CreationOptions::ExternalProfilingOptions::m_TimelineEnabled, ExecuteNetworkParams::m_TuningLevel, and ExecuteNetworkParams::m_TuningPath.

150  : m_CxxOptions{"ExecuteNetwork",
151  "Executes a neural network model using the provided input "
152  "tensor. Prints the resulting output tensor."}
153 {
154  try
155  {
156  // cxxopts doesn't provide a mechanism to ensure required options are given. There is a
157  // separate function CheckRequiredOptions() for that.
158  m_CxxOptions.add_options("a) Required")
159  ("c,compute",
160  "Which device to run layers on by default. Possible choices: "
162  + " NOTE: Compute devices need to be passed as a comma separated list without whitespaces "
163  "e.g. CpuRef,CpuAcc",
164  cxxopts::value<std::vector<std::string>>())
165 
166  ("f,model-format",
167  "armnn-binary, caffe-binary, caffe-text, onnx-binary, onnx-text, tflite-binary, tensorflow-binary or "
168  "tensorflow-text.",
169  cxxopts::value<std::string>())
170 
171  ("D,armnn-tflite-delegate",
172  "enable Arm NN TfLite delegate",
173  cxxopts::value<bool>(m_ExNetParams.m_EnableDelegate)->default_value("false")->implicit_value("true"))
174 
175  ("m,model-path",
176  "Path to model file, e.g. .armnn, .caffemodel, .prototxt, .tflite, .onnx",
177  cxxopts::value<std::string>(m_ExNetParams.m_ModelPath))
178 
179  ("i,input-name",
180  "Identifier of the input tensors in the network separated by comma.",
181  cxxopts::value<std::string>())
182 
183  ("o,output-name",
184  "Identifier of the output tensors in the network separated by comma.",
185  cxxopts::value<std::string>());
186 
187  m_CxxOptions.add_options("b) General")
188  ("b,dynamic-backends-path",
189  "Path where to load any available dynamic backend from. "
190  "If left empty (the default), dynamic backends will not be used.",
191  cxxopts::value<std::string>(m_RuntimeOptions.m_DynamicBackendsPath))
192 
193  ("d,input-tensor-data",
194  "Path to files containing the input data as a flat array separated by whitespace. "
195  "Several paths can be passed by separating them with a comma. If not specified, the network will be "
196  "run with dummy data (useful for profiling).",
197  cxxopts::value<std::string>()->default_value(""))
198 
199  ("h,help", "Display usage information")
200 
201  ("infer-output-shape",
202  "Infers output tensor shape from input tensor shape and validate where applicable (where supported by "
203  "parser)",
204  cxxopts::value<bool>(m_ExNetParams.m_InferOutputShape)->default_value("false")->implicit_value("true"))
205 
206  ("iterations",
207  "Number of iterations to run the network for, default is set to 1",
208  cxxopts::value<size_t>(m_ExNetParams.m_Iterations)->default_value("1"))
209 
210  ("l,dequantize-output",
211  "If this option is enabled, all quantized outputs will be dequantized to float. "
212  "If unset, default to not get dequantized. "
213  "Accepted values (true or false)",
214  cxxopts::value<bool>(m_ExNetParams.m_DequantizeOutput)->default_value("false")->implicit_value("true"))
215 
216  ("p,print-intermediate-layers",
217  "If this option is enabled, the output of every graph layer will be printed.",
218  cxxopts::value<bool>(m_ExNetParams.m_PrintIntermediate)->default_value("false")
219  ->implicit_value("true"))
220 
221  ("parse-unsupported",
222  "Add unsupported operators as stand-in layers (where supported by parser)",
223  cxxopts::value<bool>(m_ExNetParams.m_ParseUnsupported)->default_value("false")->implicit_value("true"))
224 
225  ("q,quantize-input",
226  "If this option is enabled, all float inputs will be quantized to qasymm8. "
227  "If unset, default to not quantized. Accepted values (true or false)",
228  cxxopts::value<bool>(m_ExNetParams.m_QuantizeInput)->default_value("false")->implicit_value("true"))
229 
230  ("r,threshold-time",
231  "Threshold time is the maximum allowed time for inference measured in milliseconds. If the actual "
232  "inference time is greater than the threshold time, the test will fail. By default, no threshold "
233  "time is used.",
234  cxxopts::value<double>(m_ExNetParams.m_ThresholdTime)->default_value("0.0"))
235 
236  ("s,input-tensor-shape",
237  "The shape of the input tensors in the network as a flat array of integers separated by comma."
238  "Several shapes can be passed by separating them with a colon (:).",
239  cxxopts::value<std::string>())
240 
241  ("v,visualize-optimized-model",
242  "Enables built optimized model visualizer. If unset, defaults to off.",
243  cxxopts::value<bool>(m_ExNetParams.m_EnableLayerDetails)->default_value("false")
244  ->implicit_value("true"))
245 
246  ("w,write-outputs-to-file",
247  "Comma-separated list of output file paths keyed with the binding-id of the output slot. "
248  "If left empty (the default), the output tensors will not be written to a file.",
249  cxxopts::value<std::string>())
250 
251  ("x,subgraph-number",
252  "Id of the subgraph to be executed. Defaults to 0.",
253  cxxopts::value<size_t>(m_ExNetParams.m_SubgraphId)->default_value("0"))
254 
255  ("y,input-type",
256  "The type of the input tensors in the network separated by comma. "
257  "If unset, defaults to \"float\" for all defined inputs. "
258  "Accepted values (float, int or qasymm8).",
259  cxxopts::value<std::string>())
260 
261  ("z,output-type",
262  "The type of the output tensors in the network separated by comma. "
263  "If unset, defaults to \"float\" for all defined outputs. "
264  "Accepted values (float, int or qasymm8).",
265  cxxopts::value<std::string>());
266 
267  m_CxxOptions.add_options("c) Optimization")
268  ("bf16-turbo-mode",
269  "If this option is enabled, FP32 layers, "
270  "weights and biases will be converted to BFloat16 where the backend supports it",
271  cxxopts::value<bool>(m_ExNetParams.m_EnableBf16TurboMode)
272  ->default_value("false")->implicit_value("true"))
273 
274  ("enable-fast-math",
275  "Enables fast_math options in backends that support it. Using the fast_math flag can lead to "
276  "performance improvements but may result in reduced or different precision.",
277  cxxopts::value<bool>(m_ExNetParams.m_EnableFastMath)->default_value("false")->implicit_value("true"))
278 
279  ("fp16-turbo-mode",
280  "If this option is enabled, FP32 layers, "
281  "weights and biases will be converted to FP16 where the backend supports it",
282  cxxopts::value<bool>(m_ExNetParams.m_EnableFp16TurboMode)
283  ->default_value("false")->implicit_value("true"))
284 
285  ("tuning-level",
286  "Sets the tuning level which enables a tuning run which will update/create a tuning file. "
287  "Available options are: 1 (Rapid), 2 (Normal), 3 (Exhaustive). "
288  "Requires tuning-path to be set, default is set to 0 (No tuning run)",
289  cxxopts::value<int>(m_ExNetParams.m_TuningLevel)->default_value("0"))
290 
291  ("tuning-path",
292  "Path to tuning file. Enables use of CL tuning",
293  cxxopts::value<std::string>(m_ExNetParams.m_TuningPath));
294 
295  m_CxxOptions.add_options("d) Profiling")
296  ("a,enable-external-profiling",
297  "If enabled external profiling will be switched on",
299  ->default_value("false")->implicit_value("true"))
300 
301  ("e,event-based-profiling",
302  "Enables built in profiler. If unset, defaults to off.",
303  cxxopts::value<bool>(m_ExNetParams.m_EnableProfiling)->default_value("false")->implicit_value("true"))
304 
305  ("g,file-only-external-profiling",
306  "If enabled then the 'file-only' test mode of external profiling will be enabled",
307  cxxopts::value<bool>(m_RuntimeOptions.m_ProfilingOptions.m_FileOnly)
308  ->default_value("false")->implicit_value("true"))
309 
310  ("file-format",
311  "If profiling is enabled specifies the output file format",
312  cxxopts::value<std::string>(m_RuntimeOptions.m_ProfilingOptions.m_FileFormat)->default_value("binary"))
313 
314  ("j,outgoing-capture-file",
315  "If specified the outgoing external profiling packets will be captured in this binary file",
316  cxxopts::value<std::string>(m_RuntimeOptions.m_ProfilingOptions.m_OutgoingCaptureFile))
317 
318  ("k,incoming-capture-file",
319  "If specified the incoming external profiling packets will be captured in this binary file",
320  cxxopts::value<std::string>(m_RuntimeOptions.m_ProfilingOptions.m_IncomingCaptureFile))
321 
322  ("timeline-profiling",
323  "If enabled timeline profiling will be switched on, requires external profiling",
325  ->default_value("false")->implicit_value("true"))
326 
327  ("u,counter-capture-period",
328  "If profiling is enabled in 'file-only' mode this is the capture period that will be used in the test",
329  cxxopts::value<uint32_t>(m_RuntimeOptions.m_ProfilingOptions.m_CapturePeriod)->default_value("150"));
330  }
331  catch (const std::exception& e)
332  {
333  ARMNN_ASSERT_MSG(false, "Caught unexpected exception");
334  ARMNN_LOG(fatal) << "Fatal internal error: " << e.what();
335  exit(EXIT_FAILURE);
336  }
337 }
ExecuteNetworkParams m_ExNetParams
armnn::IRuntime::CreationOptions m_RuntimeOptions
#define ARMNN_LOG(severity)
Definition: Logging.hpp:163
BackendRegistry & BackendRegistryInstance()
std::string GetBackendIdsAsString() const
#define ARMNN_ASSERT_MSG(COND, MSG)
Definition: Assert.hpp:15
std::string m_DynamicBackendsPath
Setting this value will override the paths set by the DYNAMIC_BACKEND_PATHS compiler directive Only a...
Definition: IRuntime.hpp:59
ExternalProfilingOptions m_ProfilingOptions
Definition: IRuntime.hpp:83

◆ ProgramOptions() [2/2]

ProgramOptions ( int  ac,
const char *  av[] 
)

Runs ParseOptions() on initialization.

Definition at line 339 of file ExecuteNetworkProgramOptions.cpp.

References ParseOptions().

339  : ProgramOptions()
340 {
341  ParseOptions(ac, av);
342 }
ProgramOptions()
Initializes ProgramOptions by adding options to the underlying cxxopts::options object.
void ParseOptions(int ac, const char *av[])
Parses program options from the command line or another source and stores the values in member variab...

Member Function Documentation

◆ ParseOptions()

void ParseOptions ( int  ac,
const char *  av[] 
)

Parses program options from the command line or another source and stores the values in member variables.

It also checks the validity of the parsed parameters. Throws a cxxopts exception if parsing fails or an armnn exception if parameters are not valid.

Definition at line 344 of file ExecuteNetworkProgramOptions.cpp.

References CheckOptionDependencies(), CheckRequiredOptions(), GetBackendIDs(), IRuntime::CreationOptions::m_BackendOptions, ExecuteNetworkParams::m_ComputeDevices, m_CxxOptions, m_CxxResult, ExecuteNetworkParams::m_DynamicBackendsPath, IRuntime::CreationOptions::m_DynamicBackendsPath, ExecuteNetworkParams::m_EnableProfiling, m_ExNetParams, ExecuteNetworkParams::m_GenerateTensorData, ExecuteNetworkParams::m_InputNames, ExecuteNetworkParams::m_InputTensorDataFilePaths, ExecuteNetworkParams::m_InputTensorShapes, ExecuteNetworkParams::m_InputTypes, ExecuteNetworkParams::m_ModelFormat, ExecuteNetworkParams::m_OutputNames, ExecuteNetworkParams::m_OutputTensorFiles, ExecuteNetworkParams::m_OutputTypes, m_RuntimeOptions, ExecuteNetworkParams::m_TuningLevel, ExecuteNetworkParams::m_TuningPath, ParseArray(), ParseStringList(), armnn::stringUtils::StringTrimCopy(), ValidateExecuteNetworkParams(), and ValidateRuntimeOptions().

Referenced by ProgramOptions().

345 {
346  // Parses the command-line.
347  m_CxxResult = m_CxxOptions.parse(ac, av);
348 
349  if (m_CxxResult.count("help") || ac <= 1)
350  {
351  std::cout << m_CxxOptions.help() << std::endl;
352  exit(EXIT_SUCCESS);
353  }
354 
357 
358  // Some options can't be assigned directly because they need some post-processing:
359  auto computeDevices = GetOptionValue<std::vector<std::string>>("compute", m_CxxResult);
360  m_ExNetParams.m_ComputeDevices = GetBackendIDs(computeDevices);
362  armnn::stringUtils::StringTrimCopy(GetOptionValue<std::string>("model-format", m_CxxResult));
364  ParseStringList(GetOptionValue<std::string>("input-name", m_CxxResult), ",");
366  ParseStringList(GetOptionValue<std::string>("input-tensor-data", m_CxxResult), ",");
368  ParseStringList(GetOptionValue<std::string>("output-name", m_CxxResult), ",");
370  ParseStringList(GetOptionValue<std::string>("input-type", m_CxxResult), ",");
372  ParseStringList(GetOptionValue<std::string>("output-type", m_CxxResult), ",");
374  ParseStringList(GetOptionValue<std::string>("write-outputs-to-file", m_CxxResult), ",");
378 
379  // Parse input tensor shape from the string we got from the command-line.
380  std::vector<std::string> inputTensorShapesVector =
381  ParseStringList(GetOptionValue<std::string>("input-tensor-shape", m_CxxResult), ":");
382 
383  if (!inputTensorShapesVector.empty())
384  {
385  m_ExNetParams.m_InputTensorShapes.reserve(inputTensorShapesVector.size());
386 
387  for(const std::string& shape : inputTensorShapesVector)
388  {
389  std::stringstream ss(shape);
390  std::vector<unsigned int> dims = ParseArray(ss);
391 
393  std::make_unique<armnn::TensorShape>(static_cast<unsigned int>(dims.size()), dims.data()));
394  }
395  }
396 
397  // We have to validate ExecuteNetworkParams first so that the tuning path and level is validated
399 
400  // Parse CL tuning parameters to runtime options
401  if (!m_ExNetParams.m_TuningPath.empty())
402  {
403  m_RuntimeOptions.m_BackendOptions.emplace_back(
405  {
406  "GpuAcc",
407  {
408  {"TuningLevel", m_ExNetParams.m_TuningLevel},
409  {"TuningFile", m_ExNetParams.m_TuningPath.c_str()},
410  {"KernelProfilingEnabled", m_ExNetParams.m_EnableProfiling}
411  }
412  }
413  );
414  }
415 
417 }
ExecuteNetworkParams m_ExNetParams
std::vector< std::string > m_InputTypes
void ValidateExecuteNetworkParams()
Ensures that the parameters for ExecuteNetwork fit together.
std::vector< TensorShapePtr > m_InputTensorShapes
std::vector< unsigned int > ParseArray(std::istream &stream)
std::vector< std::string > ParseStringList(const std::string &inputString, const char *delimiter)
Splits a given string at every accurance of delimiter into a vector of string.
armnn::IRuntime::CreationOptions m_RuntimeOptions
std::vector< std::string > m_OutputNames
std::vector< std::string > m_OutputTensorFiles
std::vector< armnn::BackendId > m_ComputeDevices
std::vector< std::string > m_OutputTypes
std::string StringTrimCopy(const std::string &str, const std::string &chars="\\\")
Trim from both the start and the end of a string, returns a trimmed copy of the string.
Definition: StringUtils.hpp:85
std::vector< BackendOptions > m_BackendOptions
Pass backend specific options.
Definition: IRuntime.hpp:115
std::vector< armnn::BackendId > GetBackendIDs(const std::vector< std::string > &backendStrings)
Takes a vector of backend strings and returns a vector of backendIDs. Removes duplicate entries...
std::vector< std::string > m_InputNames
std::vector< std::string > m_InputTensorDataFilePaths
Struct for the users to pass backend specific options.
std::string m_DynamicBackendsPath
Setting this value will override the paths set by the DYNAMIC_BACKEND_PATHS compiler directive Only a...
Definition: IRuntime.hpp:59
void ValidateRuntimeOptions()
Ensures that the runtime options are valid.
void CheckOptionDependencies(const cxxopts::ParseResult &result)
cxxopts::ParseResult m_CxxResult
void CheckRequiredOptions(const cxxopts::ParseResult &result)

◆ ValidateExecuteNetworkParams()

void ValidateExecuteNetworkParams ( )

Ensures that the parameters for ExecuteNetwork fit together.

Definition at line 135 of file ExecuteNetworkProgramOptions.cpp.

References m_ExNetParams, and ExecuteNetworkParams::ValidateParams().

Referenced by ParseOptions().

136 {
138 }
ExecuteNetworkParams m_ExNetParams

◆ ValidateRuntimeOptions()

void ValidateRuntimeOptions ( )

Member Data Documentation

◆ m_CxxOptions

cxxopts::Options m_CxxOptions

Definition at line 41 of file ExecuteNetworkProgramOptions.hpp.

Referenced by ParseOptions(), and ProgramOptions().

◆ m_CxxResult

cxxopts::ParseResult m_CxxResult

Definition at line 42 of file ExecuteNetworkProgramOptions.hpp.

Referenced by ParseOptions().

◆ m_ExNetParams

◆ m_RuntimeOptions


The documentation for this struct was generated from the following files: