# 8 Network performance tuning

Source: [https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html](https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html)

**Parent Topic:** https://docs.qualcomm.com/doc/80-PT790-993B/topic/dl_inference_tools_part.html

## 8.1 Model configurator

Source: [https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html](https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html)

An input model can be compiled with several network compilation and runtime parameters.

The model configurator tool helps identify the optimal compiler configuration for a network by running multiple configurations on the AIC100 device. The tool solves the following problems:

- How many cores to compile for? Using all the cores may not give the best performance for all models.
- What are the different compilation parameter values to choose?
- What batch size to use and how many instances to run in parallel?

The model configurator provides two ways to find the optimal compiler and runtime configuration for a model:

1. Brute force
        
    The user can define a list of search space parameters (see [Search space parameters](https://docs.qualcomm.com/doc/80-PT790-993B/topic/model-configurator-search-space-parameters.html)). All valid combinations of the search space for a given model and inputs are evaluated. The performance achieved with each configuration is listed, so that the best combination of options can be determined.
2. Config optimizer
        
    This method uses an optimization algorithm to conduct the search. For a given search space and initial value for the optimization parameters, the algorithm returns a locally optimal configuration. This is expected to arrive at the optimal solution faster, as it does not evaluate the entire search space, but instead tries to take informed variable-sized steps towards the optimal solution. [Search space parameters](https://docs.qualcomm.com/doc/80-PT790-993B/topic/model-configurator-search-space-parameters.html) describes how to use the config optimizer. Single device partitioning and depth first are not supported yet as search parameters in this method. Remote execution is also not supported.

The model configurator tool uses the qaic-exec tool for compiling the model and the qaic-runner tool for running the model.

The tool can be found in:

    /opt/qti-aic/scripts/qaic-model-configuratorCopy to clipboard

A README for the tool is also available at ` /opt/qti-aic/scripts/qaic-model-configurator/README.md`.

Figure : Model configurator
      
      ![Apps SDK Model Configurator](data:image/png;base64,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)

**Parent Topic:** [Network performance tuning](https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html)

## 8.1.1 Usage

Source: [https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html](https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html)

model_configurator.py [-h] [-cores PARAM_CORES] [-batchsize PARAM_BS] [-mos PARAM_MOS] [-ols PARAM_OLS] [-dealloc-dly PARAM_DEALLOC_DELAY] [-split-size PARAM_SPLIT_SIZE] [-limit-vtcm-percent PARAM_VTCM_RATIO] [-enable-single-device-partitioning] [-test-depth-first-search] [-depth-first-mem PARAM_DFS_MEM] [-convert-to-fp16] [-quantization-precision {Int8,Int16}] [-quantization-precision-bias {Int8,Int32}] [-quantization-schema-activations {symmetric,asymmetric,symmetric_with_uint8,symmetric_with_power2_scale}] [-quantization-schema-constants {symmetric,asymmetric,symmetric_with_uint8,symmetric_with_power2_scale}] [-quantization-calibration {KLMinimization,Percentile,KLMinimizationV2,MSE,SQNR}] [-percentile-calibration-value PERCENTILE_CALIB] [-num-histogram-bins NUM_HISTOGRAM_BINS] [-quant-profile-threads QUANT_PROFILE_THREADS] [-quant-num-inputs QUANT_NUM_INPUTS] [-no-quant] [-external-quantization EXT_QUANT_FILE] [-node-precision-info NODE_PRECISION_FILE] [-execute-nodes-in-fp16 NODES_IN_FP16] [-keep-original-precision-for-nodes NODES_IN_ORIGINAL_PRECISION] [-device-processing] [-multicast-weights] [-combine-inputs {True,False}] [-combine-outputs {True,False}] [-compile-only] [-enable-depth-first] [-onnx-define-symbol-batch-size ONNX_DEFINE_SYMB_BS] [-onnx-define-symbol ONNX_SYMBS] [-stats-batchsize STATS_BATCHSIZE] [-max-compilation-threads MAX_COMPILATION_THREADS] [-iter ITER] [-time RUN_DURATION] [-instances INSTANCES] [-set-size SET_SIZE] [-input-list-file INPUT] [-input-list-generate] [-benchmark] [-custom-IO-list-file CUSTOM_IO_FILE] [-output-dir OUTPUT] [-device-id DEVICE_ID] [-model-input MODELINPUTDATA] [-output-node-name OUTNODENAME] [-qdrive] [-qdrive-telnet-ip QD_TELNET_IP] [-register-custom-op CUSTOM_OP_CONFIG] [-enable-channelwise] [-enable-rowwise] [-image-dir IMAGE_DIR] [-image-type {jpg,png}] [-height IMGHEIGHT] [-width IMGWIDTH] [-letterbox-resize] [-no-nhwc-conversion] [-no-normalize] [-normalize-255] [-fp32-to-int8] [-bgr-to-rgb] [-num-raw-files RAW_FILES_CNT] [-reuse-single-file] [--verbose] [-save-configs SAVESPFILE] [-load-configs LOADSPFILE] [-list-configs] [-remote-exec REMOTE_EXEC_INFO] [-load-pre-gen-files PRE_GEN_FILES] [-create-batched-inputs CREATE_BATCHED_INPUTS] [-parallel-evaluator] [-num-parallel-compile NUM_PARALLEL_COMPILATIONS] [-retain-binaries] [-optimized-config-search OPT_CONFIG_SEARCH] 
    MODEL {onnx,tf,caffe,caffe2,pytorch}    Copy to clipboard

Details of each of option can be found by running:

    python model_configurator.py –help Copy to clipboard

**Dependencies:** Python 3.8, Python packages - opencv-python, pandas, numpy, sklearn dataclasses, paramiko, jsonschema

The dependent packages can be installed with:

    pip3 install -r /opt/qti-aic/scripts/qaic-model-configurator/requirements.txtCopy to clipboard

The model configurator requires both the Platform SDK and the Apps SDK to be installed.

**Parent Topic:** [Model configurator](https://docs.qualcomm.com/doc/80-PT790-993B/topic/qaic-model-configurator.html)

## 8.1.2 Supported model types

Source: [https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html](https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html)

Table : Supported model types

| No. | Type | Command syntax |
| --- | --- | --- |
| 1 | Onnx | python model\_configurator.py **&lt;path to .onnx model&gt; onnx** &lt;other options&gt; |
| 2 | Caffe | python model\_configurator.py **&lt;path to directory containing caffe model&gt; caffe**&lt;other options&gt; |
| 3 | Caffe2 | python model\_configurator.py **&lt;path to directory containing caffe2 model&gt;** **caffe2 -model-input**=*&lt;inputName1&gt;,&lt;inputType1&gt;,&lt;inputShape1&gt;* &lt;other options&gt;<br><br><br>              <br><br><br><br>              <br>**Note:** When running with multiple batch sizes, use an **asterisk** in place of first dimension for model-input.<br><br><br>              <br>Example: `-model-input=gpu_0/data,float,[*,3,224,224] ` |
| 4 | Tensorflow | python model\_configurator.py **&lt;path to tf model pb&gt; tf -output-node-name**=&lt;comma separated names of outputs&gt; &lt;other options&gt; |
| 5 | PyTorch | python model\_configurator.py **&lt;path to PyTorch model pt&gt; pytorch -model-input=**&lt;inputName1&gt;,&lt;inputType1&gt;,&lt;inputShape1&gt; &lt;other options&gt;<br><br><br>              <br><br><br><br>              <br>**Note**: When running with multiple batch sizes, use an asterisk in place of the first dimension for model-input.<br><br><br>              <br>Example: `-model-input=gpu_0/data,float,[*,3,224,224] ` |

**Parent Topic:** [Model configurator](https://docs.qualcomm.com/doc/80-PT790-993B/topic/qaic-model-configurator.html)

## 8.1.3 Search space parameters

Source: [https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html](https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html)

**Parent Topic:** [Model configurator](https://docs.qualcomm.com/doc/80-PT790-993B/topic/qaic-model-configurator.html)

## 8.1.3.1 Brute force

Source: [https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html](https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html)

The search space for brute force can be created by using the options in the following table. All the parameters have default values that can be found by using `-help` on `model-configurator.py`.

Table : Search Space parameters

| No. | Parameter | Command syntax |
| --- | --- | --- |
| 1 | `-cores` | Comma separated values and ranges (Examples: 1-4,8,12).<br><br><br>              <br>Number of cores – Selects the number of cores that the model will be compiled for. This option instructs the AIC100 compiler on how many cores the model compilation should be distributed. The number of cores should not exceed the number of cores available on the hardware.<br><br><br>              <br>To know the number of cores available on the hardware, use the command "`/opt/qti-aic/tools/qaic_util -q`" (available once the Platform SDK is installed). |
| 2 | `-batchsize ` | Comma separated values and ranges (Examples: 1-4,8,12).<br><br><br>              <br>It indicates the batch size of the model input.<br><br><br>              <br>Multiple inputs can be batched and inferenced together to reduce control and data path overhead. |
| 3 | `-mos` | Maximum output channel split – The effort level to reduce the on-chip memory usage. The compiler optimizes for the on-chip memory usage by mapping the network to the on-chip memory.<br><br><br>              <br>Increasing the effort level holds more of the network inside on-chip memory, which may lead to a higher communication overload.<br><br><br>              <br>There may be a sweet spot for optimum performance that is dependent on the actual network being run.<br><br><br>              <br>This value should be less than or equal to the number of cores.<br><br><br>              <br>The list of MOS values to be searched across as set by the user is augmented with an additional default value. For points in the search space where the MOS equals this default value, the compiler uses its own internal heuristic algorithms to determine a MOS value to use.<br><br><br>              <br>If this option is not set, then the compiler sets it as per its internal heuristic algorithms. |
| 4 | `-ols` | Overlap split factor – Factor to increase splitting of network operations.<br><br><br>              <br>The compiler can split network nodes into multiple instances to enable more fine-grained parallelism. Generally higher is better, but there may be a sweet spot that may need to be tuned for a given network.<br><br><br>              <br>This value should be less than or equal to 8.<br><br><br>              <br>If this option is not set, then the compiler sets it as per its internal heuristic algorithms. |
| 5 | `-instances ` | Comma separated values and ranges (Examples: 1-4,8,12).<br><br><br>              <br>It indicates the concurrent thread number to execute the same model in parallel.<br><br><br>              <br>By default, instances \* cores &lt;= the number of cores available on the hardware. |
| 6 | `-depth-first-mem` | Comma separated values and ranges. It indicates the memory size for depth first compiler optimizations. Works when depth-first is enabled and for cores=1. To enable depth-first, use option `-enable-depth-first`. See [Other options](https://docs.qualcomm.com/doc/80-PT790-993B/topic/model-configurator-other-options.html).<br><br><br>              <br>If only `-enable-depth-first` is specified, then the compiler chooses the depth-first-mem value using some heuristics. |
| 7 | `-dealloc-dly` | Comma separated and ranges. Example: 0-2,5.<br><br><br>              <br>Sets buffer lifetime. Adjusts how long to keep allocation alive past dealloc.<br><br><br>              <br>Smaller values may result in higher performance for networks with large inputs.<br><br><br>              <br>Valid values are in range [0,10]. Steps of 1 are taken for the specified range. |
| 8 | `-split-size` | Comma separated and ranges. Example: 512-1024,2048.<br><br><br>              <br>Sets the maximum tile size in KiB. Valid values are in range [512,2048].<br><br><br>              <br>Steps of 256 are taken for the specified range. |
| 9 | `-limit-vtcm-percent` | Comma separated and ranges. Example: 50,80,100.<br><br><br>              <br>Percentage of fast memory an instruction can use. Valid values are in range [0,100]. Steps of 5 are taken for the specified range. |

**Parent Topic:** [Search space parameters](https://docs.qualcomm.com/doc/80-PT790-993B/topic/model-configurator-search-space-parameters.html)

## 8.1.3.2 Config optimizer

Source: [https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html](https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html)

To run the optimized search, provide the search arguments via a JSON configuration file. The optimized search can be run on one or more of the searchable parameters (cores, mos ols, batch-size, dealloc-delay, split-size, limit-vtcm-percent and instances). Static values can be set for searchable parameters that have been excluded from the search space.

Table : Config optimizer JSON configuration file

| Parameter | Command syntax |
| --- | --- |
| `-optimized-config-search ` | Path to the configuration file. |

Sample configuration files are available at:

    /opt/qti-aic/scripts/qaic-model-configurator/SampleFiles/ optimizer_config_full_search.json   
    /opt/qti-aic/scripts/qaic-model-configurator/SampleFiles/ optimizer_config_limited_search.json 
    /opt/qti-aic/scripts/qaic-model-configurator/SampleFiles/ optimizer_config_limited_search_static_bs_ols.jsonCopy to clipboard

The JSON file requires the elements listed in the following table.

Table : Config optimizer JSON file elements

| No. | Key | Type | Description | Recommended Value |
| --- | --- | --- | --- | --- |
| 1 | "max\_func\_eval" | Integer | Maximum number of evaluations to do for each initial point. This number can be increased if successful convergence is not achieved. | 200 |
| 2 | "objective" | String | Search objective. Options "maximize\_inf\_rate" or "minimize\_latency". |  |
| 3 | "params" | JSON Object | Provide the search range for each of the parameters – cores, mos, ols, and so on through the min, max values. | Set full range of valid values for each of the options.<br><br><br>              <br>Refer to the “Parameter Range” table below. |
| 4 | "static\_params" | JSON Object | Optional static values to be used for searchable parameters that have been excluded from the search space. |  |
| 5 | "initial\_values" | List of JSON Objects | List of initial values for the search parameters. A fresh search is initiated from each of these points and the results returned. Initial values must be picked from within the search range defined in "params". | Provide multiple initial values.<br><br><br>              <br>Refer to the “Guideline for setting initial value” below. |

The recommended values are meant to be a general guidance and starting point. They may not always apply. For example, some models might be too big to execute for a larger batch size, in which case the range should be chosen accordingly. The following table contains the recommended search range to be set.

Table : Parameter range

| No. | Parameter | Min | Max | Comment |
| --- | --- | --- | --- | --- |
| 1 | cores | 1 | Number of NSPs on device |  |
| 2 | mos | 1 | Number of NSPs on device |  |
| 3 | ols | 1 | 8 | Optimal value is typically found in range 1-8.<br><br><br>              <br>However, the ols value can typically be any integer &gt; 1. |
| 4 | batch-size | 1 | 64 | The Min and Max values must be a power of 2.<br><br><br>              <br>The Max value would depend on the model. |
| 5 | instances | 1 | Number of NSPs on device |  |
| 6 | dealloc-dly | 0 | 4 | Valid range: [0-10]<br><br><br>              <br>Most models have an optimal value between 0-4. |
| 7 | split-size | 512 | 2048 |  |
| 8 | limit-vtcm-percent | 25 | 100 | Valid range: [0,100]<br><br><br>              <br>Most models have an optimal value between 25-100. |

## Setting initial values

Initial values are critical to how the search is conducted and how fast the algorithm will converge. If the user has general intuition on the optimal solution, then the initial value can be picked based on this.

It is recommended to set around 4-5 initial values configured using one of the options below:

1. Sweep over the cores in fixed-sized steps, set vtcm to 100, and keep the initial values for the other parameters to their Min value. For example, cores can be set to [1,4,8,12,16] taking steps of 4 for a 16 NSP device.
2. Sweep over the cores in fixed-sized steps as in Option **1**. Choose the corresponding instances value, such that `cores * instances` is close to number of NSPs on the device.
          
    Example: Pick `{cores,instances}` pairs from `[{1,16}, {4,4}, {8,2}, {12,1}, {16,1}]` for a 16 NSP device. Set vtcm to 100 and the rest of the parameters to their Min value.

With config optimizer, the model is always run using benchmark mode. The batch mode for running models through config optimizer is not supported yet. For more details on the benchmark/batch mode, refer to the **benchmark** option.

**Parent Topic:** [Search space parameters](https://docs.qualcomm.com/doc/80-PT790-993B/topic/model-configurator-search-space-parameters.html)

## 8.1.4 Optimized search results

Source: [https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html](https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html)

The results of the optimized config search will include:

- The initial value used for that run of the optimizer.
- The status returned by the optimizer (the following table lists the possible statuses).
- The configuration to which the optimizer converged.
- The objective value that was achieved.

The optimizer status should be checked before interpreting the rest of the results.

Table : Optimizer status values

| No. | Optimizer status | Comment |
| --- | --- | --- |
| 1 | SUCCESS | The optimizer successfully converged on a solution. |
| 2 | CONSTRAIN\_FAILURE | The optimizer stopped without meeting all the constraints. |
| 3 | NUMERICAL\_FAILURE | The optimizer encountered a numerical failure internally. |
| 4 | EXCEED\_MAX\_ITER | The optimizer exceeded the max allowed number of iterations of its algorithm. Max\_iterations = 2 \* max\_evaluations. |
| 5 | EXCEED\_MAX\_EVAL | The optimizer exceeded the max allowed number of evaluations. |
| 6 | UNKNOWN\_ERROR | The optimizer returned an unknown error. |

**Parent Topic:** [Model configurator](https://docs.qualcomm.com/doc/80-PT790-993B/topic/qaic-model-configurator.html)

## 8.1.5 Input file options

Source: [https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html](https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html)

Table : Input file options

| No. | Parameter | Command syntax |
| --- | --- | --- |
| 1 | -input-list-file | Provide an input text file with list of raw input file paths.<br><br><br>              <br>**Use this option when you already have a raw file with the correct batch size as expected by the model.**<br><br><br>              <br>**With this option you can run with only one batch size.** |
| 2 | -input-list-generate | Generates raw files on the fly for different batch sizes from JPG/PNG images in a directory.<br><br><br>              <br>**Use this option when you have a directory of PNG/JPG images, and you want to run across different batch sizes.**<br><br><br>              <br><br><br><br>              <br>The following parameters are mandatory to be passed if this option is chosen:<br><br><br>              <br>`-image-dir` &lt;Directory of all images - should contain at least number of max batch size images`>`<br><br><br>              <br>If there are lesser files that the required batch size, user can pass:<br><br><br>              <br>`-reuse-single-file` option to reuse the same file for multiple batches.<br><br><br>              <br>`-height` &lt; height of the image the model takes&gt;<br><br><br>              <br>`-width` &lt;width of the image the model takes&gt;<br><br><br>              <br>`-image-type` &lt;extension of images in image-dir. Default jpg&gt;<br><br><br>              <br>For other optional parameters with this input type, refer to the "`Input file Generation Options`" section in `--help`. |
| 3 | -load-pre-gen-files | Pregenerated input data files and PGQ profiles for a batch size can be provided through this option. This is an extension for `-input-list-file` which is for one batch size alone. File paths should be absolute paths or relative paths to parent directory of JSON file.<br><br><br>              <br>For specification, an example file can be found at: `/opt/qti-aic/scripts/qaic-model-configurator/SampleFiles/pre_gen_files.json ` |
| 4 | -create-batched-inputs | Text file with comma-separated ordered input .raw files with no batch dimension. Add lines for a new set of inputs. The inputs will be concatenated together to create a batch on-the-go. File paths of the .raw files should be absolute paths or relative paths to parent directory of the txt file. Assumes all inputs are Int64.<br><br><br>              <br>Sample file at: `/opt/qti-aic/scripts/qaic-model-configurator/SampleFiles/create_batched_inputs_file.txt ` |
| 5 | None of the above | Generates random numbers (default Gaussian) for the required size of inputs. This option may perform slower than providing real input. |

Note: If the inputs provided are less than the –iter specified, a warning is issued. The inputs are repeated to meet the –iter numbers. If the inputs provided are greater than the –iter specified, then all the inputs are executed, so the actual –iter run will be greater than the –iter specified.

**Parent Topic:** [Model configurator](https://docs.qualcomm.com/doc/80-PT790-993B/topic/qaic-model-configurator.html)

## 8.1.6 Quantization options

Source: [https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html](https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html)

Table : Quantization options

| Parameter | Command syntax |
| --- | --- |
| `-quantization-precision ` | Quantization precision: Int8 (default) or Int16 |
| `-quantization-precision-bias ` | Quantization precision bias: Int8 (default) or Int32 |
| `-quantization-schema-activations` | Quantization scheme to use for activations:<br><br><br>              <br>symmetric, symmetric\_with\_uint8 (default), symmetric\_with\_power2\_scale |
| `-quantization-schema-constants` | Quantization scheme for to use for constants such as weights and bias:<br><br><br>              <br>symmetric, symmetric\_with\_uint8 (default), symmetric\_with\_power2\_scale |
| `-quantization-calibration` | Specify which quantization calibration to use: KLMinimization, Percentile, MSE, SQNR, or KLMinimizationV2.<br><br><br>              <br>If not specified, default (None – MinMax calibration) is used. |
| `-percentile-calibration-value` | Specify the value to be used with the percentile calibration method.<br><br><br>              <br>The specified float value must be within 90 and 100. Default is 100. |
| `-num-histogram-bins ` | Sets the number of histogram bins that will be used in profiling every node. Default is 512. |
| `-convert-to-fp16 ` | Run all floating-point computation in fp16 (disabled by default).<br><br><br>              <br>No quantization is performed. |
| `-no-quant ` | Disables quantization. |
| `-node-precision-info` | Load node precision config file to run specific instances in FP16. |
| `-execute-nodes-in-fp16` | Run all instances of the operators in this list with FP16. |
| `-keep-original-precision-for-nodes ` | Run all instances of the operators in this list with original precision. |
| `-external-quantization` | Provide the external quantization file path. |
| `-custom-IO-list-file` | Custom I/O configuration file. |
| `-load-pre-gen-files` | Pregenerated input data files and PGQ profiles for a batch size can be provided through this option. This is an extension for `-input-list-file`, which is for one batch size alone. File paths should be absolute paths or relative paths to parent directory of the .json file.<br><br><br>              <br>For specification, an example file can be found at:<br><br><br>              <br>`/opt/qti-aic/scripts/qaic-model-configurator/SampleFiles/pre_gen_files.json`. |
| `-enable-rowwise` | Enable row-wise quantization. |
| `-enable-channelwise` | Enable channel-wise quantization. |

**Parent Topic:** [Model configurator](https://docs.qualcomm.com/doc/80-PT790-993B/topic/qaic-model-configurator.html)

## 8.1.7 Other options

Source: [https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html](https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html)

Table : Other options

| Parameter | Command syntax |
| --- | --- |
| `-load-configs, `<br><br><br>              <br>`-save-config, `<br><br><br>              <br>`-list-configs ` | Options used to save the search space in a file and load it later for another run (with editing if needed).<br><br><br>              <br>The `-list-configs` option will list all the executions before running. |
| `-iter ` | Number of iterations to run. |
| `-device-processing ` | Enable pre- and postprocessing on the AIC device. |
| `-compile-only ` | Perform compilation only (no execution).<br><br><br>              <br>Compiled networks are saved in output directories. |
| `-device-id ` | AIC device ID in case of multiple devices. |
| `-d32-spatial-major ` | Use spatial major layout. Note that the compiler automatically uses spatial major layout for depth-wise separable convolutions, so it is not necessary to specify this option explicitly for such cases. |
| `-qdrive ` | Use qdrive present at 192.168.1.1 instead of attached SA9000 to execute each model. |
| `-register-custom-op ` | Register custom operations for your model using the configuration file. |
| `-enable-depth-first ` | Enables depth-first optimizations. Compiler sets the default depth-first memory size. To search across different depth-first memory sizes use the option<br><br><br>              <br>`-depth-first-mem=N.` See *Search space parameters* for more information. |
| `-enable-single-device-partitioning` | Enables single-device partitioning. The cores involved are split into partitions/clusters and the network is split among the clusters, allowing for pipelined execution of the network.<br><br><br>              <br>Extends the search space by automatically generating valid cluster configurations and the associated MOS values for each cluster. |
| `-remote-exec ` | Enables remote execution of the model. Pass host and username as username@host. The connection is geared to be password-less and requires the ssh keys to be set up on the remote machine for this to work. When specified, the model is compiled locally, the compiled binary and input data are copied to remote machine, and model is run there. This is expected to be slower as data movement is involved. |
| `-onnx-define-symbol-batch-size ` | Set the onnx symbol name for batch size. Sets the batch size through the`onnx-define-symbol` option.<br><br><br>              <br>The batch size values are picked from the `-batchsize` option. This option is relevant for ONNX models alone. |
| `-retain-binaries ` | By default, compiled model binaries are deleted as they can take up a lot of disk space.<br><br><br>              <br>This option can be used to retain the binaries. |
| `-max-compilation-threads` | Max number of threads to spawn for running multiple compilations in parallel. |

**Parent Topic:** [Model configurator](https://docs.qualcomm.com/doc/80-PT790-993B/topic/qaic-model-configurator.html)

## 8.1.8 Debug issues

Source: [https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html](https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html)

When running the configurator over a search space, a set of files are created in the output directory. If no output directory is specified by the user, it defaults to directory name “model\_configurator\_output/” in the directory from which the command is being run.

Table : Model configurator logs

| Log files/directory | Description |
| --- | --- |
| model\_configurator.log | Main application log file. |
| results.csv | The final results are saved in csv. |
| compiled\_models | Directory containing compiler outputs. Removed at application exit, unless the`-retain-binaries` command line option is specified. |

**Parent Topic:** [Model configurator](https://docs.qualcomm.com/doc/80-PT790-993B/topic/qaic-model-configurator.html)

## 8.1.9 Example config files

Source: [https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html](https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html)

Example config files (for use with model\_configurator) are included in the `SampleConfigurations` sub-directory.

The file `config_8cores_only_smallset.csv` can be used with model\_configurator for an 8-core AIC100 SoC to do a shallow search of parameters values. This config file restricts the search space to combinations that satisfy the following conditions: cores\*instances = 8, batchsize=1 or 4, mos=1,4, or 8, ols=1,2, or 4. It has 36 parameter combinations and may be helpful to quickly gauge the parameters to which a given network is sensitive and hence worth exploring with a deeper search.

The file `config_8cores_only.csv` is also suited for use with an 8-core AIC100 SoC; however, it specifies a deeper search over the same parameters as `config_8cores_only_smallset.csv`. It also targets configurations that satisfy the criterion cores\*instances = 8; however, it sweeps a larger range of values for the other parameters. Specifically, batchsize=1,2,4, or 8, mos=1,2,4, or 8, and ols = 1,2, or 4. The file has 104 combinations and hence model\_configurator will take a longer time to finish.

It is recommended that model\_configurator be invoked with one of the above config files for new networks to determine if there is an opportunity to tune parameters further. The default parameter values may not always be optimal.

The file `config_14cores_ref.csv` is provided as a reference that contains all valid combinations of cores and instances for a 14-core AIC100 SoC. It sweeps over batchsize=1,2,4,8, or 14, mos=1,2,4, 8, or 14 and ols=1,2, or 4. It has 304 combinations, including some that use fewer than 14 cores for the combination of cores and instances. The following command is one example that can generate this configuration file:

    $ python3 /opt/qti-aic/scripts/qaic-model-configurator/model_configurator.py vgg16.onnx onnx -list-configs -save-configs ./config_14cores_ref.csv -iter 500 -cores=1,2,4,8,14 -instances 1,2,4,8,14 -batchsize 1,2,4,8,14 -mos 1,2,4,8,14 -ols 1,2,4Copy to clipboard

By filtering out just the combinations of interest, other config files can be derived from this reference file. For example, `config_8cores_only_smallset.csv` can be derived from `config_14cores_ref.csv` by selecting only combinations for which cores\*instances=8, batchsize=1 or 4, mos=1,4, or 8, ols=1,2, or 4.

The selected config file can be passed to `qaic-model-configurator` to execute a search using the `-load-configs` option. For example:

    $ python3 /opt/qti-aic/scripts/qaic-model-configurator/model_configurator.py vgg16.onnx onnx -output-dir int8host -list-configs -load-configs ./config_14cores_ref.csv -iter=500 -quantization-schema-activations=symmetric_with_uint8 -quantization-precision=Int8 -input-list-generate -image-dir ./ -height 640 -width 640 -image-type jpg -reuse-single-fileCopy to clipboard

Note: Options that impact how a model should be executed, such as quantization and format conversion options should be added to a `qaic-model-configurator` invocation that performs the actual measurements, such as the one above.

**Parent Topic:** [Model configurator](https://docs.qualcomm.com/doc/80-PT790-993B/topic/qaic-model-configurator.html)

## 8.1.10 Limitations

Source: [https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html](https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html)

Running on CentOS-7:

- To run qaic-model-configurator on a CentOS-7 host, the libstdc++ library that is
                packaged in the Apps SDK must be used. This requires setting the environment
                variable LD\_LIBRARY\_PATH before running qaic-model-configurator. This can be done
                with the following command:

    export LD_LIBRARY_PATH=/opt/qti-aic/dev/lib/x86_64:/opt/qti-aic/dev/lib/x86_64/appsCopy to clipboard

**Parent Topic:** [Model configurator](https://docs.qualcomm.com/doc/80-PT790-993B/topic/qaic-model-configurator.html)

## 8.1.11 Example run and img2raw usage for a ResNet-50 model

Source: [https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html](https://docs.qualcomm.com/doc/80-PT790-993B/topic/network-perform-tuning.html)

For Caffe2 models:

    $ python3  /opt/qti-aic/scripts/qaic-model-configurator/model_configurator.py caffe2_resnet50_caffe2 -iter 100 -list-configs -batchsize 1,4,8 -cores 2,8 -mos 2 -ols 2 -instance 1 -input-list-generate -image-dir $PATH_IMAGE_SET -width 224 -height 224 -model-input=gpu_0/data,float,[*,3,224,224] -reuse-single-fileCopy to clipboard

For ONNX models:

    $ python3 /opt/qti-aic/scripts/qaic-model-configurator/model_configurator.py resnet50.onnx onnx -iter 5000 -precision Int8 -list-configs -batchsize 1 -cores 2,7-12 -mos 2 -ols 2 -instance 2,7 -input-list-file inputs_res.txtCopy to clipboard

For an ONNX model with single device partitioning:

    $ python3 /opt/qti-aic/scripts/qaic-model-configurator/model_configurator.py SsdResnet18_1MP.onnx onnx -iter 5000 -list-configs -batchsize 1 -cores 6 -mos 1,2,4,8 -ols 2,4 -instance 1 -input-list-file list.txt -width 224 -height 224 -reuse-single-file -enable-single-device-partitioningCopy to clipboard

**To generate raw files** from jpg/png images for different batch sizes, the `img2raw` Python script can be used. This script is imported by the model\_configurator to generate raw files for different batch sizes from a provided image directory.

    img2raw.py [-h] [-batchsize BATCH_SIZE] -image-dir IMAGE_DIR
                    [-image-type {jpg,png}] -height IMGHEIGHT -width IMGWIDTH 
                    [-no-nhwc-conversion] [-no-normalize] [-fp32-to-int8] 
                    [-bgr-to-rgb] [-num-raw-files RAW_FILES_CNT] 
                    [-reuse-single-file] [-output OUTPUT] 
     
                    -h, --help show this help message and exit 
                    -batchsize BATCH_SIZE   Output batch size, default 1 
                    -image-dir IMAGE_DIR Input image directory 
                    -image-type {jpg,png} jpg (default) or png 
                    -height IMGHEIGHT output image height 
                    -width IMGWIDTH output image width 
                    -no-nhwc-conversion Disable conversion from NHWC to NCHW 
                    -no-normalize Disable Normalization 
                    -fp32-to-int8 Convert input from Fp32 to int8 
                    -bgr-to-rgb Convert from BGR to RGB 
                    -num-raw-files RAW_FILES_CNT  Number of raw files to generate default 1 (multiple of batchsize) 
                    -reuse-single-file If set will reuse same image for multiple batches 
                    -output OUTPUT Output Directory Copy to clipboard

**Example img2raw.py**

(Picks up four images from JPEGImages\_dir, does scaling with provided width and height, NHWC→NCHW, normalization, and merges the buffers into a single raw image.)

    $ python3 /opt/qti-aic/scripts/qaic-model-configurator/img2raw.py -image-dir JPEGImages_dir -height 124 -width 124 -batchsize 4  
     
    ls batch_size_4 
        file-list.txt img_0.rawCopy to clipboard

Table : img2raw options

| No. | Option | Description |
| --- | --- | --- |
| 1 | `-batchsize` | Output batch size, default 1. |
| 2 | `-image-dir IMAGE_DIR` | Input image directory. There could be any number of files in the image-dir (should be more than the batch size \* num-raw-files). |
| 3 | `-image-type Type` | Type of images in the image-dir (png/jpg). |
| 4 | `-height IMGHEIGHT`,<br><br><br>              <br>`-width IMGWIDTH` | Output image dimensions. Input images are scaled to these dimensions. |
| 5 | `-no-nhwc-conversion` | Input images are expected in NHWC format and converted to NCHW. Add this flag to disable this conversion. |
| 6 | `-no-normalize` | Disable normalization of images. |
| 7 | `-fp32-to-int8` | Convert the output images in int8 format. (Disabled by default.) |
| 8 | `-bgr-to-rgb` | Convert input images from BGR to RGB format. (Disabled by default.) |
| 9 | `-num-raw-files` | How many raw files to generate (Default 1).<br><br><br>              <br>Example: If -batchsize=8 and if 16 images are present in the directory, two raw files will be created.<br><br><br>              <br>The image-dir should have at least batch size \* num-raw-files files. |
| 10 | `-reuse-single-file` | If set, will reuse the same image for generating multibatch raw files. Only a single image from the image-dir will be used. |
| 11 | -output | Output directory where the files will be created. A text file is also created in the same directory with the names of the raw files generated. |
| 12 | `-letterbox-resize` | Resize image as per letterbox logic. |
| 13 | `-normalize-255` | Normalization by dividing image by 255. |
| 14 | `-iter` | Number of iterations (iter) for which input file should be generated. |

**Parent Topic:** [Model configurator](https://docs.qualcomm.com/doc/80-PT790-993B/topic/qaic-model-configurator.html)

Last Published: Jul 26, 2023

[Previous Topic
Remote execution over ssh with preshared key setup](https://docs.qualcomm.com/bundle/publicresource/80-PT790-993B/topics/network-accuracy-analysis.md#network-accuracy-analysis_remote_execution_configuration) [Next Topic
Network profiler](https://docs.qualcomm.com/bundle/publicresource/80-PT790-993B/topics/network-profiler.md)