invarlock 0.3.5__tar.gz → 0.3.7__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.
- {invarlock-0.3.5/src/invarlock.egg-info → invarlock-0.3.7}/PKG-INFO +27 -13
- {invarlock-0.3.5 → invarlock-0.3.7}/README.md +25 -12
- {invarlock-0.3.5 → invarlock-0.3.7}/pyproject.toml +7 -4
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/__init__.py +2 -2
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/_data/runtime/tiers.yaml +57 -30
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/__init__.py +11 -15
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/auto.py +35 -40
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/capabilities.py +2 -2
- invarlock-0.3.7/src/invarlock/adapters/hf_causal.py +418 -0
- invarlock-0.3.5/src/invarlock/adapters/hf_onnx.py → invarlock-0.3.7/src/invarlock/adapters/hf_causal_onnx.py +3 -3
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/hf_mixin.py +25 -4
- invarlock-0.3.5/src/invarlock/adapters/hf_bert.py → invarlock-0.3.7/src/invarlock/adapters/hf_mlm.py +4 -11
- invarlock-0.3.5/src/invarlock/adapters/hf_t5.py → invarlock-0.3.7/src/invarlock/adapters/hf_seq2seq.py +9 -9
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/calibration/spectral_null.py +15 -10
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/calibration/variance_ve.py +0 -2
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/adapter_auto.py +31 -21
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/app.py +73 -2
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/calibrate.py +6 -2
- invarlock-0.3.7/src/invarlock/cli/commands/certify.py +963 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/doctor.py +11 -11
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/explain_gates.py +57 -8
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/plugins.py +13 -9
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/report.py +233 -69
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/run.py +1066 -244
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/verify.py +154 -15
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/config.py +22 -6
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/doctor_helpers.py +4 -5
- invarlock-0.3.7/src/invarlock/cli/output.py +193 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/provenance.py +1 -1
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/api.py +45 -5
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/auto_tuning.py +65 -20
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/bootstrap.py +1 -1
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/contracts.py +7 -1
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/registry.py +11 -13
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/runner.py +425 -75
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/edits/quant_rtn.py +65 -37
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/bench.py +3 -16
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/data.py +82 -51
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/metrics.py +63 -2
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/primary_metric.py +23 -0
- invarlock-0.3.7/src/invarlock/eval/tail_stats.py +230 -0
- invarlock-0.3.7/src/invarlock/eval/tasks/__init__.py +12 -0
- invarlock-0.3.7/src/invarlock/eval/tasks/classification.py +48 -0
- invarlock-0.3.7/src/invarlock/eval/tasks/qa.py +36 -0
- invarlock-0.3.7/src/invarlock/eval/tasks/text_generation.py +102 -0
- invarlock-0.3.7/src/invarlock/guards/_estimators.py +154 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/invariants.py +19 -10
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/policies.py +16 -6
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/rmt.py +627 -546
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/spectral.py +348 -110
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/tier_config.py +32 -30
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/variance.py +7 -31
- invarlock-0.3.7/src/invarlock/guards_ref/rmt_ref.py +40 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/model_profile.py +90 -42
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/observability/health.py +6 -6
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/observability/metrics.py +108 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/certificate.py +384 -55
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/certificate_schema.py +3 -2
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/dataset_hashing.py +15 -2
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/guards_analysis.py +350 -277
- invarlock-0.3.7/src/invarlock/reporting/html.py +82 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/normalizer.py +13 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/policy_utils.py +38 -36
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/primary_metric_utils.py +71 -17
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/render.py +852 -431
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/report.py +40 -4
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/report_types.py +11 -3
- invarlock-0.3.7/src/invarlock/reporting/telemetry.py +86 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/validate.py +1 -18
- {invarlock-0.3.5 → invarlock-0.3.7/src/invarlock.egg-info}/PKG-INFO +27 -13
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock.egg-info/SOURCES.txt +12 -5
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock.egg-info/entry_points.txt +5 -3
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock.egg-info/requires.txt +1 -0
- invarlock-0.3.5/src/invarlock/adapters/hf_gpt2.py +0 -404
- invarlock-0.3.5/src/invarlock/adapters/hf_llama.py +0 -487
- invarlock-0.3.5/src/invarlock/cli/commands/certify.py +0 -403
- invarlock-0.3.5/src/invarlock/guards_ref/rmt_ref.py +0 -40
- invarlock-0.3.5/src/invarlock/reporting/html.py +0 -32
- {invarlock-0.3.5 → invarlock-0.3.7}/LICENSE +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/MANIFEST.in +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/setup.cfg +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/__main__.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/_data/runtime/profiles/ci_cpu.yaml +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/_data/runtime/profiles/release.yaml +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/_capabilities.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/base.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/base_types.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/hf_loading.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/adapters/py.typed +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/assurance/__init__.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/calibration/__init__.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/__init__.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/__main__.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/_evidence.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/_json.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/__init__.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/commands/export_html.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/constants.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/determinism.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/device.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/errors.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/overhead_utils.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/cli/utils.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/config.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/__init__.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/abi.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/checkpoint.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/error_utils.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/events.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/exceptions.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/retry.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/core/types.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/edits/__init__.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/edits/_edit_utils.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/edits/_external_utils.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/edits/noop.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/edits/py.typed +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/edits/registry.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/__init__.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/bench_regression.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/bootstrap.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/probes/__init__.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/probes/fft.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/probes/mi.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/probes/post_attention.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/providers/base.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/providers/seq2seq.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/providers/text_lm.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/providers/vision_text.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/eval/py.typed +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/__init__.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/_contracts.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards/py.typed +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards_ref/__init__.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards_ref/spectral_ref.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/guards_ref/variance_ref.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/model_utils.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/observability/__init__.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/observability/alerting.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/observability/core.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/observability/exporters.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/observability/py.typed +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/observability/utils.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/plugins/__init__.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/plugins/hello_guard.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/plugins/hf_awq_adapter.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/plugins/hf_bnb_adapter.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/plugins/hf_gptq_adapter.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/plugins/py.typed +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/py.typed +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/__init__.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/reporting/utils.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/security.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/sparsity_utils.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/utils/__init__.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock/utils/digest.py +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock.egg-info/dependency_links.txt +0 -0
- {invarlock-0.3.5 → invarlock-0.3.7}/src/invarlock.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: invarlock
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.7
|
|
4
4
|
Summary: Edit‑agnostic robustness certificates for weight edits (InvarLock framework)
|
|
5
5
|
Author-email: InvarLock Team <oss@invarlock.dev>
|
|
6
6
|
Maintainer-email: InvarLock Maintainers <support@invarlock.dev>
|
|
@@ -31,6 +31,7 @@ Requires-Dist: scikit-learn>=1.4
|
|
|
31
31
|
Requires-Dist: pydantic>=2.0
|
|
32
32
|
Requires-Dist: rich>=13.0
|
|
33
33
|
Requires-Dist: pyyaml>=6.0
|
|
34
|
+
Requires-Dist: markdown>=3.5
|
|
34
35
|
Requires-Dist: psutil>=5.9
|
|
35
36
|
Requires-Dist: hypothesis>=6.98
|
|
36
37
|
Requires-Dist: typing_extensions>=4.7
|
|
@@ -110,9 +111,9 @@ In short: certify that weight edits (e.g., quantization) preserve quality. If
|
|
|
110
111
|
they don’t, roll back safely.
|
|
111
112
|
|
|
112
113
|
Technical: edit‑agnostic guard pipeline (invariants → spectral → RMT →
|
|
113
|
-
variance) producing a machine‑readable
|
|
114
|
+
variance) producing a machine‑readable Evaluation Certificate.
|
|
114
115
|
|
|
115
|
-
> **Status:** 0.3.
|
|
116
|
+
> **Status:** 0.3.7 (pre‑1.0). Until 1.0, **minor** releases may be
|
|
116
117
|
> breaking. See CLI help and the CHANGELOG for updates.
|
|
117
118
|
|
|
118
119
|
[](https://github.com/invarlock/invarlock/actions/workflows/ci.yml)
|
|
@@ -127,7 +128,20 @@ For guidance on where to ask questions, how to report bugs, and what to expect i
|
|
|
127
128
|
|
|
128
129
|
## 🚀 Quick start (no repo clone)
|
|
129
130
|
|
|
130
|
-
|
|
131
|
+
Notebooks (Colab):
|
|
132
|
+
|
|
133
|
+
- [](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_quickstart_cpu.ipynb)
|
|
134
|
+
`invarlock_quickstart_cpu.ipynb` — install + certify + verify + HTML export (CPU-friendly)
|
|
135
|
+
- [](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_compare_certify.ipynb)
|
|
136
|
+
`invarlock_compare_certify.ipynb` — Compare & Certify (BYOE) end-to-end
|
|
137
|
+
- [](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_certificate_deep_dive.ipynb)
|
|
138
|
+
`invarlock_certificate_deep_dive.ipynb` — reading and interpreting certificates
|
|
139
|
+
- [](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_custom_datasets.ipynb)
|
|
140
|
+
`invarlock_custom_datasets.ipynb` — Bring Your Own Data (BYOD) with `local_jsonl`
|
|
141
|
+
- [](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_python_api.ipynb)
|
|
142
|
+
`invarlock_python_api.ipynb` — programmatic Python API usage
|
|
143
|
+
- [](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_policy_tiers.ipynb)
|
|
144
|
+
`invarlock_policy_tiers.ipynb` — Conservative vs Balanced vs Aggressive tier comparison
|
|
131
145
|
|
|
132
146
|
```bash
|
|
133
147
|
# Install with HF adapters
|
|
@@ -146,8 +160,8 @@ This produces `reports/.../evaluation.cert.json` with paired metrics
|
|
|
146
160
|
(ppl/accuracy), structural deltas, spectral/RMT stats, variance‑estimator
|
|
147
161
|
provenance, seeds/hashes, pairing metrics, and a policy digest.
|
|
148
162
|
|
|
149
|
-
> **Calibration note:** tier thresholds and window sizes are piloted on GPT‑2 small
|
|
150
|
-
> BERT base
|
|
163
|
+
> **Calibration note:** tier thresholds and window sizes are piloted on GPT‑2 small
|
|
164
|
+
> and BERT base (see `docs/assurance/09-tier-v1-calibration.md`). For
|
|
151
165
|
> calibrated Balanced/Conservative certs, use the preset‑based CI/Release examples
|
|
152
166
|
> below. `INVARLOCK_TINY_RELAX` dev runs relax sample‑size floors and are intended
|
|
153
167
|
> only for small smoke tests (not release evidence).
|
|
@@ -170,7 +184,7 @@ Quick examples (repo presets, CPU; repo clone required for preset paths):
|
|
|
170
184
|
pip install "invarlock[hf]"
|
|
171
185
|
|
|
172
186
|
# Preflight a config (JSON diagnostics)
|
|
173
|
-
invarlock doctor --config configs/
|
|
187
|
+
invarlock doctor --config configs/presets/causal_lm/wikitext2_512.yaml --json
|
|
174
188
|
|
|
175
189
|
# Calibrated GPT‑2 small (recommended starting point; repo preset)
|
|
176
190
|
INVARLOCK_ALLOW_NETWORK=1 INVARLOCK_DEDUP_TEXTS=1 \
|
|
@@ -179,7 +193,7 @@ invarlock certify \
|
|
|
179
193
|
--subject gpt2 \
|
|
180
194
|
--adapter auto \
|
|
181
195
|
--profile release \
|
|
182
|
-
--preset configs/
|
|
196
|
+
--preset configs/presets/causal_lm/wikitext2_512.yaml
|
|
183
197
|
|
|
184
198
|
# Tiny causal LM smoke (out‑of‑calibration, dev‑only)
|
|
185
199
|
INVARLOCK_ALLOW_NETWORK=1 \
|
|
@@ -249,7 +263,7 @@ INVARLOCK_ALLOW_NETWORK=1 invarlock certify \
|
|
|
249
263
|
--subject gpt2 \
|
|
250
264
|
--adapter auto \
|
|
251
265
|
--profile ci \
|
|
252
|
-
--preset configs/
|
|
266
|
+
--preset configs/presets/causal_lm/wikitext2_512.yaml
|
|
253
267
|
```
|
|
254
268
|
|
|
255
269
|
- Offline/air‑gapped usage: pre‑download to a cache, then run with network
|
|
@@ -319,7 +333,7 @@ needed (e.g., `CUDA_VISIBLE_DEVICES`).
|
|
|
319
333
|
3. **RMT** (ε-band on outliers; monitor or gate per tier)
|
|
320
334
|
4. **Variance (VE)** (predictive paired ΔlogNLL gate; tiered sidedness)
|
|
321
335
|
|
|
322
|
-
- **
|
|
336
|
+
- **Evaluation Certificate (schema v1, PM‑only)**: Primary Metric (ppl or
|
|
323
337
|
accuracy) with paired statistics, structural deltas, spectral/RMT stats, VE
|
|
324
338
|
provenance, seeds/hashes, pairing metrics, and **policy digest**. Canonical
|
|
325
339
|
artifact: `reports/.../evaluation.cert.json`.
|
|
@@ -440,7 +454,7 @@ Key checks enforced by balanced policy (summary):
|
|
|
440
454
|
```yaml
|
|
441
455
|
model:
|
|
442
456
|
id: "<set-your-model-id>" # e.g., gpt2
|
|
443
|
-
adapter: "
|
|
457
|
+
adapter: "hf_causal"
|
|
444
458
|
device: "cpu"
|
|
445
459
|
dataset:
|
|
446
460
|
provider: "wikitext2"
|
|
@@ -488,7 +502,7 @@ output:
|
|
|
488
502
|
Run preflight checks before a run to catch misconfigurations early:
|
|
489
503
|
|
|
490
504
|
```bash
|
|
491
|
-
invarlock doctor --config configs/
|
|
505
|
+
invarlock doctor --config configs/presets/causal_lm/wikitext2_512.yaml --json
|
|
492
506
|
```
|
|
493
507
|
|
|
494
508
|
Text mode emits lines prefixed with `ERROR:`, `WARNING:`, or `NOTE:` and stable
|
|
@@ -505,7 +519,7 @@ invarlock/
|
|
|
505
519
|
│ ├─ invarlock/ # core + unified namespace
|
|
506
520
|
│ │ ├─ core/ # runner, registry, contracts, events, ABI
|
|
507
521
|
│ │ ├─ cli/ # console app + command wrappers (unified import path)
|
|
508
|
-
│ │ ├─ adapters/ #
|
|
522
|
+
│ │ ├─ adapters/ # model adapters (HF causal/MLM/seq2seq/onnx)
|
|
509
523
|
│ │ ├─ edits/ # quant_rtn
|
|
510
524
|
│ │ ├─ guards/ # invariants, spectral, rmt, variance
|
|
511
525
|
│ │ ├─ eval/ # evaluation metrics and helpers
|
|
@@ -4,9 +4,9 @@ In short: certify that weight edits (e.g., quantization) preserve quality. If
|
|
|
4
4
|
they don’t, roll back safely.
|
|
5
5
|
|
|
6
6
|
Technical: edit‑agnostic guard pipeline (invariants → spectral → RMT →
|
|
7
|
-
variance) producing a machine‑readable
|
|
7
|
+
variance) producing a machine‑readable Evaluation Certificate.
|
|
8
8
|
|
|
9
|
-
> **Status:** 0.3.
|
|
9
|
+
> **Status:** 0.3.7 (pre‑1.0). Until 1.0, **minor** releases may be
|
|
10
10
|
> breaking. See CLI help and the CHANGELOG for updates.
|
|
11
11
|
|
|
12
12
|
[](https://github.com/invarlock/invarlock/actions/workflows/ci.yml)
|
|
@@ -21,7 +21,20 @@ For guidance on where to ask questions, how to report bugs, and what to expect i
|
|
|
21
21
|
|
|
22
22
|
## 🚀 Quick start (no repo clone)
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
Notebooks (Colab):
|
|
25
|
+
|
|
26
|
+
- [](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_quickstart_cpu.ipynb)
|
|
27
|
+
`invarlock_quickstart_cpu.ipynb` — install + certify + verify + HTML export (CPU-friendly)
|
|
28
|
+
- [](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_compare_certify.ipynb)
|
|
29
|
+
`invarlock_compare_certify.ipynb` — Compare & Certify (BYOE) end-to-end
|
|
30
|
+
- [](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_certificate_deep_dive.ipynb)
|
|
31
|
+
`invarlock_certificate_deep_dive.ipynb` — reading and interpreting certificates
|
|
32
|
+
- [](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_custom_datasets.ipynb)
|
|
33
|
+
`invarlock_custom_datasets.ipynb` — Bring Your Own Data (BYOD) with `local_jsonl`
|
|
34
|
+
- [](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_python_api.ipynb)
|
|
35
|
+
`invarlock_python_api.ipynb` — programmatic Python API usage
|
|
36
|
+
- [](https://colab.research.google.com/github/invarlock/invarlock/blob/main/notebooks/invarlock_policy_tiers.ipynb)
|
|
37
|
+
`invarlock_policy_tiers.ipynb` — Conservative vs Balanced vs Aggressive tier comparison
|
|
25
38
|
|
|
26
39
|
```bash
|
|
27
40
|
# Install with HF adapters
|
|
@@ -40,8 +53,8 @@ This produces `reports/.../evaluation.cert.json` with paired metrics
|
|
|
40
53
|
(ppl/accuracy), structural deltas, spectral/RMT stats, variance‑estimator
|
|
41
54
|
provenance, seeds/hashes, pairing metrics, and a policy digest.
|
|
42
55
|
|
|
43
|
-
> **Calibration note:** tier thresholds and window sizes are piloted on GPT‑2 small
|
|
44
|
-
> BERT base
|
|
56
|
+
> **Calibration note:** tier thresholds and window sizes are piloted on GPT‑2 small
|
|
57
|
+
> and BERT base (see `docs/assurance/09-tier-v1-calibration.md`). For
|
|
45
58
|
> calibrated Balanced/Conservative certs, use the preset‑based CI/Release examples
|
|
46
59
|
> below. `INVARLOCK_TINY_RELAX` dev runs relax sample‑size floors and are intended
|
|
47
60
|
> only for small smoke tests (not release evidence).
|
|
@@ -64,7 +77,7 @@ Quick examples (repo presets, CPU; repo clone required for preset paths):
|
|
|
64
77
|
pip install "invarlock[hf]"
|
|
65
78
|
|
|
66
79
|
# Preflight a config (JSON diagnostics)
|
|
67
|
-
invarlock doctor --config configs/
|
|
80
|
+
invarlock doctor --config configs/presets/causal_lm/wikitext2_512.yaml --json
|
|
68
81
|
|
|
69
82
|
# Calibrated GPT‑2 small (recommended starting point; repo preset)
|
|
70
83
|
INVARLOCK_ALLOW_NETWORK=1 INVARLOCK_DEDUP_TEXTS=1 \
|
|
@@ -73,7 +86,7 @@ invarlock certify \
|
|
|
73
86
|
--subject gpt2 \
|
|
74
87
|
--adapter auto \
|
|
75
88
|
--profile release \
|
|
76
|
-
--preset configs/
|
|
89
|
+
--preset configs/presets/causal_lm/wikitext2_512.yaml
|
|
77
90
|
|
|
78
91
|
# Tiny causal LM smoke (out‑of‑calibration, dev‑only)
|
|
79
92
|
INVARLOCK_ALLOW_NETWORK=1 \
|
|
@@ -143,7 +156,7 @@ INVARLOCK_ALLOW_NETWORK=1 invarlock certify \
|
|
|
143
156
|
--subject gpt2 \
|
|
144
157
|
--adapter auto \
|
|
145
158
|
--profile ci \
|
|
146
|
-
--preset configs/
|
|
159
|
+
--preset configs/presets/causal_lm/wikitext2_512.yaml
|
|
147
160
|
```
|
|
148
161
|
|
|
149
162
|
- Offline/air‑gapped usage: pre‑download to a cache, then run with network
|
|
@@ -213,7 +226,7 @@ needed (e.g., `CUDA_VISIBLE_DEVICES`).
|
|
|
213
226
|
3. **RMT** (ε-band on outliers; monitor or gate per tier)
|
|
214
227
|
4. **Variance (VE)** (predictive paired ΔlogNLL gate; tiered sidedness)
|
|
215
228
|
|
|
216
|
-
- **
|
|
229
|
+
- **Evaluation Certificate (schema v1, PM‑only)**: Primary Metric (ppl or
|
|
217
230
|
accuracy) with paired statistics, structural deltas, spectral/RMT stats, VE
|
|
218
231
|
provenance, seeds/hashes, pairing metrics, and **policy digest**. Canonical
|
|
219
232
|
artifact: `reports/.../evaluation.cert.json`.
|
|
@@ -334,7 +347,7 @@ Key checks enforced by balanced policy (summary):
|
|
|
334
347
|
```yaml
|
|
335
348
|
model:
|
|
336
349
|
id: "<set-your-model-id>" # e.g., gpt2
|
|
337
|
-
adapter: "
|
|
350
|
+
adapter: "hf_causal"
|
|
338
351
|
device: "cpu"
|
|
339
352
|
dataset:
|
|
340
353
|
provider: "wikitext2"
|
|
@@ -382,7 +395,7 @@ output:
|
|
|
382
395
|
Run preflight checks before a run to catch misconfigurations early:
|
|
383
396
|
|
|
384
397
|
```bash
|
|
385
|
-
invarlock doctor --config configs/
|
|
398
|
+
invarlock doctor --config configs/presets/causal_lm/wikitext2_512.yaml --json
|
|
386
399
|
```
|
|
387
400
|
|
|
388
401
|
Text mode emits lines prefixed with `ERROR:`, `WARNING:`, or `NOTE:` and stable
|
|
@@ -399,7 +412,7 @@ invarlock/
|
|
|
399
412
|
│ ├─ invarlock/ # core + unified namespace
|
|
400
413
|
│ │ ├─ core/ # runner, registry, contracts, events, ABI
|
|
401
414
|
│ │ ├─ cli/ # console app + command wrappers (unified import path)
|
|
402
|
-
│ │ ├─ adapters/ #
|
|
415
|
+
│ │ ├─ adapters/ # model adapters (HF causal/MLM/seq2seq/onnx)
|
|
403
416
|
│ │ ├─ edits/ # quant_rtn
|
|
404
417
|
│ │ ├─ guards/ # invariants, spectral, rmt, variance
|
|
405
418
|
│ │ ├─ eval/ # evaluation metrics and helpers
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "invarlock"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.7"
|
|
8
8
|
description = "Edit‑agnostic robustness certificates for weight edits (InvarLock framework)"
|
|
9
9
|
authors = [{ name = "InvarLock Team", email = "oss@invarlock.dev" }]
|
|
10
10
|
maintainers = [{ name = "InvarLock Maintainers", email = "support@invarlock.dev" }]
|
|
@@ -35,6 +35,7 @@ dependencies = [
|
|
|
35
35
|
"pydantic>=2.0",
|
|
36
36
|
"rich>=13.0",
|
|
37
37
|
"pyyaml>=6.0",
|
|
38
|
+
"markdown>=3.5",
|
|
38
39
|
"psutil>=5.9",
|
|
39
40
|
"hypothesis>=6.98",
|
|
40
41
|
"typing_extensions>=4.7",
|
|
@@ -161,9 +162,11 @@ invariants = "invarlock.guards:InvariantsGuard"
|
|
|
161
162
|
hello_guard = "invarlock.plugins:HelloGuard"
|
|
162
163
|
|
|
163
164
|
[project.entry-points."invarlock.adapters"]
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
165
|
+
hf_causal = "invarlock.adapters:HF_Causal_Adapter"
|
|
166
|
+
hf_mlm = "invarlock.adapters:HF_MLM_Adapter"
|
|
167
|
+
hf_seq2seq = "invarlock.adapters:HF_Seq2Seq_Adapter"
|
|
168
|
+
hf_causal_onnx = "invarlock.adapters:HF_Causal_ONNX_Adapter"
|
|
169
|
+
hf_auto = "invarlock.adapters:HF_Auto_Adapter"
|
|
167
170
|
hf_gptq = "invarlock.plugins.hf_gptq_adapter:HF_GPTQ_Adapter"
|
|
168
171
|
hf_awq = "invarlock.plugins.hf_awq_adapter:HF_AWQ_Adapter"
|
|
169
172
|
hf_bnb = "invarlock.plugins.hf_bnb_adapter:HF_BNB_Adapter"
|
|
@@ -6,13 +6,13 @@ Core runtime package — torch-independent utilities, configuration, and interfa
|
|
|
6
6
|
|
|
7
7
|
This package provides the foundation for the InvarLock GuardChain without heavy dependencies.
|
|
8
8
|
For torch-dependent functionality, see subpackages under `invarlock.*`:
|
|
9
|
-
- `invarlock.adapters`: Model adapters (HF
|
|
9
|
+
- `invarlock.adapters`: Model adapters (HF causal/MLM/seq2seq + auto)
|
|
10
10
|
- `invarlock.guards`: Safety mechanisms (invariants, spectral, RMT, variance)
|
|
11
11
|
- `invarlock.edits`: Built-in quantization and edit interfaces
|
|
12
12
|
- `invarlock.eval`: Metrics, guard-overhead checks, and certification
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
|
-
__version__ = "0.3.
|
|
15
|
+
__version__ = "0.3.7"
|
|
16
16
|
|
|
17
17
|
# Core exports - torch-independent
|
|
18
18
|
from .config import CFG, Defaults, get_default_config
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
# Tier
|
|
1
|
+
# Tier policy defaults (metrics gates + guard knobs) used at runtime.
|
|
2
2
|
#
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
3
|
+
# Balanced and Conservative values are calibrated/validated against pilot/null
|
|
4
|
+
# runs (Nov/Dec 2025) where applicable; Aggressive is research-oriented (not in
|
|
5
|
+
# the safety case).
|
|
6
|
+
#
|
|
7
|
+
# Rationale by key: docs/reference/tier-policy-catalog.md
|
|
8
|
+
# Calibration method: docs/assurance/09-tier-v1-calibration.md
|
|
9
|
+
# Provenance/digest: docs/assurance/11-policy-provenance.md
|
|
6
10
|
|
|
7
11
|
balanced:
|
|
8
12
|
metrics:
|
|
@@ -11,6 +15,13 @@ balanced:
|
|
|
11
15
|
min_tokens: 50000
|
|
12
16
|
hysteresis_ratio: 0.002
|
|
13
17
|
min_token_fraction: 0.01
|
|
18
|
+
pm_tail:
|
|
19
|
+
mode: warn
|
|
20
|
+
min_windows: 50
|
|
21
|
+
quantile: 0.95
|
|
22
|
+
quantile_max: 0.20
|
|
23
|
+
epsilon: 0.0001
|
|
24
|
+
mass_max: 1.0
|
|
14
25
|
accuracy:
|
|
15
26
|
delta_min_pp: -1.0
|
|
16
27
|
min_examples: 200
|
|
@@ -20,7 +31,7 @@ balanced:
|
|
|
20
31
|
deadband: 0.02
|
|
21
32
|
min_abs_adjust: 0.012
|
|
22
33
|
max_scale_step: 0.03
|
|
23
|
-
min_effect_lognll: 0.
|
|
34
|
+
min_effect_lognll: 0.0
|
|
24
35
|
predictive_one_sided: true
|
|
25
36
|
topk_backstop: 1
|
|
26
37
|
max_adjusted_modules: 1
|
|
@@ -33,10 +44,10 @@ balanced:
|
|
|
33
44
|
max_caps: 5
|
|
34
45
|
max_spectral_norm: null
|
|
35
46
|
family_caps:
|
|
36
|
-
ffn: 3.
|
|
37
|
-
attn: 3.
|
|
38
|
-
embed:
|
|
39
|
-
other:
|
|
47
|
+
ffn: 3.849
|
|
48
|
+
attn: 3.018
|
|
49
|
+
embed: 1.05
|
|
50
|
+
other: 0.0
|
|
40
51
|
multiple_testing:
|
|
41
52
|
method: bh
|
|
42
53
|
alpha: 0.05
|
|
@@ -44,12 +55,12 @@ balanced:
|
|
|
44
55
|
rmt_guard:
|
|
45
56
|
deadband: 0.10
|
|
46
57
|
margin: 1.5
|
|
47
|
-
epsilon_default: 0.
|
|
58
|
+
epsilon_default: 0.01
|
|
48
59
|
epsilon_by_family:
|
|
49
|
-
ffn: 0.
|
|
50
|
-
attn: 0.
|
|
51
|
-
embed: 0.
|
|
52
|
-
other: 0.
|
|
60
|
+
ffn: 0.01
|
|
61
|
+
attn: 0.01
|
|
62
|
+
embed: 0.01
|
|
63
|
+
other: 0.01
|
|
53
64
|
|
|
54
65
|
conservative:
|
|
55
66
|
metrics:
|
|
@@ -58,6 +69,13 @@ conservative:
|
|
|
58
69
|
min_tokens: 20000
|
|
59
70
|
hysteresis_ratio: 0.002
|
|
60
71
|
min_token_fraction: 0.01
|
|
72
|
+
pm_tail:
|
|
73
|
+
mode: warn
|
|
74
|
+
min_windows: 50
|
|
75
|
+
quantile: 0.95
|
|
76
|
+
quantile_max: 0.12
|
|
77
|
+
epsilon: 0.0001
|
|
78
|
+
mass_max: 1.0
|
|
61
79
|
accuracy:
|
|
62
80
|
delta_min_pp: -0.5
|
|
63
81
|
min_examples: 200
|
|
@@ -67,7 +85,7 @@ conservative:
|
|
|
67
85
|
deadband: 0.03
|
|
68
86
|
min_abs_adjust: 0.02
|
|
69
87
|
max_scale_step: 0.015
|
|
70
|
-
min_effect_lognll: 0.
|
|
88
|
+
min_effect_lognll: 0.016
|
|
71
89
|
predictive_one_sided: false
|
|
72
90
|
topk_backstop: 0
|
|
73
91
|
max_adjusted_modules: 0
|
|
@@ -78,24 +96,25 @@ conservative:
|
|
|
78
96
|
deadband: 0.05
|
|
79
97
|
scope: ffn
|
|
80
98
|
max_caps: 3
|
|
99
|
+
max_spectral_norm: null
|
|
81
100
|
family_caps:
|
|
82
|
-
ffn:
|
|
101
|
+
ffn: 3.849
|
|
83
102
|
attn: 2.6
|
|
84
103
|
embed: 2.8
|
|
85
104
|
other: 2.8
|
|
86
105
|
multiple_testing:
|
|
87
106
|
method: bonferroni
|
|
88
|
-
alpha: 0.
|
|
107
|
+
alpha: 0.000625
|
|
89
108
|
m: 4
|
|
90
109
|
rmt_guard:
|
|
91
110
|
deadband: 0.05
|
|
92
111
|
margin: 1.3
|
|
93
|
-
epsilon_default: 0.
|
|
112
|
+
epsilon_default: 0.01
|
|
94
113
|
epsilon_by_family:
|
|
95
|
-
ffn: 0.
|
|
96
|
-
attn: 0.
|
|
97
|
-
embed: 0.
|
|
98
|
-
other: 0.
|
|
114
|
+
ffn: 0.01
|
|
115
|
+
attn: 0.01
|
|
116
|
+
embed: 0.01
|
|
117
|
+
other: 0.01
|
|
99
118
|
|
|
100
119
|
aggressive:
|
|
101
120
|
metrics:
|
|
@@ -104,6 +123,13 @@ aggressive:
|
|
|
104
123
|
min_tokens: 50000
|
|
105
124
|
hysteresis_ratio: 0.002
|
|
106
125
|
min_token_fraction: 0.01
|
|
126
|
+
pm_tail:
|
|
127
|
+
mode: warn
|
|
128
|
+
min_windows: 50
|
|
129
|
+
quantile: 0.95
|
|
130
|
+
quantile_max: 0.30
|
|
131
|
+
epsilon: 0.0001
|
|
132
|
+
mass_max: 1.0
|
|
107
133
|
accuracy:
|
|
108
134
|
delta_min_pp: -2.0
|
|
109
135
|
min_examples: 200
|
|
@@ -111,27 +137,28 @@ aggressive:
|
|
|
111
137
|
min_examples_fraction: 0.01
|
|
112
138
|
variance_guard:
|
|
113
139
|
deadband: 0.12
|
|
114
|
-
min_effect_lognll: 0.
|
|
140
|
+
min_effect_lognll: 0.033
|
|
115
141
|
spectral_guard:
|
|
116
142
|
sigma_quantile: 0.98
|
|
117
143
|
deadband: 0.15
|
|
118
144
|
scope: ffn
|
|
119
145
|
max_caps: 8
|
|
146
|
+
max_spectral_norm: null
|
|
120
147
|
family_caps:
|
|
121
|
-
ffn: 3.
|
|
148
|
+
ffn: 3.849
|
|
122
149
|
attn: 3.5
|
|
123
150
|
embed: 2.5
|
|
124
151
|
other: 3.5
|
|
125
152
|
multiple_testing:
|
|
126
153
|
method: bh
|
|
127
|
-
alpha: 0.
|
|
154
|
+
alpha: 0.00078125
|
|
128
155
|
m: 4
|
|
129
156
|
rmt_guard:
|
|
130
157
|
deadband: 0.15
|
|
131
158
|
margin: 1.8
|
|
132
|
-
epsilon_default: 0.
|
|
159
|
+
epsilon_default: 0.01
|
|
133
160
|
epsilon_by_family:
|
|
134
|
-
ffn: 0.
|
|
135
|
-
attn: 0.
|
|
136
|
-
embed: 0.
|
|
137
|
-
other: 0.
|
|
161
|
+
ffn: 0.01
|
|
162
|
+
attn: 0.01
|
|
163
|
+
embed: 0.01
|
|
164
|
+
other: 0.01
|
|
@@ -29,13 +29,11 @@ from .capabilities import (
|
|
|
29
29
|
)
|
|
30
30
|
|
|
31
31
|
_LAZY_MAP = {
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"HF_Causal_Auto_Adapter": ".auto",
|
|
38
|
-
"HF_MLM_Auto_Adapter": ".auto",
|
|
32
|
+
"HF_Causal_Adapter": ".hf_causal",
|
|
33
|
+
"HF_MLM_Adapter": ".hf_mlm",
|
|
34
|
+
"HF_Seq2Seq_Adapter": ".hf_seq2seq",
|
|
35
|
+
"HF_Causal_ONNX_Adapter": ".hf_causal_onnx",
|
|
36
|
+
"HF_Auto_Adapter": ".auto",
|
|
39
37
|
}
|
|
40
38
|
|
|
41
39
|
|
|
@@ -76,7 +74,7 @@ class _RemovedComponent:
|
|
|
76
74
|
return _RemovedComponent(self._name, self._replacement)
|
|
77
75
|
|
|
78
76
|
|
|
79
|
-
# Placeholders for removed
|
|
77
|
+
# Placeholders for removed utilities referenced in tests
|
|
80
78
|
HF_Pythia_Adapter = _RemovedComponent("HF_Pythia_Adapter")
|
|
81
79
|
auto_tune_pruning_budget = _RemovedComponent("auto_tune_pruning_budget")
|
|
82
80
|
run_auto_invarlock = _RemovedComponent("run_auto_invarlock")
|
|
@@ -91,13 +89,11 @@ run_invarlock = _RemovedComponent("run_invarlock", "invarlock.cli.run")
|
|
|
91
89
|
quick_prune_gpt2 = _RemovedComponent("quick_prune_gpt2")
|
|
92
90
|
|
|
93
91
|
__all__ = [
|
|
94
|
-
"
|
|
95
|
-
"
|
|
96
|
-
"
|
|
97
|
-
"
|
|
98
|
-
"
|
|
99
|
-
"HF_Causal_Auto_Adapter",
|
|
100
|
-
"HF_MLM_Auto_Adapter",
|
|
92
|
+
"HF_Causal_Adapter",
|
|
93
|
+
"HF_MLM_Adapter",
|
|
94
|
+
"HF_Seq2Seq_Adapter",
|
|
95
|
+
"HF_Causal_ONNX_Adapter",
|
|
96
|
+
"HF_Auto_Adapter",
|
|
101
97
|
"BaseAdapter",
|
|
102
98
|
"AdapterConfig",
|
|
103
99
|
"AdapterInterface",
|
|
@@ -110,21 +110,26 @@ class _DelegatingAdapter(ModelAdapter):
|
|
|
110
110
|
|
|
111
111
|
def _load_adapter(self, adapter_name: str) -> ModelAdapter:
|
|
112
112
|
"""Load an adapter by name."""
|
|
113
|
-
if adapter_name == "
|
|
114
|
-
|
|
115
|
-
".
|
|
116
|
-
).
|
|
117
|
-
return
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
".
|
|
121
|
-
).
|
|
122
|
-
return
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
".
|
|
126
|
-
).
|
|
127
|
-
return
|
|
113
|
+
if adapter_name == "hf_causal":
|
|
114
|
+
HF_Causal_Adapter = _importlib.import_module(
|
|
115
|
+
".hf_causal", __package__
|
|
116
|
+
).HF_Causal_Adapter
|
|
117
|
+
return HF_Causal_Adapter()
|
|
118
|
+
if adapter_name == "hf_mlm":
|
|
119
|
+
HF_MLM_Adapter = _importlib.import_module(
|
|
120
|
+
".hf_mlm", __package__
|
|
121
|
+
).HF_MLM_Adapter
|
|
122
|
+
return HF_MLM_Adapter()
|
|
123
|
+
if adapter_name == "hf_seq2seq":
|
|
124
|
+
HF_Seq2Seq_Adapter = _importlib.import_module(
|
|
125
|
+
".hf_seq2seq", __package__
|
|
126
|
+
).HF_Seq2Seq_Adapter
|
|
127
|
+
return HF_Seq2Seq_Adapter()
|
|
128
|
+
if adapter_name == "hf_causal_onnx":
|
|
129
|
+
HF_Causal_ONNX_Adapter = _importlib.import_module(
|
|
130
|
+
".hf_causal_onnx", __package__
|
|
131
|
+
).HF_Causal_ONNX_Adapter
|
|
132
|
+
return HF_Causal_ONNX_Adapter()
|
|
128
133
|
elif adapter_name == "hf_bnb":
|
|
129
134
|
HF_BNB_Adapter = _importlib.import_module(
|
|
130
135
|
"invarlock.plugins.hf_bnb_adapter"
|
|
@@ -141,11 +146,11 @@ class _DelegatingAdapter(ModelAdapter):
|
|
|
141
146
|
).HF_GPTQ_Adapter
|
|
142
147
|
return HF_GPTQ_Adapter()
|
|
143
148
|
else:
|
|
144
|
-
# Default to
|
|
145
|
-
|
|
146
|
-
".
|
|
147
|
-
).
|
|
148
|
-
return
|
|
149
|
+
# Default to causal adapter
|
|
150
|
+
HF_Causal_Adapter = _importlib.import_module(
|
|
151
|
+
".hf_causal", __package__
|
|
152
|
+
).HF_Causal_Adapter
|
|
153
|
+
return HF_Causal_Adapter()
|
|
149
154
|
|
|
150
155
|
def _ensure_delegate_from_id(self, model_id: str) -> ModelAdapter:
|
|
151
156
|
if self._delegate is not None:
|
|
@@ -172,14 +177,16 @@ class _DelegatingAdapter(ModelAdapter):
|
|
|
172
177
|
self._delegate = self._load_adapter(quant_adapter)
|
|
173
178
|
return self._delegate
|
|
174
179
|
|
|
175
|
-
# Fall back to class
|
|
180
|
+
# Fall back to lightweight class-name inspection (no transformers import).
|
|
176
181
|
cls_name = getattr(model, "__class__", type(model)).__name__.lower()
|
|
177
|
-
if any(k in cls_name for k in ["
|
|
178
|
-
self._delegate = self._load_adapter("
|
|
179
|
-
elif any(k in cls_name for k in ["bert", "roberta", "albert", "deberta"]):
|
|
180
|
-
self._delegate = self._load_adapter("hf_bert")
|
|
182
|
+
if any(k in cls_name for k in ["bert", "roberta", "albert", "deberta"]):
|
|
183
|
+
self._delegate = self._load_adapter("hf_mlm")
|
|
181
184
|
else:
|
|
182
|
-
|
|
185
|
+
cfg = getattr(model, "config", None)
|
|
186
|
+
if getattr(cfg, "is_encoder_decoder", False):
|
|
187
|
+
self._delegate = self._load_adapter("hf_seq2seq")
|
|
188
|
+
else:
|
|
189
|
+
self._delegate = self._load_adapter("hf_causal")
|
|
183
190
|
return self._delegate
|
|
184
191
|
|
|
185
192
|
def can_handle(self, model: Any) -> bool: # pragma: no cover - trivial
|
|
@@ -206,21 +213,9 @@ class _DelegatingAdapter(ModelAdapter):
|
|
|
206
213
|
raise AttributeError(item)
|
|
207
214
|
|
|
208
215
|
|
|
209
|
-
class
|
|
210
|
-
name = "
|
|
216
|
+
class HF_Auto_Adapter(_DelegatingAdapter):
|
|
217
|
+
name = "hf_auto"
|
|
211
218
|
|
|
212
219
|
def load_model(self, model_id: str, device: str = "auto", **kwargs: Any) -> Any:
|
|
213
220
|
delegate = self._ensure_delegate_from_id(model_id)
|
|
214
221
|
return delegate.load_model(model_id, device=device, **kwargs)
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
class HF_MLM_Auto_Adapter(_DelegatingAdapter):
|
|
218
|
-
name = "hf_mlm_auto"
|
|
219
|
-
|
|
220
|
-
def load_model(self, model_id: str, device: str = "auto", **kwargs: Any) -> Any:
|
|
221
|
-
# Force BERT-like adapter for MLM families
|
|
222
|
-
HF_BERT_Adapter = _importlib.import_module(
|
|
223
|
-
".hf_bert", __package__
|
|
224
|
-
).HF_BERT_Adapter
|
|
225
|
-
self._delegate = HF_BERT_Adapter()
|
|
226
|
-
return self._delegate.load_model(model_id, device=device, **kwargs)
|
|
@@ -359,7 +359,7 @@ def _detect_weight_tying(model: Any) -> dict[str, str]:
|
|
|
359
359
|
tying: dict[str, str] = {}
|
|
360
360
|
|
|
361
361
|
# Common weight tying patterns
|
|
362
|
-
#
|
|
362
|
+
# Decoder embed_tokens style: lm_head.weight ↔ model.embed_tokens.weight
|
|
363
363
|
if hasattr(model, "lm_head") and hasattr(model, "model"):
|
|
364
364
|
inner = model.model
|
|
365
365
|
if hasattr(inner, "embed_tokens"):
|
|
@@ -408,7 +408,7 @@ def _detect_primary_metric(model: Any) -> str:
|
|
|
408
408
|
return "rouge"
|
|
409
409
|
return "ppl_seq2seq"
|
|
410
410
|
|
|
411
|
-
# Decoder-only models (GPT-like,
|
|
411
|
+
# Decoder-only models (GPT-like, RoPE-style)
|
|
412
412
|
return "ppl_causal"
|
|
413
413
|
|
|
414
414
|
|