From 8eb77b464dbf4c6db623ed3116647918e8e7e083 Mon Sep 17 00:00:00 2001 From: Matthias Hertel <11649409+MatthiasHertel80@users.noreply.github.com> Date: Wed, 30 Sep 2026 15:28:32 +0200 Subject: [PATCH] Move to ExecuTorch 1.5.1 The PyTorch::ExecuTorch pack 1.5.1 is in the public pack index and executorch 1.5.1 is on PyPI. It targets torch 2.14.0 (torch_pin.py at the v1.5.1 tag) and keeps torchao 0.18, ethos-u-vela 5.1.0 and tosa-tools 2026.5.0, so requirements-arm-tosa.txt is unchanged. The pack pins in the csolution and the cproject follow, and the generated layer and the RTE context headers name the new pack version. The exported program is 8784 bytes instead of 8832. --- README.md | 8 +++--- RTE/_Debug_SSE-320-U85/Pre_Include_Global.h | 4 +-- RTE/_Debug_SSE-320-U85/RTE_Components.h | 12 ++++----- ai_layer/ai_layer.clayer.yml | 2 +- ai_layer/model_pte.c | 27 +++++++++------------ cmsis-executorch.cproject.yml | 2 +- cmsis-executorch.csolution.yml | 2 +- documentation/pack-provenance.md | 17 +++++++------ requirements.txt | 13 +++++----- setup_venv.py | 2 +- 10 files changed, 44 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 3860c0dd..28f8f343 100644 --- a/README.md +++ b/README.md @@ -31,13 +31,13 @@ application. The pack [`PyTorch::ExecuTorch`](https://www.keil.arm.com/packs/executorch-pytorch/) can be optionally installed manually with: ```bash -cpackget add PyTorch::ExecuTorch@1.4.1 +cpackget add PyTorch::ExecuTorch@1.5.1 ``` > [!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.1`. -> The matching wheel is `executorch==1.4.1` from PyPI, pinned in +> format is consumed by the runtime supplied in `PyTorch::ExecuTorch@1.5.1`. +> The matching wheel is `executorch==1.5.1` from PyPI, pinned in > `requirements.txt`. ## Quick start @@ -73,7 +73,7 @@ Ethos-U version info: Arch: v2.0.0 MACs/cc: 256 Cmd stream: v1 -ExecuTorch Ethos-U85 example: 8832 byte model +ExecuTorch Ethos-U85 example: 8784 byte model Output: 10 element(s): 0.0079 0.0459 0.0475 -0.0475 0.0791 0.0411 -0.0285 -0.0744 -0.2246 -0.0016 Test_result: PASS ``` diff --git a/RTE/_Debug_SSE-320-U85/Pre_Include_Global.h b/RTE/_Debug_SSE-320-U85/Pre_Include_Global.h index 37e190f9..83d53110 100644 --- a/RTE/_Debug_SSE-320-U85/Pre_Include_Global.h +++ b/RTE/_Debug_SSE-320-U85/Pre_Include_Global.h @@ -12,10 +12,10 @@ /* ARM::Machine Learning:NPU Support:Ethos-U Driver&Generic U85@1.26.2 */ // enabling global pre includes #define ETHOSU_ARCH u85 -/* PyTorch::Machine Learning:ExecuTorch:Backend EthosU@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Backend EthosU@1.5.1 */ #define EXECUTORCH_BUILD_ARM_BAREMETAL 1 #define ET_USE_ETHOS_U_BACKEND 1 -/* PyTorch::Machine Learning:ExecuTorch:Runtime@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Runtime@1.5.1 */ /* ExecuTorch global configuration */ #define C10_USING_CUSTOM_GENERATED_MACROS #define FLATBUFFERS_MAX_ALIGNMENT 1024 diff --git a/RTE/_Debug_SSE-320-U85/RTE_Components.h b/RTE/_Debug_SSE-320-U85/RTE_Components.h index 571f80b4..a80a87c2 100644 --- a/RTE/_Debug_SSE-320-U85/RTE_Components.h +++ b/RTE/_Debug_SSE-320-U85/RTE_Components.h @@ -30,17 +30,17 @@ #define RTE_TIMEOUT 1 /* ARM::Machine Learning:NPU Support:Ethos-U Driver&Generic U85@1.26.2 */ #define RTE_ETHOS_U_CORE_DRIVER -/* PyTorch::Machine Learning:ExecuTorch Operators:Quantized dequantize@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch Operators:Quantized dequantize@1.5.1 */ #define RTE_ML_EXECUTORCH_OP_QUANTIZED_DEQUANTIZE /* ExecuTorch op_dequantize */ -/* PyTorch::Machine Learning:ExecuTorch Operators:Quantized quantize@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch Operators:Quantized quantize@1.5.1 */ #define RTE_ML_EXECUTORCH_OP_QUANTIZED_QUANTIZE /* ExecuTorch op_quantize */ -/* PyTorch::Machine Learning:ExecuTorch:Backend EthosU@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Backend EthosU@1.5.1 */ #define RTE_ML_EXECUTORCH_BACKEND_ETHOS_U /* ExecuTorch Ethos-U Backend (Cortex-M host) */ -/* PyTorch::Machine Learning:ExecuTorch:Kernel Registration@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Kernel Registration@1.5.1 */ #define RTE_ML_EXECUTORCH_KERNEL_REGISTRATION /* ExecuTorch Kernel Registration */ -/* PyTorch::Machine Learning:ExecuTorch:Kernel Utils@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Kernel Utils@1.5.1 */ #define RTE_ML_EXECUTORCH_KERNEL_UTILS /* ExecuTorch Kernel Utils */ -/* PyTorch::Machine Learning:ExecuTorch:Runtime@1.4.1 */ +/* PyTorch::Machine Learning:ExecuTorch:Runtime@1.5.1 */ #define RTE_ML_EXECUTORCH_RUNTIME /* ExecuTorch Runtime */ diff --git a/ai_layer/ai_layer.clayer.yml b/ai_layer/ai_layer.clayer.yml index 1322ac2c..87928945 100644 --- a/ai_layer/ai_layer.clayer.yml +++ b/ai_layer/ai_layer.clayer.yml @@ -6,7 +6,7 @@ layer: description: TinyCNN int8 image classifier for Ethos-U85 packs: - - pack: PyTorch::ExecuTorch@1.4.1 + - pack: PyTorch::ExecuTorch@1.5.1 define: - ET_LOG_ENABLED: 0 diff --git a/ai_layer/model_pte.c b/ai_layer/model_pte.c index dd1ffd5c..6de9411d 100644 --- a/ai_layer/model_pte.c +++ b/ai_layer/model_pte.c @@ -3,10 +3,10 @@ __attribute__((aligned(16))) const unsigned char model_pte[] = { 0x24, 0x00, 0x00, 0x00, 0x45, 0x54, 0x31, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00, 0x14, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, - 0x2c, 0x00, 0x00, 0x00, 0x8c, 0x1a, 0x00, 0x00, 0x8c, 0x1a, 0x00, 0x00, 0xf0, 0xe1, 0xff, 0xff, + 0x2c, 0x00, 0x00, 0x00, 0x8c, 0x1a, 0x00, 0x00, 0x8c, 0x1a, 0x00, 0x00, 0x20, 0xe2, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x72, 0xdf, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x50, 0x1a, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x50, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xa2, 0xdf, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x50, 0x1a, 0x00, 0x00, 0x76, 0x65, 0x6c, 0x61, 0x5f, 0x62, 0x69, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x6d, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -430,23 +430,20 @@ __attribute__((aligned(16))) const unsigned char model_pte[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x28, 0x00, 0x24, 0x00, 0x20, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x14, 0x00, 0x10, 0x00, 0x0c, 0x00, - 0x08, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, - 0x28, 0x02, 0x00, 0x00, 0xb8, 0x02, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x94, 0x03, 0x00, 0x00, - 0x98, 0x03, 0x00, 0x00, 0x20, 0x06, 0x00, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0xf8, 0x01, 0x00, 0x00, 0x88, 0x02, 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, + 0x68, 0x03, 0x00, 0x00, 0xf0, 0x05, 0x00, 0x00, 0x3c, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x72, 0xfd, 0xff, 0xff, 0x0c, 0x00, 0x00, 0x00, - 0xd0, 0x01, 0x00, 0x00, 0xd0, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x88, 0x01, 0x00, 0x00, - 0xd0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x38, 0xfa, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xa6, 0xfd, 0xff, 0xff, + 0x0c, 0x00, 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x54, 0x01, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x68, 0xfa, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x65, 0x74, 0x68, 0x6f, 0x73, 0x2d, 0x75, 0x38, 0x35, 0x2d, 0x32, 0x35, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x00, 0x00, - 0x64, 0xfa, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x94, 0xfa, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x5f, 0x69, 0x6f, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x9c, 0xfa, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x6f, 0x75, 0x70, 0x75, - 0x74, 0x5f, 0x72, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x61, 0x72, - 0x6f, 0x75, 0x6e, 0x64, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xfa, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, + 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xfa, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x76, 0x65, 0x6c, 0x61, 0x0d, 0x00, 0x00, 0x00, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x00, 0x00, 0x00, 0xf4, 0xfa, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, diff --git a/cmsis-executorch.cproject.yml b/cmsis-executorch.cproject.yml index 5128d15f..62ac0773 100644 --- a/cmsis-executorch.cproject.yml +++ b/cmsis-executorch.cproject.yml @@ -7,7 +7,7 @@ # the Board layer brings the board bring-up. project: packs: - - pack: PyTorch::ExecuTorch@1.4.1 + - pack: PyTorch::ExecuTorch@1.5.1 - pack: ARM::CMSIS misc: diff --git a/cmsis-executorch.csolution.yml b/cmsis-executorch.csolution.yml index acb57444..8f034c95 100644 --- a/cmsis-executorch.csolution.yml +++ b/cmsis-executorch.csolution.yml @@ -20,7 +20,7 @@ solution: # Pinned exactly: the pack's C++ runtime and the Python exporter pinned in # requirements.txt must be the same ExecuTorch version, or the .pte fails # to load. `cbuild setup --packs` fetches it from the public index. - - pack: PyTorch::ExecuTorch@1.4.1 + - pack: PyTorch::ExecuTorch@1.5.1 - pack: ARM::CMSIS - pack: ARM::CMSIS-NN - pack: ARM::CMSIS-Compiler diff --git a/documentation/pack-provenance.md b/documentation/pack-provenance.md index 6fb19ab9..5cf2144a 100644 --- a/documentation/pack-provenance.md +++ b/documentation/pack-provenance.md @@ -11,14 +11,14 @@ The pack is published as an asset of the matching ExecuTorch GitHub release, which is also what its `.pdsc` declares as its download location: ```xml -https://github.com/pytorch/executorch/releases/download/v1.4.1/ +https://github.com/pytorch/executorch/releases/download/v1.5.1/ ``` So the normal acquisition routes work, and `cbuild setup ... --packs` takes care of it on a fresh clone. To install it by hand: ```bash -cpackget add PyTorch::ExecuTorch@1.4.1 +cpackget add PyTorch::ExecuTorch@1.5.1 ``` The version is pinned exactly, in `cmsis-executorch.csolution.yml` and @@ -26,10 +26,10 @@ The version is pinned exactly, in `cmsis-executorch.csolution.yml` and ```yaml packs: - - pack: PyTorch::ExecuTorch@1.4.1 + - pack: PyTorch::ExecuTorch@1.5.1 ``` -Both must agree. The pin is exact rather than a `@^1.4.1` range because the +Both must agree. The pin is exact rather than a `@^1.5.1` range because the pack's C++ runtime and the Python exporter have to be the *same* ExecuTorch version — see [Moving to a new ExecuTorch version](#moving-to-a-new-executorch-version). @@ -63,7 +63,7 @@ ExecuTorch tree at `backends/arm/cmsis_pack/scripts/build_pack.sh`. ```bash git clone https://github.com/pytorch/executorch.git cd executorch -git checkout release/1.4 # or the tag matching your target version +git checkout release/1.5 # or the tag matching your target version git submodule update --init --recursive ``` @@ -111,7 +111,7 @@ them); the pack lands in the output directory: backends/arm/cmsis_pack/scripts/build_pack.sh \ --executorch-root "$PWD" \ --build-dir cmake-out-arm \ - --version 1.4.1-local \ + --version 1.5.1-local \ --output-dir pack-output ``` @@ -120,7 +120,7 @@ backends/arm/cmsis_pack/scripts/build_pack.sh \ Before trusting a freshly built pack, check the parts that go missing quietly: ```bash -VERSION=1.4.1-local +VERSION=1.5.1-local PACK=pack-output/PyTorch.ExecuTorch.$VERSION set -e @@ -158,7 +158,8 @@ in order: 2. **Update both pins** — `PyTorch::ExecuTorch@` in the csolution and in the cproject. 3. **Update the Python pins**: `executorch`, `torch` and `torchao` in - `requirements.txt`, following the new release's `install_requirements.py`; + `requirements.txt`, following the new release's `torch_pin.py` and + `install_requirements.py`; `requirements-arm-tosa.txt` (the TOSA serializer and its flatbuffers pin) only changes when the Arm backend's `requirements-arm-tosa.txt` does. 4. **Rebuild the venv, the AI layer and the project:** diff --git a/requirements.txt b/requirements.txt index 1fd6d11f..75f8ff19 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,12 +3,13 @@ # # executorch, torch and torchao must match: a .pte exported by one ExecuTorch # version only loads in the runtime of the same version, and that runtime is -# the PyTorch::ExecuTorch@1.4.1 pack pinned in the csolution. ExecuTorch 1.4.1 -# targets torch 2.13.0 and torchao 0.18.0 (install_requirements.py on the -# release/1.4 branch); prebuilt wheels exist for Linux, macOS and Windows, -# Python 3.10 to 3.14 (the export venv stays below 3.14: see requirements-arm-tosa.txt). -executorch==1.4.1 -torch==2.13.0 +# the PyTorch::ExecuTorch@1.5.1 pack pinned in the csolution. ExecuTorch 1.5.1 +# targets torch 2.14.0 (torch_pin.py at the v1.5.1 tag) and torchao 0.18 +# (the wheel requires torchao>=0.18.0,<0.19); prebuilt wheels exist for Linux, +# macOS and Windows, Python 3.10 to 3.14 (the export venv stays below 3.14: +# see requirements-arm-tosa.txt). +executorch==1.5.1 +torch==2.14.0 torchao==0.18.0 # Vela, the Ethos-U compiler. Same pin as executorch's `ethos_u` extra. diff --git a/setup_venv.py b/setup_venv.py index 4e987584..0d79bc06 100755 --- a/setup_venv.py +++ b/setup_venv.py @@ -22,7 +22,7 @@ HERE = Path(__file__).resolve().parent VENV_DIR = HERE / ".venv" -# ExecuTorch 1.4 declares requires-python = ">=3.10,<3.15" in its pyproject.toml, +# ExecuTorch 1.5 declares requires-python = ">=3.10,<3.15" in its pyproject.toml, # but the tosa-tools 2026.5.0 it pins for the Arm backend (see # requirements-arm-tosa.txt) only ships wheels up to CPython 3.13, so on 3.14 # pip reports "No matching distribution found for tosa-tools==2026.5.0".