Changelog#

[v1.3.0] - 2026-09-10#

Added#

  • Layer bias correction, a calibration-only accuracy pass that measures the systematic per-channel error quantization introduces and folds it into the biases of the layers carrying an integer one. Enable it with layer_bias_correction=True. No labels and no training loop, but it needs the float weights kept: a weightMemory.method of DeleteFloat is silently promoted to SaveFloat, so they are written to disk rather than dropped. The other methods are left as set. The field is an index into weightMemory.methodList, not one of those names: 0 is DeleteFloat and 1 is SaveFloat.

  • Hessian-based weight quantization can hold its Hessian in half precision (hessian_dtype="bf16"), and accumulation_device chooses where it is accumulated, trading memory against speed. It defaults to auto, which follows useGPUOnlyForCalibration inversely: that setting’s own default resolves auto to the CPU, the slower of the two, so a compile that enables Hessian-based quantization and says nothing about the device takes that path.

  • A model made of several parts, such as a vision-language model, can be compiled one named part at a time with model_part and model_part_options.

  • The parse stage is seeded, so the same inputs produce the same parsed graph. Each one also records how it was produced: the source revisions, the resolved parser settings, the parse inputs, and a hash of the source model. Read it with read_provenance() or the new info subcommand, and set QBCOMPILER_PROVENANCE=0 to record nothing. The compiled MXQ records the same source revisions and the configuration it was compiled with. Neither is an on-disk format change.

  • config_save_path, and --config-save-path on the command line, writes a compile’s fully resolved configuration before it starts, so the settings a build actually used survive a run that fails and can be fed straight back to reproduce it.

  • mxq_compile_from_source and mxq_compile_from_mblt expose the two halves of the compile entry point, for callers that stage the steps. The combined entry point is unchanged.

  • A separate bit-width for the mixture-of-experts router gate, and a per-layer override that forces 8-bit weights.

  • calibration.maxSampleSizeForQuantScheme is reachable from CompileConfig. The cap and its default of 16 are not new — the quantizer has enforced them since v1.2.0 — but nothing exposed them to the Python layer.

  • Two parser settings on ParserConfig, each also readable from the matching MBLT_HL_PARSER_ environment variable. force_np_supported_types casts torch weights to a numpy dtype, so bfloat16 becomes float32; it is on by default and was unconditional before, so what is new is being able to turn it off and keep the original dtype, skipping that copy on a model that does not fit. transform_skip_on_error reports a transform rule that raises and carries on, instead of failing the parse.

  • regulus-rb-usb, a target device for USB-attached REGULUS. Its NPU I/O boundary is not floating point, so its executables are not interchangeable with regulus-rb ones.

  • Qwen3-VL compiles for batched language-model inference.

  • Installing the package puts a qbcompiler command on PATH; the previous python -m qbcompiler form still works and runs the same thing.

Fixed#

  • [Breaking] The llm and llm_fast presets had been swapped since v1.1.0. v1.3.0 corrects them: llm optimizes for accuracy, llm_fast for compile time. A pipeline pinned to either changes behaviour — swap the name to keep the old one.

  • Code generation is reproducible: recompiling one model with the same settings produces the same binary. Three causes are fixed — two sets of pointers iterated in heap order, and parallel bundle emission drawing ids from one shared counter, so the order threads reached it decided which id each bundle got.

  • [Breaking] Calibration inputs given as a name map are matched by shape, and by name among inputs that share one. Two same-shape inputs fell back to positional order, silently calibrating against the wrong one; a name in such a group that does not match the model is now an error.

  • Two code-generation faults on the first-generation REGULUS target that silently produced wrong results: two bitwise-ALU lowerings, and a write to a register that generation does not have. An executable built for it with an earlier release is worth rebuilding.

  • [Breaking] An operation that needs the multi-function unit is correctly rejected on regulus-ra, which does not have that unit. It had been classified as supported and exported as an empty layer, so a model using one built on 1.2 and produced wrong results. A model that compiled before may now fail to build.

  • [Breaking] The preprocessing resize operation applies its alignCorners and antialias settings instead of overwriting them with fixed values. Those values are still the defaults, so only a pipeline that sets either one changes.

  • The preprocessing colour conversion between RGB and BGR works. The channel swap used a negative-step slice, which the tensor library rejects, so it raised instead of running.

  • For a split model, the advertised input and output order follows the source model’s declared order. It had been the order the sub-networks were walked in, while samples are numbered in the declared order, so a caller zipping buffers positionally put every one on the wrong input. An executable built for a split model before this release is worth rebuilding.

  • weightMemory.method had no effect. The value was parsed but never reached the resource manager, so float weights were always deleted after quantization whatever was asked for. The field is an index into weightMemory.methodList rather than one of its names: 0 DeleteFloat, 1 SaveFloat, 2 MoveFloat, 3 KeepFloat, 4 KeepAll.

  • Quantization accuracy and stability, across asymmetric zero-points, histogram calibration weighting, the 16-bit weight range, EfficientViT.

  • The compile and quantize subcommands run. Both reached the compile entry point without a target device, which is a required argument, so every invocation failed internally. quantize now takes a target device of its own, and compile’s drives both phases rather than the parse phase alone.

  • Command-line argument errors no longer exit silently: every failure prints a coded message, or emits a structured event instead where that channel is on. A missing --target-device lists the available ones instead of failing internally, and an unsupported --backend is reported as an argument error rather than an internal one.

Changed#

  • [Breaking] Transformer feed-forward bit-width is set per projection rather than as one value. A single number still applies to all three, so configuration files keep working; code that read the field as a number does not.

  • [Breaking] A configuration file written by 1.2 may name a key this release removed. An unknown key has always been refused, so such a file fails to load — it is the key set that changed, not the loader. Regenerate it with dump-config and carry across the values that were set.

  • [Breaking] The exception, progress and logging modules moved under a reporting package. Importing the exception classes from the package root is unchanged.

  • [Breaking] inference_scheme is validated against the target device’s core count before quantization rather than failing later: multi-core schemes are rejected on single-core devices, and all narrows to single-core there.

  • [Breaking] A batch-LLM compile honours the requested inferenceScheme instead of forcing single. global4 and global8 now build what they name, and multi and all are rejected with an error rather than quietly becoming single. A pipeline that passed either of those and relied on the silent fallback now fails; one pinned to global4 gets a different MXQ than it did on 1.2.

  • Hessian-based quantization uses a larger default block size and a parallel solve instead of a sequential one, and skips a layer whose Hessian is empty instead of aborting the compile.

  • The body-subgraph export writes the body together with every subgraph it calls, rather than the body alone, and a subgraph that is only ever called is no longer chosen as the body.

  • The ONNX parser handles GroupNormalization, which it did not before. A model containing one parses and partitions differently with no change to the call.

  • The multi-function unit is served by a lookup table embedded in the library.

  • Binary code generation, the stage after quantization, is up to roughly 3x faster. Sparse liveness storage applies to every compile; building each compilation unit in a forked process applies to the Global inference schemes, which single-core devices do not accept.

  • [Breaking] torch models are parsed by the same pipeline as onnx; previously only onnx took that path. The resulting graph, its operation coverage, the split between NPU and host, and the numerics can all differ with no change to the call. tf, tflite and torchscript still use the legacy parser.

  • [Breaking] An unrecognised backend name is rejected at the API boundary, with the accepted names listed. Several names the parser registry accepted before — including the one for Hugging Face models — are no longer backend names; load the model yourself and pass it as a torch model.

  • [Breaking] The parser package holding the new pipeline took the name the legacy one used, and the legacy pipeline moved beside it under a _legacy suffix. Code importing the old name binds to a different module rather than failing.

  • The parser transforms subgraphs in parallel, one forked worker per subgraph, up to ParserConfig.num_work — settable there or with MBLT_HL_PARSER_NUM_WORK, and by default the CPUs the process is allowed to use, less two. Worker count is not memory-aware: peak host memory scales with it, so models with unusually heavy subgraphs need a lower num_work.

  • [Breaking] The classification_torchvision preset resizes by shortest side rather than to an exact height and width. For a non-square calibration image that is a different tensor, so a pipeline pinned to this preset changes numerics with no error. Two further changes reach a configuration that already resized by shortest side: the scaled long side truncates where it used to round, and a centre crop splits an odd gap to even rather than always rounding down. Either can move the crop by a pixel.

  • Quantized activations are stored with real integer dtypes rather than float, lowering host memory use on large models.

Removed#

  • [Breaking] The _V2 suffixed entry points. Dropping the suffix is enough for the two mxq_ ones. For the two mblt_ ones it is not: mblt_compile and mblt_compile_with_callback take the output path before the target device, where mblt_compile_V2 and mblt_compile_with_callback_V2 took the target device first, so a positional caller swaps two strings silently.

  • [Breaking] hf_config, which now raises ValueError naming its replacement. Load the Hugging Face model yourself and name the part to compile with model_part.

  • The lookup-table clustering settings, replaced by explicit grouping and optimization sections. They existed only in the Python layer and no compiler component read them, so a compile that set them already behaved as the new defaults do.

  • The bundled multi-function wrapper library.

[v1.2.0] - 2026-06-26#

API#

  • Unified qbcompiler support for multiple hardware targets, including REGULUS and ARIES, into a single compiler.

CLI#

  • Introduced the python -m qbcompiler CLI, with parse and quantize as the subcommand names for producing an MBLT and an MXQ, alongside the end-to-end compile. Advertised by check as capabilities.

[v1.1.0] - 2026-03-31#

API#

  • The configuration of the mxq_compile function has been structurally refactored.

  • For ONNX model parsing, graph optimization is now handled by the newly refactored parser based on mblt-graph.

  • Improved quantization accuracy for non-linear activation functions.

[v1.0.2] - 2026-02-12#

API#

  • Added support for all in inference_scheme.

  • Fixed an issue where the optimize option was not being applied correctly.

[v1.0.0] - 2026-01-30#

API#

  • Introduced support for Qwen3 LLMs.

  • Expanded compatibility to include the YOLO26 series.

  • Removed the deprecated singlecore compile and startdramoffset options.

  • Added support for custom masks and dynamic RoPE.

  • Added NPU-accelerated execution for parts of the pre-processing pipeline, along with new input process configuration.

    • Added support for uint8 inputs.

    • Added NPU-based normalization.

  • Added support for Torch tensors and image files as calibration data.

  • Removed redundant quantization configuration options and unified Percentile, MSE, and KL into a histogram-based observer.

  • Added support for dynamic core and memory allocation for all models.

[v0.12.0.0] - 2026-01-02#

API#

  • Refactored compilation and quantization configuration.

  • Optimized CPU memory usage during compilation.

  • Added support for Transformers v4.57.1 (aligned with the 0.12 Mobilint Docker release).

  • Added support for the MiniCPM model.

[v0.11.0.0] - 2025-09-10#

API#

  • Added support for Torch parser

  • Added support for Yolo12l and Yolo12x

  • Expanded support range for ViT models

  • Fixed minor bugs for GRU/RNN/LSTM

[v0.10.0.0] - 2025-07-24#

API#

  • Added Inference_scheme global4/global8 modes

  • Added support for Yolov10 series, Yolo11 series, Yolo12n, Yolo12s, and Yolo12m

  • Added LLM config options

  • Added support for GRU/RNN/LSTM

[v0.9.0.5] - 2025-06-25#

API#

  • Changed YOLO model decoding to be linked with the model zoo

  • Added layer config options

[v0.9.0.4] - 2025-05-22#

API#

  • Added support for direct compilation of HuggingFace LLM models

[v0.9.0.3] - 2025-04-02#

API#

  • Added support for saving mblt using mmap

  • Added support for diverse visualization types

[v0.9.0.2] - 2025-01-16#

API#

  • Added API for saving model architecture

  • Added support for Visualization tool

  • Added support for Run min output difference QAT mode

[v0.9.0.1] - 2024-12-13#

API#

  • Added API for global core (beta)

  • Added API for YOLO post (beta)

  • Added support for diverse hardware

[v0.9.0.0] - 2024-11-27#

API#

  • Updated the high-level parsing processes

Docker#

  • ONNX: 1.13.0 -> 1.16.2

  • TensorFlow: 2.9.0 -> 2.17.0

  • Torch: 1.13.0 -> 2.4.1

[v0.8.5] - 2024-06-20#

API#

  • Added support for FastPercentile quantization method

[v0.8.4] - 2024-05-20#

API#

  • Connected TF backend to ONNX backend by TF2ONNX

  • Enabled compilation of models with custom input shape

  • Supported more operations

Docker#

  • ONNX: 1.12.0 -> 1.13.0

[v0.8.3] - 2024-03-07#

API#

  • Added support for TF Lite backend

[v0.8.2] - 2024-02-23#

[v0.8.1] - 2023-12-08#

[v0.8.0] - 2023-11-02#

API#

  • Deprecated TVM backend

[v0.7.12] - 2023-09-12#

[v0.7.11] - 2023-08-31#

API#

  • Added support for TorchScript backend

[v0.7.10] - 2023-08-11#

[v0.7.9] - 2023-08-11#

[v0.7.8] - 2023-08-08#

[v0.7] - 2023-03-23#

  • Added multi-channel quantization

  • Supported more operations

API#

  • Improved calibration dataset processing

  • Added support for CPU offloading (beta version)

[v0.6] - 2022-08-10#

  • Made minor updates

[v0.5] - 2022-07-01#

Docker#

  • Switched from Conda to Virtualenv

  • Python: 3.7.7 -> 3.8.10

  • Torch: 1.8.1 -> 1.10.1

  • TensorFlow: 1.15.0 -> 2.3.0

  • ONNX:1.6.0 -> 1.11.0

Parser#

  • Refactored code

API#

  • Enabled saving sample inference results (inputs and outputs)

[v0.4] - 2022-02-23#

Optimizer#

  • Made minor updates in fusing reshape

[v0.3] - 2022-02-05#

Parser#

  • Identified preprocess and postprocess of the model

  • Excluded preprocess and postprocess if they were unsupported by the NPU

API#

  • Added integer inference simulation in the Python API

[v0.2] - 2021-12-01#

  • First release