Repository files navigation

ExecuTorch on Ethos-U

This example shows how to deploy and run an ExecuTorch model on an Arm Ethos-U NPU. The pack PyTorch::ExecuTorch provides the source code components to build the ExecuTorch runtime, required operators, and Ethos-U backend. The build process uses the CMSIS-Toolbox 2.14.1 or higher.

This example application targets the Arm Corstone-320 reference platform with an Ethos-U85 NPU. It demonstrates the same overall workflow used for other Ethos-U systems: export and quantize a PyTorch model, delegate it to Ethos-U, select only the required runtime components, and build it into an embedded application.

What the example demonstrates

  • Exporting an ExecuTorch model for Ethos-U using a Python virtual environment (without requiring Docker).
  • The pack PyTorch::ExecuTorch links only the required and operator components that the ML model needs.
  • Manage NPU and Vela configuration using CMSIS solution project rather duplicating the Python exporter.
  • Generating the model as part of the normal CMSIS-Toolbox build process.
  • Running the finished application on a Corstone-320 FVP simulation model.

Prerequisites

The pack PyTorch::ExecuTorch can be optionally installed manually with:

cpackget add PyTorch::ExecuTorch@1.4.0

Note

The pack and Python exporter versions must match, as the generated .pte format is consumed by the runtime supplied in PyTorch::ExecuTorch@1.4.0.

Quick start

The example can be built and run entirely in Keil Studio for VS Code; no command-line commands are required.

  1. Install Keil Studio for VS Code and Python extension from the VS Code marketplace.
  2. Clone or download this repository, then open its folder in VS Code.
  3. Before using the example for the first time, select Terminal > Run Task > Setup Python virtual environment. Wait for the task to create the .venv environment and install the packages required to export the model.
  4. Use the CMSIS action buttons to build the application, then select Run or Debug. Keil Studio starts the Corstone-320 FVP automatically.

A successful run prints the Ethos-U configuration, output logits, and a pass result:

Ethos-U version info:
Arch: v2.0.0
MACs/cc: 256
Cmd stream: v1
ExecuTorch Ethos-U85 example: 8864 byte model
Output: 10 element(s): 0.0187 -0.0204 -0.0645 0.0034 0.0187 ...
Test_result: PASS

Command-line build

The same workflow can be performed from the VS Code Terminal as described below.

1. Create the Python environment

On Linux or macOS:

./setup_venv.sh

On Windows:

.\setup_venv.bat

The setup script creates .venv/ and installs the packages required to quantize and export the model. It is safe to run again; use --recreate when you want a completely new environment.

Note

On Windows, enable long-path support or keep the repository close to the drive root. PyTorch packages can otherwise exceed the legacy 260-character path limit.

2. Build the application

cbuild cmsis-executorch-simple.csolution.yml --active SSE-320-U85 --packs --update-rte

This command:

  1. Resolves and installs the required CMSIS packs.
  2. Generates the MLOps build information for the selected target.
  3. Quantizes and exports the model for Ethos-U85.
  4. Generates the model's CMSIS component selection.
  5. Compiles and links the embedded application.

The resulting image is:

out/cmsis-executorch-simple/SSE-320-U85/Debug/cmsis-executorch-simple.hex

3. Run on the FVP

FVP_Corstone_SSE-320 \
-f board/Corstone-320/fvp_config.txt \
-a out/cmsis-executorch-simple/SSE-320-U85/Debug/cmsis-executorch-simple.hex

How model generation works

The selected target is described by the mlops: node in cmsis-executorch-simple.csolution.yml:

mlops:
npu:
type: Ethos-U85vela:
system: Ethos_U85_SYS_DRAM_Midmemory: Shared_Srammodel:
clayer: $AI-Layer$name: TinyCNN

Building with --active SSE-320-U85 generates cmsis-executorch-simple.cbuild-mlops.yml. This file contains the resolved processor, NPU, and Vela options. model/export_model.py reads those options and passes them to ExecuTorch's EthosUCompileSpec, so the target configuration does not need to be duplicated in Python.

The export step produces:

  • model/model.pte: the ExecuTorch program.
  • ai_layer/model/model_pte.h: the same program embedded as a C array.
  • ai_layer/ai_layer.clayer.yml: the CMSIS components required by the model.

See the MLOps flow for a detailed walkthrough.

Component selection

The ExecuTorch CMSIS Pack provides the runtime, backends, and individual operators as selectable CMSIS components. scripts/gen_components.py examines the exported .pte and updates ai_layer/ai_layer.clayer.yml so only the required components are linked.

CMSIS-Toolbox resolves components before it executes the model-export step. If a model change also changes its operator set, the first build updates the component list and asks you to build again:

[run_export] The model's operator set changed: ai_layer.clayer.yml was regenerated.
[run_export] Re-run the build to compile and link the updated component selection.

Run the same build command a second time to use the new selection.

Adapting the example

To use a different model, replace or modify model/model.py and update the model name or input handling as required. The next build regenerates the .pte and embedded model data.

To target another Ethos-U configuration, update the target and mlops: settings in the CMSIS solution. The generated Vela options then follow that configuration automatically. Moving to a different board or reference platform also requires the corresponding device pack, board support, memory layout, and FVP configuration.

When updating ExecuTorch, update the CMSIS pack and Python package versions together. More information is available in pack provenance.

Project layout

PathPurpose
cmsis-executorch-simple.csolution.ymlSolution, target, and MLOps configuration
cmsis-executorch-simple.cproject.ymlApplication project and model-conversion build step
model/model.pyExample TinyCNN model
model/export_model.pyQuantizes and delegates the model to Ethos-U
scripts/run_export.pyRuns model export and component generation
scripts/gen_components.pyMaps model operators to CMSIS components
ai_layer/ai_layer.clayer.ymlGenerated model-specific component selection
board/Corstone-320/Corstone-320 platform support and FVP configuration
src/app_main.cppLoads the model, runs inference, and prints the result
documentation/Detailed MLOps, pack, and cross-platform notes

Known limitations

  • A model change that changes the operator set requires two builds.
  • The supplied platform configuration targets Corstone-320 with Ethos-U85; another target needs its corresponding platform integration.

License

The example code is licensed under Apache-2.0; see LICENSE. ExecuTorch uses a BSD-3-Clause license.

References

About

Docker driven integration workflow of Executorch into CMSIS-based projects

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

ExecuTorch on Ethos-U

This example shows how to deploy and run an ExecuTorch model on an Arm Ethos-U NPU. The pack PyTorch::ExecuTorch provides the source code components to build the ExecuTorch runtime, required operators, and Ethos-U backend. The build process uses the CMSIS-Toolbox 2.14.1 or higher.

This example application targets the Arm Corstone-320 reference platform with an Ethos-U85 NPU. It demonstrates the same overall workflow used for other Ethos-U systems: export and quantize a PyTorch model, delegate it to Ethos-U, select only the required runtime components, and build it into an embedded application.

What the example demonstrates

  • Exporting an ExecuTorch model for Ethos-U using a Python virtual environment (without requiring Docker).
  • The pack PyTorch::ExecuTorch links only the required and operator components that the ML model needs.
  • Manage NPU and Vela configuration using CMSIS solution project rather duplicating the Python exporter.
  • Generating the model as part of the normal CMSIS-Toolbox build process.
  • Running the finished application on a Corstone-320 FVP simulation model.

Prerequisites

The pack PyTorch::ExecuTorch can be optionally installed manually with:

cpackget add PyTorch::ExecuTorch@1.4.0

Note

The pack and Python exporter versions must match, as the generated .pte format is consumed by the runtime supplied in PyTorch::ExecuTorch@1.4.0.

Quick start

The example can be built and run entirely in Keil Studio for VS Code; no command-line commands are required.

  1. Install Keil Studio for VS Code and Python extension from the VS Code marketplace.
  2. Clone or download this repository, then open its folder in VS Code.
  3. Before using the example for the first time, select Terminal > Run Task > Setup Python virtual environment. Wait for the task to create the .venv environment and install the packages required to export the model.
  4. Use the CMSIS action buttons to build the application, then select Run or Debug. Keil Studio starts the Corstone-320 FVP automatically.

A successful run prints the Ethos-U configuration, output logits, and a pass result:

Ethos-U version info:
Arch: v2.0.0
MACs/cc: 256
Cmd stream: v1
ExecuTorch Ethos-U85 example: 8864 byte model
Output: 10 element(s): 0.0187 -0.0204 -0.0645 0.0034 0.0187 ...
Test_result: PASS

Command-line build

The same workflow can be performed from the VS Code Terminal as described below.

1. Create the Python environment

On Linux or macOS:

./setup_venv.sh

On Windows:

.\setup_venv.bat

The setup script creates .venv/ and installs the packages required to quantize and export the model. It is safe to run again; use --recreate when you want a completely new environment.

Note

On Windows, enable long-path support or keep the repository close to the drive root. PyTorch packages can otherwise exceed the legacy 260-character path limit.

2. Build the application

cbuild cmsis-executorch-simple.csolution.yml --active SSE-320-U85 --packs --update-rte

This command:

  1. Resolves and installs the required CMSIS packs.
  2. Generates the MLOps build information for the selected target.
  3. Quantizes and exports the model for Ethos-U85.
  4. Generates the model's CMSIS component selection.
  5. Compiles and links the embedded application.

The resulting image is:

out/cmsis-executorch-simple/SSE-320-U85/Debug/cmsis-executorch-simple.hex

3. Run on the FVP

FVP_Corstone_SSE-320 \
-f board/Corstone-320/fvp_config.txt \
-a out/cmsis-executorch-simple/SSE-320-U85/Debug/cmsis-executorch-simple.hex

How model generation works

The selected target is described by the mlops: node in cmsis-executorch-simple.csolution.yml:

mlops:
npu:
type: Ethos-U85vela:
system: Ethos_U85_SYS_DRAM_Midmemory: Shared_Srammodel:
clayer: $AI-Layer$name: TinyCNN

Building with --active SSE-320-U85 generates cmsis-executorch-simple.cbuild-mlops.yml. This file contains the resolved processor, NPU, and Vela options. model/export_model.py reads those options and passes them to ExecuTorch's EthosUCompileSpec, so the target configuration does not need to be duplicated in Python.

The export step produces:

  • model/model.pte: the ExecuTorch program.
  • ai_layer/model/model_pte.h: the same program embedded as a C array.
  • ai_layer/ai_layer.clayer.yml: the CMSIS components required by the model.

See the MLOps flow for a detailed walkthrough.

Component selection

The ExecuTorch CMSIS Pack provides the runtime, backends, and individual operators as selectable CMSIS components. scripts/gen_components.py examines the exported .pte and updates ai_layer/ai_layer.clayer.yml so only the required components are linked.

CMSIS-Toolbox resolves components before it executes the model-export step. If a model change also changes its operator set, the first build updates the component list and asks you to build again:

[run_export] The model's operator set changed: ai_layer.clayer.yml was regenerated.
[run_export] Re-run the build to compile and link the updated component selection.

Run the same build command a second time to use the new selection.

Adapting the example

To use a different model, replace or modify model/model.py and update the model name or input handling as required. The next build regenerates the .pte and embedded model data.

To target another Ethos-U configuration, update the target and mlops: settings in the CMSIS solution. The generated Vela options then follow that configuration automatically. Moving to a different board or reference platform also requires the corresponding device pack, board support, memory layout, and FVP configuration.

When updating ExecuTorch, update the CMSIS pack and Python package versions together. More information is available in pack provenance.

Project layout

PathPurpose
cmsis-executorch-simple.csolution.ymlSolution, target, and MLOps configuration
cmsis-executorch-simple.cproject.ymlApplication project and model-conversion build step
model/model.pyExample TinyCNN model
model/export_model.pyQuantizes and delegates the model to Ethos-U
scripts/run_export.pyRuns model export and component generation
scripts/gen_components.pyMaps model operators to CMSIS components
ai_layer/ai_layer.clayer.ymlGenerated model-specific component selection
board/Corstone-320/Corstone-320 platform support and FVP configuration
src/app_main.cppLoads the model, runs inference, and prints the result
documentation/Detailed MLOps, pack, and cross-platform notes

Known limitations

  • A model change that changes the operator set requires two builds.
  • The supplied platform configuration targets Corstone-320 with Ethos-U85; another target needs its corresponding platform integration.

License

The example code is licensed under Apache-2.0; see LICENSE. ExecuTorch uses a BSD-3-Clause license.

References

About

Docker driven integration workflow of Executorch into CMSIS-based projects

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ExecuTorch on Ethos-U

This example shows how to deploy and run an ExecuTorch model on an Arm Ethos-U NPU. The pack PyTorch::ExecuTorch provides the source code components to build the ExecuTorch runtime, required operators, and Ethos-U backend. The build process uses the CMSIS-Toolbox 2.14.1 or higher.

This example application targets the Arm Corstone-320 reference platform with an Ethos-U85 NPU. It demonstrates the same overall workflow used for other Ethos-U systems: export and quantize a PyTorch model, delegate it to Ethos-U, select only the required runtime components, and build it into an embedded application.

What the example demonstrates

  • Exporting an ExecuTorch model for Ethos-U using a Python virtual environment (without requiring Docker).
  • The pack PyTorch::ExecuTorch links only the required and operator components that the ML model needs.
  • Manage NPU and Vela configuration using CMSIS solution project rather duplicating the Python exporter.
  • Generating the model as part of the normal CMSIS-Toolbox build process.
  • Running the finished application on a Corstone-320 FVP simulation model.

Prerequisites

The pack PyTorch::ExecuTorch can be optionally installed manually with:

cpackget add PyTorch::ExecuTorch@1.4.0

Note

The pack and Python exporter versions must match, as the generated .pte format is consumed by the runtime supplied in PyTorch::ExecuTorch@1.4.0.

Quick start

The example can be built and run entirely in Keil Studio for VS Code; no command-line commands are required.

  1. Install Keil Studio for VS Code and Python extension from the VS Code marketplace.
  2. Clone or download this repository, then open its folder in VS Code.
  3. Before using the example for the first time, select Terminal > Run Task > Setup Python virtual environment. Wait for the task to create the .venv environment and install the packages required to export the model.
  4. Use the CMSIS action buttons to build the application, then select Run or Debug. Keil Studio starts the Corstone-320 FVP automatically.

A successful run prints the Ethos-U configuration, output logits, and a pass result:

Ethos-U version info:
Arch: v2.0.0
MACs/cc: 256
Cmd stream: v1
ExecuTorch Ethos-U85 example: 8864 byte model
Output: 10 element(s): 0.0187 -0.0204 -0.0645 0.0034 0.0187 ...
Test_result: PASS

Command-line build

The same workflow can be performed from the VS Code Terminal as described below.

1. Create the Python environment

On Linux or macOS:

./setup_venv.sh

On Windows:

.\setup_venv.bat

The setup script creates .venv/ and installs the packages required to quantize and export the model. It is safe to run again; use --recreate when you want a completely new environment.

Note

On Windows, enable long-path support or keep the repository close to the drive root. PyTorch packages can otherwise exceed the legacy 260-character path limit.

2. Build the application

cbuild cmsis-executorch-simple.csolution.yml --active SSE-320-U85 --packs --update-rte

This command:

  1. Resolves and installs the required CMSIS packs.
  2. Generates the MLOps build information for the selected target.
  3. Quantizes and exports the model for Ethos-U85.
  4. Generates the model's CMSIS component selection.
  5. Compiles and links the embedded application.

The resulting image is:

out/cmsis-executorch-simple/SSE-320-U85/Debug/cmsis-executorch-simple.hex

3. Run on the FVP

FVP_Corstone_SSE-320 \
-f board/Corstone-320/fvp_config.txt \
-a out/cmsis-executorch-simple/SSE-320-U85/Debug/cmsis-executorch-simple.hex

How model generation works

The selected target is described by the mlops: node in cmsis-executorch-simple.csolution.yml:

mlops:
npu:
type: Ethos-U85vela:
system: Ethos_U85_SYS_DRAM_Midmemory: Shared_Srammodel:
clayer: $AI-Layer$name: TinyCNN

Building with --active SSE-320-U85 generates cmsis-executorch-simple.cbuild-mlops.yml. This file contains the resolved processor, NPU, and Vela options. model/export_model.py reads those options and passes them to ExecuTorch's EthosUCompileSpec, so the target configuration does not need to be duplicated in Python.

The export step produces:

  • model/model.pte: the ExecuTorch program.
  • ai_layer/model/model_pte.h: the same program embedded as a C array.
  • ai_layer/ai_layer.clayer.yml: the CMSIS components required by the model.

See the MLOps flow for a detailed walkthrough.

Component selection

The ExecuTorch CMSIS Pack provides the runtime, backends, and individual operators as selectable CMSIS components. scripts/gen_components.py examines the exported .pte and updates ai_layer/ai_layer.clayer.yml so only the required components are linked.

CMSIS-Toolbox resolves components before it executes the model-export step. If a model change also changes its operator set, the first build updates the component list and asks you to build again:

[run_export] The model's operator set changed: ai_layer.clayer.yml was regenerated.
[run_export] Re-run the build to compile and link the updated component selection.

Run the same build command a second time to use the new selection.

Adapting the example

To use a different model, replace or modify model/model.py and update the model name or input handling as required. The next build regenerates the .pte and embedded model data.

To target another Ethos-U configuration, update the target and mlops: settings in the CMSIS solution. The generated Vela options then follow that configuration automatically. Moving to a different board or reference platform also requires the corresponding device pack, board support, memory layout, and FVP configuration.

When updating ExecuTorch, update the CMSIS pack and Python package versions together. More information is available in pack provenance.

Project layout

PathPurpose
cmsis-executorch-simple.csolution.ymlSolution, target, and MLOps configuration
cmsis-executorch-simple.cproject.ymlApplication project and model-conversion build step
model/model.pyExample TinyCNN model
model/export_model.pyQuantizes and delegates the model to Ethos-U
scripts/run_export.pyRuns model export and component generation
scripts/gen_components.pyMaps model operators to CMSIS components
ai_layer/ai_layer.clayer.ymlGenerated model-specific component selection
board/Corstone-320/Corstone-320 platform support and FVP configuration
src/app_main.cppLoads the model, runs inference, and prints the result
documentation/Detailed MLOps, pack, and cross-platform notes

Known limitations

  • A model change that changes the operator set requires two builds.
  • The supplied platform configuration targets Corstone-320 with Ethos-U85; another target needs its corresponding platform integration.

License

The example code is licensed under Apache-2.0; see LICENSE. ExecuTorch uses a BSD-3-Clause license.

References

About

Docker driven integration workflow of Executorch into CMSIS-based projects

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ExecuTorch on Ethos-U

This example shows how to deploy and run an ExecuTorch model on an Arm Ethos-U NPU. The pack PyTorch::ExecuTorch provides the source code components to build the ExecuTorch runtime, required operators, and Ethos-U backend. The build process uses the CMSIS-Toolbox 2.14.1 or higher.

This example application targets the Arm Corstone-320 reference platform with an Ethos-U85 NPU. It demonstrates the same overall workflow used for other Ethos-U systems: export and quantize a PyTorch model, delegate it to Ethos-U, select only the required runtime components, and build it into an embedded application.

What the example demonstrates

  • Exporting an ExecuTorch model for Ethos-U using a Python virtual environment (without requiring Docker).
  • The pack PyTorch::ExecuTorch links only the required and operator components that the ML model needs.
  • Manage NPU and Vela configuration using CMSIS solution project rather duplicating the Python exporter.
  • Generating the model as part of the normal CMSIS-Toolbox build process.
  • Running the finished application on a Corstone-320 FVP simulation model.

Prerequisites

The pack PyTorch::ExecuTorch can be optionally installed manually with:

cpackget add PyTorch::ExecuTorch@1.4.0

Note

The pack and Python exporter versions must match, as the generated .pte format is consumed by the runtime supplied in PyTorch::ExecuTorch@1.4.0.

Quick start

The example can be built and run entirely in Keil Studio for VS Code; no command-line commands are required.

  1. Install Keil Studio for VS Code and Python extension from the VS Code marketplace.
  2. Clone or download this repository, then open its folder in VS Code.
  3. Before using the example for the first time, select Terminal > Run Task > Setup Python virtual environment. Wait for the task to create the .venv environment and install the packages required to export the model.
  4. Use the CMSIS action buttons to build the application, then select Run or Debug. Keil Studio starts the Corstone-320 FVP automatically.

A successful run prints the Ethos-U configuration, output logits, and a pass result:

Ethos-U version info:
Arch: v2.0.0
MACs/cc: 256
Cmd stream: v1
ExecuTorch Ethos-U85 example: 8864 byte model
Output: 10 element(s): 0.0187 -0.0204 -0.0645 0.0034 0.0187 ...
Test_result: PASS

Command-line build

The same workflow can be performed from the VS Code Terminal as described below.

1. Create the Python environment

On Linux or macOS:

./setup_venv.sh

On Windows:

.\setup_venv.bat

The setup script creates .venv/ and installs the packages required to quantize and export the model. It is safe to run again; use --recreate when you want a completely new environment.

Note

On Windows, enable long-path support or keep the repository close to the drive root. PyTorch packages can otherwise exceed the legacy 260-character path limit.

2. Build the application

cbuild cmsis-executorch-simple.csolution.yml --active SSE-320-U85 --packs --update-rte

This command:

  1. Resolves and installs the required CMSIS packs.
  2. Generates the MLOps build information for the selected target.
  3. Quantizes and exports the model for Ethos-U85.
  4. Generates the model's CMSIS component selection.
  5. Compiles and links the embedded application.

The resulting image is:

out/cmsis-executorch-simple/SSE-320-U85/Debug/cmsis-executorch-simple.hex

3. Run on the FVP

FVP_Corstone_SSE-320 \
-f board/Corstone-320/fvp_config.txt \
-a out/cmsis-executorch-simple/SSE-320-U85/Debug/cmsis-executorch-simple.hex

How model generation works

The selected target is described by the mlops: node in cmsis-executorch-simple.csolution.yml:

mlops:
npu:
type: Ethos-U85vela:
system: Ethos_U85_SYS_DRAM_Midmemory: Shared_Srammodel:
clayer: $AI-Layer$name: TinyCNN

Building with --active SSE-320-U85 generates cmsis-executorch-simple.cbuild-mlops.yml. This file contains the resolved processor, NPU, and Vela options. model/export_model.py reads those options and passes them to ExecuTorch's EthosUCompileSpec, so the target configuration does not need to be duplicated in Python.

The export step produces:

  • model/model.pte: the ExecuTorch program.
  • ai_layer/model/model_pte.h: the same program embedded as a C array.
  • ai_layer/ai_layer.clayer.yml: the CMSIS components required by the model.

See the MLOps flow for a detailed walkthrough.

Component selection

The ExecuTorch CMSIS Pack provides the runtime, backends, and individual operators as selectable CMSIS components. scripts/gen_components.py examines the exported .pte and updates ai_layer/ai_layer.clayer.yml so only the required components are linked.

CMSIS-Toolbox resolves components before it executes the model-export step. If a model change also changes its operator set, the first build updates the component list and asks you to build again:

[run_export] The model's operator set changed: ai_layer.clayer.yml was regenerated.
[run_export] Re-run the build to compile and link the updated component selection.

Run the same build command a second time to use the new selection.

Adapting the example

To use a different model, replace or modify model/model.py and update the model name or input handling as required. The next build regenerates the .pte and embedded model data.

To target another Ethos-U configuration, update the target and mlops: settings in the CMSIS solution. The generated Vela options then follow that configuration automatically. Moving to a different board or reference platform also requires the corresponding device pack, board support, memory layout, and FVP configuration.

When updating ExecuTorch, update the CMSIS pack and Python package versions together. More information is available in pack provenance.

Project layout

PathPurpose
cmsis-executorch-simple.csolution.ymlSolution, target, and MLOps configuration
cmsis-executorch-simple.cproject.ymlApplication project and model-conversion build step
model/model.pyExample TinyCNN model
model/export_model.pyQuantizes and delegates the model to Ethos-U
scripts/run_export.pyRuns model export and component generation
scripts/gen_components.pyMaps model operators to CMSIS components
ai_layer/ai_layer.clayer.ymlGenerated model-specific component selection
board/Corstone-320/Corstone-320 platform support and FVP configuration
src/app_main.cppLoads the model, runs inference, and prints the result
documentation/Detailed MLOps, pack, and cross-platform notes

Known limitations

  • A model change that changes the operator set requires two builds.
  • The supplied platform configuration targets Corstone-320 with Ethos-U85; another target needs its corresponding platform integration.

License

The example code is licensed under Apache-2.0; see LICENSE. ExecuTorch uses a BSD-3-Clause license.

References

About

Docker driven integration workflow of Executorch into CMSIS-based projects

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

ExecuTorch on Ethos-U

This example shows how to deploy and run an ExecuTorch model on an Arm Ethos-U NPU. The pack PyTorch::ExecuTorch provides the source code components to build the ExecuTorch runtime, required operators, and Ethos-U backend. The build process uses the CMSIS-Toolbox 2.14.1 or higher.

This example application targets the Arm Corstone-320 reference platform with an Ethos-U85 NPU. It demonstrates the same overall workflow used for other Ethos-U systems: export and quantize a PyTorch model, delegate it to Ethos-U, select only the required runtime components, and build it into an embedded application.

What the example demonstrates

  • Exporting an ExecuTorch model for Ethos-U using a Python virtual environment (without requiring Docker).
  • The pack PyTorch::ExecuTorch links only the required and operator components that the ML model needs.
  • Manage NPU and Vela configuration using CMSIS solution project rather duplicating the Python exporter.
  • Generating the model as part of the normal CMSIS-Toolbox build process.
  • Running the finished application on a Corstone-320 FVP simulation model.

Prerequisites

The pack PyTorch::ExecuTorch can be optionally installed manually with:

cpackget add PyTorch::ExecuTorch@1.4.0

Note

The pack and Python exporter versions must match, as the generated .pte format is consumed by the runtime supplied in PyTorch::ExecuTorch@1.4.0.

Quick start

The example can be built and run entirely in Keil Studio for VS Code; no command-line commands are required.

  1. Install Keil Studio for VS Code and Python extension from the VS Code marketplace.
  2. Clone or download this repository, then open its folder in VS Code.
  3. Before using the example for the first time, select Terminal > Run Task > Setup Python virtual environment. Wait for the task to create the .venv environment and install the packages required to export the model.
  4. Use the CMSIS action buttons to build the application, then select Run or Debug. Keil Studio starts the Corstone-320 FVP automatically.

A successful run prints the Ethos-U configuration, output logits, and a pass result:

Ethos-U version info:
Arch: v2.0.0
MACs/cc: 256
Cmd stream: v1
ExecuTorch Ethos-U85 example: 8864 byte model
Output: 10 element(s): 0.0187 -0.0204 -0.0645 0.0034 0.0187 ...
Test_result: PASS

Command-line build

The same workflow can be performed from the VS Code Terminal as described below.

1. Create the Python environment

On Linux or macOS:

./setup_venv.sh

On Windows:

.\setup_venv.bat

The setup script creates .venv/ and installs the packages required to quantize and export the model. It is safe to run again; use --recreate when you want a completely new environment.

Note

On Windows, enable long-path support or keep the repository close to the drive root. PyTorch packages can otherwise exceed the legacy 260-character path limit.

2. Build the application

cbuild cmsis-executorch-simple.csolution.yml --active SSE-320-U85 --packs --update-rte

This command:

  1. Resolves and installs the required CMSIS packs.
  2. Generates the MLOps build information for the selected target.
  3. Quantizes and exports the model for Ethos-U85.
  4. Generates the model's CMSIS component selection.
  5. Compiles and links the embedded application.

The resulting image is:

out/cmsis-executorch-simple/SSE-320-U85/Debug/cmsis-executorch-simple.hex

3. Run on the FVP

FVP_Corstone_SSE-320 \
-f board/Corstone-320/fvp_config.txt \
-a out/cmsis-executorch-simple/SSE-320-U85/Debug/cmsis-executorch-simple.hex

How model generation works

The selected target is described by the mlops: node in cmsis-executorch-simple.csolution.yml:

mlops:
npu:
type: Ethos-U85vela:
system: Ethos_U85_SYS_DRAM_Midmemory: Shared_Srammodel:
clayer: $AI-Layer$name: TinyCNN

Building with --active SSE-320-U85 generates cmsis-executorch-simple.cbuild-mlops.yml. This file contains the resolved processor, NPU, and Vela options. model/export_model.py reads those options and passes them to ExecuTorch's EthosUCompileSpec, so the target configuration does not need to be duplicated in Python.

The export step produces:

  • model/model.pte: the ExecuTorch program.
  • ai_layer/model/model_pte.h: the same program embedded as a C array.
  • ai_layer/ai_layer.clayer.yml: the CMSIS components required by the model.

See the MLOps flow for a detailed walkthrough.

Component selection

The ExecuTorch CMSIS Pack provides the runtime, backends, and individual operators as selectable CMSIS components. scripts/gen_components.py examines the exported .pte and updates ai_layer/ai_layer.clayer.yml so only the required components are linked.

CMSIS-Toolbox resolves components before it executes the model-export step. If a model change also changes its operator set, the first build updates the component list and asks you to build again:

[run_export] The model's operator set changed: ai_layer.clayer.yml was regenerated.
[run_export] Re-run the build to compile and link the updated component selection.

Run the same build command a second time to use the new selection.

Adapting the example

To use a different model, replace or modify model/model.py and update the model name or input handling as required. The next build regenerates the .pte and embedded model data.

To target another Ethos-U configuration, update the target and mlops: settings in the CMSIS solution. The generated Vela options then follow that configuration automatically. Moving to a different board or reference platform also requires the corresponding device pack, board support, memory layout, and FVP configuration.

When updating ExecuTorch, update the CMSIS pack and Python package versions together. More information is available in pack provenance.

Project layout

PathPurpose
cmsis-executorch-simple.csolution.ymlSolution, target, and MLOps configuration
cmsis-executorch-simple.cproject.ymlApplication project and model-conversion build step
model/model.pyExample TinyCNN model
model/export_model.pyQuantizes and delegates the model to Ethos-U
scripts/run_export.pyRuns model export and component generation
scripts/gen_components.pyMaps model operators to CMSIS components
ai_layer/ai_layer.clayer.ymlGenerated model-specific component selection
board/Corstone-320/Corstone-320 platform support and FVP configuration
src/app_main.cppLoads the model, runs inference, and prints the result
documentation/Detailed MLOps, pack, and cross-platform notes

Known limitations

  • A model change that changes the operator set requires two builds.
  • The supplied platform configuration targets Corstone-320 with Ethos-U85; another target needs its corresponding platform integration.

License

The example code is licensed under Apache-2.0; see LICENSE. ExecuTorch uses a BSD-3-Clause license.

References

About

Docker driven integration workflow of Executorch into CMSIS-based projects

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ExecuTorch on Ethos-U

This example shows how to deploy and run an ExecuTorch model on an Arm Ethos-U NPU. The pack PyTorch::ExecuTorch provides the source code components to build the ExecuTorch runtime, required operators, and Ethos-U backend. The build process uses the CMSIS-Toolbox 2.14.1 or higher.

This example application targets the Arm Corstone-320 reference platform with an Ethos-U85 NPU. It demonstrates the same overall workflow used for other Ethos-U systems: export and quantize a PyTorch model, delegate it to Ethos-U, select only the required runtime components, and build it into an embedded application.

What the example demonstrates

  • Exporting an ExecuTorch model for Ethos-U using a Python virtual environment (without requiring Docker).
  • The pack PyTorch::ExecuTorch links only the required and operator components that the ML model needs.
  • Manage NPU and Vela configuration using CMSIS solution project rather duplicating the Python exporter.
  • Generating the model as part of the normal CMSIS-Toolbox build process.
  • Running the finished application on a Corstone-320 FVP simulation model.

Prerequisites

The pack PyTorch::ExecuTorch can be optionally installed manually with:

cpackget add PyTorch::ExecuTorch@1.4.0

Note

The pack and Python exporter versions must match, as the generated .pte format is consumed by the runtime supplied in PyTorch::ExecuTorch@1.4.0.

Quick start

The example can be built and run entirely in Keil Studio for VS Code; no command-line commands are required.

  1. Install Keil Studio for VS Code and Python extension from the VS Code marketplace.
  2. Clone or download this repository, then open its folder in VS Code.
  3. Before using the example for the first time, select Terminal > Run Task > Setup Python virtual environment. Wait for the task to create the .venv environment and install the packages required to export the model.
  4. Use the CMSIS action buttons to build the application, then select Run or Debug. Keil Studio starts the Corstone-320 FVP automatically.

A successful run prints the Ethos-U configuration, output logits, and a pass result:

Ethos-U version info:
Arch: v2.0.0
MACs/cc: 256
Cmd stream: v1
ExecuTorch Ethos-U85 example: 8864 byte model
Output: 10 element(s): 0.0187 -0.0204 -0.0645 0.0034 0.0187 ...
Test_result: PASS

Command-line build

The same workflow can be performed from the VS Code Terminal as described below.

1. Create the Python environment

On Linux or macOS:

./setup_venv.sh

On Windows:

.\setup_venv.bat

The setup script creates .venv/ and installs the packages required to quantize and export the model. It is safe to run again; use --recreate when you want a completely new environment.

Note

On Windows, enable long-path support or keep the repository close to the drive root. PyTorch packages can otherwise exceed the legacy 260-character path limit.

2. Build the application

cbuild cmsis-executorch-simple.csolution.yml --active SSE-320-U85 --packs --update-rte

This command:

  1. Resolves and installs the required CMSIS packs.
  2. Generates the MLOps build information for the selected target.
  3. Quantizes and exports the model for Ethos-U85.
  4. Generates the model's CMSIS component selection.
  5. Compiles and links the embedded application.

The resulting image is:

out/cmsis-executorch-simple/SSE-320-U85/Debug/cmsis-executorch-simple.hex

3. Run on the FVP

FVP_Corstone_SSE-320 \
-f board/Corstone-320/fvp_config.txt \
-a out/cmsis-executorch-simple/SSE-320-U85/Debug/cmsis-executorch-simple.hex

How model generation works

The selected target is described by the mlops: node in cmsis-executorch-simple.csolution.yml:

mlops:
npu:
type: Ethos-U85vela:
system: Ethos_U85_SYS_DRAM_Midmemory: Shared_Srammodel:
clayer: $AI-Layer$name: TinyCNN

Building with --active SSE-320-U85 generates cmsis-executorch-simple.cbuild-mlops.yml. This file contains the resolved processor, NPU, and Vela options. model/export_model.py reads those options and passes them to ExecuTorch's EthosUCompileSpec, so the target configuration does not need to be duplicated in Python.

The export step produces:

  • model/model.pte: the ExecuTorch program.
  • ai_layer/model/model_pte.h: the same program embedded as a C array.
  • ai_layer/ai_layer.clayer.yml: the CMSIS components required by the model.

See the MLOps flow for a detailed walkthrough.

Component selection

The ExecuTorch CMSIS Pack provides the runtime, backends, and individual operators as selectable CMSIS components. scripts/gen_components.py examines the exported .pte and updates ai_layer/ai_layer.clayer.yml so only the required components are linked.

CMSIS-Toolbox resolves components before it executes the model-export step. If a model change also changes its operator set, the first build updates the component list and asks you to build again:

[run_export] The model's operator set changed: ai_layer.clayer.yml was regenerated.
[run_export] Re-run the build to compile and link the updated component selection.

Run the same build command a second time to use the new selection.

Adapting the example

To use a different model, replace or modify model/model.py and update the model name or input handling as required. The next build regenerates the .pte and embedded model data.

To target another Ethos-U configuration, update the target and mlops: settings in the CMSIS solution. The generated Vela options then follow that configuration automatically. Moving to a different board or reference platform also requires the corresponding device pack, board support, memory layout, and FVP configuration.

When updating ExecuTorch, update the CMSIS pack and Python package versions together. More information is available in pack provenance.

Project layout

PathPurpose
cmsis-executorch-simple.csolution.ymlSolution, target, and MLOps configuration
cmsis-executorch-simple.cproject.ymlApplication project and model-conversion build step
model/model.pyExample TinyCNN model
model/export_model.pyQuantizes and delegates the model to Ethos-U
scripts/run_export.pyRuns model export and component generation
scripts/gen_components.pyMaps model operators to CMSIS components
ai_layer/ai_layer.clayer.ymlGenerated model-specific component selection
board/Corstone-320/Corstone-320 platform support and FVP configuration
src/app_main.cppLoads the model, runs inference, and prints the result
documentation/Detailed MLOps, pack, and cross-platform notes

Known limitations

  • A model change that changes the operator set requires two builds.
  • The supplied platform configuration targets Corstone-320 with Ethos-U85; another target needs its corresponding platform integration.

License

The example code is licensed under Apache-2.0; see LICENSE. ExecuTorch uses a BSD-3-Clause license.

References

About

Docker driven integration workflow of Executorch into CMSIS-based projects

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ExecuTorch on Ethos-U

This example shows how to deploy and run an ExecuTorch model on an Arm Ethos-U NPU. The pack PyTorch::ExecuTorch provides the source code components to build the ExecuTorch runtime, required operators, and Ethos-U backend. The build process uses the CMSIS-Toolbox 2.14.1 or higher.

This example application targets the Arm Corstone-320 reference platform with an Ethos-U85 NPU. It demonstrates the same overall workflow used for other Ethos-U systems: export and quantize a PyTorch model, delegate it to Ethos-U, select only the required runtime components, and build it into an embedded application.

What the example demonstrates

  • Exporting an ExecuTorch model for Ethos-U using a Python virtual environment (without requiring Docker).
  • The pack PyTorch::ExecuTorch links only the required and operator components that the ML model needs.
  • Manage NPU and Vela configuration using CMSIS solution project rather duplicating the Python exporter.
  • Generating the model as part of the normal CMSIS-Toolbox build process.
  • Running the finished application on a Corstone-320 FVP simulation model.

Prerequisites

The pack PyTorch::ExecuTorch can be optionally installed manually with:

cpackget add PyTorch::ExecuTorch@1.4.0

Note

The pack and Python exporter versions must match, as the generated .pte format is consumed by the runtime supplied in PyTorch::ExecuTorch@1.4.0.

Quick start

The example can be built and run entirely in Keil Studio for VS Code; no command-line commands are required.

  1. Install Keil Studio for VS Code and Python extension from the VS Code marketplace.
  2. Clone or download this repository, then open its folder in VS Code.
  3. Before using the example for the first time, select Terminal > Run Task > Setup Python virtual environment. Wait for the task to create the .venv environment and install the packages required to export the model.
  4. Use the CMSIS action buttons to build the application, then select Run or Debug. Keil Studio starts the Corstone-320 FVP automatically.

A successful run prints the Ethos-U configuration, output logits, and a pass result:

Ethos-U version info:
Arch: v2.0.0
MACs/cc: 256
Cmd stream: v1
ExecuTorch Ethos-U85 example: 8864 byte model
Output: 10 element(s): 0.0187 -0.0204 -0.0645 0.0034 0.0187 ...
Test_result: PASS

Command-line build

The same workflow can be performed from the VS Code Terminal as described below.

1. Create the Python environment

On Linux or macOS:

./setup_venv.sh

On Windows:

.\setup_venv.bat

The setup script creates .venv/ and installs the packages required to quantize and export the model. It is safe to run again; use --recreate when you want a completely new environment.

Note

On Windows, enable long-path support or keep the repository close to the drive root. PyTorch packages can otherwise exceed the legacy 260-character path limit.

2. Build the application

cbuild cmsis-executorch-simple.csolution.yml --active SSE-320-U85 --packs --update-rte

This command:

  1. Resolves and installs the required CMSIS packs.
  2. Generates the MLOps build information for the selected target.
  3. Quantizes and exports the model for Ethos-U85.
  4. Generates the model's CMSIS component selection.
  5. Compiles and links the embedded application.

The resulting image is:

out/cmsis-executorch-simple/SSE-320-U85/Debug/cmsis-executorch-simple.hex

3. Run on the FVP

FVP_Corstone_SSE-320 \
-f board/Corstone-320/fvp_config.txt \
-a out/cmsis-executorch-simple/SSE-320-U85/Debug/cmsis-executorch-simple.hex

How model generation works

The selected target is described by the mlops: node in cmsis-executorch-simple.csolution.yml:

mlops:
npu:
type: Ethos-U85vela:
system: Ethos_U85_SYS_DRAM_Midmemory: Shared_Srammodel:
clayer: $AI-Layer$name: TinyCNN

Building with --active SSE-320-U85 generates cmsis-executorch-simple.cbuild-mlops.yml. This file contains the resolved processor, NPU, and Vela options. model/export_model.py reads those options and passes them to ExecuTorch's EthosUCompileSpec, so the target configuration does not need to be duplicated in Python.

The export step produces:

  • model/model.pte: the ExecuTorch program.
  • ai_layer/model/model_pte.h: the same program embedded as a C array.
  • ai_layer/ai_layer.clayer.yml: the CMSIS components required by the model.

See the MLOps flow for a detailed walkthrough.

Component selection

The ExecuTorch CMSIS Pack provides the runtime, backends, and individual operators as selectable CMSIS components. scripts/gen_components.py examines the exported .pte and updates ai_layer/ai_layer.clayer.yml so only the required components are linked.

CMSIS-Toolbox resolves components before it executes the model-export step. If a model change also changes its operator set, the first build updates the component list and asks you to build again:

[run_export] The model's operator set changed: ai_layer.clayer.yml was regenerated.
[run_export] Re-run the build to compile and link the updated component selection.

Run the same build command a second time to use the new selection.

Adapting the example

To use a different model, replace or modify model/model.py and update the model name or input handling as required. The next build regenerates the .pte and embedded model data.

To target another Ethos-U configuration, update the target and mlops: settings in the CMSIS solution. The generated Vela options then follow that configuration automatically. Moving to a different board or reference platform also requires the corresponding device pack, board support, memory layout, and FVP configuration.

When updating ExecuTorch, update the CMSIS pack and Python package versions together. More information is available in pack provenance.

Project layout

PathPurpose
cmsis-executorch-simple.csolution.ymlSolution, target, and MLOps configuration
cmsis-executorch-simple.cproject.ymlApplication project and model-conversion build step
model/model.pyExample TinyCNN model
model/export_model.pyQuantizes and delegates the model to Ethos-U
scripts/run_export.pyRuns model export and component generation
scripts/gen_components.pyMaps model operators to CMSIS components
ai_layer/ai_layer.clayer.ymlGenerated model-specific component selection
board/Corstone-320/Corstone-320 platform support and FVP configuration
src/app_main.cppLoads the model, runs inference, and prints the result
documentation/Detailed MLOps, pack, and cross-platform notes

Known limitations

  • A model change that changes the operator set requires two builds.
  • The supplied platform configuration targets Corstone-320 with Ethos-U85; another target needs its corresponding platform integration.

License

The example code is licensed under Apache-2.0; see LICENSE. ExecuTorch uses a BSD-3-Clause license.

References

About

Docker driven integration workflow of Executorch into CMSIS-based projects

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

ExecuTorch on Ethos-U

This example shows how to deploy and run an ExecuTorch model on an Arm Ethos-U NPU. The pack PyTorch::ExecuTorch provides the source code components to build the ExecuTorch runtime, required operators, and Ethos-U backend. The build process uses the CMSIS-Toolbox 2.14.1 or higher.

This example application targets the Arm Corstone-320 reference platform with an Ethos-U85 NPU. It demonstrates the same overall workflow used for other Ethos-U systems: export and quantize a PyTorch model, delegate it to Ethos-U, select only the required runtime components, and build it into an embedded application.

What the example demonstrates

  • Exporting an ExecuTorch model for Ethos-U using a Python virtual environment (without requiring Docker).
  • The pack PyTorch::ExecuTorch links only the required and operator components that the ML model needs.
  • Manage NPU and Vela configuration using CMSIS solution project rather duplicating the Python exporter.
  • Generating the model as part of the normal CMSIS-Toolbox build process.
  • Running the finished application on a Corstone-320 FVP simulation model.

Prerequisites

The pack PyTorch::ExecuTorch can be optionally installed manually with:

cpackget add PyTorch::ExecuTorch@1.4.0

Note

The pack and Python exporter versions must match, as the generated .pte format is consumed by the runtime supplied in PyTorch::ExecuTorch@1.4.0.

Quick start

The example can be built and run entirely in Keil Studio for VS Code; no command-line commands are required.

  1. Install Keil Studio for VS Code and Python extension from the VS Code marketplace.
  2. Clone or download this repository, then open its folder in VS Code.
  3. Before using the example for the first time, select Terminal > Run Task > Setup Python virtual environment. Wait for the task to create the .venv environment and install the packages required to export the model.
  4. Use the CMSIS action buttons to build the application, then select Run or Debug. Keil Studio starts the Corstone-320 FVP automatically.

A successful run prints the Ethos-U configuration, output logits, and a pass result:

Ethos-U version info:
Arch: v2.0.0
MACs/cc: 256
Cmd stream: v1
ExecuTorch Ethos-U85 example: 8864 byte model
Output: 10 element(s): 0.0187 -0.0204 -0.0645 0.0034 0.0187 ...
Test_result: PASS

Command-line build

The same workflow can be performed from the VS Code Terminal as described below.

1. Create the Python environment

On Linux or macOS:

./setup_venv.sh

On Windows:

.\setup_venv.bat

The setup script creates .venv/ and installs the packages required to quantize and export the model. It is safe to run again; use --recreate when you want a completely new environment.

Note

On Windows, enable long-path support or keep the repository close to the drive root. PyTorch packages can otherwise exceed the legacy 260-character path limit.

2. Build the application

cbuild cmsis-executorch-simple.csolution.yml --active SSE-320-U85 --packs --update-rte

This command:

  1. Resolves and installs the required CMSIS packs.
  2. Generates the MLOps build information for the selected target.
  3. Quantizes and exports the model for Ethos-U85.
  4. Generates the model's CMSIS component selection.
  5. Compiles and links the embedded application.

The resulting image is:

out/cmsis-executorch-simple/SSE-320-U85/Debug/cmsis-executorch-simple.hex

3. Run on the FVP

FVP_Corstone_SSE-320 \
-f board/Corstone-320/fvp_config.txt \
-a out/cmsis-executorch-simple/SSE-320-U85/Debug/cmsis-executorch-simple.hex

How model generation works

The selected target is described by the mlops: node in cmsis-executorch-simple.csolution.yml:

mlops:
npu:
type: Ethos-U85vela:
system: Ethos_U85_SYS_DRAM_Midmemory: Shared_Srammodel:
clayer: $AI-Layer$name: TinyCNN

Building with --active SSE-320-U85 generates cmsis-executorch-simple.cbuild-mlops.yml. This file contains the resolved processor, NPU, and Vela options. model/export_model.py reads those options and passes them to ExecuTorch's EthosUCompileSpec, so the target configuration does not need to be duplicated in Python.

The export step produces:

  • model/model.pte: the ExecuTorch program.
  • ai_layer/model/model_pte.h: the same program embedded as a C array.
  • ai_layer/ai_layer.clayer.yml: the CMSIS components required by the model.

See the MLOps flow for a detailed walkthrough.

Component selection

The ExecuTorch CMSIS Pack provides the runtime, backends, and individual operators as selectable CMSIS components. scripts/gen_components.py examines the exported .pte and updates ai_layer/ai_layer.clayer.yml so only the required components are linked.

CMSIS-Toolbox resolves components before it executes the model-export step. If a model change also changes its operator set, the first build updates the component list and asks you to build again:

[run_export] The model's operator set changed: ai_layer.clayer.yml was regenerated.
[run_export] Re-run the build to compile and link the updated component selection.

Run the same build command a second time to use the new selection.

Adapting the example

To use a different model, replace or modify model/model.py and update the model name or input handling as required. The next build regenerates the .pte and embedded model data.

To target another Ethos-U configuration, update the target and mlops: settings in the CMSIS solution. The generated Vela options then follow that configuration automatically. Moving to a different board or reference platform also requires the corresponding device pack, board support, memory layout, and FVP configuration.

When updating ExecuTorch, update the CMSIS pack and Python package versions together. More information is available in pack provenance.

Project layout

PathPurpose
cmsis-executorch-simple.csolution.ymlSolution, target, and MLOps configuration
cmsis-executorch-simple.cproject.ymlApplication project and model-conversion build step
model/model.pyExample TinyCNN model
model/export_model.pyQuantizes and delegates the model to Ethos-U
scripts/run_export.pyRuns model export and component generation
scripts/gen_components.pyMaps model operators to CMSIS components
ai_layer/ai_layer.clayer.ymlGenerated model-specific component selection
board/Corstone-320/Corstone-320 platform support and FVP configuration
src/app_main.cppLoads the model, runs inference, and prints the result
documentation/Detailed MLOps, pack, and cross-platform notes

Known limitations

  • A model change that changes the operator set requires two builds.
  • The supplied platform configuration targets Corstone-320 with Ethos-U85; another target needs its corresponding platform integration.

License

The example code is licensed under Apache-2.0; see LICENSE. ExecuTorch uses a BSD-3-Clause license.

References

About

Docker driven integration workflow of Executorch into CMSIS-based projects

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages