- [Breaking] Small API changes in model api: .compact(), .optimize(), .declutter() now take &mut self and work in place.
- Fix brand new ArrayFeatureExtractor inference
- ONNX ArrayFeatureExtractor
- ConvTranspose/deconv optimisation
- just a release script failure
- hold half at 1.7.x for compat with rust 1.50
- ConvTranspose/deconv pulse support
- ONNX SpaceToDepth/DepthToSpace
- optimise i8u8, u8i8 and u8*u8 matrix products (and convo)
- bump prost dep
- some optimisations for arm32 (cortex-a7 and a9)
- Switched the order of item_type and item_type_vendor in the NNEF tendor format to be consistent with NNEF-tools, and changed the item_type of integers due to an error in the specification. Breaking for tensor files containing integers or strings.
- Scan output batching optimisation
- Concat pulsification over a secondary axis
- new aarch64 16x4 f32 kernel
- better handling of errors in ONNX parser
- fix/workaround some performance regressions bubling from recent ndarray changes
- ONNX ConvTranspose, Gather, GatherND, GatherElements, Scatter, ScatterND, ScatterElements support (and NNEF deconv)
- Fixes around integer serialisation in NNEF
- workaround subtle breaking changes in ndarray (between 0.15.1 and 0.15.2)
- low-level functions in linalg are now version tagged: two versions of tract can now co-exist in the same binary
- rustc minimal version is now 1.50
- dependencies version bumps (ndarray, itertools, and others)
- fix sigmoid and tanh variability on intel
- temporary disable binary unicast add fusing (too many bugs)
- Release are now "in sync": all tract crate versions on a build must be aligned
- optimisations, with a focus on aarch64
- Dependency bumps
- 0.12.3 is a misfire
- hotfixes on 0.12.2 new tree classifier
- fix X compilation from macos/aarch64 to macos/intel
- ONNX-ML: CategoryMapper and TreeEnsembleClassifier (partial, SoftmaxZero and Probits are missing). With NNEF support.
- cargo-deny enforces licences choices
-
0.12.0 is a misfire.
-
API BREAKING: TypedFact::dt_shape & friends can not fail anymore, no longer return a result (remove
?
) -
Breaking: Rust minimal version bumped to 1.42
-
Early, basic, correct but slow support for i8 by u8 matrix mult.
-
Support for Apple Silicon, aka M1, aka aarch64 darwin (but not in CI yet)
-
dynamic quantization convolution support
-
release now ships cli musl builds for linux
-
optimizations targetting small Cortex-A (like 7, 8, and 9)
-
command line dump --profile --cost now computes flops
-
ONNX: OneHot op support
- ONNX: new op: DynamicQuantizeLinear
- tract-data crate split from core, containing tensor, dim, and datum types.
- switch from error_chain to anyhow
- simplify trivial gathers to a slice
- generalize symbolic dimension a bit: support "2S" and the like
- deprecate "x" syntax in CLI, please use
,
instead
- NNEF: tract-nnef no longer performs gunziping, but expect an uncompressed tar stream. We found out is it counter-productive (weights matrices are more or less random, they do not compress easily, and decompression is expensive). NNEF networks in the wild are .tgz file. Using flate2, decompression is a one-liner, but it must be done by the client code now.
- bumped extended nnef compat version (unchecked at this stage) to "alpha1"
- move pulse operators and translation to their own crate and nnef registry
- generalize TDim to support an arbitrary number of symbols
- concretize_stream_dim is superseded by concrentize_dims
- new crates, building on tract-opl introduction:
- tract-pulse-opl: pulse runtime (handful of ops, including Delay) is now separated from core
- tract-onnx-opl: onnx runtime (4 ops not belonging in core)
- tract-pulse: pulsification of models (model-translation time)
- tract-onnx is now limited to onnx model loading and conversion
- load a NNEF as a TypedModel using tract_nnef, and from the CLI
- dump a tract TypedModel to NNEF (with extensions for op not nnef compatbile)
- not a full coverage of nnef, but enough for most CNN (image categorizers zoo working)
- 80% of onnx tests are surviving a NNEF dump and reload at this stage
- covered operators compatible with Operator Sets 9, 10, 11 (new) and 12 (new)
- Tensor::l1 method is gone
- Support for -gnu targets (non-mvsc).
- --cost now gives the number of parameters in the model
- SimpleState is clonable again (actually useful !)
- introduce
TypedModel::method.concretize_stream_dim
- various pulsification bugfixes
- fix Reshape with TDim
Still no shortage of version numbers...
- NormalizedModel (and friends) are gone. They were only useful as a pre-pulse transformation pre-requisite that the current TypedModel (& co) meets.
- TypedModel::into_optimized() is gone. InferenceModel::into_optimized() stays as an end-to-end shortcut for simple cases. It does .into_typed()?.declutter()?.optimize()).
- TypedModel::codegen() is now ::optimize()
I wish I had seen these issues yesterday. Anyway, version numbers are cheap.
- Bumping minimum rust to 1.41
- CLI refactoring (hopefully stabilizing a bit?)
profile --bench
is now bench- profile is now
dump --profile
- cost is now
dump --cost
- profiling is now done during a full net instead of per op
- new "compact" graph dumper, profile visual hints
dump --cost --profile --json
output profiling and cost information- show logical names for ops instead of the Op struct names (not 100% sure it's right)
- criterion integration
- WASM support for tract-onnx and tract-tensorflow targets (CI)
- Convenience methods added to Models to allow model building in fluent style, up to Plan instantiation (SimplePlan now nicknamed RunnableModel). Non breaking.
- Support for ONNX bidi LSTM (CI), GRU and RNN (untested, consider alpha)
- Fixes around nets with a non trivial batch size (axis simplification code, matmul op fusion)
- Lock ndarray version to dodge rustc/llvm issue (rust-lang/rust#71506)
- Use http://gihub.com/kali/readings for instrumentation.
- New jupyter/keras/tf example
- ARMv8 tanh / sigmoid optimisation
- refactor exports and dependencies
- preferred way to use tract is now to
use tract_tensorflow::prelude::*;
- singleton framework is built by
let tensorflow = tensorflow()
. The Framework trait is in the prelude too. - the prelude contains a reexport of
tract_core
, and of ndarray astract_ndarray
- no more need to declare dependency on
tract-core
and/ortract-linalg
in Cargo.toml - same goes for
tract_onnx
- preferred way to use tract is now to
- Rustc minimum version is now 1.39
- Support for MatMulInteger, ConvInteger
- Support for QuantizeLinear DequantizeLinear
- Basic support for QLinearMatMul, QLinearConv
- Initial support for GatherV2
- Fix PReLu normalization
- Initial support for AddV2, Mean, Min, Prod, Sum
- Make Onnx loader operator set aware, and Slice-10 support.
- Cost now reports Delay ops buffer size
- Bump dependencies (protobuf) and fix codegen
- Windows CI now performs a top-level "cargo check"
- remove the no_panic checks, as too fragile (breaking non-lto builds)
- Change tensor facts names for consistency: TensorFact is now InferenceFact.
- Introduce Windows support, including CI coverage for linalg
- Switch from Travis to GitHub Actions
- Internal refactoring around tract-core canonic opset
- Tract CLI can now compute a FLOP number for networks ("cost" subcommand). Furthermore the CI asserts its value for a few networks to prevent optimisation regressions.
- Fix: handling of -1 in ONNX Reshape op
- Fix release script after 0.4.1 release disaster.
- Fix for OS where CARGO_CFG_TARGET_FAMILY is undefined
- Linear Algebra package refactor
- tract-core canonic operator set introduction
- significant performance boost (up to 20% on some real-life networks)
- Start Kaldi networks support (LSTM, Renorm, Affine, downsample)
This Changelog started way too late. But better late than never.