tensorfs 0.3.88__tar.gz → 0.3.90__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.
- {tensorfs-0.3.88 → tensorfs-0.3.90}/Cargo.lock +3 -3
- {tensorfs-0.3.88 → tensorfs-0.3.90}/Cargo.toml +1 -1
- {tensorfs-0.3.88 → tensorfs-0.3.90}/PKG-INFO +1 -1
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/ingest.rs +8 -8
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/err.rs +3 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/fit.rs +53 -21
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/fingerprint.rs +36 -1
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/h3_lora.rs +25 -1
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/source.rs +131 -32
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/machine.rs +11 -4
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/providers.rs +97 -10
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/download.rs +3 -2
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/tests.rs +19 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/civitai_anima.rs +2 -2
- tensorfs-0.3.90/crates/tensorfs-core/tests/fit.rs +192 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/h3_lora.rs +380 -63
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/source_download.rs +3 -5
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-plane/tests/host_tier.rs +49 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-py/src/store.rs +16 -10
- {tensorfs-0.3.88 → tensorfs-0.3.90}/pyproject.toml +1 -1
- tensorfs-0.3.88/crates/tensorfs-core/tests/fit.rs +0 -83
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/Cargo.toml +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/build.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/examples/h3-swiglu-layout.md +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/examples/optional-cache-backfill.md +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/examples/resident-conversion.md +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/examples/resident_conversion_profile.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/asset_update.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/b64.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/conform.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/ensure.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/fetch.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/main.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/rd.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/repo.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/cache_roots.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/canon.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/capability.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/catalog/lock.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/catalog.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/cbor.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/checkpoint.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/checkpoint_root.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/corpus.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/adoption.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/companion_tests.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/estimate.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/graft_tests.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/group_commit_tests.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/history_cost_tests.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/part_rows_tests.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/progress.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/resume_tests.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/retention.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived/roots.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/derived.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/descriptors.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/disk.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/dtype.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/durability.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ensure/admission.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ensure/flight.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ensure.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/fetch.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/filesystem_identity.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/fill.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/gc.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/header.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/home.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ids.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/convert.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/custody.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/gguf.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/journal.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/mod.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/narrow.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/routes/anima.routes.json +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/routes/anima.spec.json +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/routes/sdxl.routes.json +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/routes/sdxl.spec.json +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/routes.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/ingest/transaction.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/jcs.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/keyed_roots.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/lib.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/limits.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/manifest.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/meta.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/project.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/read.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/receipt.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/reclaim.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/registry.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/relation.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/repo_cache.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/repository.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/sha256.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/source_artifact.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/spec.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/staging.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/stats.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/storage.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/store.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/api.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/decisions.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/http.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/http_reuse_tests.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/hub.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/memory.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/mod.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/policy.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/pull.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/push.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/sources.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/transport/tests/tail.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/unsynced.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/src/vectors.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/additive_fields.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/anima_hf_profile.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/as_is.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/catalog_owner_probe.c +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/checkpoint_roots.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/civitai_sdxl_profile.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/ensure.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fd_budget.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fd_headroom.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fetch_faults.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fetch_url_progress.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/foreign_json.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/h3_swiglu.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/home.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/hub_tls.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/import_tree.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/instrument_profiles.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/keyed_roots.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/liveness.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/qwen_image21_profile.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/read_plan.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/reclaim.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/repo_cache.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/repo_store.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/resident_admission.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/routed_single_file.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/sha256_backends.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/source_artifacts.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/source_plan.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/source_prefixes.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/staging.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/store_boundaries.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/transfer_memory.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/trust_index.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/version.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-core/tests/write_through.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-plane/API.md +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-plane/Cargo.toml +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-plane/src/bin/g1_vmm.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-plane/src/bin/g2_overlap.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-plane/src/bin/gpu_bench/mod.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-plane/src/cuda.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-plane/src/cursor.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-plane/src/device.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-plane/src/faults.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-plane/src/host.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-plane/src/io.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-plane/src/layout.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-plane/src/lib.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-plane/src/plane.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-plane/tests/common/mod.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-plane/tests/gpu.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-py/Cargo.toml +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-py/src/docs.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-py/src/ensure.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-py/src/errors.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-py/src/ingest.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-py/src/lib.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/crates/tensorfs-py/src/plane.rs +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/python/tensorfs/__init__.py +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/python/tensorfs/_derived_channel.py +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/python/tensorfs/_ext.pyi +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/python/tensorfs/_source_channel.py +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/python/tensorfs/_tensors.py +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/python/tensorfs/derived.py +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/python/tensorfs/errors.py +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/python/tensorfs/plane.py +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/python/tensorfs/plane.pyi +0 -0
- {tensorfs-0.3.88 → tensorfs-0.3.90}/python/tensorfs/py.typed +0 -0
|
@@ -449,7 +449,7 @@ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
|
|
|
449
449
|
|
|
450
450
|
[[package]]
|
|
451
451
|
name = "tensorfs-core"
|
|
452
|
-
version = "0.3.
|
|
452
|
+
version = "0.3.90"
|
|
453
453
|
dependencies = [
|
|
454
454
|
"fs2",
|
|
455
455
|
"libc",
|
|
@@ -464,7 +464,7 @@ dependencies = [
|
|
|
464
464
|
|
|
465
465
|
[[package]]
|
|
466
466
|
name = "tensorfs-plane"
|
|
467
|
-
version = "0.3.
|
|
467
|
+
version = "0.3.90"
|
|
468
468
|
dependencies = [
|
|
469
469
|
"libc",
|
|
470
470
|
"libloading",
|
|
@@ -474,7 +474,7 @@ dependencies = [
|
|
|
474
474
|
|
|
475
475
|
[[package]]
|
|
476
476
|
name = "tensorfs-py"
|
|
477
|
-
version = "0.3.
|
|
477
|
+
version = "0.3.90"
|
|
478
478
|
dependencies = [
|
|
479
479
|
"pyo3",
|
|
480
480
|
"tensorfs-core",
|
|
@@ -575,6 +575,7 @@ pub fn cmd_bank(dialect: &str, converter: &str, f: &Flags) -> ExitCode {
|
|
|
575
575
|
}
|
|
576
576
|
let profile = SourceProfile {
|
|
577
577
|
auto_select: true,
|
|
578
|
+
grammar: None,
|
|
578
579
|
name: name.to_string(),
|
|
579
580
|
components,
|
|
580
581
|
};
|
|
@@ -589,7 +590,7 @@ pub fn cmd_bank(dialect: &str, converter: &str, f: &Flags) -> ExitCode {
|
|
|
589
590
|
&target,
|
|
590
591
|
&unnamed(&srcs),
|
|
591
592
|
&CarrierSet::default(),
|
|
592
|
-
|
|
593
|
+
source_core::Classify::Banked(®),
|
|
593
594
|
variant,
|
|
594
595
|
) {
|
|
595
596
|
Ok(prepared) => prepared,
|
|
@@ -659,6 +660,7 @@ pub fn cmd_source_plan(f: &Flags) -> ExitCode {
|
|
|
659
660
|
|
|
660
661
|
struct ClosedSourcePlan {
|
|
661
662
|
converter: String,
|
|
663
|
+
profile: String,
|
|
662
664
|
order: Vec<(String, String)>,
|
|
663
665
|
registry: String,
|
|
664
666
|
session: String,
|
|
@@ -828,6 +830,7 @@ fn read_closed_source_plan(path: &Path) -> Result<ClosedSourcePlan, ExitCode> {
|
|
|
828
830
|
}
|
|
829
831
|
Ok(ClosedSourcePlan {
|
|
830
832
|
converter,
|
|
833
|
+
profile,
|
|
831
834
|
order,
|
|
832
835
|
registry,
|
|
833
836
|
session,
|
|
@@ -850,10 +853,7 @@ fn prepare_closed_source_plan(
|
|
|
850
853
|
if closed.registry != BUILTIN_REGISTRY {
|
|
851
854
|
flags.push(("registry".to_string(), closed.registry.clone()));
|
|
852
855
|
}
|
|
853
|
-
|
|
854
|
-
if as_is {
|
|
855
|
-
flags.push(("source-profile".to_string(), source_core::AS_IS.to_string()));
|
|
856
|
-
}
|
|
856
|
+
flags.push(("source-profile".to_string(), closed.profile.clone()));
|
|
857
857
|
for (component, source) in &closed.sources {
|
|
858
858
|
flags.push((
|
|
859
859
|
"source".to_string(),
|
|
@@ -865,7 +865,7 @@ fn prepare_closed_source_plan(
|
|
|
865
865
|
&closed.target,
|
|
866
866
|
&closed.sources,
|
|
867
867
|
&closed.set,
|
|
868
|
-
(
|
|
868
|
+
source_core::classify(®istry, &closed.profile).map_err(bail)?,
|
|
869
869
|
None,
|
|
870
870
|
)
|
|
871
871
|
.map_err(bail)?;
|
|
@@ -1000,12 +1000,12 @@ fn prepare(f: &Flags, target: &str) -> Result<Prepared, ExitCode> {
|
|
|
1000
1000
|
let sources = sources(f)?;
|
|
1001
1001
|
let registry = load_registry(f)?;
|
|
1002
1002
|
let variant = flag(f, "spec-variant").and_then(|value| value.parse().ok());
|
|
1003
|
-
let as_is = flag(f, "source-profile") == Some(source_core::AS_IS);
|
|
1004
1003
|
source_core::prepare(
|
|
1005
1004
|
target,
|
|
1006
1005
|
&unnamed(&sources),
|
|
1007
1006
|
&CarrierSet::default(),
|
|
1008
|
-
(
|
|
1007
|
+
source_core::classify(®istry, flag(f, "source-profile").unwrap_or_default())
|
|
1008
|
+
.map_err(bail)?,
|
|
1009
1009
|
variant,
|
|
1010
1010
|
)
|
|
1011
1011
|
.map_err(bail)
|
|
@@ -134,6 +134,9 @@ codes![
|
|
|
134
134
|
PLACEMENT_UNFIT,
|
|
135
135
|
CONVERT_SIZE_CAP,
|
|
136
136
|
SEAM_UNBANKED,
|
|
137
|
+
// An adapter factor targets a module the reviewed converter cannot map; dropping it
|
|
138
|
+
// would change the adapter.
|
|
139
|
+
ADAPTER_TARGET_UNSUPPORTED,
|
|
137
140
|
// ingest border: the temporary candidate transaction
|
|
138
141
|
QUOTA_EXHAUSTED,
|
|
139
142
|
ROOT_EXPIRED,
|
|
@@ -8,10 +8,13 @@
|
|
|
8
8
|
use crate::capability::CapabilityRecords;
|
|
9
9
|
use crate::dtype::Dtype;
|
|
10
10
|
use crate::err::{refuse, Code, Result};
|
|
11
|
-
use crate::header::{Closure, Header};
|
|
11
|
+
use crate::header::{Body, Closure, Header};
|
|
12
12
|
use crate::ids::ascii_name;
|
|
13
13
|
use crate::limits;
|
|
14
14
|
|
|
15
|
+
/// How many skipped keys the warning names.
|
|
16
|
+
const WARNED_KEYS: usize = 5;
|
|
17
|
+
|
|
15
18
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
16
19
|
pub struct TensorRequirement {
|
|
17
20
|
pub shape: Vec<u64>,
|
|
@@ -102,6 +105,7 @@ impl TensorRequirements {
|
|
|
102
105
|
}
|
|
103
106
|
}
|
|
104
107
|
|
|
108
|
+
/// Where the checkpoint came from. Accepted and echoed; it no longer changes the verdict.
|
|
105
109
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
106
110
|
pub enum Custody {
|
|
107
111
|
Canonical,
|
|
@@ -139,7 +143,11 @@ pub struct Routes {
|
|
|
139
143
|
pub enum Fit {
|
|
140
144
|
Ok {
|
|
141
145
|
routes: Routes,
|
|
146
|
+
/// Stored tensors of a constructed component the code does not build, as
|
|
147
|
+
/// `component/key`: skipped, never loaded.
|
|
142
148
|
ignored: Vec<String>,
|
|
149
|
+
/// What those tensors store, in bytes.
|
|
150
|
+
ignored_bytes: u64,
|
|
143
151
|
device: Option<String>,
|
|
144
152
|
},
|
|
145
153
|
ComponentMissing {
|
|
@@ -162,6 +170,7 @@ pub enum Fit {
|
|
|
162
170
|
required: Dtype,
|
|
163
171
|
stored: Dtype,
|
|
164
172
|
},
|
|
173
|
+
/// No longer answered: a stored key the code does not build is skipped (`Ok.ignored`).
|
|
165
174
|
ExtraTensor {
|
|
166
175
|
component: String,
|
|
167
176
|
key: String,
|
|
@@ -207,13 +216,35 @@ impl Fit {
|
|
|
207
216
|
matches!(self, Self::Ok { .. })
|
|
208
217
|
}
|
|
209
218
|
|
|
219
|
+
/// The one line a caller shows when stored tensors were skipped: how many, how many
|
|
220
|
+
/// bytes, and the first few. A truncated model reads "420 stored tensor(s), 9.8 GB".
|
|
221
|
+
pub fn warning(&self) -> Option<String> {
|
|
222
|
+
let Self::Ok {
|
|
223
|
+
ignored,
|
|
224
|
+
ignored_bytes,
|
|
225
|
+
..
|
|
226
|
+
} = self
|
|
227
|
+
else {
|
|
228
|
+
return None;
|
|
229
|
+
};
|
|
230
|
+
if ignored.is_empty() {
|
|
231
|
+
return None;
|
|
232
|
+
}
|
|
233
|
+
let more = match ignored.len().saturating_sub(WARNED_KEYS) {
|
|
234
|
+
0 => String::new(),
|
|
235
|
+
more => format!(", and {more} more"),
|
|
236
|
+
};
|
|
237
|
+
Some(format!(
|
|
238
|
+
"{} stored tensor(s) the code does not build were skipped, not loaded: {} B ({}{more})",
|
|
239
|
+
ignored.len(),
|
|
240
|
+
ignored_bytes,
|
|
241
|
+
ignored[..ignored.len().min(WARNED_KEYS)].join(", "),
|
|
242
|
+
))
|
|
243
|
+
}
|
|
244
|
+
|
|
210
245
|
pub fn text(&self) -> String {
|
|
211
246
|
match self {
|
|
212
|
-
Self::Ok {
|
|
213
|
-
routes,
|
|
214
|
-
ignored,
|
|
215
|
-
device,
|
|
216
|
-
} => {
|
|
247
|
+
Self::Ok { routes, device, .. } => {
|
|
217
248
|
let mut text = format!(
|
|
218
249
|
"fits (routes: verbatim x{}, decoded_float x{}, encoded_gemm x{}",
|
|
219
250
|
routes.verbatim, routes.decoded_float, routes.encoded_gemm
|
|
@@ -221,13 +252,10 @@ impl Fit {
|
|
|
221
252
|
if let Some(device) = device {
|
|
222
253
|
text.push_str(&format!("; encoded leaves qualified on {device}"));
|
|
223
254
|
}
|
|
224
|
-
if !ignored.is_empty() {
|
|
225
|
-
text.push_str(&format!(
|
|
226
|
-
"; {} stored key(s) ignored on local custody",
|
|
227
|
-
ignored.len()
|
|
228
|
-
));
|
|
229
|
-
}
|
|
230
255
|
text.push(')');
|
|
256
|
+
if let Some(warning) = self.warning() {
|
|
257
|
+
text.push_str(&format!("; {warning}"));
|
|
258
|
+
}
|
|
231
259
|
text
|
|
232
260
|
}
|
|
233
261
|
Self::ComponentMissing { component, present } => format!(
|
|
@@ -258,7 +286,7 @@ impl Fit {
|
|
|
258
286
|
stored.name()
|
|
259
287
|
),
|
|
260
288
|
Self::ExtraTensor { component, key } => {
|
|
261
|
-
format!("{component}.{key}: stored but not constructed
|
|
289
|
+
format!("{component}.{key}: stored but not constructed")
|
|
262
290
|
}
|
|
263
291
|
Self::EncodingUnsupported {
|
|
264
292
|
component,
|
|
@@ -325,8 +353,9 @@ pub fn fit(
|
|
|
325
353
|
) -> Result<Fit> {
|
|
326
354
|
header.validate(&Closure::default())?;
|
|
327
355
|
let plain = plain_digest();
|
|
356
|
+
let _ = custody;
|
|
328
357
|
let mut routes = Routes::default();
|
|
329
|
-
let mut ignored = Vec::new();
|
|
358
|
+
let (mut ignored, mut ignored_bytes) = (Vec::new(), 0u64);
|
|
330
359
|
let mut encoded = Vec::new();
|
|
331
360
|
|
|
332
361
|
for (component, required_tensors) in requirements.components() {
|
|
@@ -389,20 +418,22 @@ pub fn fit(
|
|
|
389
418
|
}
|
|
390
419
|
}
|
|
391
420
|
|
|
392
|
-
|
|
421
|
+
// A stored key the code does not build is skipped, on every custody: the code may
|
|
422
|
+
// build less than an older checkpoint stores (Qwen's text encoder dropped `lm_head`).
|
|
423
|
+
for (key, stored) in stored_tensors {
|
|
393
424
|
if required_tensors
|
|
394
425
|
.iter()
|
|
395
426
|
.any(|(required_key, _)| required_key == key)
|
|
396
427
|
{
|
|
397
428
|
continue;
|
|
398
429
|
}
|
|
399
|
-
if custody == Custody::Canonical {
|
|
400
|
-
return Ok(Fit::ExtraTensor {
|
|
401
|
-
component: component.clone(),
|
|
402
|
-
key: key.clone(),
|
|
403
|
-
});
|
|
404
|
-
}
|
|
405
430
|
ignored.push(format!("{component}/{key}"));
|
|
431
|
+
for (_, part) in &stored.parts {
|
|
432
|
+
ignored_bytes += match &part.body {
|
|
433
|
+
Body::Segments(objects) => objects.iter().map(|object| object.length).sum(),
|
|
434
|
+
Body::Inline(bytes) => bytes.len() as u64,
|
|
435
|
+
};
|
|
436
|
+
}
|
|
406
437
|
}
|
|
407
438
|
}
|
|
408
439
|
|
|
@@ -436,6 +467,7 @@ pub fn fit(
|
|
|
436
467
|
Ok(Fit::Ok {
|
|
437
468
|
routes,
|
|
438
469
|
ignored,
|
|
470
|
+
ignored_bytes,
|
|
439
471
|
device: device.map(str::to_string),
|
|
440
472
|
})
|
|
441
473
|
}
|
|
@@ -204,9 +204,20 @@ pub struct SourceProfile {
|
|
|
204
204
|
/// Whether headers alone may choose this format. False requires the caller
|
|
205
205
|
/// to declare the reviewed format; shapes cannot prove semantic row layout.
|
|
206
206
|
pub auto_select: bool,
|
|
207
|
+
/// Set when a converter's planner, not banked key sets, recognizes the source.
|
|
208
|
+
pub grammar: Option<Grammar>,
|
|
207
209
|
pub components: Vec<SourceProfileComponent>,
|
|
208
210
|
}
|
|
209
211
|
|
|
212
|
+
/// A carrier matches when every key starts with `key_prefix` and the reviewed `converter`
|
|
213
|
+
/// plans it: the planner is the key grammar, so any valid subset of its reviewed modules
|
|
214
|
+
/// matches without a banked key list. Its keys construct in sorted order.
|
|
215
|
+
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
216
|
+
pub struct Grammar {
|
|
217
|
+
pub converter: String,
|
|
218
|
+
pub key_prefix: String,
|
|
219
|
+
}
|
|
220
|
+
|
|
210
221
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
211
222
|
pub struct SourceProfileComponent {
|
|
212
223
|
pub component: String,
|
|
@@ -684,6 +695,13 @@ impl FingerprintRegistry {
|
|
|
684
695
|
if !profile.auto_select {
|
|
685
696
|
fields.push(("auto_select", Value::Bool(false)));
|
|
686
697
|
}
|
|
698
|
+
if let Some(grammar) = &profile.grammar {
|
|
699
|
+
let converter = Value::str(grammar.converter.clone());
|
|
700
|
+
let key_prefix = Value::str(grammar.key_prefix.clone());
|
|
701
|
+
let grammar =
|
|
702
|
+
vec![("converter", converter), ("key_prefix", key_prefix)];
|
|
703
|
+
fields.push(("grammar", Value::obj(grammar)));
|
|
704
|
+
}
|
|
687
705
|
Value::obj(fields)
|
|
688
706
|
})
|
|
689
707
|
.collect(),
|
|
@@ -705,6 +723,19 @@ fn parse_source_profiles(value: &Value) -> Result<Vec<SourceProfile>> {
|
|
|
705
723
|
Some(_) => return refuse(Code::WRONG_TYPE, "SourceProfile.auto_select must be bool"),
|
|
706
724
|
};
|
|
707
725
|
ascii_name("source profile", &name, limits::MAX_NAME_BYTES)?;
|
|
726
|
+
let grammar = match fields.opt("grammar") {
|
|
727
|
+
None => None,
|
|
728
|
+
Some(value) => {
|
|
729
|
+
let mut grammar = Fields::new("Grammar", value)?;
|
|
730
|
+
let converter = grammar.req_str("converter")?.to_string();
|
|
731
|
+
let key_prefix = grammar.req_str("key_prefix")?.to_string();
|
|
732
|
+
grammar.done()?;
|
|
733
|
+
Some(Grammar {
|
|
734
|
+
converter,
|
|
735
|
+
key_prefix,
|
|
736
|
+
})
|
|
737
|
+
}
|
|
738
|
+
};
|
|
708
739
|
let mut components = Vec::new();
|
|
709
740
|
for value in as_arr("SourceProfile", "components", fields.req("components")?)? {
|
|
710
741
|
let mut component_fields = Fields::new("SourceProfileComponent", value)?;
|
|
@@ -795,7 +826,7 @@ fn parse_source_profiles(value: &Value) -> Result<Vec<SourceProfile>> {
|
|
|
795
826
|
),
|
|
796
827
|
);
|
|
797
828
|
}
|
|
798
|
-
if variants.is_empty() {
|
|
829
|
+
if variants.is_empty() && grammar.is_none() {
|
|
799
830
|
return refuse(
|
|
800
831
|
Code::MISSING_FIELD,
|
|
801
832
|
format!("source profile {name:?} component {component:?} has no variants"),
|
|
@@ -853,6 +884,7 @@ fn parse_source_profiles(value: &Value) -> Result<Vec<SourceProfile>> {
|
|
|
853
884
|
profiles.push(SourceProfile {
|
|
854
885
|
name,
|
|
855
886
|
auto_select,
|
|
887
|
+
grammar,
|
|
856
888
|
components,
|
|
857
889
|
});
|
|
858
890
|
}
|
|
@@ -1061,11 +1093,13 @@ mod tests {
|
|
|
1061
1093
|
registry.source_profiles = vec![
|
|
1062
1094
|
SourceProfile {
|
|
1063
1095
|
auto_select: true,
|
|
1096
|
+
grammar: None,
|
|
1064
1097
|
name: "profile/a".into(),
|
|
1065
1098
|
components: vec![source_component(Some("a/model.index.json"), None)],
|
|
1066
1099
|
},
|
|
1067
1100
|
SourceProfile {
|
|
1068
1101
|
auto_select: true,
|
|
1102
|
+
grammar: None,
|
|
1069
1103
|
name: "profile/b".into(),
|
|
1070
1104
|
components: vec![
|
|
1071
1105
|
source_component(Some("b/model.safetensors"), None),
|
|
@@ -1089,6 +1123,7 @@ mod tests {
|
|
|
1089
1123
|
let mut registry = registry();
|
|
1090
1124
|
registry.source_profiles = vec![SourceProfile {
|
|
1091
1125
|
auto_select: true,
|
|
1126
|
+
grammar: None,
|
|
1092
1127
|
name: "profile/prefix".into(),
|
|
1093
1128
|
components: vec![source_component(None, Some("weights/"))],
|
|
1094
1129
|
}];
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
//! checkpoint's head interleave is reordered before training, not exported again
|
|
7
7
|
//! in adapter state dictionaries. This is structural conversion, not permission
|
|
8
8
|
//! to apply a FL2VA-trained adapter to REF2VA. Runtime owns that binding and never
|
|
9
|
-
//! parses foreign keys.
|
|
9
|
+
//! parses foreign keys. This planner is also the key grammar of the
|
|
10
|
+
//! `h3/native-lora-*/2` profiles: any complete pairs on the reviewed projections.
|
|
10
11
|
|
|
11
12
|
use std::collections::BTreeMap;
|
|
12
13
|
|
|
@@ -160,6 +161,29 @@ pub(super) fn plan(
|
|
|
160
161
|
plain: &EncodingSpec,
|
|
161
162
|
p: &mut Plan,
|
|
162
163
|
) -> Result<()> {
|
|
164
|
+
let adaln: Vec<&str> = header
|
|
165
|
+
.tensors
|
|
166
|
+
.iter()
|
|
167
|
+
.map(|tensor| tensor.key.as_str())
|
|
168
|
+
.filter(|key| key.contains("adaln_proj"))
|
|
169
|
+
.collect();
|
|
170
|
+
if !adaln.is_empty() {
|
|
171
|
+
// Named in full: these are the factors a conversion would have to drop.
|
|
172
|
+
let more = match adaln.len().saturating_sub(4) {
|
|
173
|
+
0 => String::new(),
|
|
174
|
+
more => format!(", and {more} more"),
|
|
175
|
+
};
|
|
176
|
+
return refuse(
|
|
177
|
+
Code::ADAPTER_TARGET_UNSUPPORTED,
|
|
178
|
+
format!(
|
|
179
|
+
"{} AdaLN modulation factor(s) ({}{more}). h3.lora/2 maps attention and MLP \
|
|
180
|
+
projections only, and dropping AdaLN pairs changes the adapter. Use a repack \
|
|
181
|
+
with the AdaLN pairs removed, or store the file as-is.",
|
|
182
|
+
adaln.len(),
|
|
183
|
+
adaln[..adaln.len().min(4)].join(", "),
|
|
184
|
+
),
|
|
185
|
+
);
|
|
186
|
+
}
|
|
163
187
|
let mut pairs: BTreeMap<String, Pair<'_>> = BTreeMap::new();
|
|
164
188
|
for tensor in &header.tensors {
|
|
165
189
|
if !matches!(tensor.dtype, Dtype::F16 | Dtype::Bf16 | Dtype::F32) {
|