# Qualcomm AI Engine Direct Model Preparation on Linux Source: [https://docs.qualcomm.com/doc/80-64748-1/topic/model_prep_linux.html](https://docs.qualcomm.com/doc/80-64748-1/topic/model_prep_linux.html) qnn_model_prepare_on_linux # Qualcomm AI Engine Direct Stable Diffusion Model Preparation on Linux ![](data:image/png;base64,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 "Jupyter Notebook")![80-64748-5](data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAUCAYAAABroNZJAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAAEZ0FNQQAAsY58+1GTAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAP9JREFUeNpjZMACPCLLtjMCKWSx/wwMO3Ys7/LEpp4JmyAjw38OYsTwGkIqGDUEW0QAgWdk2V8yDPy/fXkXE9wl/xkZ0oDUPxLtb4axmEHEnctHz6vqWl8CMkOJcNF/oKWpwITXh2II2KArR2+o6VhvA3owEVkcDfxj/M+QAPTGAmRBFMW3rxx9pqZvswGYxhOAXFY0A/4wMP233768ewu6yRg23r589JWmps3if0wMSUAuLKl/Z2RiNN2+tOsMNucxA2PmPzA8GoDeaYQJ3rp29KOqrFE/AwdrKpD7m/Efs8m25R3XkTUi62PBFXrbt0/+CaQkRmCyZ0EOqAF1CQDQgVOu//oaYAAAAABJRU5ErkJggg)Download The Qualcomm AI Engine Direct SDK allows clients to run ML models on HTP hardware. The following steps describe how to prepare and execute the Stable Diffusion models on Linux platforms with HTP capability. This document uses the term Qualcomm Neural Network (QNN) and Qualcomm AI Engine Direct SDK interchangeably. # Prerequisites 1. Qualcomm AI Engine Direct SDK (with Ubuntu Linux support) 2. Ubuntu 20.04 installation with required packages for QNN Tools 3. Android Platform tools version 31 or greater 4. This notebook could be executed with Anaconda (with the supplied environment.yaml) or a virtual environment(venv) 5. Stable diffusion `.onnx` files and their corresponding AIMET encodings (generated via AIMET workflow) This work flow assumes that you have generated the Stable Diffusion model artifacts following the AIMET Stable Diffusion workflow: - Stable Diffusion text encoder model and its AIMET encodings - Stable Diffusion U-Net model and its AIMET encodings - Stable Diffusion Variational Auto Encoder (VAE) model and its AIMET encodings - `fp32.npy` file - a numpy object array saved as a Python pickle that contains data that is required as part of the model conversion step. # Tested Environment **Linux x86 PC** - Distributor ID: Ubuntu - Description: Ubuntu 20.04.5 LTS - Release: 20.04 - Platform: x86\_64 AMD # Workflow The three models and encodings are processed independently via different executable QNN utilities available in the Qualcomm AI Engine Direct SDK. To prepare Stable Diffusion models for inference, the QNN executable utilities require an Ubuntu 20.04 environment 1. Convert the `.onnx` files to their equivalent QNN representation with `A16W8` (16-bit activation and 8-bit weights) 2. Generate the QNN model libraries 3. Generate the QNN context binaries for the QNN HTP backend After preparing the Stable Diffusion models for inference, the next step is to execute the QNN context binaries for inference on a Snapdragon Android device. See qnn\_model\_execution\_on\_android.ipynb. ![QNN Work flow](data:image/png;base64,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) The Python environment can be set up using either Anaconda or Python virtual environment (venv). **Note:** One of the following two steps to setup the Python environment must be executed before executing the notebook. If you have already started the jupyer notebook, configure the Python environment before you continue. After configuring the Python environment, restart the notebook server and select the correct kernel. # Setup ### Set up Anaconda in an Ubuntu 20.04 terminal 1. Install Anaconda from : [https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh](https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh). 2. Execute the setup script with the following command. `chmod a+x Anaconda3-2023.03-1-Linux-x86_64.sh && bash Anaconda3-2023.03-1-Linux-x86_64.sh` 3. Configure an Anaconda environment with the following commands in the Ubuntu 20.04 terminal. `conda create --name stable_diffusion_env python=3.8` `conda activate stable_diffusion_env` `conda install ipykernel` `ipython kernel install --user --name=stable_diffusion_env` ### Setup venv (non-Anaconda) in an Ubuntu 20.04 terminal The following steps install the packages required to use the QNN tools in an Ubuntu 20.04 environment (Ubuntu terminal window). 1. Update the package index files. `sudo apt-get update` 2. Install Python3.8 and necessary packages. By default Ubuntu 20.04 should come with Python 3.8 and you don't need to install it again. However to reinstall it run the following command. `sudo bash -c 'apt-get update && apt-get install software-properties-common && add-apt-repository ppa:deadsnakes/ppa && apt-get install python3.8 python3.8-distutils libpython3.8'` 3. Install python3-pip. `sudo apt-get install python3-pip` 4. Install python3 virtual environnment support. `sudo apt install python3-virtualenv` 5. Create and activate a Python 3.8 virtual environment by executing the following commands. virtualenv -p /usr/bin/python3.8 venv_stable_diffusion source venv_stable_diffusion/bin/activateCopy to clipboard ### Install the required python packages In [ ]: pip install --quiet -r requirements.txt Copy to clipboard ## Set up the Qualcomm AI Engine Direct SDK The following steps configure the Qualcomm AI Engine Direct SDK, which enables running Stable Diffusion on the device. Execute the following on an Ubuntu 20.04 terminal. **NOTE:** These steps require sudo or root privileges. 1. After setting up Python and pip in Ubuntu, check QNN tool dependencies; see /docs/QNN/general/setup.html for more information about QNN setup and the ML framework dependencies. 2. Set the `QNN_SDK_ROOT` environment variable to the location of the Qualcomm AI Engine Directory. For **Linux**, `export QNN_SDK_ROOT="./assets/qnn_assets/unzipped_qnn_sdk_linux/"` 3. Check and install Linux dependencies. source $QNN_SDK_ROOT/bin/check-linux-dependency.sh sudo apt-get install -y libtinfo5Copy to clipboard ## Set up Python dependencies for the Qualcomm AI Engine In [ ]: import os #Check and install Python dependencies QNN_SDK_ROOT=os.getcwd() + "/assets/qnn_assets/unzipped_qnn_sdk_linux/" !python $QNN_SDK_ROOT/bin/check-python-dependency Copy to clipboard # Prepare Stable Diffusion Models for Inference The following section uses the Qualcomm AI Engine Direct SDK to prepare stable diffusion models for on-target inference. In [ ]: # Set up environment variable to reference STABLE_DIFFUSION_MODELS STABLE_DIFFUSION_MODELS = os.getcwd() + "/assets/stable_diffusion/" Copy to clipboard ## Convert the model from ONNX representation to QNN representation The Qualcomm AI Engine Direct SDK `qnn-onnx-conerter` tool converts a model from ONNX representation to its equivalent QNN representation in `A16W8` precision. The encoding files generated from the AIMET workflow are provided as an input to this step via the `–quantization_overrides model.encodings` option. This step generates a `.cpp` file that represents the model as a series of QNN API calls and a `.bin` file that contains static data that is typically model weights and referenced by the `.cpp` file. This step must be done independently for all three models. ### Generate model inputs list/data In [ ]: inputs_pickle_path=STABLE_DIFFUSION_MODELS + '/fp32.npy' !python3 generate_inputs.py --pickle_path $inputs_pickle_path --working_dir $STABLE_DIFFUSION_MODELS Copy to clipboard ### Set up environment variables for the Qualcomm AI Direct SDK tools In [ ]: env = os.environ.copy() env["QNN_SDK_ROOT"] = QNN_SDK_ROOT env["PYTHONPATH"] = QNN_SDK_ROOT + "/benchmarks/QNN/:" + QNN_SDK_ROOT + "/lib/python" env["PATH"] = QNN_SDK_ROOT + "/bin/x86_64-linux-clang:" + env["PATH"] env["LD_LIBRARY_PATH"] = QNN_SDK_ROOT + "/lib/x86_64-linux-clang" env["HEXAGON_TOOLS_DIR"] = QNN_SDK_ROOT + "/bin/x86_64-linux-clang" Copy to clipboard ### Convert the text encoder In [ ]: import subprocess !mkdir $STABLE_DIFFUSION_MODELS/converted_text_encoder proc = subprocess.Popen([QNN_SDK_ROOT + "/bin/x86_64-linux-clang/qnn-onnx-converter", "-o", STABLE_DIFFUSION_MODELS + "/converted_text_encoder/qnn_model.cpp", "-i",STABLE_DIFFUSION_MODELS + "/text_encoder_onnx/text_encoder.onnx", "--input_list", STABLE_DIFFUSION_MODELS + "/text_encoder_onnx/text_encoder_input_list.txt", "--act_bw", "16", "--bias_bw", "32", "--quantization_overrides", STABLE_DIFFUSION_MODELS + "/text_encoder_onnx/text_encoder.encodings" ],stdout=subprocess.PIPE, stderr=subprocess.PIPE,env=env) output, error = proc.communicate() print(output.decode(),error.decode()) # Rename the model files to make them unique and helpful for subsequent stages !mv $STABLE_DIFFUSION_MODELS/converted_text_encoder/qnn_model.cpp $STABLE_DIFFUSION_MODELS/converted_text_encoder/text_encoder.cpp !mv $STABLE_DIFFUSION_MODELS/converted_text_encoder/qnn_model.bin $STABLE_DIFFUSION_MODELS/converted_text_encoder/text_encoder.bin !mv $STABLE_DIFFUSION_MODELS/converted_text_encoder/qnn_model_net.json $STABLE_DIFFUSION_MODELS/converted_text_encoder/text_encoder_net.json Copy to clipboard ### Convert U-Net Expected execution time: ~ 1.5 hours In [ ]: !mkdir $STABLE_DIFFUSION_MODELS/converted_unet proc = subprocess.Popen([QNN_SDK_ROOT + "/bin/x86_64-linux-clang/qnn-onnx-converter", "-o", STABLE_DIFFUSION_MODELS + "/converted_unet/qnn_model.cpp", "-i",STABLE_DIFFUSION_MODELS + "/unet_onnx/unet.onnx", "--input_list", STABLE_DIFFUSION_MODELS + "/unet_onnx/unet_input_list.txt", "--act_bw", "16", "--bias_bw", "32", "--quantization_overrides", STABLE_DIFFUSION_MODELS + "/unet_onnx/unet.encodings", "-l", "input_3", "NONTRIVIAL" ],stdout=subprocess.PIPE, stderr=subprocess.PIPE,env=env) output, error = proc.communicate() print(output.decode(),error.decode()) # Rename the model files to make them unique and helpful for subsequent stages !mv $STABLE_DIFFUSION_MODELS/converted_unet/qnn_model.cpp $STABLE_DIFFUSION_MODELS/converted_unet/unet.cpp !mv $STABLE_DIFFUSION_MODELS/converted_unet/qnn_model.bin $STABLE_DIFFUSION_MODELS/converted_unet/unet.bin !mv $STABLE_DIFFUSION_MODELS/converted_unet/qnn_model_net.json $STABLE_DIFFUSION_MODELS/converted_unet/unet_net.json Copy to clipboard ### Convert the VAE decoder Expected execution time: ~25 minutes In [ ]: !mkdir $STABLE_DIFFUSION_MODELS/converted_vae_decoder proc = subprocess.Popen([QNN_SDK_ROOT + "/bin/x86_64-linux-clang/qnn-onnx-converter", "-o", STABLE_DIFFUSION_MODELS + "/converted_vae_decoder/qnn_model.cpp", "-i",STABLE_DIFFUSION_MODELS + "/vae_decoder_onnx/vae_decoder.onnx", "--input_list", STABLE_DIFFUSION_MODELS + "/vae_decoder_onnx/vae_decoder_input_list.txt", "--act_bw", "16", "--bias_bw", "32", "--quantization_overrides", STABLE_DIFFUSION_MODELS + "/vae_decoder_onnx/vae_decoder.encodings" ],stdout=subprocess.PIPE, stderr=subprocess.PIPE,env=env) output, error = proc.communicate() print(output.decode(),error.decode()) # Rename for uniqueness !mv $STABLE_DIFFUSION_MODELS/converted_vae_decoder/qnn_model.cpp $STABLE_DIFFUSION_MODELS/converted_vae_decoder/vae_decoder.cpp !mv $STABLE_DIFFUSION_MODELS/converted_vae_decoder/qnn_model.bin $STABLE_DIFFUSION_MODELS/converted_vae_decoder/vae_decoder.bin !mv $STABLE_DIFFUSION_MODELS/converted_vae_decoder/qnn_model_net.json $STABLE_DIFFUSION_MODELS/converted_vae_decoder/vae_decoder_net.json Copy to clipboard ## QNN model library The Qualcomm AI Engine Direct SDK `qnn-model-lib-generator` compiles the model `.cpp` and `.bin` files into a shared object library for a specific target. This example generates a shared object library for x86\_64-linux target. The inputs to this stage are the `model.cpp` and `model.bin` files generated in the previous step. ### Generate the text encoder model library In [ ]: proc = subprocess.Popen([QNN_SDK_ROOT + "/bin/x86_64-linux-clang/qnn-model-lib-generator", "-c", STABLE_DIFFUSION_MODELS + "/converted_text_encoder/text_encoder.cpp", "-b", STABLE_DIFFUSION_MODELS + "/converted_text_encoder/text_encoder.bin", "-t", "x86_64-linux-clang", "-o", STABLE_DIFFUSION_MODELS + "/converted_text_encoder" ],stdout=subprocess.PIPE, stderr=subprocess.PIPE,env=env) output, error = proc.communicate() print(output.decode(),error.decode()) Copy to clipboard ### Generate the U-Net model library Expected execution time: ~25 minutes In [ ]: proc = subprocess.Popen([QNN_SDK_ROOT + "/bin/x86_64-linux-clang/qnn-model-lib-generator", "-c", STABLE_DIFFUSION_MODELS + "/converted_unet/unet.cpp", "-b", STABLE_DIFFUSION_MODELS + "/converted_unet/unet.bin", "-t", "x86_64-linux-clang", "-o", STABLE_DIFFUSION_MODELS + "/converted_unet" ],stdout=subprocess.PIPE, stderr=subprocess.PIPE,env=env) output, error = proc.communicate() print(output.decode(),error.decode()) Copy to clipboard ### Generate the VAE decoder model library In [ ]: proc = subprocess.Popen([QNN_SDK_ROOT + "/bin/x86_64-linux-clang/qnn-model-lib-generator", "-c", STABLE_DIFFUSION_MODELS + "/converted_vae_decoder/vae_decoder.cpp", "-b", STABLE_DIFFUSION_MODELS + "/converted_vae_decoder/vae_decoder.bin", "-t", "x86_64-linux-clang", "-o", STABLE_DIFFUSION_MODELS + "/converted_vae_decoder" ],stdout=subprocess.PIPE, stderr=subprocess.PIPE,env=env) output, error = proc.communicate() print(output.decode(),error.decode()) Copy to clipboard ## QNN HTP context binary The Qualcomm AI Engine Direct SDK `qnn-context-binary-generator` tool creates a QNN context binary applicable to the QNN HTP backend. This binary can be deployed to run on a Snapdragon Gen2 device the runs Android. This step requires the model shared object library from the previous step and the `libQnnHtp.so` library, available in the Qualcomm AI Engine Direct SDK. Provie additional options that pertain to the QNN HTP backend by passing the `libQnnHtpBackendExtensions.so` library that implements extensions for the QNN HTP backend. The library is available in the Qualcomm AI Engine Direct SDK. The library and configurations are provided as a `.json` format as shown below. Documentation on backend extensions and configuraton parameters is available in the Qualcomm AI Engine Direct SDK Documents. In [ ]: # HTP backend extensions config file (htp_backend_extensions.json) example htp_backend_extensions_data = ''' { "backend_extensions": { "shared_library_path": "libQnnHtpNetRunExtensions.so", "config_file_path": "/tmp/htp_config.json" } } ''' # HTP backend config file (htp_config.json) example htp_backend_config_data = ''' { "graphs": { "vtcm_mb":8, "graph_names":["qnn_model"] }, "devices": [ { "soc_id": 57, "dsp_arch": "v73", "cores":[{ "core_id": 0, "perf_profile": "burst", "rpc_control_latency":100 }] } ] } ''' #write the config files to a temporary location with open('/tmp/htp_backend_extensions.json','w') as f: f.write(htp_backend_extensions_data) with open('/tmp/htp_config.json','w') as f: f.write(htp_backend_config_data) Copy to clipboard In [ ]: # Create a path under the models directory for serialized binaries !mkdir $STABLE_DIFFUSION_MODELS/serialized_binaries Copy to clipboard ### Generate the QNN context binary for text encoder In [ ]: proc = subprocess.Popen([QNN_SDK_ROOT + "/bin/x86_64-linux-clang/qnn-context-binary-generator", "--model", STABLE_DIFFUSION_MODELS + "/converted_text_encoder/x86_64-linux-clang/libtext_encoder.so", "--backend", "libQnnHtp.so", "--output_dir", STABLE_DIFFUSION_MODELS + "/serialized_binaries", "--binary_file", "text_encoder.serialized", "--config_file", "/tmp/htp_backend_extensions.json", "--log_level", "verbose" ],stdout=subprocess.PIPE, stderr=subprocess.PIPE,env=env) output, error = proc.communicate() print(output.decode(),error.decode()) Copy to clipboard ### Generate the QNN context binary for U-Net Expected execution time: ~2 minutes In [ ]: proc = subprocess.Popen([QNN_SDK_ROOT + "/bin/x86_64-linux-clang/qnn-context-binary-generator", "--model", STABLE_DIFFUSION_MODELS + "/converted_unet/x86_64-linux-clang/libunet.so", "--backend", "libQnnHtp.so", "--output_dir", STABLE_DIFFUSION_MODELS + "/serialized_binaries", "--binary_file", "unet.serialized", "--config_file", "/tmp/htp_backend_extensions.json" ],stdout=subprocess.PIPE, stderr=subprocess.PIPE,env=env) output, error = proc.communicate() print(output.decode(),error.decode()) Copy to clipboard ### Generate the QNN context binary for VAE Decoder Expected execution time: ~1.5 minutes In [ ]: proc = subprocess.Popen([QNN_SDK_ROOT + "/bin/x86_64-linux-clang/qnn-context-binary-generator", "--model", STABLE_DIFFUSION_MODELS + "/converted_vae_decoder/x86_64-linux-clang/libvae_decoder.so", "--backend", "libQnnHtp.so", "--output_dir", STABLE_DIFFUSION_MODELS + "/serialized_binaries", "--binary_file", "vae_decoder.serialized", "--config_file", "/tmp/htp_backend_extensions.json" ],stdout=subprocess.PIPE, stderr=subprocess.PIPE,env=env) output, error = proc.communicate() print(output.decode(),error.decode()) Copy to clipboard Upon completion of these steps to prepare Stable Diffusion models for inference, QNN context binaries for the three models are available in `$STABLE_DIFFUSION_MODELS/serialized_binaries/` The next step is to execute the prepared models (now represented as serialized context binaries) on a Snapdragon Gen2 Android device using executable utilities available in the Qualcomm AI Engine Direct SDK. Copyright (c) 2023 Qualcomm Technologies, Inc. and/or its subsidiaries. **Parent Topic:** [Qualcomm AI Engine Direct Model Preparation](https://docs.qualcomm.com/doc/80-64748-1/topic/model_prep.html) Last Published: Apr 09, 2024 [Previous Topic Qualcomm AI Engine Direct Model Preparation on WSL](https://docs.qualcomm.com/bundle/publicresource/80-64748-1/topics/model_prep_wsl.md) [Next Topic Qualcomm AI Engine Direct Model Execution](https://docs.qualcomm.com/bundle/publicresource/80-64748-1/topics/model_execution.md)