Changes before 1.0
Each item names the 0.x release that made the change. A configuration or a program written for an earlier release may need the change the item describes.
-
Next release. A looping
--log-filesymbolic link is rejected with exit 2 instead of a traceback and exit 1. -
Next release. Archive output links whose target directory is missing are rejected before conversion with exit 2.
-
Next release. int16 CONCATENATION, EXPAND_DIMS and FILL with nonzero zero points are rejected, as in LiteRT.
-
0.28.0. The legacy
neuralspotmodule type was removed; usecmake(the new default),zephyrornsx. With it,<prefix>_platform.hno longer maps<PREFIX>_PRINTFtons_lp_printfor the<PREFIX>_PUT_IN_*hooks to neuralSPOT’s sections, and<PREFIX>_PUT_CODE_IN_ITCMis empty, so operators withcode_placement: ITCMstay in the default code section. Define the hooks your application needs; without them the arenas and code follow the linker’s default placement and logging is silent. -
0.28.0.
memory.plannerdefaults tohill_climbinstead ofgreedy. Its scratch arenas are the same size or smaller thangreedy’s in every memory whengreedy’s plan fits, but tensor offsets and the memory of an individual tensor can change. Setmemory.planner: greedyto keep the previous layout. -
0.28.0. An unknown key in a nested block, a list entry or
memory.tensors[].attributesis an error that names the nearest valid key (the command line exits 2). Earlier releases dropped such keys, with a warning in the later ones; unknown top-level keys were already rejected. See When a key is wrong. -
0.28.0. A
TRANSPOSE_CONVwithSAMEpadding whose input height or width is not divisible by its stride, such as a KerasConv2DTransposedecoder, produced output shifted by one pixel in earlier releases. It now follows LiteRT, and a declared output shape the operators do not produce is a typed error. -
0.28.0. Conversion applies LiteRT’s dtype, scale and quantization rules, so a model that breaks one is a typed error with a hint where earlier releases gave a traceback, wrong output or code that did not compile. Platform and configuration-value errors that do not depend on the model exit 2 (see When a key is wrong), and the public I/O tables report scale 1 and zero point 0 for every tensor but an int8, uint8 or int16 one with a scale.
-
0.28.0. Golden data must match each tensor’s element count and dtype; a mismatch or an archive that cannot be loaded raises
GoldenDataErrorand exits 2. Attribute values are checked before conversion starts, and a.zipexport appears at the output path only when it is complete. -
0.31.0. The plan’s
platform.coreand thecoreof each report measurement are namedcpu, as in the configuration’splatform.cpu, because CORE means heliaCORE everywhere else;measurements_fortakescpu. A plan or report that names itcorestill reads.OptimizationPlanandOptimizationReportread a file from a newer release with the sameschema_versioninstead of rejecting a field, knob, value or member they do not know. To check that a file holds only what one release writes, validate it against thejson_schemaobject in that release’splan-schema.jsonorreport-schema.json. The rename keepsschema_version1, an exception made once before 1.0: a script that reads the raw JSON readscpuand falls back tocore, and heliaAOT 0.30 and earlier cannot read a plan or report that 0.31.0 or later writes.PlanOptimization.goalis the string written, which still compares equal to itsOptimizationGoalmember. -
0.31.0. A built-in operator’s
operators[].attributeskeys are checked: a key the operators a rule reaches do not take is an error that names the nearest valid key, where earlier releases passed it through. A custom operator class keeps free-form attributes only when itsATTRIBUTESmodel allows extra keys. A custom transform takes no options unless it declaresOPTIONS; a built-in transform that takes none has rejected options since 0.28.0. -
0.31.0. Removed settings, each an error that names its replacement:
memory.auto_hydrate_constants, which had no effect (<prefix>_model_initalways hydrates staged constants);operators[].attributes.scratch_placement, which was never implemented (use amemory.tensorsrule); and theble,usbandpsramvalues ofplatform.capabilities, which nothing read (declare PSRAM underplatform.memories). The--memory.auto-hydrate-constantsand--no-memory.auto-hydrate-constantsflags are gone, so the command line rejects them as unknown options. -
0.31.0.
model.typeaccepts onlytfliteandlitert, and an unknown value is a command-line or configuration error.model.versiondefaults to none, so the generated documentation shows the LiteRT schema version the model file records (3) instead ofv1.0.0. A custom platform no longer needsplatform.speeds. -
0.31.0.
list-targetsandtarget-infoare deprecated; useplatforms listandplatforms show NAME. -
0.31.0.
AotConverter.convert()returns aConversionResultwith the output path, the prefix, the parsed plan and report, and the kept work directory, instead of the internal code generation context. Read those fields, or the residency report, instead of the context’s. -
0.31.0.
ConvertArgs.from_yamlraisesInvalidConfigError, aConfigValueErrorwithexit_code2, for a file it cannot load or a key or value that does not validate, where earlier releases raisedFileNotFoundError,ValueErroror pydantic’sValidationError. -
0.31.0.
ModelLoadErroris anOSErrorrather than aFileNotFoundError, andUnsupportedModelErroris aConfigValueError. CatchModelLoadErrororOSErrorfor a model that cannot be loaded, and put anexcept UnsupportedModelErrorbefore anexcept ConfigValueError. -
0.31.0. Each typed error carries the exit code the command line ends with, as
exit_codeon its class.ConfigValueErrorno longer takes anexit_codeargument: a configuration rejected on its own or against the target raises its subclassInvalidConfigError, which declares 2. -
0.31.0.
helia_aotexportsAotConverter,ConversionResultandConvertArgsand no module objects, and each manifest name is promised at one import path:AotConverterandConvertArgsfromhelia_aot, the registry names fromhelia_aot.registry, the operator names fromhelia_aot.aot.operators, the memory names fromhelia_aot.memory, andValidCVarNameTypeandValidModuleNameTypefromhelia_aot.defines. -
0.31.0. A generated module needs ns-cmsis-nn 7.46.0 or later; a project on 7.45.x or earlier updates ns-cmsis-nn before rebuilding a regenerated module. See the heliaCORE floor.
-
0.32.0. Public enum members are spelled in UPPER_CASE (
ModuleType.CMAKE,ScheduleMode.TABLE,MemoryPlannerType.HILL_CLIMB,ModelType.TFLITE,ArenaRole.SCRATCH). The earlier lowercase names remain aliases of the same members, and configuration values are unchanged.member.namenow returns the uppercase name (ModuleType.cmake.nameis"CMAKE"), so code that compares.namewith a lowercase string compares.valueinstead. -
0.32.0.
Registry.unfreezeandRegistryContext.unfreezeare removed. -
0.32.0.
MemoryType.readableandMemoryType.executableare removed, andMemoryType.writeableand the other compiler helpers onMemoryType,ConvertArgs,ModuleArgsandAirTensorare private. AnAirTensorconstructor keyword or assignment that uses a former field name is an error naming the new spelling. -
0.32.0.
ConversionResultcompares and hashes by identity. -
0.32.0. The command line logs at the level
verbosenames: 0 errors only, 1 stage milestones, 2 debug details, 3 debug details with each AIR operator’s tensors and options. Level 0 shows no warnings, configuration warnings included; from level 1 each reaches standard error and--log-fileonce.AotConverter.convert()leaves thehelia_aotlogger as the caller configured it. -
0.32.0.
platform.speedsis deprecated; no conversion reads it, and a non-empty value is accepted with a warning until 2.0 removes it. -
0.32.0. On the experimental Python custom-operator path, a
type: "*"operator rule is checked against the built-in operators’ attributes even when a custom operator with free-form (extra="allow") attributes is registered. A key no operator declares, or a removed key such asscratch_placementin a rule for a free-form custom operator, is a configuration error. Put free-form keys on a rule for the custom operator’s type. -
0.32.0. A former key of a renamed setting is accepted, with one warning per conversion, in transform options, planner options, operator attributes and tensor attributes as well as the configuration blocks.
-
0.32.0. Generated modules require ns-cmsis-nn 7.47.0 or newer (was 7.46.0).
-
0.32.0. Generated modules no longer contain the empty
<prefix>_compiler.h; include<prefix>_model.h. -
0.32.0. The file-name promise covers only the names
module-layout.jsonmarks public (see What a release promises); operator, helper and CMSIS-Pack file names can change. -
0.32.0.
<prefix>_context_initis advanced instead of public:<prefix>_model_initalready calls it, so an application that only runs a model does not call it. -
0.32.0. The generated C API is version 1.1.0. The operator callback’s
opargument is the operator’s layer index, its 0-based position in execution order, not its AIR node id. The two differ when a transform removed or reordered operators or the parser skipped one;ConversionResult.operators[op].source_indicesgives the model-file operator index.<prefix>_status_treserves 1000 to 1999 for custom operators (<prefix>_status_custom_first,<prefix>_status_custom_last). Hold statuses inint32_t. -
0.32.0. Exit code 2 means rejected input wherever the check runs. These used to exit 1 and now exit 2: a missing, unreadable or corrupt model file; an existing output without
--force; a missing golden archive;test.state_feedbackandtest.tolerancevalues the model rejects; an out-of-rangemodel.subgraph; an unsupported model extension; an invalidSOURCE_DATE_EPOCH;memory.tensorsrules that give one constant memory two source memories; a float16 model on a target without FP16 support; an Ethos-U model on a target without an NPU. A script that treated 1 as bad input checks for 2. -
0.32.0. A rule that names an
idoutranks a rule that names only atype, foroperators[]andmemory.tensors. Where a type rule used to override an id rule, the id rule now wins; a rule that others override on everything it matches logs a warning. -
0.32.0.
memory.tensors[].attributes.memoryis unset by default. A rule that sets onlyconstant_destination_memorystages its constants from a source the planner chooses, read-only memory first (MRAM on Apollo510), instead of taking DTCM as the source. Setmemory: DTCMin the rule to keep the previous placement. -
0.32.0. Operator ids must be strings holding a decimal integer from 0 to 2147483647, unique in the model;
OperatorIdErrornames any other. Only a custom parser or transform can produce another. -
0.32.0. Resource variables start at the constant their
CALL_ONCEinitialization assigns, as they do in LiteRT. They used to start at zero or at their zero point, which gave wrong output for stateful models whose variables have nonzero initial values, such as NNSE and NNVAD. Models whose variables start at zero are unchanged. Two handles that name one variable now share it. -
0.32.0. Conversion rejects, with
UnsupportedModelError, models that earlier releases converted silently. These models are invalid: LiteRT refuses them, or for an element-count mismatch gives an undefined result:- a plain
CALLnode, which LiteRT has no kernel for; - a
CALL_ONCEnode that names no other subgraph of the model; - a
CALL_ONCEinitial value whose type differs from the variable’s read (LiteRT refuses the read), or whose element count differs from it (LiteRT copies the read’s byte count, past the variable’s end or short of it); - a fused activation on
CONCATENATION, which LiteRT’s builtin kernel rejects; - int8
CONCATENATION, or int8 and int16PACK,UNPACK,SPACE_TO_BATCH_ND,BATCH_TO_SPACE_ND,REDUCE_MAX,REDUCE_MIN,EXPAND_DIMSorFILL, whose inputs and outputs differ in scale or zero point.
LiteRT runs these, but heliaAOT does not support them:
- a
CALL_ONCEnode after aREAD_VARIABLEorASSIGN_VARIABLE; - a
CALL_ONCEinitialization subgraph that runs anything butVAR_HANDLEand the assignment of a constant, such as a nestedCALL_ONCEor an initializer that computes its value.
- a plain
-
0.32.0. A module converted for a target without MVE stops a build with
ARM_MATH_MVEI(#errorin<prefix>_common.h) when one of its layers would be planned differently with MVE: another kernel entry, other scratch or weight sums. Examples are int8 convolution, fully connected, batch matmul and average pooling, and int8 3x3 depthwise. Layers planned the same either way, such as int8 max pooling or int16 fully connected, still build for both.HELIA_AOT_SKIP_TARGET_CHECKlifts the check. -
0.32.0. The optimization report counts MACs for
TRANSPOSE_CONVandBATCH_MATMULtoo. ATRANSPOSE_CONVrewritten toCONV_2Dis counted at its input positions, no longer on its upscaled input, which counted four times too many at stride 2.