NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #754 most downloaded on PyPI
A refreshing functional take on deep learning, compatible with your favorite libraries
Last release 6 months ago
23 Mar 2026
Release timing varies
gaps range from 1 weeks to 7 months
Nearly every release is documented
notes for 57 of the last 60 stable releases
3 versions withdrawn
withdrawn after publishing
12 years old
250 releases · first in 2014
Previously we used a complicated build process that used self-hosted runners to build wheels for platforms Github Actions did not support. Github Acti
Previously we used a complicated build process that used self-hosted runners to build wheels for platforms Github Actions did not support. Github Actions has been adding support for ARM recently, so we've simplified the CI process to rely only on it exclusively.
This release adds back support for MacOS ARM64 wheels that were missing from the previous release. Linux ARM wheels are still pending, as Linux ARM architectures are currently only supported for private repos. Cross-compilation with QEMU is possible in theory, but in practice the build timed out after several hours.
Numpy is a build dependency of Thinc, and numpy 2.0 is not binary compatible with numpy 1.0 (fair enough). This means we can't have a version that's c
Numpy is a build dependency of Thinc, and numpy 2.0 is not binary compatible with numpy 1.0 (fair enough). This means we can't have a version that's compatible across numpy v1 and numpy v2.
This release updates v9 by pinning to numpy 2.0, and builds against it. No other changes are made, so that we have paired versions that only differ in their dependencies.
One column per quarter.
> The main new feature of Thinc v9 is the support for learning rate schedules that can take the training dynamics into account. For example, the new `
The main new feature of Thinc v9 is the support for learning rate schedules that can take the training dynamics into account. For example, the new
plateau.v1schedule scales the learning rate when no progress has been found after a given number of evaluation steps. Another visible change is thatAppleOpsis now part of Thinc, so it is not necessary anymore to installthinc-apple-opsto use the AMX units on Apple Silicon.
plateau.v1 schedule (#842). This schedule scales the learning rate if training was found to be stagnant for a given period.thinc-apple-ops is integrated into Thinc (#927). Starting with this version of Thinc, it is not necessary anymore to install thinc-apple-ops.Schedule class (#804).thinc.backends.linalg has been removed (#742). The same functionality is provided by implementations in BLAS that are better tested and more performant.thinc.extra.search has been removed (#743). The beam search functionality in this module was strongly coupled to the spaCy transition parser and has therefore moved to spaCy in v4.@adrianeboyd, @danieldk, @honnibal, @ines, @kadarakos, @shadeMe, @svlandeg
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Fix numpy deprecation warning filter syntax in pyproject.toml.
v8.3.13: Bug fixes and validation improvements Latest
Latest
Compare
Our chain of libraries used Pydantic v1 in unusual ways and relied heavily on implementation details of what did and did not specifically pass Pydanti
Our chain of libraries used Pydantic v1 in unusual ways and relied heavily on implementation details of what did and did not specifically pass Pydantic v1 type validation. Pydantic v2 greatly improved the behaviours of Pydantic overall, but unfortunately it broke the way we were using the library in Confection pretty fundamentally.
The Pydantic v2 migration has been a blocker for full Python 3.14 support, as Pydantic v2 understandably didn't want to update their v1 shim for the 3.14 type-handling behaviours.
Confection v1.1 now resolves this issue by implementing our own custom validation logic that matches the behaviours we need. This release updates to v1.1, allowing us to re-enable validation when networks are defined.
v8.3.11: Support confection v1 (and therefore full Pydantic v2 support)
v8.3.11: Support confection v1 (and therefore full Pydantic v2 support)
Compare
Add wheels for Windows-ARM for Python 3.11-3.14. Python 3.10 wheels are skipped for this platform because there are no numpy Windows ARM wheels availa
Add wheels for Windows-ARM for Python 3.11-3.14. Python 3.10 wheels are skipped for this platform because there are no numpy Windows ARM wheels available for Python 3.10.
Add wheels for Python 3.14 and add some noexcept qualifiers to C functions.
Add wheels for Python 3.14 and add some noexcept qualifiers to C functions.
Nothing published for this version
Widen numpy runtime dependency pin
A release with Python3.14 wheels should be up shortly.
v8.3.7: Widen numpy pin, drop support for Python 3.9
Compare
This release adds support for Python 3.13. In order to do this we're requiring Pydantic >= 2.0 and updated compilation to use Cython 3.0. This require
This release adds support for Python 3.13. In order to do this we're requiring Pydantic >= 2.0 and updated compilation to use Cython 3.0. This required an updated to the blis packaged that's not binary compatible, but thinc itself should not have any binary backwards compatibility issues.
Nothing published for this version
Previous releases have used releases of our blis package that vendor newer releases of the upstream blis library. Unfortunately these newer releases h
Previous releases have used releases of our blis package that vendor newer releases of the upstream blis library. Unfortunately these newer releases have had intermittent crashes on Windows that we haven't been able to track down.
I've therefore released a v1.2 of the blis package that goes back to the known-good v0.7 release of the vendored blis code, which we were using before. This release updates the verison-pin to use it.
It took a surprisingly long time to get v0.7 of blis to compile, due to conflicts on Windows. I regret the delay.
v8.3.4: Update Blis pin to revert to known-good v0.7
Compare
Update blis pin to v1.1. This updates the vendored blis code to 1.1, which should fix crashes from the previously vendored v0.9 code on Windows.
v8.3.3: Fix Blis crashes, widen numpy pin
Compare
Fix regression to torch training introduced in v8.3.1
v8.3.2: Fix regression to torch training, update ARM dependency
Compare
torch.cuda.amp is deprecated (Pytorch 2.4). This PR updates shims pytorch.py to use torch.amp.autocast instead of torch.cuda.amp.autocast.
torch.cuda.amp is deprecated (Pytorch 2.4). This PR updates shims pytorch.py to use torch.amp.autocast instead of torch.cuda.amp.autocast.
Thanks to @Atlogit for the patch.
Numpy is a build dependency of Thinc, and numpy 2.0 is not binary compatible with numpy 1.0 (fair enough). This means we can't have a version that's c
Numpy is a build dependency of Thinc, and numpy 2.0 is not binary compatible with numpy 1.0 (fair enough). This means we can't have a version that's compatible across numpy v1 and numpy v2.
This release updates the pins to numpy 2.0 and builds against it. No other changes are made, so that we have paired versions that only differ in their dependencies.
Numpy v2.0 isn't binary compatible with v1 (understandably). We build against numpy so we need to restrict the pin.
Numpy v2.0 isn't binary compatible with v1 (understandably). We build against numpy so we need to restrict the pin.
Bump typing_extensions pin for Python 3.7
nbconvert pintyping_extensions pin for Python 3.7@honnibal, @ines, @svlandeg
Make strings2arrays work again for sequences of inequal length (#918).
cupy.cublas import (#921).@danieldk, @honnibal, @ines, @svlandeg
Add the ParametricAttention_v2 layer, which adds support for key transformations (#913).
Add the ParametricAttention_v2 layer, which adds support for key transformations (#913).
@danieldk, @honnibal, @ines, @svlandeg
Updates and binary wheels for Python 3.12.
Updates and binary wheels for Python 3.12.
@adrianeboyd, @honnibal, @ines, @svlandeg
Future deprecation warning: built-in MXNet and TensorFlow support will be removed in Thinc v9. If you need MXNet or TensorFlow support in the future,…
To improve loading times and reduce conflicts, MXNet and TensorFlow are no longer imported automatically (#890).
MXNet and TensorFlow support needs to be enabled explicitly. Previously, MXNet and TensorFlow were imported automatically if they were available in the current environment.
To enable MXNet:
from thinc.api import enable_mxnet
enable_mxnet()
To enable TensorFlow:
from thinc.api import enable_tensorflow
enable_tensorflow()
With spaCy CLI commands you can provide this custom code using -c code.py. For training use spacy train -c code.py and to package your code with your pipeline use spacy package -c code.py.
Future deprecation warning: built-in MXNet and TensorFlow support will be removed in Thinc v9. If you need MXNet or TensorFlow support in the future, you can transition to using a custom copy of the current MXNetWrapper or TensorFlowWrapper in your package or project.
@adrianeboyd, @danieldk, @honnibal, @ines, @svlandeg
Support zero-length batches and hidden sizes in reduce_{max,mean,sum} (#882).
reduce_{max,mean,sum} (#882).NumpyOps/CupyOps.asarray (#897).@adrianeboyd, @danieldk, @honnibal, @ines, @svlandeg
Update NumPy build constraints for NumPy v1.25 (#885).
distutils to setuptools/sysconfig (#888).@adrianeboyd, @Ankush-Chander, @danieldk, @honnibal, @ines, @svlandeg
Implement pad as a CUDA kernel (#860).
pad as a CUDA kernel (#860).unflatten (#861).cupy kernels (#870).@adrianeboyd, @danieldk, @honnibal, @ines, @shadeMe, @svlandeg
Fix type signature of Model.begin_update (#858).
Model.begin_update (#858).@danieldk, @honnibal, @ines
Add premap_ids.v1 layer for mapping from ints to ints (#815).
premap_ids.v1 layer for mapping from ints to ints (#815).Dockerfile (#843, #844, #845).@adrianeboyd, @danieldk, @essenmitsosse, @honnibal, @ines, @kadarakos, @patjouk, @polm, @svlandeg
Add with_flatten.v2 layer with symmetric input/output types (#821).
with_flatten.v2 layer with symmetric input/output types (#821).typing_extensions v4.4.x for Python 3.6 and 3.7 (#833).@adrianeboyd, @albertvillanova, @danieldk, @essenmitsosse, @honnibal, @ines, @shadchin, @shadeMe, @svlandeg
Add SparseLinear.v2, to fix indexing issues (#754).
SparseLinear.v2, to fix indexing issues (#754).TorchScriptWrapper_v1 (#802).PyTorchShim (#796).packaging requirement (#799).reduce_first/last (#807).CupyOps.asarray to always copy cupy arrays to the current device (#812).Ops.asarray* (#819).@adrianeboyd, @danieldk, @frobnitzem, @honnibal, @ines, @richardpaulhudson, @ryndaniels, @shadeMe, @svlandeg
Updates and binary wheels for Python 3.11 (#793).
__all__ static to support type checking (#780).@adrianeboyd, @honnibal, @ines, @rmitsch
Fix issue #785: Revert change to return type for Ops.alloc from #779.
Ops.alloc from #779.@adrianeboyd, @honnibal, @ines, @svlandeg
Extend pydantic support to v1.10.x (#778).
fix_random_seed entry point in setup.cfg.@adrianeboyd, @honnibal, @ines, @pawamoy, @svlandeg
Update CuPy extras to add cuda116, cuda117, cuda11x and cuda-autodetect, which uses the new cupy-wheel package (#740).
cuda116, cuda117, cuda11x and cuda-autodetect, which uses the new cupy-wheel package (#740).fix_random_seed (#748).blis versions to ~=0.7.8 to avoid bugs in BLIS 0.9.0.@adrianeboyd, @honnibal, @ines, @rmitsch, @svlandeg, @willfrey
Use confection for configurations (#745).
with_signpost_interval layer to support layer profiling with macOS Instruments (#711).remap_ids.v2 layer which allows more types of inputs (#726).argmax in maxout (#702).FloatsType in Ops by a TypeVar.Ops.asarrayDf methods.@adrianeboyd, @cclauss, @danieldk, @honnibal, @ines, @kadarakos, @polm, @rmitsch, @shadeMe
Added support for mypy 0.950 and pydantic v1.9.0, added bound types throughout layers and ops (#599).
NumpyOps CPU kernels generic (#627).NumpyOps (#618).NumpyOps and CupyOps (#664).NumpyOps.cblas to get a table of C BLAS functions (#643, #700).NumpyOps.asarray (#656).CupyOps.asarray (#661).Model.copy() for layers used more than once (#659).Shim (#677).xp2tensorflow and xp2torch when possible (#686).HashEmbed by avoiding large temporary arrays (#696).Ops.reduce_last and Ops.reduce_first (#710).to_categorical.In most cases the typing updates allow many casts and ignores to be removed, but types may also need minor modifications following the updates for mypy and pydantic.
get_array_module now returns None for non-numpy/cupy array input rather than returning numpy by default.
The prefer_gpu and require_gpu functions no longer set the default PyTorch torch.Tensor type to torch.cuda.FloatTensor. This means that wrapped PyTorch models cannot assume that Tensors are allocated on a CUDA GPU after calling these functions. For example:
# Before Thinc v8.1.0, this Tensor would be allocated on the GPU after
# {prefer,require}_gpu. Now it will be allocated as a CPU tensor by default.
token_mask = torch.arange(max_seq_len)
# To ensure correct allocation, specify the device where the Tensor should be allocated.
# `input` refers to the input of the model.
token_mask = torch.arange(max_seq_len, device=input.device)
This change brings Thinc's behavior in line with how device memory allocation is normally handled in PyTorch.
@adrianeboyd, @danieldk, @honnibal, @ines, @kadarakos, @koaning, @richardpaulhudson, @shadeMe, @svlandeg
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Extend support for typing_extensions up to v4.1.x (for Python 3.7 and earlier).
typing_extensions up to v4.1.x (for Python 3.7 and earlier).@adrianeboyd, @danieldk, @honnibal, @ines, @shadeMe
Make `Ops.asarray` implementations more robust.
Ops.asarray implementations more robust.Beam when no states have valid transitions.Tensor handling in CupyOps.asarray.Ops.sigmoid to prevent overflow.is_torch_array work without PyTorch installed.CupyOps.adam and NumpyOps.adam.init implementations for layers no longer return Model.@adrianeboyd, @danieldk, @honnibal, @ines, @kadarakos, @koaning, @notplus, @richardpaulhudson, @shadeMe
Fix issue #610: Improve compatibility with PyTorch versions before v1.9.0.
@adrianeboyd, @danieldk
Add new activation functions: `ClippedLinear.v1`, `Gelu.v1`, `HardSigmoid.v1`, `HardSwish.v1`, `HardSwishMobilenet.v1`, `HardTanh.v1`, `ReluK.v1`, and
ClippedLinear.v1, Gelu.v1, HardSigmoid.v1, HardSwish.v1, HardSwishMobilenet.v1, HardTanh.v1, ReluK.v1, and Swish.v1.PyTorchWrapper on GPU to avoid memory contention between CuPy and PyTorch.thinc-bigendian-ops and consistently serialize model data with little endian byte order.Softmax.v2 with support for softmax with temperature and optional normalization.CategoricalCrossentropy.v3 and SequenceCategoricalCrossentropy.v3 with support for label smoothing.CupyOps.maxout by exploiting GPU parallelism better.NumpyOps.seq2col and CupyOps.seq2col implementations of Ops.seq2col to determine padding.Ragged.Ragged arrays in expand_window.v1.Inf/NaN out of PyTorch layers when using mixed-precision training.CupyOps.mish and correct an equation in Ops.backprop_mish.CategoricalCrossentropy.get_grad.murmurhashrequirement.Config.out keyword argument of Ops.mish and Ops.backprop_mish is replaced by inplace for consistency with other activations.@adrianeboyd, @andrewsi-z, @danieldk, @honnibal, @ines, @Jette16, @kadarakos, @kianmeng, @polm, @svlandeg, @thatbudakguy
Nothing published for this version
Nothing published for this version
Fix issue #553: Switch torch tensor type with set_ops and use_ops.
set_ops and use_ops.use_ops.@adrianeboyd, @danieldk, @ryndaniels, @svlandeg
Speed up GPU training time with up to ~25% by using cuBLAS for computing Frobenius norms in gradient clipping.
AppleOps (if available) when calling get_ops("cpu").CategoricalCrossEntropy when the labels are integers.model.walk with depth-first traversal.forward/init callbacks of a Model in with_debug and with_nvtx_range to facilitate recursively instrumenting models.replace_node on nodes with indirect node refs.@adrianeboyd, @danieldk, @honnibal, @ines, @svlandeg
Fix issue #533: Fix get_array_ops for numpy arrays.
get_array_ops for numpy arrays.@adrianeboyd
Enable config overrides to add new keys.
ops registry.nbconvert and nbformat.numpy_ops gemm output.mypy plugin crash on variadic arguments.@adrianeboyd, @connorbrinton, @danieldk, @honnibal, @ines, @svlandeg
Allow negated values in CategoricalCrossentropy
Fix issue #512: Include final n-gram in NumpyOps.ngrams.
NumpyOps.ngrams.Fix backprop_reduce_max GPU kernel.
backprop_reduce_max GPU kernel.Update to support torch v1.9.0.
Your coding agent can read these notes before it upgrades. Set up the MCP server →