invarlock 0.3.6__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.6/src/invarlock.egg-info → invarlock-0.3.7}/PKG-INFO +23 -9
- {invarlock-0.3.6 → invarlock-0.3.7}/README.md +21 -8
- {invarlock-0.3.6 → invarlock-0.3.7}/pyproject.toml +7 -4
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/__init__.py +2 -2
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/adapters/__init__.py +10 -14
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/adapters/auto.py +35 -40
- {invarlock-0.3.6 → 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.6/src/invarlock/adapters/hf_onnx.py → invarlock-0.3.7/src/invarlock/adapters/hf_causal_onnx.py +3 -3
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/adapters/hf_mixin.py +25 -4
- invarlock-0.3.6/src/invarlock/adapters/hf_bert.py → invarlock-0.3.7/src/invarlock/adapters/hf_mlm.py +4 -11
- invarlock-0.3.6/src/invarlock/adapters/hf_t5.py → invarlock-0.3.7/src/invarlock/adapters/hf_seq2seq.py +9 -9
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/adapter_auto.py +31 -21
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/app.py +73 -2
- invarlock-0.3.7/src/invarlock/cli/commands/certify.py +963 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/doctor.py +8 -10
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/plugins.py +13 -9
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/report.py +233 -69
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/run.py +907 -183
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/verify.py +76 -11
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/config.py +1 -1
- {invarlock-0.3.6 → 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.6 → invarlock-0.3.7}/src/invarlock/cli/provenance.py +1 -1
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/bootstrap.py +1 -1
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/registry.py +9 -11
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/runner.py +111 -25
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/edits/quant_rtn.py +65 -37
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/bench.py +3 -3
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/data.py +68 -23
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/metrics.py +59 -1
- 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.6 → invarlock-0.3.7}/src/invarlock/guards/invariants.py +19 -10
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/rmt.py +2 -2
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/variance.py +2 -2
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/model_profile.py +48 -27
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/observability/health.py +6 -6
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/observability/metrics.py +108 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/certificate.py +159 -9
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/certificate_schema.py +1 -1
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/guards_analysis.py +154 -4
- invarlock-0.3.7/src/invarlock/reporting/html.py +82 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/normalizer.py +7 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/render.py +791 -431
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/report.py +39 -3
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/report_types.py +6 -1
- invarlock-0.3.7/src/invarlock/reporting/telemetry.py +86 -0
- {invarlock-0.3.6 → invarlock-0.3.7/src/invarlock.egg-info}/PKG-INFO +23 -9
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock.egg-info/SOURCES.txt +10 -5
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock.egg-info/entry_points.txt +5 -3
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock.egg-info/requires.txt +1 -0
- invarlock-0.3.6/src/invarlock/adapters/hf_gpt2.py +0 -404
- invarlock-0.3.6/src/invarlock/adapters/hf_llama.py +0 -487
- invarlock-0.3.6/src/invarlock/cli/commands/certify.py +0 -422
- invarlock-0.3.6/src/invarlock/reporting/html.py +0 -32
- {invarlock-0.3.6 → invarlock-0.3.7}/LICENSE +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/MANIFEST.in +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/setup.cfg +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/__main__.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/_data/runtime/profiles/ci_cpu.yaml +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/_data/runtime/profiles/release.yaml +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/_data/runtime/tiers.yaml +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/adapters/_capabilities.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/adapters/base.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/adapters/base_types.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/adapters/hf_loading.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/adapters/py.typed +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/assurance/__init__.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/calibration/__init__.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/calibration/spectral_null.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/calibration/variance_ve.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/__init__.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/__main__.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/_evidence.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/_json.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/__init__.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/calibrate.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/explain_gates.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/commands/export_html.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/constants.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/determinism.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/device.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/errors.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/overhead_utils.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/cli/utils.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/config.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/__init__.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/abi.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/api.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/auto_tuning.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/checkpoint.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/contracts.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/error_utils.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/events.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/exceptions.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/retry.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/core/types.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/edits/__init__.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/edits/_edit_utils.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/edits/_external_utils.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/edits/noop.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/edits/py.typed +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/edits/registry.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/__init__.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/bench_regression.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/bootstrap.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/primary_metric.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/probes/__init__.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/probes/fft.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/probes/mi.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/probes/post_attention.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/providers/base.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/providers/seq2seq.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/providers/text_lm.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/providers/vision_text.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/py.typed +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/eval/tail_stats.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/__init__.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/_contracts.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/_estimators.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/policies.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/py.typed +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/spectral.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards/tier_config.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards_ref/__init__.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards_ref/rmt_ref.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards_ref/spectral_ref.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/guards_ref/variance_ref.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/model_utils.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/observability/__init__.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/observability/alerting.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/observability/core.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/observability/exporters.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/observability/py.typed +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/observability/utils.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/plugins/__init__.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/plugins/hello_guard.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/plugins/hf_awq_adapter.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/plugins/hf_bnb_adapter.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/plugins/hf_gptq_adapter.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/plugins/py.typed +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/py.typed +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/__init__.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/dataset_hashing.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/policy_utils.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/primary_metric_utils.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/utils.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/reporting/validate.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/security.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/sparsity_utils.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/utils/__init__.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock/utils/digest.py +0 -0
- {invarlock-0.3.6 → invarlock-0.3.7}/src/invarlock.egg-info/dependency_links.txt +0 -0
- {invarlock-0.3.6 → 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).
|
|
@@ -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"
|
|
@@ -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).
|
|
@@ -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"
|
|
@@ -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
|
|
@@ -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
|
|
|
@@ -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
|
|