119 lines
3.0 KiB
Markdown
119 lines
3.0 KiB
Markdown
# Qualcomm AI Hub Example
|
|
|
|
This example takes the ONNX model produced by the SageMaker training example and runs the Qualcomm AI Hub upload workflow:
|
|
|
|
1. Quantize
|
|
2. Compile
|
|
3. Validate
|
|
4. Profile
|
|
5. Download the compiled artifact
|
|
|
|
## Prerequisites
|
|
|
|
Run the training example first and wait for it to complete:
|
|
|
|
```bash
|
|
bash examples/training/run_training.sh --config config.yaml --wait
|
|
```
|
|
|
|
If the dataset is already uploaded to S3, use:
|
|
|
|
```bash
|
|
bash examples/training/run_training.sh --config config.yaml --skip-upload --wait
|
|
```
|
|
|
|
The training artifact must contain a static-shape `model.onnx`. The training example exports an input named `input` with shape `1x3x160x160`.
|
|
|
|
Your `config.yaml` must include AI Hub settings:
|
|
|
|
```yaml
|
|
aihub:
|
|
device:
|
|
name: Samsung Galaxy S25 (Family)
|
|
target_runtime: tflite
|
|
input_specs:
|
|
input: [[1, 3, 160, 160], float32]
|
|
output_dir: build/qai-hub
|
|
```
|
|
|
|
You also need local Qualcomm AI Hub SDK authentication configured.
|
|
|
|
## Prepare Inputs
|
|
|
|
AI Hub does not consume the raw JPG training images directly. It needs NumPy tensors that match the ONNX model input shape and preprocessing.
|
|
|
|
Generate calibration and validation inputs:
|
|
|
|
```bash
|
|
uv run python examples/ai-hub/prepare_inputs.py
|
|
```
|
|
|
|
This writes:
|
|
|
|
```text
|
|
examples/training/data/aihub_calibration/*.npy
|
|
examples/training/data/inputs.npz
|
|
```
|
|
|
|
The script applies the same image preprocessing used by the training example:
|
|
|
|
- resize to `160x160`
|
|
- convert to channel-first `1x3x160x160`
|
|
- normalize with ImageNet mean and standard deviation
|
|
|
|
Useful options:
|
|
|
|
```bash
|
|
uv run python examples/ai-hub/prepare_inputs.py \
|
|
--dataset-dir examples/training/data/flower_photos_sagemaker \
|
|
--calibration-dir examples/training/data/aihub_calibration \
|
|
--input-file examples/training/data/inputs.npz \
|
|
--samples 16
|
|
```
|
|
|
|
## Run AI Hub
|
|
|
|
After training completes and inputs are prepared:
|
|
|
|
```bash
|
|
bash examples/ai-hub/run_ai_hub.sh --config config.yaml
|
|
```
|
|
|
|
By default, the script uses the last SageMaker training job recorded in `.qc-cli.json`. It downloads that job's `model.tar.gz`, extracts `model.onnx`, runs the AI Hub workflow, and downloads the compiled artifact.
|
|
|
|
To use a specific training job:
|
|
|
|
```bash
|
|
bash examples/ai-hub/run_ai_hub.sh \
|
|
--config config.yaml \
|
|
--from-job qc-cli-YYYYMMDD-HHMMSS
|
|
```
|
|
|
|
To resume from a later Workbench step:
|
|
|
|
```bash
|
|
bash examples/ai-hub/run_ai_hub.sh \
|
|
--config config.yaml \
|
|
--from-step validate
|
|
```
|
|
|
|
To skip downloading the compiled artifact:
|
|
|
|
```bash
|
|
bash examples/ai-hub/run_ai_hub.sh \
|
|
--config config.yaml \
|
|
--skip-download
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
If AI Hub reports dynamic input shapes, rerun training with the current training source. AI Hub quantization requires the exported ONNX model to use static input shapes.
|
|
|
|
If `run_ai_hub.sh` reports missing calibration or input files, run:
|
|
|
|
```bash
|
|
uv run python examples/ai-hub/prepare_inputs.py
|
|
```
|
|
|
|
If validation fails with a missing input name, make sure `config.yaml` and the generated `.npz` both use `input` as the input name.
|