Equimo 2.7.0__tar.gz → 2.8.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {equimo-2.7.0 → equimo-2.8.0}/CHANGELOG.md +96 -0
- {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/README.md +10 -0
- equimo-2.8.0/LICENSES/pretrained/sam-License.md +96 -0
- {equimo-2.7.0 → equimo-2.8.0}/NOTICE +42 -0
- {equimo-2.7.0 → equimo-2.8.0}/PKG-INFO +35 -3
- {equimo-2.7.0 → equimo-2.8.0}/README.md +30 -2
- equimo-2.8.0/docs/licensing/sam3-provenance.md +81 -0
- {equimo-2.7.0 → equimo-2.8.0}/docs/stability.md +14 -0
- {equimo-2.7.0 → equimo-2.8.0}/models/huggingface/NOTICE +14 -0
- {equimo-2.7.0 → equimo-2.8.0}/models/huggingface/README.md +12 -1
- equimo-2.8.0/pyproject.toml +136 -0
- equimo-2.7.0/pyproject.toml → equimo-2.8.0/pyproject.toml.orig +12 -1
- equimo-2.8.0/src/equimo/EGM.md +227 -0
- equimo-2.8.0/src/equimo/__init__.py +1 -0
- equimo-2.8.0/src/equimo/_legacy_layouts.py +167 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/_pretrained.py +3 -1
- equimo-2.8.0/src/equimo/audio/EGM.md +61 -0
- equimo-2.8.0/src/equimo/audio/layers/EGM.md +42 -0
- equimo-2.8.0/src/equimo/audio/models/EGM.md +64 -0
- equimo-2.8.0/src/equimo/conversion/EGM.md +56 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/conversion/utils.py +22 -10
- equimo-2.8.0/src/equimo/core/EGM.md +126 -0
- equimo-2.8.0/src/equimo/core/emamodel.py +42 -0
- equimo-2.8.0/src/equimo/core/implicit/EGM.md +124 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/implicit/deq.py +5 -5
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/implicit/strategies.py +3 -2
- equimo-2.8.0/src/equimo/core/layers/EGM.md +272 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/__init__.py +4 -0
- equimo-2.8.0/src/equimo/core/layers/_apply.py +13 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/attention.py +158 -19
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/dropout.py +7 -7
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/ffn.py +38 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/generic.py +9 -4
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/mamba.py +4 -3
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/norm.py +14 -2
- equimo-2.8.0/src/equimo/core/ops/EGM.md +80 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/ops/__init__.py +2 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/ops/probability.py +10 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/ops/scan.py +19 -19
- equimo-2.8.0/src/equimo/core/parameters.py +209 -0
- {equimo-2.7.0/src/equimo/finetune → equimo-2.8.0/src/equimo/core}/tags.py +51 -140
- equimo-2.8.0/src/equimo/finetune/EGM.md +296 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/_typing.py +2 -1
- equimo-2.8.0/src/equimo/finetune/audio/EGM.md +53 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/config.py +9 -10
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/continued_ssl.py +5 -1
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/feature_extraction.py +3 -2
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/labels.py +48 -9
- equimo-2.8.0/src/equimo/finetune/language/EGM.md +47 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/masks.py +1 -21
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/merging.py +4 -1
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/paths.py +2 -25
- equimo-2.8.0/src/equimo/finetune/peft/EGM.md +246 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/_common.py +13 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/_compat.py +22 -3
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/adapters.py +21 -9
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/dora.py +1 -1
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/ia3.py +1 -1
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/lora.py +51 -20
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/prefix.py +3 -3
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/prompts.py +17 -42
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/scale_shift.py +7 -3
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/vera.py +5 -3
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/pooling.py +2 -1
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/regularization.py +14 -7
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/serialization.py +29 -10
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/surgery.py +1 -1
- equimo-2.8.0/src/equimo/finetune/tags.py +182 -0
- equimo-2.8.0/src/equimo/finetune/vision/EGM.md +66 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/vision/eomt.py +4 -8
- equimo-2.8.0/src/equimo/language/EGM.md +87 -0
- equimo-2.8.0/src/equimo/language/__init__.py +18 -0
- equimo-2.8.0/src/equimo/language/data/bpe_simple_vocab_16e6.txt.gz +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/language/models.py +128 -2
- equimo-2.8.0/src/equimo/language/tokenizers.py +253 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/serialization.py +98 -23
- equimo-2.8.0/src/equimo/tabular/EGM.md +33 -0
- equimo-2.8.0/src/equimo/tabular/layers/EGM.md +100 -0
- equimo-2.8.0/src/equimo/tabular/models/EGM.md +77 -0
- equimo-2.8.0/src/equimo/timeseries/EGM.md +30 -0
- equimo-2.8.0/src/equimo/timeseries/layers/EGM.md +47 -0
- equimo-2.8.0/src/equimo/timeseries/models/EGM.md +64 -0
- equimo-2.8.0/src/equimo/vision/EGM.md +152 -0
- equimo-2.8.0/src/equimo/vision/_encoder_identity.py +46 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/io.py +3 -1
- equimo-2.8.0/src/equimo/vision/layers/EGM.md +229 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/attention.py +30 -22
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/convolution.py +27 -2
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/downsample.py +2 -2
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/posemb.py +274 -113
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/wavelet.py +1 -1
- equimo-2.8.0/src/equimo/vision/models/EGM.md +216 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/eomt.py +2 -14
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/fastervit.py +4 -1
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/lowformer.py +3 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/parcae.py +13 -16
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/pmd.py +3 -1
- equimo-2.8.0/src/equimo/vision/models/sam3/EGM.md +246 -0
- equimo-2.8.0/src/equimo/vision/models/sam3/__init__.py +36 -0
- equimo-2.8.0/src/equimo/vision/models/sam3/decoding.py +79 -0
- equimo-2.8.0/src/equimo/vision/models/sam3/detector.py +876 -0
- equimo-2.8.0/src/equimo/vision/models/sam3/encoder.py +262 -0
- equimo-2.8.0/src/equimo/vision/models/sam3/interactive.py +681 -0
- equimo-2.8.0/src/equimo/vision/models/sam3/model.py +270 -0
- equimo-2.8.0/src/equimo/vision/models/sam3/tracker.py +1287 -0
- equimo-2.8.0/src/equimo/vision/models/sam3/video.py +1145 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/shvit.py +1 -1
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/vit.py +6 -6
- equimo-2.8.0/src/equimo/vision/ops.py +214 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/pmt_checkpoint.py +17 -3
- equimo-2.8.0/src/equimo/vision/query_training/EGM.md +108 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/query_training/_loss.py +3 -3
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/segmentation.py +105 -2
- equimo-2.7.0/src/equimo/__init__.py +0 -1
- equimo-2.7.0/src/equimo/core/emamodel.py +0 -31
- equimo-2.7.0/src/equimo/language/__init__.py +0 -9
- equimo-2.7.0/src/equimo/language/tokenizers.py +0 -99
- equimo-2.7.0/src/equimo/vision/_encoder_identity.py +0 -27
- {equimo-2.7.0 → equimo-2.8.0}/LICENSE.md +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/LICENSES/Apache-2.0.txt +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/ast-BSD-3-Clause.txt +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/convnext-Apache-2.0.txt +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/convnextv2-CC-BY-NC-4.0.txt +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/dinov2-Apache-2.0.txt +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/dinov3-License.md +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/eupe-FAIR-Noncommercial-Research-License.md +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/lingbot-vision-Apache-2.0.txt +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/siglip2-Apache-2.0.txt +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/t0-alpha-Apache-2.0.txt +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/tabpfn-3-License-v1.0.txt +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/tips-CC-BY-4.0.txt +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/LICENSES/tfc-t0-APACHE-2.0.txt +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/docs/licensing/t0-source-provenance.md +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/docs/migration-v2.md +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/docs/timeseries.md +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/models/huggingface/convnext-conversion.json +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/_checkpoint_limits.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/_io.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/audio/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/audio/io.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/audio/layers/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/audio/layers/patch.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/audio/models/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/audio/models/ast.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/catalog.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/conversion/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/_prng.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/factory.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/implicit/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/implicit/_base.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/implicit/injectors.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/implicit/stabilizers.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/intermediates.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/_registry.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/activation.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/rotary.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/_blocks.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/_serialization_codecs.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/audio/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/audio/recipes.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/audio/selectors.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/calibration.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/heads.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/inspection.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/language/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/language/recipes.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/language/selectors.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/base.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/bitfit.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/recipes.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/selectors.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/vision/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/vision/dense.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/vision/pmt.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/registry.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/layers/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/layers/attention.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/layers/blocks.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/layers/decoder.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/layers/mlp.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/layers/preprocessing.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/layers/registry.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/models/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/models/tabpfn.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/layers/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/layers/axis_attn.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/layers/blocks.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/layers/patch_encoder.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/layers/registry.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/layers/residual_mlp.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/models/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/models/t0.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/utils.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/patch.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/registry.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/squeeze_excite.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/_embedding.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/_features.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/attnet.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/convnext.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/deq.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/iformer.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/mlla.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/mobilenet.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/partialformer.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/pmt.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/reduceformer.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/vssd.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/query_training/__init__.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/query_training/_assignment.py +0 -0
- {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/query_training/_sampling.py +0 -0
|
@@ -2,6 +2,102 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to Equimo are documented here. Equimo follows Semantic Versioning from version 2.0.0 onward.
|
|
4
4
|
|
|
5
|
+
## [2.8.0] - 2026-11-10
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- SAM 3.1 in `equimo.vision.models.sam3` (`Sam3`, `sam31_multiplex`, `decode_concepts`, the prompt and output types and
|
|
10
|
+
an experimental video tracker), `sam31_text` and `ClipBpeTokenizer` in `equimo.language` with a `clip` extra, and
|
|
11
|
+
converted weights under the SAM License. See `docs/sam3.md`.
|
|
12
|
+
- SAM 3.1 prompting helpers: `encode_concept`, `source_size` for prompts given in original pixels, default positive
|
|
13
|
+
interactive labels with validation, and `decode_concepts` keeping every query by default.
|
|
14
|
+
- `Sam3VideoTracker.remove_object`.
|
|
15
|
+
- `equimo.core.parameters` describes how optimizers should treat each leaf, for every training workflow:
|
|
16
|
+
`trainable_mask` (an Equinox filter excluding buffers), `weight_decay_mask` (also usable as an Optax `mask`),
|
|
17
|
+
`DEFAULT_NO_DECAY_TAGS`, `buffer_mask`, `module_tags`, and the field markers `buffer()` and `tagged(...)`. The path
|
|
18
|
+
tagger moved to `equimo.core.tags`; `equimo.finetune` and `equimo.finetune.tags` re-export the same functions.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- RoPE and Swin position embeddings compute the values that follow from their configuration (`VisionRoPE.freqs`,
|
|
23
|
+
`DinoRoPE.periods`, `RoPE.rotations`, and the `PosEmbMLPSwinv1D`/`PosEmbMLPSwinv2D` coordinate and index tables) when
|
|
24
|
+
used instead of storing them as PyTree leaves, so optimizers no longer see them and weight decay can no longer change
|
|
25
|
+
them. They remain readable as attributes but cannot be replaced with `eqx.tree_at`; set them through constructor
|
|
26
|
+
arguments. The structural signatures of models using them change. Checkpoints, fine-tuning bundles, and PMT artifacts
|
|
27
|
+
saved by earlier versions still load; `load_weights` raises `ValueError` when a stored value differs from the computed
|
|
28
|
+
one by more than rounding, for example after weight decay, and `load_delta` raises `FineTuneBundleError` for a bundle
|
|
29
|
+
whose trained delta changed such a value. Earlier versions cannot read checkpoints, bundles, or PMT artifacts that 2.8
|
|
30
|
+
saves for these models. The value hashes that identify a model (fine-tuning bundle base-checkpoint hashes, merge
|
|
31
|
+
checks, PMT encoder digests) cover the static fields of these modules instead, such as RoPE `base` and
|
|
32
|
+
`periods_dtype`, so a base model that differs only in those settings is rejected.
|
|
33
|
+
- Frozen PEFT arrays are declared buffers and excluded from every trainability mode: VeRA `vera_A`/`vera_B`, LoRA-FA
|
|
34
|
+
`frozen_A`/`correction_matrix`, RandLoRA bases, PiSSA `base_weight_delta`, OFT `unmerged_weight`, and a fixed
|
|
35
|
+
AdaptFormer `scale`. `mode="full"` previously trained the VeRA bases, the LoRA-FA correction matrix, and the OFT
|
|
36
|
+
backup weight. `make_param_labels` without `trainable_paths` gives buffers the label `None` instead of a decay label.
|
|
37
|
+
- The default no-weight-decay policy (`LLRDConfig.no_weight_decay_tags`, `DEFAULT_NO_DECAY_TAGS`) also excludes layer
|
|
38
|
+
scales (`block.layer_scale`, including PMD lateral scales) and state-space dynamics (`ssm`: Mamba `A_log`, `D`,
|
|
39
|
+
`dt_bias`; Parcae `A_log`, `dt_bias`, `B`, `C`). Leaves of registered normalization layers are tagged `norm` whatever
|
|
40
|
+
their field name, including norms inside `eqx.nn.Sequential`, and leaves named `*_bias` are tagged `bias`. The path
|
|
41
|
+
tagger also tags the Swin-v2 continuous position-bias MLP (`pos_emb_funct`, used by FasterViT HAT blocks)
|
|
42
|
+
`embedding.position`. These tags change tag-based selection (`TargetSpec` tags, `train_norm`, `train_bias`, and the
|
|
43
|
+
`norm`, `head_plus_norm`, `bias`, and surgical modes), parameter roles, plan labels, and plan fingerprints.
|
|
44
|
+
`CANONICAL_TAGS` gains `ssm`, `buffer`, and `vector`.
|
|
45
|
+
- The path tagger tags arrays with at most one axis `vector`, and the default no-weight-decay policy excludes them, as
|
|
46
|
+
timm, MAE, and OpenCLIP do. With the tags above, built-in backbones need no `vector` tag; PEFT and probe-head vectors
|
|
47
|
+
no longer decay: DoRA magnitudes, AdaLoRA singular values, VeRA and RandLoRA scales, IA3 vectors, FourierFT
|
|
48
|
+
coefficients, scale/shift parameters, adapter residual scales, and the `AttentionPool` and
|
|
49
|
+
`AttentionPoolingClassifierHead` query vectors. Their plan labels change from `*_decay` to `*_no_decay`.
|
|
50
|
+
- Position-embedding tables are evaluated while tracing, so `jax.jit` programs and ONNX exports hold them as constants.
|
|
51
|
+
MLLA attention rotates queries and keys with one RoPE call, so its programs hold one table per block. Exporting `RoPE`
|
|
52
|
+
(MLLA) or the Swin tables to ONNX needs a jax2onnx release that includes enpasos/jax2onnx#291; jax2onnx 0.17.1 and
|
|
53
|
+
0.18.0 fail on them.
|
|
54
|
+
- `VisionParcae.weight_decay_mask()` follows the default policy, so it also leaves biases, norms, layer scales, vectors,
|
|
55
|
+
and position embeddings undecayed.
|
|
56
|
+
- `update_ema_model` averages only trainable leaves; integer arrays and buffers take the current model's values.
|
|
57
|
+
- `l2_sp_loss`, `adapter_norm_loss`, and `task_vector_norm_loss` skip buffers.
|
|
58
|
+
- `VisionTransformer` raises `TypeError` for unknown constructor arguments instead of ignoring them.
|
|
59
|
+
- `DropPath` keeps or drops the whole unbatched input with one draw, matching `DropPathAdd`; it previously dropped rows
|
|
60
|
+
of the leading axis (tokens or channels) independently.
|
|
61
|
+
- `PromptedModel.__call__` raises `ValueError` when the base model has no `head`; use `features()` for headless models.
|
|
62
|
+
- `apply_adalora` raises `ValueError` for a nonzero `dropout`, which AdaLoRA wrappers cannot apply.
|
|
63
|
+
- `load_image` raises `ValueError` when only one of `mean` and `std` is given.
|
|
64
|
+
- Tokenizer files are cached under a directory derived from the full URL, so pinned revisions no longer share a cache
|
|
65
|
+
entry; existing tokenizers are downloaded once more.
|
|
66
|
+
|
|
67
|
+
### Fixed
|
|
68
|
+
|
|
69
|
+
- `FasterViT` runs models with three or more stages. Their window stages previously raised `ValueError` on every forward
|
|
70
|
+
endpoint.
|
|
71
|
+
- `SHViT.__call__` pools before its final norm. It previously raised `ValueError` with the default `norm_layer`.
|
|
72
|
+
- `LowFormer` drops the stem entry of `att_strides`, so each stage uses its own stride and the presets run at 224
|
|
73
|
+
pixels. The last attention stage of every preset changes shape: its checkpoints saved by earlier versions no longer
|
|
74
|
+
load.
|
|
75
|
+
- `FeatureSpec(pooling="attention")` returns the feature dtype instead of float32 for low-precision features.
|
|
76
|
+
- `apply_eva_lora` skips targets it already wrapped instead of raising for missing activation artifacts.
|
|
77
|
+
- `MllaBlock` (used by `Mlla` and `Vssd`) applies its output projection to the gated attention output and keeps the
|
|
78
|
+
first convolutional position encoding in the residual stream, as in MLLA and VSSD. Outputs of these models change.
|
|
79
|
+
- EUPE ViTs use the DINOv3 patch RoPE configuration, including training-time coordinate rescaling, which their config
|
|
80
|
+
previously set under an ignored key. Inference outputs are unchanged.
|
|
81
|
+
- EUPE ViTs compute their RoPE periods in bfloat16, as the EUPE checkpoints store them. Pretrained outputs are
|
|
82
|
+
unchanged; models built with `pretrained=False` previously used float32 periods.
|
|
83
|
+
- LoRA-FA with `custom_vjp=False`, RandLoRA, and AdaptFormer with a fixed scale stop gradients to their frozen arrays.
|
|
84
|
+
- `GroupSpec.tags` holds the tags shared by every leaf of the group instead of the first leaf's tags, so tag-based
|
|
85
|
+
optimizer rules, such as Rollfast's `GroupRule(tag=...)`, no longer depend on which leaf a group happened to start
|
|
86
|
+
with.
|
|
87
|
+
- `apply_lora_rank_pattern` keeps the `metadata` of LoRA wrappers, such as PiSSA's initialization record.
|
|
88
|
+
- Plans with layer-wise learning-rate decay, or other non-uniform multipliers, on PEFT models no longer raise
|
|
89
|
+
"inconsistent learning rate": PEFT labels then also name the block, head, or embedding (`lora_A_block_03_decay`
|
|
90
|
+
instead of `lora_A_decay`). Labels under uniform rates are unchanged.
|
|
91
|
+
- `apply_adalora` honors `scaling="alpha_over_sqrt_r"`.
|
|
92
|
+
- The `dynamictanh` norm (`DyT`) can be used as a block `norm_layer`.
|
|
93
|
+
- Adapters, AdaptFormer, scale/shift, and `AttentionPool` return the activation dtype instead of promoting bfloat16 to
|
|
94
|
+
float32.
|
|
95
|
+
- `save_delta` without `base_model` accepts a `TrainableSpec(mode="peft")` that trains no head, norm, or bias.
|
|
96
|
+
- `SentencePieceTokenizer` checks for the `language` extra before downloading, writes downloads atomically, and times
|
|
97
|
+
out after 60 seconds.
|
|
98
|
+
- PyTorch conversion renames only whole `scale` and `kernel` path components, keeps dictionary keys in parameter names,
|
|
99
|
+
and rejects an unknown `source` even when a `torch_model` is given.
|
|
100
|
+
|
|
5
101
|
## [2.7.0] - 2026-10-26
|
|
6
102
|
|
|
7
103
|
### Added
|
|
@@ -23,6 +23,7 @@ still current.
|
|
|
23
23
|
| dinov3 | `dinov3_` | 8 | DINOv3 License | [snapshot](dinov3-License.md) | [DINOv3](https://github.com/facebookresearch/dinov3) | [upstream license](https://github.com/facebookresearch/dinov3/blob/main/LICENSE.md) | 2026-08-21 |
|
|
24
24
|
| eupe | `eupe_` | 6 | FAIR Noncommercial Research License v1 | [snapshot](eupe-FAIR-Noncommercial-Research-License.md) | [EUPE](https://github.com/facebookresearch/EUPE) | [upstream license](https://github.com/facebookresearch/EUPE/blob/main/LICENSE.md) | 2026-08-21 |
|
|
25
25
|
| lingbot | `lingbot_` | 4 | Apache 2.0 | [snapshot](lingbot-vision-Apache-2.0.txt) | [LingBot-Vision checkpoints](https://huggingface.co/collections/robbyant/lingbot-vision) | [upstream license](https://github.com/robbyant/lingbot-vision/blob/main/LICENSE) | 2026-09-23 |
|
|
26
|
+
| sam31 | `sam31_` | 2 | SAM License | [snapshot](sam-License.md) | [SAM 3.1](https://github.com/facebookresearch/sam3) | [upstream license](https://github.com/facebookresearch/sam3/blob/main/LICENSE) | 2026-11-09 |
|
|
26
27
|
| siglip2 | `siglip2_` | 15 | Apache 2.0 | [snapshot](siglip2-Apache-2.0.txt) | [SigLIP 2 model](https://huggingface.co/google/siglip2-base-patch16-256) | [current license declaration](https://huggingface.co/google/siglip2-base-patch16-256) | 2026-08-21 |
|
|
27
28
|
| t0 | `t0_` | 1 | Apache 2.0 | [snapshot](t0-alpha-Apache-2.0.txt) | [T0-alpha model](https://huggingface.co/theforecastingcompany/t0-alpha) | [upstream license](https://github.com/theforecastingcompany/tfc-t0/blob/main/LICENSE) | 2026-08-21 |
|
|
28
29
|
| tabpfn | `tabpfn_` | 8 | TABPFN-3 License v1.0 | [snapshot](tabpfn-3-License-v1.0.txt) | [TabPFN-3 model](https://huggingface.co/Prior-Labs/tabpfn_3) | [upstream license](https://huggingface.co/Prior-Labs/tabpfn_3/blob/main/LICENSE) | 2026-08-21 |
|
|
@@ -80,6 +81,15 @@ the upstream vision and text checkpoint parameters to its JAX/Equinox parameter
|
|
|
80
81
|
source is the [`google-deepmind/tips` project](https://github.com/google-deepmind/tips), which states that it is not an
|
|
81
82
|
official Google product. No endorsement by the upstream authors is implied.
|
|
82
83
|
|
|
84
|
+
### SAM 3.1
|
|
85
|
+
|
|
86
|
+
The `sam31_multiplex` and `sam31_text` archives are converted from Meta's SAM 3.1 checkpoint (`facebook/sam3.1`,
|
|
87
|
+
`sam3.1_multiplex.pt`) and remain SAM Materials under the [SAM License](sam-License.md). Equimo converted the parameters
|
|
88
|
+
to its JAX/Equinox layout and archive format; they are not an official Meta product and no endorsement by Meta is
|
|
89
|
+
implied. The license requires that a copy of it accompany any distribution, that publications using the materials
|
|
90
|
+
acknowledge them (section 1.b.ii), and that uses comply with trade controls (sections 1.b.iii and 1.b.v). Equimo's SAM
|
|
91
|
+
3.1 code is not SAM Materials in the author's reading; see `docs/licensing/sam3-provenance.md`.
|
|
92
|
+
|
|
83
93
|
### T0-alpha
|
|
84
94
|
|
|
85
95
|
Equimo converted the upstream T0-alpha checkpoint to its JAX/Equinox parameter layout and archive format. The Apache-2.0
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
SAM License\
|
|
2
|
+
Last Updated: November 19, 2025
|
|
3
|
+
|
|
4
|
+
“Agreement” means the terms and conditions for use, reproduction, distribution and modification of the SAM Materials set
|
|
5
|
+
forth herein.
|
|
6
|
+
|
|
7
|
+
“SAM Materials” means, collectively, Documentation and the models, software and algorithms, including machine-learning
|
|
8
|
+
model code, trained model weights, inference-enabling code, training-enabling code, fine-tuning enabling code, and other
|
|
9
|
+
elements of the foregoing distributed by Meta and made available under this Agreement.
|
|
10
|
+
|
|
11
|
+
“Documentation” means the specifications, manuals and documentation accompanying SAM Materials distributed by Meta.
|
|
12
|
+
|
|
13
|
+
“Licensee” or “you” means you, or your employer or any other person or entity (if you are entering into this Agreement
|
|
14
|
+
on such person or entity’s behalf), of the age required under applicable laws, rules or regulations to provide legal
|
|
15
|
+
consent and that has legal authority to bind your employer or such other person or entity if you are entering in this
|
|
16
|
+
Agreement on their behalf.
|
|
17
|
+
|
|
18
|
+
“Meta” or “we” means Meta Platforms Ireland Limited (if you are located in or, if you are an entity, your principal
|
|
19
|
+
place of business is in the EEA or Switzerland) or Meta Platforms, Inc. (if you are located outside of the EEA or
|
|
20
|
+
Switzerland).
|
|
21
|
+
|
|
22
|
+
“Sanctions” means any economic or trade sanctions or restrictions administered or enforced by the United States
|
|
23
|
+
(including the Office of Foreign Assets Control of the U.S. Department of the Treasury (“OFAC”), the U.S. Department of
|
|
24
|
+
State and the U.S. Department of Commerce), the United Nations, the European Union, or the United Kingdom.
|
|
25
|
+
|
|
26
|
+
“Trade Controls” means any of the following: Sanctions and applicable export and import controls.
|
|
27
|
+
|
|
28
|
+
By using or distributing any portion or element of the SAM Materials, you agree to be bound by this Agreement.
|
|
29
|
+
|
|
30
|
+
1\. License Rights and Redistribution.
|
|
31
|
+
|
|
32
|
+
a. Grant of Rights. You are granted a non-exclusive, worldwide, non-transferable and royalty-free limited license under
|
|
33
|
+
Meta’s intellectual property or other rights owned by Meta embodied in the SAM Materials to use, reproduce, distribute,
|
|
34
|
+
copy, create derivative works of, and make modifications to the SAM Materials.
|
|
35
|
+
|
|
36
|
+
b. Redistribution and Use. i. Distribution of SAM Materials, and any derivative works thereof, are subject to the terms
|
|
37
|
+
of this Agreement. If you distribute or make the SAM Materials, or any derivative works thereof, available to a third
|
|
38
|
+
party, you may only do so under the terms of this Agreement and you shall provide a copy of this Agreement with any such
|
|
39
|
+
SAM Materials.
|
|
40
|
+
|
|
41
|
+
ii. If you submit for publication the results of research you perform on, using, or otherwise in connection with SAM
|
|
42
|
+
Materials, you must acknowledge the use of SAM Materials in your publication.
|
|
43
|
+
|
|
44
|
+
iii. Your use of the SAM Materials must comply with applicable laws and regulations, including Trade Control Laws and
|
|
45
|
+
applicable privacy and data protection laws. iv. Your use of the SAM Materials will not involve or encourage others to
|
|
46
|
+
reverse engineer, decompile or discover the underlying components of the SAM Materials. v. You are not the target of
|
|
47
|
+
Trade Controls and your use of SAM Materials must comply with Trade Controls. You agree not to use, or permit others to
|
|
48
|
+
use, SAM Materials for any activities subject to the International Traffic in Arms Regulations (ITAR) or end uses
|
|
49
|
+
prohibited by Trade Controls, including those related to military or warfare purposes, nuclear industries or
|
|
50
|
+
applications, espionage, or the development or use of guns or illegal weapons. 2. User Support. Your use of the SAM
|
|
51
|
+
Materials is done at your own discretion; Meta does not process any information nor provide any service in relation to
|
|
52
|
+
such use. Meta is under no obligation to provide any support services for the SAM Materials. Any support provided is “as
|
|
53
|
+
is”, “with all faults”, and without warranty of any kind.
|
|
54
|
+
|
|
55
|
+
3\. Disclaimer of Warranty. UNLESS REQUIRED BY APPLICABLE LAW, THE SAM MATERIALS AND ANY OUTPUT AND RESULTS THEREFROM ARE
|
|
56
|
+
PROVIDED ON AN “AS IS” BASIS, WITHOUT WARRANTIES OF ANY KIND, AND META DISCLAIMS ALL WARRANTIES OF ANY KIND, BOTH
|
|
57
|
+
EXPRESS AND IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, OR
|
|
58
|
+
FITNESS FOR A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR DETERMINING THE APPROPRIATENESS OF USING OR
|
|
59
|
+
REDISTRIBUTING THE SAM MATERIALS AND ASSUME ANY RISKS ASSOCIATED WITH YOUR USE OF THE SAM MATERIALS AND ANY OUTPUT AND
|
|
60
|
+
RESULTS.
|
|
61
|
+
|
|
62
|
+
4\. Limitation of Liability. IN NO EVENT WILL META OR ITS AFFILIATES BE LIABLE UNDER ANY THEORY OF LIABILITY, WHETHER IN
|
|
63
|
+
CONTRACT, TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR OTHERWISE, ARISING OUT OF THIS AGREEMENT, FOR ANY LOST PROFITS OR ANY
|
|
64
|
+
DIRECT OR INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF META OR ITS AFFILIATES
|
|
65
|
+
HAVE BEEN ADVISED OF THE POSSIBILITY OF ANY OF THE FOREGOING.
|
|
66
|
+
|
|
67
|
+
5\. Intellectual Property.
|
|
68
|
+
|
|
69
|
+
a. Subject to Meta’s ownership of SAM Materials and derivatives made by or for Meta, with respect to any derivative
|
|
70
|
+
works and modifications of the SAM Materials that are made by you, as between you and Meta, you are and will be the
|
|
71
|
+
owner of such derivative works and modifications.
|
|
72
|
+
|
|
73
|
+
b. If you institute litigation or other proceedings against Meta or any entity (including a cross-claim or counterclaim
|
|
74
|
+
in a lawsuit) alleging that the SAM Materials, outputs or results, or any portion of any of the foregoing, constitutes
|
|
75
|
+
infringement of intellectual property or other rights owned or licensable by you, then any licenses granted to you under
|
|
76
|
+
this Agreement shall terminate as of the date such litigation or claim is filed or instituted. You will indemnify and
|
|
77
|
+
hold harmless Meta from and against any claim by any third party arising out of or related to your use or distribution
|
|
78
|
+
of the SAM Materials.
|
|
79
|
+
|
|
80
|
+
6\. Term and Termination. The term of this Agreement will commence upon your acceptance of this Agreement or access to
|
|
81
|
+
the SAM Materials and will continue in full force and effect until terminated in accordance with the terms and
|
|
82
|
+
conditions herein. Meta may terminate this Agreement if you are in breach of any term or condition of this Agreement.
|
|
83
|
+
Upon termination of this Agreement, you shall delete and cease use of the SAM Materials. Sections 3, 4 and 7 shall
|
|
84
|
+
survive the termination of this Agreement.
|
|
85
|
+
|
|
86
|
+
7\. Governing Law and Jurisdiction. This Agreement will be governed and construed under the laws of the State of
|
|
87
|
+
California without regard to choice of law principles, and the UN Convention on Contracts for the International Sale of
|
|
88
|
+
Goods does not apply to this Agreement. The courts of California shall have exclusive jurisdiction of any dispute
|
|
89
|
+
arising out of this Agreement.
|
|
90
|
+
|
|
91
|
+
8\. Modifications and Amendments. Meta may modify this Agreement from time to time; provided that they are similar in
|
|
92
|
+
spirit to the current version of the Agreement, but may differ in detail to address new problems or concerns. All such
|
|
93
|
+
changes will be effective immediately. Your continued use of the SAM Materials after any modification to this Agreement
|
|
94
|
+
constitutes your agreement to such modification. Except as provided in this Agreement, no modification or addition to
|
|
95
|
+
any provision of this Agreement will be binding unless it is in writing and signed by an authorized representative of
|
|
96
|
+
both you and Meta.
|
|
@@ -66,3 +66,45 @@ This product includes software derived from Chronos-2 by Amazon.com, Inc. or
|
|
|
66
66
|
its affiliates, Copyright Amazon.com, Inc. All Rights Reserved, licensed under
|
|
67
67
|
the Apache License 2.0.
|
|
68
68
|
Source: https://github.com/amazon-science/chronos-forecasting
|
|
69
|
+
|
|
70
|
+
CLIP tokenizer and vocabulary
|
|
71
|
+
-----------------------------
|
|
72
|
+
|
|
73
|
+
ClipBpeTokenizer in src/equimo/language/tokenizers.py is adapted from
|
|
74
|
+
clip/simple_tokenizer.py in OpenAI's CLIP release, and
|
|
75
|
+
src/equimo/language/data/bpe_simple_vocab_16e6.txt.gz is the vocabulary from
|
|
76
|
+
that release.
|
|
77
|
+
|
|
78
|
+
Source: https://github.com/openai/CLIP
|
|
79
|
+
|
|
80
|
+
MIT License
|
|
81
|
+
|
|
82
|
+
Copyright (c) 2021 OpenAI
|
|
83
|
+
|
|
84
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
85
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
86
|
+
in the Software without restriction, including without limitation the rights
|
|
87
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
88
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
89
|
+
furnished to do so, subject to the following conditions:
|
|
90
|
+
|
|
91
|
+
The above copyright notice and this permission notice shall be included in all
|
|
92
|
+
copies or substantial portions of the Software.
|
|
93
|
+
|
|
94
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
95
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
96
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
97
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
98
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
99
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
100
|
+
SOFTWARE.
|
|
101
|
+
|
|
102
|
+
SAM 3.1 weights
|
|
103
|
+
---------------
|
|
104
|
+
|
|
105
|
+
Equimo's sam31_multiplex and sam31_text archives are converted from Meta's
|
|
106
|
+
SAM 3.1 checkpoint and remain under the SAM License; see
|
|
107
|
+
LICENSES/pretrained/sam-License.md. No SAM Materials are included in this
|
|
108
|
+
distribution: the archives are downloaded separately. Equimo's SAM 3.1 code is
|
|
109
|
+
under Equimo's license; docs/licensing/sam3-provenance.md records how it was
|
|
110
|
+
written.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: Equimo
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.8.0
|
|
4
4
|
Summary: Implementation of modern multimodal models in JAX/Equinox
|
|
5
5
|
License-Expression: MIT AND Apache-2.0
|
|
6
6
|
License-File: LICENSE.md
|
|
@@ -13,6 +13,7 @@ License-File: LICENSES/pretrained/dinov2-Apache-2.0.txt
|
|
|
13
13
|
License-File: LICENSES/pretrained/dinov3-License.md
|
|
14
14
|
License-File: LICENSES/pretrained/eupe-FAIR-Noncommercial-Research-License.md
|
|
15
15
|
License-File: LICENSES/pretrained/lingbot-vision-Apache-2.0.txt
|
|
16
|
+
License-File: LICENSES/pretrained/sam-License.md
|
|
16
17
|
License-File: LICENSES/pretrained/siglip2-Apache-2.0.txt
|
|
17
18
|
License-File: LICENSES/pretrained/t0-alpha-Apache-2.0.txt
|
|
18
19
|
License-File: LICENSES/pretrained/tabpfn-3-License-v1.0.txt
|
|
@@ -36,6 +37,8 @@ Requires-Dist: lz4>=4.4.3
|
|
|
36
37
|
Requires-Dist: requests>=2.32.3
|
|
37
38
|
Requires-Dist: torch>=2.11,<2.12 ; extra == 'audio'
|
|
38
39
|
Requires-Dist: torchaudio>=2.11,<2.12 ; extra == 'audio'
|
|
40
|
+
Requires-Dist: ftfy>=6.1,<7 ; extra == 'clip'
|
|
41
|
+
Requires-Dist: regex>=2024.11.6 ; extra == 'clip'
|
|
39
42
|
Requires-Dist: matplotlib>=3.10.1 ; extra == 'extras'
|
|
40
43
|
Requires-Dist: pillow>=11.1.0 ; extra == 'extras'
|
|
41
44
|
Requires-Dist: scikit-learn>=1.6.1 ; extra == 'extras'
|
|
@@ -45,6 +48,7 @@ Requires-Dist: torch>=2.6.0 ; extra == 'torch'
|
|
|
45
48
|
Requires-Dist: timm>=1.0.15 ; extra == 'torch'
|
|
46
49
|
Requires-Python: >=3.12, <3.15
|
|
47
50
|
Provides-Extra: audio
|
|
51
|
+
Provides-Extra: clip
|
|
48
52
|
Provides-Extra: extras
|
|
49
53
|
Provides-Extra: language
|
|
50
54
|
Provides-Extra: torch
|
|
@@ -59,6 +63,12 @@ Equimo provides JAX/Equinox implementations of recent architectures across modal
|
|
|
59
63
|
modality today; language has first-class text encoders/tokenizers, audio includes AST spectrogram models, tabular
|
|
60
64
|
includes TabPFN-3 core models, and the experimental time-series namespace includes the raw T0 backbone.
|
|
61
65
|
|
|
66
|
+

|
|
67
|
+
|
|
68
|
+
*SAM 3.1 video tracking from the text prompt `"person"`, with
|
|
69
|
+
[the code in the guide](docs/sam3.md#tracking-a-film-clip). Excerpt from* Pulp Fiction *(1994, Miramax), which belongs
|
|
70
|
+
to its rights holders and is not covered by Equimo's licenses.*
|
|
71
|
+
|
|
62
72
|
## Features
|
|
63
73
|
|
|
64
74
|
- Pure JAX/Equinox implementations
|
|
@@ -108,7 +118,7 @@ Equimo is organized by modality, with reusable building blocks separated from mo
|
|
|
108
118
|
|
|
109
119
|
| Namespace | Purpose |
|
|
110
120
|
| ---------------------- | --------------------------------------------------------------------------------------- |
|
|
111
|
-
| `equimo.core` | Shared layers, scan ops, implicit/DEQ utilities, EMA helpers
|
|
121
|
+
| `equimo.core` | Shared layers, scan ops, implicit/DEQ utilities, EMA helpers, parameter tags and masks |
|
|
112
122
|
| `equimo.vision` | Vision models, vision layers, and image IO |
|
|
113
123
|
| `equimo.language` | Text encoders and tokenizers |
|
|
114
124
|
| `equimo.audio` | Audio models, layers, and checkpoint-linked AST waveform preprocessing |
|
|
@@ -152,6 +162,7 @@ Beyond a standard ViT (e.g., DINOv2 or SigLIP), Equimo provides other SotA archi
|
|
|
152
162
|
| FreeNet | [FreeNet: Liberating Depth-Wise Separable Operations for Building Faster Mobile Vision Architectures](https://ojs.aaai.org/index.php/AAAI/article/view/33041) | 2025 | ✅‡ |
|
|
153
163
|
| EUPE | [Efficient Universal Perception Encoder](https://arxiv.org/abs/2603.22387) | 2026 | ✅ |
|
|
154
164
|
| LingBot-Vision | [Vision Pretraining for Dense Spatial Perception](https://arxiv.org/abs/2607.05247) | 2026 | ✅§ |
|
|
165
|
+
| SAM 3.1 | [SAM 3: Segment Anything with Concepts](https://arxiv.org/abs/2511.16719) | 2025 | ✅¶ |
|
|
155
166
|
| ViT-5 | [ViT-5: Vision Transformers for The Mid-2020s](https://arxiv.org/abs/2602.08071) | 2026 | ✅ |
|
|
156
167
|
|
|
157
168
|
\*: Only contains the Linear Angular Attention module. It is straightforward to build a ViT around it, but may require
|
|
@@ -168,6 +179,9 @@ network from these blocks.
|
|
|
168
179
|
tokens, and self-attention without a key bias; the Giant variant uses a SwiGLU FFN. Pretrained Small, Base, Large, and
|
|
169
180
|
Giant backbones are available — see [pretrained models](#list-of-pretrained-models).
|
|
170
181
|
|
|
182
|
+
¶: SAM 3.1 finds every instance of a concept in an image, segments objects from clicks, and tracks through video
|
|
183
|
+
(experimental). See the [SAM 3.1 guide](docs/sam3.md). Its weights are under the SAM License.
|
|
184
|
+
|
|
171
185
|
## Implemented Audio Models
|
|
172
186
|
|
|
173
187
|
| Model | Paper | Year | Status |
|
|
@@ -799,6 +813,7 @@ The following models have pretrained weights available in Equimo:
|
|
|
799
813
|
- [TabPFN-3](https://arxiv.org/abs/2605.13986)
|
|
800
814
|
- [T0-alpha](https://huggingface.co/theforecastingcompany/t0-alpha)
|
|
801
815
|
- [LingBot-Vision](https://arxiv.org/abs/2607.05247) (Small, Base, Large, and Giant)
|
|
816
|
+
- [SAM 3.1](https://arxiv.org/abs/2511.16719) (the `sam31_multiplex` vision and `sam31_text` text models)
|
|
802
817
|
|
|
803
818
|
Before using any pretrained weights, review the [pretrained-model license index](LICENSES/pretrained/README.md). It
|
|
804
819
|
links the current upstream terms and records when each bundled license snapshot was last checked. Upstream licenses can
|
|
@@ -806,7 +821,7 @@ change, so the copies in this repository may be outdated; always check the lates
|
|
|
806
821
|
terms are welcome as issues or pull requests.
|
|
807
822
|
|
|
808
823
|
Model identifiers map to filenames in Equimo's
|
|
809
|
-
[Hugging Face repository](https://huggingface.co/poiretclement/equimo/tree/
|
|
824
|
+
[Hugging Face repository](https://huggingface.co/poiretclement/equimo/tree/f4b4cf5bc2d47a98fd0df11eddb08fd3bb5dded6/models/default).
|
|
810
825
|
|
|
811
826
|
Published ConvNeXt size factories load the default classifier with `pretrained=True`:
|
|
812
827
|
|
|
@@ -1024,6 +1039,23 @@ def loss_and_grads(model_fp32, images, labels, key):
|
|
|
1024
1039
|
return softmax_cross_entropy_with_integer_labels(logits, labels).mean()
|
|
1025
1040
|
```
|
|
1026
1041
|
|
|
1042
|
+
Give the optimizer only the trainable leaves and Equimo's weight-decay mask. `trainable_mask` leaves out buffers, such
|
|
1043
|
+
as frozen PEFT bases, which weight decay would otherwise change; `weight_decay_mask` leaves biases, norms, layer scales,
|
|
1044
|
+
state-space dynamics, every other array with at most one axis, position embeddings, and learned class, register,
|
|
1045
|
+
distillation, and mask tokens undecayed:
|
|
1046
|
+
|
|
1047
|
+
```python
|
|
1048
|
+
import optax
|
|
1049
|
+
from equimo.core.parameters import trainable_mask, weight_decay_mask
|
|
1050
|
+
|
|
1051
|
+
params, static = eqx.partition(model_fp32, trainable_mask(model_fp32))
|
|
1052
|
+
optimizer = optax.adamw(3e-4, weight_decay=0.05, mask=weight_decay_mask)
|
|
1053
|
+
opt_state = optimizer.init(params)
|
|
1054
|
+
```
|
|
1055
|
+
|
|
1056
|
+
Differentiate with respect to `params` and rebuild the model with `eqx.combine(params, static)`. Fine-tuning plans apply
|
|
1057
|
+
the same policy.
|
|
1058
|
+
|
|
1027
1059
|
Numerically sensitive operations cast locally to float32 and return the model dtype: normalization statistics, rotary
|
|
1028
1060
|
factors, and every softmax. Attention between tokens applies `jax.nn.softmax` to float32 logits. Other softmaxes
|
|
1029
1061
|
(attention pooling, attention-pooling heads, adapter fusion, the tabular decoder, and the `"softmax"` activation) use
|
|
@@ -7,6 +7,12 @@ Equimo provides JAX/Equinox implementations of recent architectures across modal
|
|
|
7
7
|
modality today; language has first-class text encoders/tokenizers, audio includes AST spectrogram models, tabular
|
|
8
8
|
includes TabPFN-3 core models, and the experimental time-series namespace includes the raw T0 backbone.
|
|
9
9
|
|
|
10
|
+

|
|
11
|
+
|
|
12
|
+
*SAM 3.1 video tracking from the text prompt `"person"`, with
|
|
13
|
+
[the code in the guide](docs/sam3.md#tracking-a-film-clip). Excerpt from* Pulp Fiction *(1994, Miramax), which belongs
|
|
14
|
+
to its rights holders and is not covered by Equimo's licenses.*
|
|
15
|
+
|
|
10
16
|
## Features
|
|
11
17
|
|
|
12
18
|
- Pure JAX/Equinox implementations
|
|
@@ -56,7 +62,7 @@ Equimo is organized by modality, with reusable building blocks separated from mo
|
|
|
56
62
|
|
|
57
63
|
| Namespace | Purpose |
|
|
58
64
|
| ---------------------- | --------------------------------------------------------------------------------------- |
|
|
59
|
-
| `equimo.core` | Shared layers, scan ops, implicit/DEQ utilities, EMA helpers
|
|
65
|
+
| `equimo.core` | Shared layers, scan ops, implicit/DEQ utilities, EMA helpers, parameter tags and masks |
|
|
60
66
|
| `equimo.vision` | Vision models, vision layers, and image IO |
|
|
61
67
|
| `equimo.language` | Text encoders and tokenizers |
|
|
62
68
|
| `equimo.audio` | Audio models, layers, and checkpoint-linked AST waveform preprocessing |
|
|
@@ -100,6 +106,7 @@ Beyond a standard ViT (e.g., DINOv2 or SigLIP), Equimo provides other SotA archi
|
|
|
100
106
|
| FreeNet | [FreeNet: Liberating Depth-Wise Separable Operations for Building Faster Mobile Vision Architectures](https://ojs.aaai.org/index.php/AAAI/article/view/33041) | 2025 | ✅‡ |
|
|
101
107
|
| EUPE | [Efficient Universal Perception Encoder](https://arxiv.org/abs/2603.22387) | 2026 | ✅ |
|
|
102
108
|
| LingBot-Vision | [Vision Pretraining for Dense Spatial Perception](https://arxiv.org/abs/2607.05247) | 2026 | ✅§ |
|
|
109
|
+
| SAM 3.1 | [SAM 3: Segment Anything with Concepts](https://arxiv.org/abs/2511.16719) | 2025 | ✅¶ |
|
|
103
110
|
| ViT-5 | [ViT-5: Vision Transformers for The Mid-2020s](https://arxiv.org/abs/2602.08071) | 2026 | ✅ |
|
|
104
111
|
|
|
105
112
|
\*: Only contains the Linear Angular Attention module. It is straightforward to build a ViT around it, but may require
|
|
@@ -116,6 +123,9 @@ network from these blocks.
|
|
|
116
123
|
tokens, and self-attention without a key bias; the Giant variant uses a SwiGLU FFN. Pretrained Small, Base, Large, and
|
|
117
124
|
Giant backbones are available — see [pretrained models](#list-of-pretrained-models).
|
|
118
125
|
|
|
126
|
+
¶: SAM 3.1 finds every instance of a concept in an image, segments objects from clicks, and tracks through video
|
|
127
|
+
(experimental). See the [SAM 3.1 guide](docs/sam3.md). Its weights are under the SAM License.
|
|
128
|
+
|
|
119
129
|
## Implemented Audio Models
|
|
120
130
|
|
|
121
131
|
| Model | Paper | Year | Status |
|
|
@@ -747,6 +757,7 @@ The following models have pretrained weights available in Equimo:
|
|
|
747
757
|
- [TabPFN-3](https://arxiv.org/abs/2605.13986)
|
|
748
758
|
- [T0-alpha](https://huggingface.co/theforecastingcompany/t0-alpha)
|
|
749
759
|
- [LingBot-Vision](https://arxiv.org/abs/2607.05247) (Small, Base, Large, and Giant)
|
|
760
|
+
- [SAM 3.1](https://arxiv.org/abs/2511.16719) (the `sam31_multiplex` vision and `sam31_text` text models)
|
|
750
761
|
|
|
751
762
|
Before using any pretrained weights, review the [pretrained-model license index](LICENSES/pretrained/README.md). It
|
|
752
763
|
links the current upstream terms and records when each bundled license snapshot was last checked. Upstream licenses can
|
|
@@ -754,7 +765,7 @@ change, so the copies in this repository may be outdated; always check the lates
|
|
|
754
765
|
terms are welcome as issues or pull requests.
|
|
755
766
|
|
|
756
767
|
Model identifiers map to filenames in Equimo's
|
|
757
|
-
[Hugging Face repository](https://huggingface.co/poiretclement/equimo/tree/
|
|
768
|
+
[Hugging Face repository](https://huggingface.co/poiretclement/equimo/tree/f4b4cf5bc2d47a98fd0df11eddb08fd3bb5dded6/models/default).
|
|
758
769
|
|
|
759
770
|
Published ConvNeXt size factories load the default classifier with `pretrained=True`:
|
|
760
771
|
|
|
@@ -972,6 +983,23 @@ def loss_and_grads(model_fp32, images, labels, key):
|
|
|
972
983
|
return softmax_cross_entropy_with_integer_labels(logits, labels).mean()
|
|
973
984
|
```
|
|
974
985
|
|
|
986
|
+
Give the optimizer only the trainable leaves and Equimo's weight-decay mask. `trainable_mask` leaves out buffers, such
|
|
987
|
+
as frozen PEFT bases, which weight decay would otherwise change; `weight_decay_mask` leaves biases, norms, layer scales,
|
|
988
|
+
state-space dynamics, every other array with at most one axis, position embeddings, and learned class, register,
|
|
989
|
+
distillation, and mask tokens undecayed:
|
|
990
|
+
|
|
991
|
+
```python
|
|
992
|
+
import optax
|
|
993
|
+
from equimo.core.parameters import trainable_mask, weight_decay_mask
|
|
994
|
+
|
|
995
|
+
params, static = eqx.partition(model_fp32, trainable_mask(model_fp32))
|
|
996
|
+
optimizer = optax.adamw(3e-4, weight_decay=0.05, mask=weight_decay_mask)
|
|
997
|
+
opt_state = optimizer.init(params)
|
|
998
|
+
```
|
|
999
|
+
|
|
1000
|
+
Differentiate with respect to `params` and rebuild the model with `eqx.combine(params, static)`. Fine-tuning plans apply
|
|
1001
|
+
the same policy.
|
|
1002
|
+
|
|
975
1003
|
Numerically sensitive operations cast locally to float32 and return the model dtype: normalization statistics, rotary
|
|
976
1004
|
factors, and every softmax. Attention between tokens applies `jax.nn.softmax` to float32 logits. Other softmaxes
|
|
977
1005
|
(attention pooling, attention-pooling heads, adapter fusion, the tabular decoder, and the `"softmax"` activation) use
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# SAM 3.1 behavior provenance
|
|
2
|
+
|
|
3
|
+
Equimo's SAM 3.1 port was first drafted from `docs/designs/sam3.md`, Equimo, the SAM 3 paper and the SAM 3.1 release
|
|
4
|
+
post, without reading the reference source. The tiny component tests then compare it against the reference at
|
|
5
|
+
`f1647e8d0c1d280991f4d1b7d974c2704537fe66`. Each row records a behavior that differed, the test that caught it, and the
|
|
6
|
+
revision that fixed it. The code stays under `MIT AND Apache-2.0`; this note is the record of what changed after reading
|
|
7
|
+
the reference, and it is not legal advice.
|
|
8
|
+
|
|
9
|
+
| Behavior corrected | Test | Revision |
|
|
10
|
+
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
11
|
+
| The joint logit goes through `inverse_sigmoid` with a 1e-3 clamp, so it stays within about +/-6.9. | `tests/test_sam3.py::test_joint_score_and_boxes_match_the_reference` | `tksqkunw` |
|
|
12
|
+
| Geometry prompts sum separate direct, pooled and position projections, add a class token, normalize the image first, and use a final projection and norm. | `tests/test_sam3.py::test_geometry_encoder_matches_the_reference_with_exemplars` | `tksqkunw` |
|
|
13
|
+
| The box relative-position bias uses signed log-scaled offsets to both box edges, with one network per axis. | `tests/test_sam3.py::test_decoder_matches_the_reference` | `tksqkunw` |
|
|
14
|
+
| The decoder's text cross-attention takes box positions; box positions are sine-encoded in y, x, width, height order; the queries and the presence token have their own output norms. | `tests/test_sam3.py::test_decoder_matches_the_reference` | `tksqkunw` |
|
|
15
|
+
| Scoring refines the prompt with a residual network and norm, then scales the dot product by `1 / sqrt(dim)`. | `tests/test_sam3.py::test_scoring_matches_the_reference` | `tksqkunw` |
|
|
16
|
+
| The segmentation head runs 2 pixel-decoder stages and has separate instance and semantic projections, and Equimo drops the unused semantic one. | `tests/test_sam3.py::test_segmentation_matches_the_reference` | `tksqkunw` |
|
|
17
|
+
| The two-way transformer adds position encodings per attention, its first block adds no self-attention residual, and it ends with a final cross-attention. | `tests/test_sam3.py::test_interactive_decoder_matches_the_reference` | `tksqkunw` |
|
|
18
|
+
| Each mask token has its own mask-embedding network, and the upsampler has a single norm. | `tests/test_sam3.py::test_interactive_decoder_matches_the_reference` | `tksqkunw` |
|
|
19
|
+
| The prompt encoder always appends a padding point, and an empty prompt also encodes one padding point in the first slot. | `tests/test_sam3.py::test_prompt_encoder_matches_the_reference_for_masks_and_boxes` | `tksqkunw` |
|
|
20
|
+
| A mask prompt follows the stability rule even with no points. | `tests/test_sam3.py::test_interactive_decoder_matches_the_reference` | `tksqkunw` |
|
|
21
|
+
| Multiplex slots have their own object, IoU and mask tokens; valid and invalid embeddings apply only to mask tokens; the decoder takes no sparse or dense prompts. | `tests/test_sam3.py::test_multiplex_decoder_matches_the_reference` | `tksqkunw` |
|
|
22
|
+
| The memory encoder's channel widths grow by 4 from `start_channels`, and its fuser depth is configurable. | `tests/test_sam3.py::test_memory_encoder_matches_the_reference` | `tksqkunw` |
|
|
23
|
+
| Memory attention adds projected image features to its queries and keys, adds position to the keys, scales the input position by 0.1, and uses exact GELU in its feed-forward. | `tests/test_sam3.py::test_memory_attention_matches_the_reference` | `tksqkunw` |
|
|
24
|
+
| The causal text encoder does not drop padded keys; right padding cannot reach real tokens through the causal mask. | `tests/test_language.py::test_causal_text_transformer_matches_the_reference_on_the_tiny_fixture` | `tksqkunw` |
|
|
25
|
+
| `roi_align` reads the border for samples outside the map, as torchvision's CUDA kernel does, instead of zeroing samples further than a pixel away. | `tests/test_vision_ops.py::test_roi_align_matches_torchvision` | `tksqkunw` |
|
|
26
|
+
| Bilinear mask resizing uses torch's float32 sample positions, through `resize_bilinear`. | `tests/test_vision_ops.py::test_bilinear_resize_matches_torch` | `tksqkunw` |
|
|
27
|
+
| Single-frame mask NMS measures overlap as intersection over minimum, not against the higher-ranked mask's area. | `tests/test_sam3.py::test_mask_nms_keeps_what_the_reference_keeps` | `tksqkunw` |
|
|
28
|
+
| The tracker has parameters for the checkpoint's object-absent pointer and memory and its interactive pointer and mask downsample, so no trained weight goes without a destination. | `tests/test_sam3.py::test_tiny_reference_state_fills_every_parameter_or_is_listed` | `pytzottv` |
|
|
29
|
+
| Exemplars with no text: the 3.1 predictor encodes the string `<text placeholder>` as the text prompt, where `ConceptPrompt.create` leaves it empty. Documented; the model is unchanged. | `tests/test_sam3_reference.py::test_exemplars_alone_keep_the_reference_detections` | `rpnrlnxk` |
|
|
30
|
+
| A detection with two or more strong overlaps is ambiguous for its whole row and column, including its matches; a track counts as matched by a raw overlap of at least 0.5. | `tests/test_sam3.py::test_association_zeroes_ambiguous_rows_and_columns` | `yvmtxxvn` |
|
|
31
|
+
| New detections need the keep mask unless nothing is tracked, and then only the boundary filter is ignored; NMS-suppressed detections are never new. | `tests/test_sam3.py::test_detections_suppressed_by_nms_are_never_new` | `yvmtxxvn` |
|
|
32
|
+
| Empty tracks do not count as unmatched in the hot-start. | `tests/test_sam3_video.py::test_hot_start_counts_only_tracks_with_pixels_as_unmatched` | `yvmtxxvn` |
|
|
33
|
+
| Duplicates count overlaps of at least 0.1, once per shared detection, and only against strictly earlier objects. | `tests/test_sam3_video.py::test_hot_start_counts_each_shared_detection`, `::test_objects_of_the_same_frame_are_never_duplicates` | `yvmtxxvn` |
|
|
34
|
+
| Reconditioning covers objects removed on the frame, keeps the tracker's logits where both masks agree, replaces the pointer through the interactive head, and leaves the frame non-conditioning. | `tests/test_sam3.py::test_commit_reconditions_and_suppresses_the_output_masks`, `::test_tracker_replays_the_reference_clip` | `yvmtxxvn` |
|
|
35
|
+
| Occlusion uses the masks after reconditioning, empty masks rather than the object score, compares strictly with the other object already occluded, treats objects removed on this frame as always occluded, and writes -10 to a suppressed mask. | `tests/test_sam3_video.py::test_occlusion_reads_the_masks_after_reconditioning`, `::test_objects_removed_this_frame_are_suppressed_first_when_they_overlap`, `::test_occlusion_ties_suppress_nobody` | `yvmtxxvn` |
|
|
36
|
+
| The object cap counts objects before this frame's removals, and new objects keep the kept-detections-first detection order unless they go over it. | `tests/test_sam3_video.py::test_object_limit_counts_objects_removed_on_the_same_frame`, `::test_new_objects_keep_kept_detections_first_when_under_the_limit` | `yvmtxxvn` |
|
|
37
|
+
| New objects are placed per state by best fit over empty slots, filling its buckets in order, and only a new state stores a conditioning frame. | `tests/test_sam3_video.py::test_new_objects_join_the_fullest_state_that_holds_them`, `::test_tracker_replays_the_reference_clip` | `yvmtxxvn` |
|
|
38
|
+
| Objects of the prompt frame are confirmed like any other, and the streak counts both frame-0 passes through the match mask. | `tests/test_sam3_video.py::test_prompt_frame_keeps_the_highest_scores_over_the_object_limit`, `tests/test_sam3.py::test_tracker_replays_the_reference_clip` | `yvmtxxvn` |
|
|
39
|
+
| An unconfirmed object is hidden only while still live two frames later, removed objects stay shown up to their last frame with a score of -1e4, and new objects render from the detector mask on their birth frame. | `tests/test_sam3.py::test_tracker_replays_the_reference_clip` | `yvmtxxvn` |
|
|
40
|
+
| Objects without pixels are dropped before overlap resolution, which goes to the highest tracker probability (the detection probability on a birth frame), so an object can remain with an empty mask. | `tests/test_sam3_video.py::test_rendering_keeps_an_object_that_lost_all_its_pixels` | `yvmtxxvn` |
|
|
41
|
+
| Memory is written on every frame including the prompt frame's second pass, with global per-pixel shrinkage over all objects in ID order, `2 * sigmoid - 1` in slots, zeros for absent slots, and `no_object_memory` for every slot that does not appear. | `tests/test_sam3.py::test_injected_memory_tracks_and_stores_like_the_reference`, `::test_area_shrinkage_clamps_empty_masks_when_others_exist` | `yvmtxxvn` |
|
|
42
|
+
| Re-encoding after adding objects is per state, from masks that pass through the source frame size with antialiasing, with overlaps resolved by highest logit at the image size. | `tests/test_sam3.py::test_tracker_replays_the_reference_clip`, `::test_non_overlap_applies_within_each_state_only` | `yvmtxxvn` |
|
|
43
|
+
| Added and reconditioned objects use `interactive_pointer_proj` from the binary mask downsampled by `interactive_mask_downsample`, with a score of +/-10 from whether the mask has pixels. | `tests/test_sam3.py::test_tracker_replays_the_reference_clip` | `yvmtxxvn` |
|
|
44
|
+
| Interactive pointers use the first mask token unless the prompt is multimask, even when stability selects another mask. | `tests/test_sam3.py::test_point_track_matches_the_reference` | `yvmtxxvn` |
|
|
45
|
+
| Propagated pointers of objects scored as absent go through `no_object_pointer`. | `tests/test_sam3.py::test_injected_memory_tracks_and_stores_like_the_reference` | `yvmtxxvn` |
|
|
46
|
+
| The spatial temporal embedding of conditioning frames counts down from entry 6 by distance and recent frames count up; the pointer encoding has sines first, cosines second and no 2 pi scale. | `tests/test_sam3.py::test_injected_memory_tracks_and_stores_like_the_reference` | `yvmtxxvn` |
|
|
47
|
+
| A new object from points stores its mask through the source frame size with its real object score on a conditioning frame; later frames store memory from their own masks, without shrinkage. | `tests/test_sam3.py::test_point_track_matches_the_reference` | `yvmtxxvn` |
|
|
48
|
+
| Box and point exemplars reach only the prompt frame; later frames detect from the text alone. | `tests/test_sam3_reference.py::test_exemplars_reach_only_the_prompt_frame_as_in_the_reference` | `wvpuyryx` |
|
|
49
|
+
|
|
50
|
+
## Sources
|
|
51
|
+
|
|
52
|
+
The first draft was written, without reading the reference, from `docs/designs/sam3.md`, Equimo, the SAM 3 paper (arXiv
|
|
53
|
+
2511.16719) and the SAM 3.1 release post. The reference was read only after it, at
|
|
54
|
+
`f1647e8d0c1d280991f4d1b7d974c2704537fe66`, to find the differences logged above and to write the fixture harness, which
|
|
55
|
+
generates fixtures through it. The tokenizer and its vocabulary come from OpenAI's MIT-licensed CLIP release; the
|
|
56
|
+
vocabulary file is byte-identical to the one the reference ships.
|
|
57
|
+
|
|
58
|
+
Legal review took place before release.
|
|
59
|
+
|
|
60
|
+
## Fixture harness
|
|
61
|
+
|
|
62
|
+
The reference's own numerics also needed one correction, in the fixture harness rather than the port. Importing
|
|
63
|
+
`sam3.model.sam3_multiplex_base` turns TF32 on for convolutions and matmul, so the harness now restores float32 after
|
|
64
|
+
that import, and building the video predictor turns it on again, so `models/sam31_reference.py:reference_precision`
|
|
65
|
+
clears it after the build as well as `float32_reference` does after the import.
|
|
66
|
+
|
|
67
|
+
The tiny text encoder's `positional_embedding` and `text_projection` are only allocated by the reference, for a
|
|
68
|
+
checkpoint to fill, so the harness initializes them from their own seeded generator. Without that, the tiny detector and
|
|
69
|
+
text outputs were NaN, and comparing NaN with NaN passes.
|
|
70
|
+
|
|
71
|
+
Generating the full-weight video fixture also needed two changes in the harness, neither of which changes what the
|
|
72
|
+
reference computes. Float32 memory attention runs in blocks of 1,024 queries, because the dense math-kernel logits do
|
|
73
|
+
not fit in 16 GB, and the detector runs one frame at a time instead of in the builder's chunks of 16 frames, for the
|
|
74
|
+
same reason.
|
|
75
|
+
|
|
76
|
+
## Full-weight video parity
|
|
77
|
+
|
|
78
|
+
The full-weight check in `tests/test_sam3_reference.py` reproduced the reference's decision trace, object IDs and masks
|
|
79
|
+
on the first run (lowest per-object mask IoU 0.9925), so it logged no behavior difference and no row above (revision
|
|
80
|
+
`ryznoxzq`). The reference numbers detections by their position in its filtered detection list, while the driver reports
|
|
81
|
+
the raw query index, so the check compares objects, as the design's criterion does, and not those indices.
|
|
@@ -34,6 +34,11 @@ Fused cuDNN attention, selected with `equimo.core.layers.with_attention_implemen
|
|
|
34
34
|
experimental. Its supported dtypes, masks, and module coverage follow cuDNN and `jax.nn.dot_product_attention` and may
|
|
35
35
|
change in a minor release. The default `implementation="xla"` is stable.
|
|
36
36
|
|
|
37
|
+
SAM 3.1 is covered in two tiers. The image endpoints (`Sam3.features`, `encode_image`, `detect`, `predict_interactive`,
|
|
38
|
+
`decode_concepts`, `encode_concept`), the `sam31_text` model and `ClipBpeTokenizer` are stable. `TrackerState`,
|
|
39
|
+
`CommitPlan`, `propagate`, `associate`, `commit`, and the video driver and policy in `equimo.vision.models.sam3.video`
|
|
40
|
+
are experimental and may change in a minor release.
|
|
41
|
+
|
|
37
42
|
Optional integrations remain optional. Their public Equimo wrappers are stable, but the supported Python range may be
|
|
38
43
|
narrower when an upstream dependency does not publish wheels. Equimo documents and tests those exceptions explicitly.
|
|
39
44
|
|
|
@@ -53,6 +58,15 @@ line. Their internal checksum cannot be reconstructed, so readers identify that
|
|
|
53
58
|
rejects them by default and returns an explicitly unverified result only when `allow_legacy=True`; `load_weights`
|
|
54
59
|
continues to read them with a warning. Equimo v1 archives and the removed v1 `load_model` API are outside this contract.
|
|
55
60
|
|
|
61
|
+
Before Equimo 2.8, RoPE and Swin position embeddings stored values that follow from their configuration, such as RoPE
|
|
62
|
+
frequencies, as PyTree leaves. They are now computed when used, which changes the structural signature of the affected
|
|
63
|
+
models; this is a correctness fix, since optimizers could change those values through weight decay. Model archives saved
|
|
64
|
+
before 2.8 remain readable throughout the v2 release line: `load_weights` recognizes the older layout and raises
|
|
65
|
+
`ValueError` if a stored value differs from the computed one by more than four machine epsilons of its dtype, while
|
|
66
|
+
`inspect_checkpoint` accepts the older signature without comparing values. Fine-tuning bundle and PMT hashes or digests
|
|
67
|
+
that covered those values are accepted when they match the older layout, but loading a bundle whose trained delta
|
|
68
|
+
changed one of them raises `FineTuneBundleError`.
|
|
69
|
+
|
|
56
70
|
Each Equimo release pins its built-in Hugging Face model repository to an immutable revision and embeds the Git LFS
|
|
57
71
|
SHA-256 of every uploaded archive. An explicit archive SHA-256 can also be supplied to `load_weights` for deployments
|
|
58
72
|
that maintain their own digest manifest.
|
|
@@ -77,3 +77,17 @@ Equimo converted the parameters to its JAX/Equinox layout and archive format.
|
|
|
77
77
|
Each archive records its timm tag, upstream Hugging Face commit, preprocessing
|
|
78
78
|
configuration, and numerical conversion checks. Sources and bundled licenses
|
|
79
79
|
are linked in README.md. No endorsement by the upstream authors is implied.
|
|
80
|
+
|
|
81
|
+
SAM 3.1
|
|
82
|
+
-------
|
|
83
|
+
|
|
84
|
+
Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved.
|
|
85
|
+
Source: https://github.com/facebookresearch/sam3
|
|
86
|
+
Checkpoint: facebook/sam3.1, sam3.1_multiplex.pt
|
|
87
|
+
License: SAM License; see LICENSES/pretrained/sam-License.md and
|
|
88
|
+
models/default/sam31/sam-License.md.
|
|
89
|
+
|
|
90
|
+
Equimo converted the checkpoint's vision and text parameters to its
|
|
91
|
+
JAX/Equinox layout and archive format, as sam31_multiplex and sam31_text. The
|
|
92
|
+
converted archives remain SAM Materials under the SAM License. They are not an
|
|
93
|
+
official Meta product, and no endorsement by Meta is implied.
|