axquant 1.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- axquant-1.3.0/.github/workflows/ci.yml +62 -0
- axquant-1.3.0/.github/workflows/release.yml +112 -0
- axquant-1.3.0/.gitignore +26 -0
- axquant-1.3.0/CHANGELOG.md +291 -0
- axquant-1.3.0/CONTRIBUTING.md +94 -0
- axquant-1.3.0/LICENSE +21 -0
- axquant-1.3.0/PKG-INFO +1049 -0
- axquant-1.3.0/README.md +1012 -0
- axquant-1.3.0/THIRD_PARTY_NOTICES.md +33 -0
- axquant-1.3.0/data/eval/coding.jsonl +15 -0
- axquant-1.3.0/data/eval/instruction.jsonl +15 -0
- axquant-1.3.0/data/eval/json.jsonl +15 -0
- axquant-1.3.0/data/eval/json_tool.jsonl +15 -0
- axquant-1.3.0/data/eval/long_context.jsonl +15 -0
- axquant-1.3.0/data/eval/multilingual.jsonl +15 -0
- axquant-1.3.0/data/eval/reasoning.jsonl +15 -0
- axquant-1.3.0/data/eval/tool.jsonl +15 -0
- axquant-1.3.0/docs/ci-root-causes.md +163 -0
- axquant-1.3.0/docs/compatibility.md +51 -0
- axquant-1.3.0/docs/flagship-certification.md +101 -0
- axquant-1.3.0/docs/known-issues.md +81 -0
- axquant-1.3.0/docs/migration-v1.1.md +74 -0
- axquant-1.3.0/docs/migration-v1.2.md +66 -0
- axquant-1.3.0/docs/model-fleet-v2.md +214 -0
- axquant-1.3.0/docs/roadmap/README.md +29 -0
- axquant-1.3.0/docs/roadmap/adr/0001-certification-freeze-discipline.md +40 -0
- axquant-1.3.0/docs/roadmap/adr/0002-gptq-act-order.md +53 -0
- axquant-1.3.0/docs/roadmap/adr/0003-kernel-latency-aware-cost-model.md +53 -0
- axquant-1.3.0/docs/roadmap/adr/0004-holdout-safe-interaction-optimization.md +48 -0
- axquant-1.3.0/docs/roadmap/adr/0005-sidecar-and-tower-quantization-scope.md +44 -0
- axquant-1.3.0/docs/roadmap/adr/0006-out-of-scope-tracks.md +42 -0
- axquant-1.3.0/docs/roadmap/implementation-plan.md +173 -0
- axquant-1.3.0/docs/roadmap/prd.md +173 -0
- axquant-1.3.0/docs/roadmap/tech-spec.md +240 -0
- axquant-1.3.0/examples/agent-protected.yaml +43 -0
- axquant-1.3.0/examples/benchmark-evidence-request.yaml +30 -0
- axquant-1.3.0/examples/expert-memory-tier-v0.1.yaml +77 -0
- axquant-1.3.0/examples/hardware-registry-request.yaml +18 -0
- axquant-1.3.0/examples/mtp-diagnose-request.yaml +50 -0
- axquant-1.3.0/examples/qwen36-27b-manual-v0.1.yaml +35 -0
- axquant-1.3.0/examples/qwen36-compatibility-request.yaml +20 -0
- axquant-1.3.0/examples/qwen36-experimental-2bit-v0.1.yaml +67 -0
- axquant-1.3.0/examples/refinement-execution-request.yaml +24 -0
- axquant-1.3.0/examples/release-audit-request.yaml +19 -0
- axquant-1.3.0/examples/release-validation-request.yaml +8 -0
- axquant-1.3.0/pyproject.toml +102 -0
- axquant-1.3.0/scripts/ci-local.sh +94 -0
- axquant-1.3.0/scripts/hf_to_mlx_bf16.py +270 -0
- axquant-1.3.0/scripts/index-ext4t-packages.py +370 -0
- axquant-1.3.0/scripts/migrate-to-ext4t.sh +404 -0
- axquant-1.3.0/scripts/plan-ext4t-from-index.py +590 -0
- axquant-1.3.0/scripts/prepare_development_model_card.py +30 -0
- axquant-1.3.0/scripts/setup-ext4t-hf.sh +449 -0
- axquant-1.3.0/scripts/studio-finalize-ext4t-layout.sh +189 -0
- axquant-1.3.0/scripts/sync-ext4t-hf-fleet.sh +531 -0
- axquant-1.3.0/scripts/sync-ext4t-peers.sh +363 -0
- axquant-1.3.0/src/axquant/__init__.py +5 -0
- axquant-1.3.0/src/axquant/__main__.py +3 -0
- axquant-1.3.0/src/axquant/activation_cache.py +512 -0
- axquant-1.3.0/src/axquant/analyzer.py +141 -0
- axquant-1.3.0/src/axquant/architectures/__init__.py +4 -0
- axquant-1.3.0/src/axquant/architectures/dense_family.py +419 -0
- axquant-1.3.0/src/axquant/architectures/nemotron3.py +156 -0
- axquant-1.3.0/src/axquant/architectures/qwen36.py +141 -0
- axquant-1.3.0/src/axquant/architectures/registry.py +105 -0
- axquant-1.3.0/src/axquant/architectures/types.py +19 -0
- axquant-1.3.0/src/axquant/artifact_paths.py +67 -0
- axquant-1.3.0/src/axquant/awq.py +271 -0
- axquant-1.3.0/src/axquant/benchmark.py +1532 -0
- axquant-1.3.0/src/axquant/benchmark_evidence.py +347 -0
- axquant-1.3.0/src/axquant/calibration.py +92 -0
- axquant-1.3.0/src/axquant/calibration_dataset.py +107 -0
- axquant-1.3.0/src/axquant/campaign.py +955 -0
- axquant-1.3.0/src/axquant/capture.py +818 -0
- axquant-1.3.0/src/axquant/capture_binding.py +150 -0
- axquant-1.3.0/src/axquant/certification/__init__.py +18 -0
- axquant-1.3.0/src/axquant/certification/common.py +226 -0
- axquant-1.3.0/src/axquant/certification/dispatch.py +75 -0
- axquant-1.3.0/src/axquant/certification/flagship.py +852 -0
- axquant-1.3.0/src/axquant/certification/packaging.py +123 -0
- axquant-1.3.0/src/axquant/certification/policy.py +26 -0
- axquant-1.3.0/src/axquant/certification/qwen3_next_direct.py +1832 -0
- axquant-1.3.0/src/axquant/certification/registry.py +127 -0
- axquant-1.3.0/src/axquant/claims.py +311 -0
- axquant-1.3.0/src/axquant/cli/__init__.py +2349 -0
- axquant-1.3.0/src/axquant/cli/_parser.py +1354 -0
- axquant-1.3.0/src/axquant/coding_sandbox.py +992 -0
- axquant-1.3.0/src/axquant/coding_suite.py +919 -0
- axquant-1.3.0/src/axquant/compatibility.py +380 -0
- axquant-1.3.0/src/axquant/converter.py +1436 -0
- axquant-1.3.0/src/axquant/data/__init__.py +0 -0
- axquant-1.3.0/src/axquant/data/convert_ladders.yaml +85 -0
- axquant-1.3.0/src/axquant/data/messages.yaml +18 -0
- axquant-1.3.0/src/axquant/data/profiles.yaml +118 -0
- axquant-1.3.0/src/axquant/data/quantizer_defaults.yaml +13 -0
- axquant-1.3.0/src/axquant/data/reference_calibration.jsonl +160 -0
- axquant-1.3.0/src/axquant/data/role_preferences.yaml +26 -0
- axquant-1.3.0/src/axquant/dataset_overlap.py +194 -0
- axquant-1.3.0/src/axquant/deferred.py +68 -0
- axquant-1.3.0/src/axquant/direct_quality.py +185 -0
- axquant-1.3.0/src/axquant/dwq.py +43 -0
- axquant-1.3.0/src/axquant/errors.py +50 -0
- axquant-1.3.0/src/axquant/experimental_bits.py +93 -0
- axquant-1.3.0/src/axquant/feasibility.py +583 -0
- axquant-1.3.0/src/axquant/gptq.py +347 -0
- axquant-1.3.0/src/axquant/hardware_registry.py +842 -0
- axquant-1.3.0/src/axquant/head_to_head.py +228 -0
- axquant-1.3.0/src/axquant/identity.py +155 -0
- axquant-1.3.0/src/axquant/inspector.py +654 -0
- axquant-1.3.0/src/axquant/kernel_latency.py +214 -0
- axquant-1.3.0/src/axquant/kv_exec.py +139 -0
- axquant-1.3.0/src/axquant/kv_probe.py +417 -0
- axquant-1.3.0/src/axquant/kv_quality.py +60 -0
- axquant-1.3.0/src/axquant/ladders.py +180 -0
- axquant-1.3.0/src/axquant/lifecycle.py +102 -0
- axquant-1.3.0/src/axquant/logging.py +22 -0
- axquant-1.3.0/src/axquant/manual.py +344 -0
- axquant-1.3.0/src/axquant/model_card.py +808 -0
- axquant-1.3.0/src/axquant/module_paths.py +199 -0
- axquant-1.3.0/src/axquant/mtp_sidecar.py +841 -0
- axquant-1.3.0/src/axquant/multimodal_backend.py +181 -0
- axquant-1.3.0/src/axquant/naming.py +106 -0
- axquant-1.3.0/src/axquant/numeric.py +39 -0
- axquant-1.3.0/src/axquant/package_data.py +52 -0
- axquant-1.3.0/src/axquant/pareto.py +79 -0
- axquant-1.3.0/src/axquant/planner.py +920 -0
- axquant-1.3.0/src/axquant/predicate.py +247 -0
- axquant-1.3.0/src/axquant/probe.py +1282 -0
- axquant-1.3.0/src/axquant/probe_capacity.py +261 -0
- axquant-1.3.0/src/axquant/profiles.py +55 -0
- axquant-1.3.0/src/axquant/publisher.py +672 -0
- axquant-1.3.0/src/axquant/quality.py +462 -0
- axquant-1.3.0/src/axquant/quantize.py +297 -0
- axquant-1.3.0/src/axquant/quantizers.py +786 -0
- axquant-1.3.0/src/axquant/recipes.py +234 -0
- axquant-1.3.0/src/axquant/recovery.py +392 -0
- axquant-1.3.0/src/axquant/refinement.py +1354 -0
- axquant-1.3.0/src/axquant/refinement_runner.py +611 -0
- axquant-1.3.0/src/axquant/release_audit.py +2109 -0
- axquant-1.3.0/src/axquant/release_exceptions.py +244 -0
- axquant-1.3.0/src/axquant/release_validation.py +151 -0
- axquant-1.3.0/src/axquant/reporting.py +1018 -0
- axquant-1.3.0/src/axquant/reproduction.py +285 -0
- axquant-1.3.0/src/axquant/revisions.py +11 -0
- axquant-1.3.0/src/axquant/role_policy.py +163 -0
- axquant-1.3.0/src/axquant/runtime.py +803 -0
- axquant-1.3.0/src/axquant/schema/__init__.py +535 -0
- axquant-1.3.0/src/axquant/schema/_base.py +27 -0
- axquant-1.3.0/src/axquant/schema/artifacts.py +2054 -0
- axquant-1.3.0/src/axquant/schema/campaign.py +647 -0
- axquant-1.3.0/src/axquant/schema/certification.py +844 -0
- axquant-1.3.0/src/axquant/schema/claims.py +116 -0
- axquant-1.3.0/src/axquant/schema/coding_suite.py +184 -0
- axquant-1.3.0/src/axquant/schema/enums.py +167 -0
- axquant-1.3.0/src/axquant/schema/flagship.py +55 -0
- axquant-1.3.0/src/axquant/schema/flagship_audit.py +276 -0
- axquant-1.3.0/src/axquant/schema/inventory.py +104 -0
- axquant-1.3.0/src/axquant/schema/kernel_latency.py +117 -0
- axquant-1.3.0/src/axquant/schema/lifecycle.py +189 -0
- axquant-1.3.0/src/axquant/schema/planning.py +747 -0
- axquant-1.3.0/src/axquant/schema/sensitivity.py +303 -0
- axquant-1.3.0/src/axquant/scoreboard.py +525 -0
- axquant-1.3.0/src/axquant/serde.py +156 -0
- axquant-1.3.0/src/axquant/simple_convert.py +305 -0
- axquant-1.3.0/src/axquant/source_prep.py +491 -0
- axquant-1.3.0/src/axquant/suites.py +329 -0
- axquant-1.3.0/src/axquant/support_policy.py +252 -0
- axquant-1.3.0/src/axquant/unified_sensitivity.py +192 -0
- axquant-1.3.0/src/axquant/validator.py +696 -0
- axquant-1.3.0/src/axquant/versioning.py +70 -0
- axquant-1.3.0/tests/_capture_helpers.py +73 -0
- axquant-1.3.0/tests/conftest.py +146 -0
- axquant-1.3.0/tests/test_activation_cache.py +561 -0
- axquant-1.3.0/tests/test_analyzer.py +85 -0
- axquant-1.3.0/tests/test_architectures.py +594 -0
- axquant-1.3.0/tests/test_artifact_paths.py +36 -0
- axquant-1.3.0/tests/test_awq.py +139 -0
- axquant-1.3.0/tests/test_benchmark.py +1103 -0
- axquant-1.3.0/tests/test_benchmark_evidence.py +458 -0
- axquant-1.3.0/tests/test_calibration.py +104 -0
- axquant-1.3.0/tests/test_campaign.py +1024 -0
- axquant-1.3.0/tests/test_capture.py +761 -0
- axquant-1.3.0/tests/test_certification_dispatch.py +151 -0
- axquant-1.3.0/tests/test_claims.py +180 -0
- axquant-1.3.0/tests/test_cli.py +521 -0
- axquant-1.3.0/tests/test_coding_suite.py +595 -0
- axquant-1.3.0/tests/test_compatibility.py +559 -0
- axquant-1.3.0/tests/test_converter.py +1464 -0
- axquant-1.3.0/tests/test_dataset_overlap.py +103 -0
- axquant-1.3.0/tests/test_documentation.py +123 -0
- axquant-1.3.0/tests/test_dwq.py +42 -0
- axquant-1.3.0/tests/test_eval_datasets.py +37 -0
- axquant-1.3.0/tests/test_experimental_bits_qp3.py +221 -0
- axquant-1.3.0/tests/test_ext4t_index_plan.py +305 -0
- axquant-1.3.0/tests/test_feasibility.py +556 -0
- axquant-1.3.0/tests/test_flagship_release_audit.py +871 -0
- axquant-1.3.0/tests/test_gptq.py +311 -0
- axquant-1.3.0/tests/test_hardware_registry.py +559 -0
- axquant-1.3.0/tests/test_head_to_head.py +209 -0
- axquant-1.3.0/tests/test_hf_to_mlx_bf16.py +146 -0
- axquant-1.3.0/tests/test_identity.py +167 -0
- axquant-1.3.0/tests/test_inspector.py +654 -0
- axquant-1.3.0/tests/test_integration_mac.py +339 -0
- axquant-1.3.0/tests/test_integration_pipeline.py +209 -0
- axquant-1.3.0/tests/test_kernel_latency.py +198 -0
- axquant-1.3.0/tests/test_kv_exec.py +31 -0
- axquant-1.3.0/tests/test_kv_probe.py +654 -0
- axquant-1.3.0/tests/test_kv_quality.py +251 -0
- axquant-1.3.0/tests/test_lifecycle.py +187 -0
- axquant-1.3.0/tests/test_manual.py +315 -0
- axquant-1.3.0/tests/test_model_card.py +418 -0
- axquant-1.3.0/tests/test_mtp_sidecar.py +569 -0
- axquant-1.3.0/tests/test_naming.py +44 -0
- axquant-1.3.0/tests/test_p0_p1_p2_productization.py +351 -0
- axquant-1.3.0/tests/test_package_data.py +74 -0
- axquant-1.3.0/tests/test_packaging.py +69 -0
- axquant-1.3.0/tests/test_pareto.py +206 -0
- axquant-1.3.0/tests/test_planner.py +804 -0
- axquant-1.3.0/tests/test_predicate.py +485 -0
- axquant-1.3.0/tests/test_probe.py +925 -0
- axquant-1.3.0/tests/test_profiles.py +20 -0
- axquant-1.3.0/tests/test_publication_privacy.py +134 -0
- axquant-1.3.0/tests/test_publisher.py +637 -0
- axquant-1.3.0/tests/test_quality.py +248 -0
- axquant-1.3.0/tests/test_quality_checks.py +120 -0
- axquant-1.3.0/tests/test_quantize.py +276 -0
- axquant-1.3.0/tests/test_quantizers.py +334 -0
- axquant-1.3.0/tests/test_qwen3_next_certification_schema.py +313 -0
- axquant-1.3.0/tests/test_qwen3_next_release_audit.py +1680 -0
- axquant-1.3.0/tests/test_recipe_bundle.py +354 -0
- axquant-1.3.0/tests/test_recovery_qp2.py +369 -0
- axquant-1.3.0/tests/test_reference_dataset.py +95 -0
- axquant-1.3.0/tests/test_refinement.py +1012 -0
- axquant-1.3.0/tests/test_refinement_runner.py +307 -0
- axquant-1.3.0/tests/test_release_audit.py +2189 -0
- axquant-1.3.0/tests/test_release_exceptions.py +302 -0
- axquant-1.3.0/tests/test_release_validation.py +373 -0
- axquant-1.3.0/tests/test_reporting.py +1356 -0
- axquant-1.3.0/tests/test_revisions.py +13 -0
- axquant-1.3.0/tests/test_role_policy_qp1.py +458 -0
- axquant-1.3.0/tests/test_runtime.py +941 -0
- axquant-1.3.0/tests/test_scoreboard.py +294 -0
- axquant-1.3.0/tests/test_serde.py +115 -0
- axquant-1.3.0/tests/test_simple_convert.py +241 -0
- axquant-1.3.0/tests/test_source_prep.py +321 -0
- axquant-1.3.0/tests/test_suites.py +83 -0
- axquant-1.3.0/tests/test_support_policy.py +123 -0
- axquant-1.3.0/tests/test_validator.py +464 -0
- axquant-1.3.0/tests/test_versioning.py +46 -0
- axquant-1.3.0/tests/test_workflows.py +40 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
lint:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v7
|
|
17
|
+
- uses: actions/setup-python@v7
|
|
18
|
+
with:
|
|
19
|
+
python-version: "3.13"
|
|
20
|
+
- name: Install dev dependencies
|
|
21
|
+
run: pip install -e ".[dev]"
|
|
22
|
+
- name: Ruff lint
|
|
23
|
+
run: ruff check .
|
|
24
|
+
- name: Ruff format
|
|
25
|
+
run: ruff format --check .
|
|
26
|
+
- name: mypy
|
|
27
|
+
run: mypy src
|
|
28
|
+
|
|
29
|
+
python-compatibility:
|
|
30
|
+
runs-on: ubuntu-latest
|
|
31
|
+
strategy:
|
|
32
|
+
fail-fast: false
|
|
33
|
+
matrix:
|
|
34
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
35
|
+
steps:
|
|
36
|
+
- uses: actions/checkout@v7
|
|
37
|
+
- uses: actions/setup-python@v7
|
|
38
|
+
with:
|
|
39
|
+
python-version: ${{ matrix.python-version }}
|
|
40
|
+
- name: Install dev dependencies
|
|
41
|
+
run: pip install -e ".[dev]"
|
|
42
|
+
- name: Run non-MLX tests
|
|
43
|
+
run: pytest -m "not integration"
|
|
44
|
+
|
|
45
|
+
test:
|
|
46
|
+
runs-on: macos-14
|
|
47
|
+
steps:
|
|
48
|
+
- uses: actions/checkout@v7
|
|
49
|
+
- uses: actions/setup-python@v7
|
|
50
|
+
with:
|
|
51
|
+
python-version: "3.13"
|
|
52
|
+
- name: Install with MLX extras
|
|
53
|
+
run: pip install -e ".[dev,mlx]"
|
|
54
|
+
- name: Run test suite
|
|
55
|
+
run: pytest -m "not integration"
|
|
56
|
+
- name: Run real-hardware integration suite
|
|
57
|
+
run: |
|
|
58
|
+
if test -f tests/test_integration_mac.py; then
|
|
59
|
+
pytest -m integration
|
|
60
|
+
else
|
|
61
|
+
echo "No tracked real-hardware integration tests yet"
|
|
62
|
+
fi
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*"]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
dist:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
permissions:
|
|
11
|
+
attestations: write
|
|
12
|
+
contents: write
|
|
13
|
+
id-token: write
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v7
|
|
16
|
+
- uses: actions/setup-python@v7
|
|
17
|
+
with:
|
|
18
|
+
python-version: "3.13"
|
|
19
|
+
- name: Verify tag matches package version
|
|
20
|
+
run: >-
|
|
21
|
+
python -c 'import os, tomllib; version =
|
|
22
|
+
tomllib.load(open("pyproject.toml", "rb"))["project"]["version"];
|
|
23
|
+
tag = os.environ["GITHUB_REF_NAME"];
|
|
24
|
+
assert tag == f"v{version}", f"tag {tag!r} does not match package v{version}"'
|
|
25
|
+
- name: Build sdist and wheel
|
|
26
|
+
run: |
|
|
27
|
+
pip install build
|
|
28
|
+
python -m build
|
|
29
|
+
- name: Generate SHA256SUMS
|
|
30
|
+
run: |
|
|
31
|
+
cd dist
|
|
32
|
+
shasum -a 256 -- * > SHA256SUMS.txt
|
|
33
|
+
- name: Attest build provenance
|
|
34
|
+
uses: actions/attest-build-provenance@v4
|
|
35
|
+
with:
|
|
36
|
+
subject-path: "dist/*"
|
|
37
|
+
- name: Extract curated release notes from CHANGELOG.md
|
|
38
|
+
run: >-
|
|
39
|
+
python -c 'import os, pathlib, re; version =
|
|
40
|
+
os.environ["GITHUB_REF_NAME"].removeprefix("v");
|
|
41
|
+
text = pathlib.Path("CHANGELOG.md").read_text(encoding="utf-8");
|
|
42
|
+
m = re.search(rf"^## \[{re.escape(version)}\][^\n]*\n(.*?)(?=^## \[|\Z)",
|
|
43
|
+
text, re.S | re.M);
|
|
44
|
+
assert m and m.group(1).strip(),
|
|
45
|
+
f"CHANGELOG.md has no notes section for {version}";
|
|
46
|
+
pathlib.Path("release-notes.md").write_text(m.group(1).strip() + "\n",
|
|
47
|
+
encoding="utf-8")'
|
|
48
|
+
- name: Upload artifacts to the GitHub Release
|
|
49
|
+
run: |
|
|
50
|
+
gh release view "${GITHUB_REF_NAME}" >/dev/null 2>&1 || \
|
|
51
|
+
gh release create "${GITHUB_REF_NAME}" --verify-tag \
|
|
52
|
+
--title "${GITHUB_REF_NAME}" --notes-file release-notes.md
|
|
53
|
+
gh release edit "${GITHUB_REF_NAME}" --title "${GITHUB_REF_NAME}"
|
|
54
|
+
gh release upload "${GITHUB_REF_NAME}" dist/* --clobber
|
|
55
|
+
env:
|
|
56
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
57
|
+
- name: Hand dists to the publish job
|
|
58
|
+
uses: actions/upload-artifact@v7
|
|
59
|
+
with:
|
|
60
|
+
name: dist
|
|
61
|
+
path: dist/*
|
|
62
|
+
retention-days: 1
|
|
63
|
+
- name: Note PyPI publish gate
|
|
64
|
+
run: |
|
|
65
|
+
if [ "${{ vars.ENABLE_PYPI_PUBLISH }}" = "true" ]; then
|
|
66
|
+
echo "ENABLE_PYPI_PUBLISH=true — pypi job will run Trusted Publishing."
|
|
67
|
+
else
|
|
68
|
+
echo "ENABLE_PYPI_PUBLISH is not true — pypi job skipped."
|
|
69
|
+
echo "GitHub Release assets are still published by this dist job."
|
|
70
|
+
echo "After registering a Trusted Publisher on pypi.org for"
|
|
71
|
+
echo "defai-digital/axquant workflow release.yml, set the repository"
|
|
72
|
+
echo "variable ENABLE_PYPI_PUBLISH=true and re-run Release."
|
|
73
|
+
echo "See docs/ci-root-causes.md."
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
# OIDC Trusted Publishing requires a matching publisher on pypi.org / test.pypi.org.
|
|
77
|
+
# Without that operator config, the exchange fails with invalid-publisher and reds
|
|
78
|
+
# every tag push even though GitHub Release assets already succeeded. Gate the job
|
|
79
|
+
# on repository variable ENABLE_PYPI_PUBLISH so Releases stay green until configured.
|
|
80
|
+
pypi:
|
|
81
|
+
needs: dist
|
|
82
|
+
if: ${{ vars.ENABLE_PYPI_PUBLISH == 'true' }}
|
|
83
|
+
runs-on: ubuntu-latest
|
|
84
|
+
permissions:
|
|
85
|
+
contents: read
|
|
86
|
+
id-token: write
|
|
87
|
+
steps:
|
|
88
|
+
- uses: actions/download-artifact@v8
|
|
89
|
+
with:
|
|
90
|
+
name: dist
|
|
91
|
+
path: dist
|
|
92
|
+
- name: Drop non-package files
|
|
93
|
+
run: rm -f dist/SHA256SUMS.txt
|
|
94
|
+
# Prerelease tags (vX.Y.ZrcN) go to TestPyPI; final tags go to PyPI.
|
|
95
|
+
- name: Publish to TestPyPI (prerelease)
|
|
96
|
+
if: contains(github.ref_name, 'rc')
|
|
97
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
98
|
+
with:
|
|
99
|
+
repository-url: https://test.pypi.org/legacy/
|
|
100
|
+
- name: Publish to PyPI
|
|
101
|
+
if: ${{ !contains(github.ref_name, 'rc') }}
|
|
102
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
103
|
+
- name: Trusted publisher guidance
|
|
104
|
+
if: failure()
|
|
105
|
+
run: |
|
|
106
|
+
cat <<'EOF'
|
|
107
|
+
PyPI Trusted Publishing failed (invalid-publisher is usually missing config).
|
|
108
|
+
Register a Trusted Publisher on pypi.org / test.pypi.org for:
|
|
109
|
+
owner=defai-digital repo=axquant workflow=release.yml
|
|
110
|
+
Environment: leave empty (this job does not set one).
|
|
111
|
+
Then keep ENABLE_PYPI_PUBLISH=true. Details: docs/ci-root-causes.md
|
|
112
|
+
EOF
|
axquant-1.3.0/.gitignore
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
.DS_Store
|
|
2
|
+
.coverage
|
|
3
|
+
.mypy_cache/
|
|
4
|
+
.pytest_cache/
|
|
5
|
+
.ruff_cache/
|
|
6
|
+
.venv/
|
|
7
|
+
.qoder/
|
|
8
|
+
.vscode/
|
|
9
|
+
.claude/
|
|
10
|
+
__pycache__/
|
|
11
|
+
build/
|
|
12
|
+
dist/
|
|
13
|
+
*.egg-info/
|
|
14
|
+
*.py[cod]
|
|
15
|
+
*.safetensors
|
|
16
|
+
*.gguf
|
|
17
|
+
*.npz
|
|
18
|
+
.env
|
|
19
|
+
credentials.json
|
|
20
|
+
# Local-only product/engineering notes and scratch (never publish).
|
|
21
|
+
.internal/
|
|
22
|
+
**/.internal/
|
|
23
|
+
# Agent convention docs (internal only; not published to GitHub).
|
|
24
|
+
AGENTS.md
|
|
25
|
+
Agents.md
|
|
26
|
+
agents.md
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to AXQuant are documented here. The format follows
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses
|
|
5
|
+
[Semantic Versioning](https://semver.org/spec/v2.0.0.html). The release workflow extracts the
|
|
6
|
+
matching section from this file as the curated GitHub Release notes and fails the release when
|
|
7
|
+
the section is missing — add an entry in the same change as any user-facing modification.
|
|
8
|
+
|
|
9
|
+
## [Unreleased]
|
|
10
|
+
|
|
11
|
+
## [1.3.0] - 2026-08-06
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- Group-preserving GPTQ act-order as the new `gptq-act` method (ADR-0002): groups process in
|
|
16
|
+
descending Hessian-mass order and columns by Hessian diagonal, while group membership and the
|
|
17
|
+
portable affine packed layout stay byte-compatible with static-grid GPTQ. Registered as a
|
|
18
|
+
distinct probe/plan/convert method label so the measured frontier — not the literature —
|
|
19
|
+
decides adoption per tensor.
|
|
20
|
+
- Measured-holdout-safe interaction optimization (`optimize_candidate_interactions`, ADR-0004):
|
|
21
|
+
complete-candidate selection driven by measured evaluations on development dataset roles,
|
|
22
|
+
with a fail-closed guard that rejects formal-holdout or missing `dataset_role` provenance and
|
|
23
|
+
a separate `interaction_measurement_set_sha256` binding so the formal holdout binding stays
|
|
24
|
+
free for final selection.
|
|
25
|
+
- Kernel-latency-aware planning (ADR-0003): `benchmark-kernels` measures decode/prefill GEMM
|
|
26
|
+
latency per (bits, group size) on the current host into a host-scoped
|
|
27
|
+
`axquant.kernel-latency.v1` table; `plan --latency-table` re-ranks candidates by measured
|
|
28
|
+
kernel speed strictly inside the quality near-tie window and records
|
|
29
|
+
`cost_model` / `kernel_latency_sha256` / host provenance on the plan. Without a table,
|
|
30
|
+
planning is bit-identical to before.
|
|
31
|
+
- Method near-tie surfacing (RM-14): plans record `method_near_ties` (capped, most fragile
|
|
32
|
+
first, with an explicit omitted count) wherever a losing packing method lands within the
|
|
33
|
+
configurable `method_near_tie_epsilon` of the winner at the same storage key.
|
|
34
|
+
- Report-only measured-KV serving-quality artifact (`axquant.kv-serving-quality.v1`, RM-21):
|
|
35
|
+
binds the executed per-layer KV plan digest to dual-profile short/long-context quality
|
|
36
|
+
retention versus BF16 KV, and fails closed unless the mlx-lm-kv runtime check proved exact
|
|
37
|
+
per-layer execution.
|
|
38
|
+
- Formal MTP A/B admissibility (`formal_mtp_bundle_issues`, RM-20): an MTP off/on evaluation
|
|
39
|
+
pair is authorizing only when both halves bind the frozen formal-host contract (device, chip,
|
|
40
|
+
OS, power mode), share identical controls, datasets, seeds, and checkpoint, and report zero
|
|
41
|
+
kernel fallbacks.
|
|
42
|
+
- Opt-in quantized MTP sidecar (`quantize_qwen36_mtp_sidecar`, ADR-0005): a separate
|
|
43
|
+
`axquant-portable-affine-u8` artifact emitted alongside the untouched byte-preserved default,
|
|
44
|
+
gated on a recorded passing AX Engine capability check for the quantized MTP layout.
|
|
45
|
+
- End-to-end CLI and audit wiring for the new evidence paths: `refine-select --interaction`
|
|
46
|
+
runs the holdout-safe interaction selection; `quantize-mtp-sidecar` executes a live AX Engine
|
|
47
|
+
capability probe (`--capability-command`, subprocess JSON contract) or consumes a recorded
|
|
48
|
+
check (`--capability-result`) before emitting the quantized sidecar; `kv-serving-quality`
|
|
49
|
+
builds the report-only KV artifact from an executed plan, kv_exec summary, and measured
|
|
50
|
+
results; and the flagship M7 gate now loads both MTP A/B bundles from the release validation
|
|
51
|
+
chain and enforces `formal_mtp_bundle_issues` against the frozen `mbp-m5` contract and the
|
|
52
|
+
digest-bound hardware-registry device identity.
|
|
53
|
+
|
|
54
|
+
### Changed
|
|
55
|
+
|
|
56
|
+
- Experimental 2/3-bit assignment is restricted to robust-trunk tensor classes (MLP and expert
|
|
57
|
+
projections, RM-42); attention and all protected roles keep 4-bit-and-up candidates, and
|
|
58
|
+
experimental plans now list every low-bit tensor with its predicted loss in the plan warnings.
|
|
59
|
+
- The default hardware profile is `ax-engine-apple-silicon-affine-dwq-v3`, adding `gptq-act`
|
|
60
|
+
to the supported method set. Previously serialized plans keep their recorded v2 profile.
|
|
61
|
+
|
|
62
|
+
- Qwen3-ASR 1.7B and Qwen3-VL 8B Instruct text-path conversion through public MLX-Audio and
|
|
63
|
+
MLX-VLM APIs, protected BF16 modality towers, architecture-specific runtime metadata, media
|
|
64
|
+
generation smokes, and four stable-name AXQ v2 development repositories.
|
|
65
|
+
- Revision-pinned Qwen3-ASR BF16 normalization in `scripts/hf_to_mlx_bf16.py`; the helper forces
|
|
66
|
+
the public MLX-Audio STT backend and records the key/layout remap in `axquant_source.json`.
|
|
67
|
+
- Explicit development-artifact edition metadata and the completed 28-repository AXQ v2
|
|
68
|
+
migration from 14 immutable sources. Stable repository names now serve receipt-bound v2
|
|
69
|
+
revisions on `main` and tag `v2`, while `legacy-pre-v2` preserves each replaced artifact.
|
|
70
|
+
Every promoted revision passed pre/post-upload MLX-LM checks, reverified Hub trees and hashes,
|
|
71
|
+
evidence-safe sibling links/model-card metadata, and a verified stable-name catalog entry.
|
|
72
|
+
- Additive `qwen36-mtp-v2` flagship certification contracts: path-neutral `CheckpointKey` and
|
|
73
|
+
`CandidateKey`, frozen campaigns with disjoint dataset roles, exact-`mbp-m5` preflight,
|
|
74
|
+
formal-cycle/holdout consumption state, durable archive proof, independent review, clean-host
|
|
75
|
+
reproduction review, a separate final publication-claim review, and final M0–M8 dispatch.
|
|
76
|
+
- Append-only artifact lifecycle events and semantic impact scans. Certified candidates become
|
|
77
|
+
ineligible for certified rendering/publication after `superseded` or `revoked`.
|
|
78
|
+
- Deterministic measured-BPW certified naming, bound public metric claims, and generated
|
|
79
|
+
certified model cards.
|
|
80
|
+
- CLI commands `campaign-freeze`, `campaign-preflight`, `campaign-start-formal`,
|
|
81
|
+
`campaign-complete-formal`, `campaign-close-no-go`, `campaign-overlap`,
|
|
82
|
+
`campaign-frontier`, `campaign-record-publication`, `artifact-lifecycle`, and `claim-render`.
|
|
83
|
+
- Checksum-bound cheapest-failure-first frontier/no-go records and formal raw-evidence/custodian
|
|
84
|
+
attestations, so candidate selection, formal failure, and no-feasible-candidate closure are
|
|
85
|
+
evidence-backed rather than boolean declarations.
|
|
86
|
+
- Downloaded publication inventory and runtime-verification records; `published` campaign state is
|
|
87
|
+
unreachable until the exact Hub revision, checkpoint bytes, final audit, claim, lifecycle,
|
|
88
|
+
AX Engine/MLX-LM smokes, and zero-fallback result are reverified.
|
|
89
|
+
- A fail-closed flagship publication privacy scan for credentials, private host/path data,
|
|
90
|
+
oversized or invalid text evidence, sensitive filenames, and formal raw holdout files. It
|
|
91
|
+
rechecks the exact post-packaging tree and scans legitimate large `tokenizer.json` assets
|
|
92
|
+
without treating them as oversized evidence.
|
|
93
|
+
- A non-symlinked durable-root boundary for the complete campaign/state-transition tree and
|
|
94
|
+
six-part formal-host evidence whose results bind the exact frozen `mbp-m5` contract.
|
|
95
|
+
|
|
96
|
+
### Fixed
|
|
97
|
+
|
|
98
|
+
- Qwen3-ASR inspection now rejects the unnormalized upstream `thinker.*` layout for planning and
|
|
99
|
+
conversion instead of counting its duplicated tied LM head as an independently convertible
|
|
100
|
+
tensor. The error points to the pinned BF16 normalization helper.
|
|
101
|
+
- Multimodal runtime smokes require real transcript/image-generation output: ASR no longer passes
|
|
102
|
+
on log text without a transcript, VLM runs non-verbose, and simple conversion rejects a smoke
|
|
103
|
+
from the wrong architecture backend before conversion.
|
|
104
|
+
- Qwen3-ASR and Qwen3-VL model-card commands now use MLX-Audio's required `--output-path` and
|
|
105
|
+
MLX-VLM's supported `--temperature` option.
|
|
106
|
+
- Converted-checkpoint verification now accepts only documented MLX-LM output identities:
|
|
107
|
+
one-to-one wrapper aliases, Qwen packed gate/up one-to-many splits, contiguous indexed-expert
|
|
108
|
+
many-to-one stacks, and the exact Qwen 3.5/Qwen3-Next/Nemotron-H `Conv1d` sanitize-axis
|
|
109
|
+
transforms. Membership, precision, parameter count, metadata, and shapes remain fail-closed.
|
|
110
|
+
- Budget allocation preserves the deterministic marginal-gain order with a priority queue instead
|
|
111
|
+
of rescanning every tensor after every upgrade, removing quadratic planning time on
|
|
112
|
+
74,000-tensor Qwen3-Coder-Next checkpoints.
|
|
113
|
+
- The AXQ v2 migration uses immutable Mistral-published BF16 sources and materializes only
|
|
114
|
+
`model.safetensors.index.json`-bound shards when upstream also ships a redundant consolidated
|
|
115
|
+
checkpoint; AXQuant's unindexed-Safetensors rejection remains strict.
|
|
116
|
+
- Development cards no longer advertise an AX Engine serve path when the package has no validated
|
|
117
|
+
native `model-manifest.json`; MLX-LM remains the documented standard text/backbone path.
|
|
118
|
+
- Qwen3 Embedding development cards link their real stable-name 4-bit/8-bit siblings instead of
|
|
119
|
+
a nonexistent 6-bit variant.
|
|
120
|
+
- Release-bound identity comparisons ignore absolute `local_path` while preserving it as
|
|
121
|
+
execution provenance; checkpoint/candidate byte digests still fail closed on content drift.
|
|
122
|
+
- Generation-smoke no longer requires the `mlx_lm` Python package; advisory KV / runtime
|
|
123
|
+
metadata is validated before install gates so Ubuntu non-MLX CI matches Mac developer paths.
|
|
124
|
+
- Gemma4 sharded source prep validates index shard paths and types before importing MLX.
|
|
125
|
+
- mypy on the Ubuntu lint job ignores missing optional `mlx` / `mlx_lm` / `transformers`
|
|
126
|
+
modules (they are only installed via `axquant[mlx]`).
|
|
127
|
+
|
|
128
|
+
### Changed
|
|
129
|
+
|
|
130
|
+
- Existing `4bit`/`6bit` repository names remain development identifiers. A certified flagship
|
|
131
|
+
must use generated `MP-<measured-main-BPW>bpw[-MTP]` naming and cannot downgrade to the
|
|
132
|
+
historical Qwen 3.6 v4 audit/publisher path.
|
|
133
|
+
- CI and release workflows use current Node 24 GitHub Actions majors and grant permissions
|
|
134
|
+
per job, reducing deprecated-runtime warnings while keeping PyPI OIDC and build provenance
|
|
135
|
+
least-privilege.
|
|
136
|
+
- Documented historical Actions red-run root causes and added `scripts/ci-local.sh` to mirror
|
|
137
|
+
CI gates (including PATH-isolated non-MLX pytest) before push.
|
|
138
|
+
- Release `pypi` job is gated on repository variable `ENABLE_PYPI_PUBLISH=true` so tag
|
|
139
|
+
Releases succeed with GitHub assets when Trusted Publishing is not yet configured on
|
|
140
|
+
pypi.org (set the variable only after registering a publisher).
|
|
141
|
+
|
|
142
|
+
### Notes
|
|
143
|
+
|
|
144
|
+
- Real PyPI upload still requires a Trusted Publisher on pypi.org plus
|
|
145
|
+
`ENABLE_PYPI_PUBLISH=true` (operator steps in docs/ci-root-causes.md).
|
|
146
|
+
- Local-only engineering/product notes stay out of the published tree: force-added
|
|
147
|
+
certification docs were removed from git (still ignored on developer machines).
|
|
148
|
+
|
|
149
|
+
## [1.2.0] - 2026-08-04
|
|
150
|
+
|
|
151
|
+
### Added
|
|
152
|
+
|
|
153
|
+
- `analyze --capture-points`: measured probing on plain dense backbones (MiniCPM5, Qwen3 dense,
|
|
154
|
+
Mistral, …) via `--capture-points output`; the default `("output", "hidden")` fails closed
|
|
155
|
+
with a hint on those layouts.
|
|
156
|
+
- `refine --lm-head-floor`, matching `plan`; the governed `8bit` path still requires measured
|
|
157
|
+
support.
|
|
158
|
+
- Structured `mtp_sidecar_bits` runtime contracts in copied (byte-preserved) MTP sidecar
|
|
159
|
+
metadata.
|
|
160
|
+
- New evaluation task categories: JSON, tool-use, multilingual, and long-context.
|
|
161
|
+
|
|
162
|
+
### Changed
|
|
163
|
+
|
|
164
|
+
- Calibration evidence is checksum-bound end to end: AWQ/GPTQ analysis records the
|
|
165
|
+
activation-capture manifest digest, tokenized-cache manifest digest, cache key, and dataset
|
|
166
|
+
ID; the planner carries the bindings; conversion rejects a mismatched capture and packages
|
|
167
|
+
`activation_capture_manifest.json` with the checkpoint; publication preparation and release
|
|
168
|
+
audit independently revalidate it.
|
|
169
|
+
- Completed capture directories are immutable (`completion.json` present → no overwrite), and
|
|
170
|
+
every committed resume chunk is validated against checkpoint row accounting.
|
|
171
|
+
- `scripts/hf_to_mlx_bf16.py` requires `--revision <40-char SHA>`, converts into a staging
|
|
172
|
+
directory, atomically renames on success, and writes `axquant_source.json` with the immutable
|
|
173
|
+
source identity.
|
|
174
|
+
- Mixed-precision plans are labeled by target BPW instead of inheriting a flat storage-class
|
|
175
|
+
name.
|
|
176
|
+
|
|
177
|
+
### Fixed
|
|
178
|
+
|
|
179
|
+
- Qwen3-Next adapter: fused `switch_mlp`/`switch_glu` 3-D weights now classify as `expert`.
|
|
180
|
+
**Pre-fix artifacts may have retained most expert weights at BF16 and must be regenerated.**
|
|
181
|
+
- Capture resume now fails closed on binding drift (model, cache, `--max-rows`, segments, token
|
|
182
|
+
budget) instead of silently mixing runs.
|
|
183
|
+
- AWQ/GPTQ convert-time refinement no longer crashes on bfloat16 module weights (the default
|
|
184
|
+
dtype of real checkpoints).
|
|
185
|
+
- Affine/DWQ/AWQ quantizers build the per-group grid from the float16-stored scale (rounded
|
|
186
|
+
up, never down), restoring the documented ≤ scale/2 per-element round-trip bound.
|
|
187
|
+
- `plan`/`refine` inject BF16 for policy-preserved tensors (norms, LM head, vision) when 16 is
|
|
188
|
+
omitted from `--bits`, matching manual planning, instead of failing per tensor; manual
|
|
189
|
+
tied-weight harmonization now refreshes scale/outlier strategies and stored BPW.
|
|
190
|
+
- Feasibility audits require MTP evidence only from MTP-declaring architectures, making the
|
|
191
|
+
Qwen3-Next direct-track N0 gate satisfiable with tool-produced reports.
|
|
192
|
+
- Measured probe/KV-probe runs no longer abort when the calibration token count leaves a
|
|
193
|
+
single-token trailing replay batch.
|
|
194
|
+
- The `kv-exec` runtime check now fails when executed per-layer KV bits differ from the plan
|
|
195
|
+
(previously reported but not enforced), and benchmark trial timeouts kill the whole
|
|
196
|
+
AX Engine process group instead of orphaning the generation.
|
|
197
|
+
- MTP benchmark aggregates pair numerators and denominators over counter-reporting trials
|
|
198
|
+
only, instead of inflating `effective_tokens_per_forward` when some trials lack counters.
|
|
199
|
+
- `prepare_development_model_card` sanitizes the manifest's calibration reference along with
|
|
200
|
+
the plan's (local-path leak that also broke the release-audit M1 equality invariant).
|
|
201
|
+
- Release audit records issues instead of crashing on wheels missing `axquant/__init__.py`,
|
|
202
|
+
corrupt measurement-set or calibration files, and non-scalar benchmark metadata; hardware
|
|
203
|
+
registry checks record all-failed raw benchmarks instead of raising.
|
|
204
|
+
- `--kv-default-bits` rejects sub-policy-floor values (2/3) at parse time instead of failing
|
|
205
|
+
late in planning.
|
|
206
|
+
- `scripts/hf_to_mlx_bf16.py` writes the lm_head-synthesized shard aside and swaps atomically;
|
|
207
|
+
saving onto the mmap-backed source silently corrupted every tensor in the shard.
|
|
208
|
+
- Ext4T scripts: union-sync verification compares content only (mtime-only differences no
|
|
209
|
+
longer deadlock syncs), empty-array expansions no longer crash stock macOS bash 3.2 under
|
|
210
|
+
`set -u`, shell-config marker blocks no longer corrupt an rc file lacking a trailing
|
|
211
|
+
newline, live log/publish directories are moved aside before migrate-and-delete, and
|
|
212
|
+
`--status`/argument handling exit correctly.
|
|
213
|
+
- Architecture-gate errors and inventory warnings name the adapter registry instead of
|
|
214
|
+
hardcoding Qwen 3.6 (the checks were already registry-wide).
|
|
215
|
+
- Ext4T planning treats `axquant/logs` packages as host-local: layout moves only — no
|
|
216
|
+
cross-host mirroring, duplicate deletion, or fingerprint-driven renames of mutable log
|
|
217
|
+
trees; index loading reports the exact file and line for corrupt or incomplete records.
|
|
218
|
+
|
|
219
|
+
See the [v1.1.x → v1.2.0 migration guide](docs/migration-v1.2.md) for action items.
|
|
220
|
+
|
|
221
|
+
## [1.1.1] - 2026-08-03
|
|
222
|
+
|
|
223
|
+
### Added
|
|
224
|
+
|
|
225
|
+
- Resumable, compressed, shardable activation capture: `capture_progress.json` +
|
|
226
|
+
`activations/.partial/` resume, deflate-compressed npz output, `--segment-batches` and
|
|
227
|
+
`--modules-per-shard` controls.
|
|
228
|
+
- Real-hardware end-to-end integration tests (`pytest -m integration` on Apple Silicon).
|
|
229
|
+
- CI workflow (lint on Ubuntu, full MLX suite on `macos-14`) and a signed release workflow
|
|
230
|
+
(SHA256SUMS + keyless Sigstore attestation).
|
|
231
|
+
- Migration guide, environment compatibility matrix, and known-issues list under `docs/`.
|
|
232
|
+
|
|
233
|
+
### Changed
|
|
234
|
+
|
|
235
|
+
- GPTQ peak memory cut ~30% at `in_features = 8192` (6.7 GB → 4.7 GB).
|
|
236
|
+
|
|
237
|
+
### Fixed
|
|
238
|
+
|
|
239
|
+
- BF16 activations are cast inside MLX before numpy export in capture.
|
|
240
|
+
- `cosine_distance` is clamped to non-negative against float rounding.
|
|
241
|
+
|
|
242
|
+
## [1.1.0] - 2026-08-03
|
|
243
|
+
|
|
244
|
+
### Added
|
|
245
|
+
|
|
246
|
+
- GPTQ Hessian error-compensated weight refinement, wired through the conversion predicate and
|
|
247
|
+
the `convert` CLI.
|
|
248
|
+
- End-to-end AWQ: `capture-activations` records checksum-bound per-module Linear input
|
|
249
|
+
activations; measured AWQ/GPTQ probing via `analyze --calibration-activations`; planner
|
|
250
|
+
selection with the `gptq-hessian` scale strategy; convert-time refinement via
|
|
251
|
+
`convert --calibration-activations`.
|
|
252
|
+
- Development model card generation for published checkpoints.
|
|
253
|
+
|
|
254
|
+
### Changed
|
|
255
|
+
|
|
256
|
+
- Python API renames: `convert_model(awq_activations=...)` → `calibration_activations=`,
|
|
257
|
+
`PlanPredicate.awq_metadata` → `method_metadata`; `load_capture_activations` returns a
|
|
258
|
+
mapping-compatible `LoadedActivationCapture`.
|
|
259
|
+
- Measured-probe backend moved to `axquant-mlx-isolated-probe-v6`; saved probe resume state
|
|
260
|
+
from older versions is rejected.
|
|
261
|
+
|
|
262
|
+
## [1.0.2] - 2026-08-03
|
|
263
|
+
|
|
264
|
+
### Added
|
|
265
|
+
|
|
266
|
+
- Qwen3-Embedding and Qwen3-Next / Coder-Next conversion support.
|
|
267
|
+
- HF → MLX BF16 helper script and an expanded Hub catalog in the README.
|
|
268
|
+
|
|
269
|
+
## [1.0.1] - 2026-08-02
|
|
270
|
+
|
|
271
|
+
### Fixed
|
|
272
|
+
|
|
273
|
+
- Protection-floor and path-safety gaps found on re-audit; six high-severity and three
|
|
274
|
+
medium-severity release-safety bugs.
|
|
275
|
+
|
|
276
|
+
## [1.0.0] - 2026-08-01
|
|
277
|
+
|
|
278
|
+
### Added
|
|
279
|
+
|
|
280
|
+
- Initial public release: inspect → calibrate → analyze → plan → convert → validate → publish
|
|
281
|
+
pipeline with checksum-bound artifacts, evidence gating, fail-closed conversion, family
|
|
282
|
+
adapters (Qwen 3.6 primary track, Qwen 3.5, Gemma-4, MiniCPM5, Mistral/Devstral, Mistral3,
|
|
283
|
+
Nemotron 3 Nano), and AX Engine runtime manifests.
|
|
284
|
+
|
|
285
|
+
[1.3.0]: https://github.com/defai-digital/axquant/compare/v1.2.0...v1.3.0
|
|
286
|
+
[1.2.0]: https://github.com/defai-digital/axquant/compare/v1.1.1...v1.2.0
|
|
287
|
+
[1.1.1]: https://github.com/defai-digital/axquant/compare/v1.1.0...v1.1.1
|
|
288
|
+
[1.1.0]: https://github.com/defai-digital/axquant/compare/v1.0.2...v1.1.0
|
|
289
|
+
[1.0.2]: https://github.com/defai-digital/axquant/compare/v1.0.1...v1.0.2
|
|
290
|
+
[1.0.1]: https://github.com/defai-digital/axquant/compare/v1.0.0...v1.0.1
|
|
291
|
+
[1.0.0]: https://github.com/defai-digital/axquant/releases/tag/v1.0.0
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Contributing to AXQuant
|
|
2
|
+
|
|
3
|
+
Contributions are warmly welcome. AXQuant exists to help Mac users get more reliable, efficient
|
|
4
|
+
local inference and a better overall experience on Apple Silicon. Bug fixes, documentation,
|
|
5
|
+
tests, usability improvements, runtime compatibility work, architecture adapters, and
|
|
6
|
+
reproducible quantization research can all move that goal forward.
|
|
7
|
+
|
|
8
|
+
First-time contributors are welcome too. If you are unsure where a change belongs, open a
|
|
9
|
+
[GitHub issue](https://github.com/defai-digital/axquant/issues) and describe what you want to
|
|
10
|
+
improve.
|
|
11
|
+
|
|
12
|
+
## Fork and submit a pull request
|
|
13
|
+
|
|
14
|
+
1. Fork [AXQuant](https://github.com/defai-digital/axquant) on GitHub.
|
|
15
|
+
2. Create a focused branch in your fork.
|
|
16
|
+
3. Set up the development environment and make your change.
|
|
17
|
+
4. Add or update tests and documentation where appropriate.
|
|
18
|
+
5. Run the checks below.
|
|
19
|
+
6. Push your branch and open a pull request against `defai-digital/axquant`.
|
|
20
|
+
|
|
21
|
+
Small, well-scoped fixes can go directly to a pull request. For a substantial design change or a
|
|
22
|
+
new model family, please open an issue first so contributors can agree on scope, runtime support,
|
|
23
|
+
and the evidence needed for promotion.
|
|
24
|
+
|
|
25
|
+
## Development setup
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
python3.13 -m venv .venv
|
|
29
|
+
source .venv/bin/activate
|
|
30
|
+
python -m pip install -e ".[dev]"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
On Apple Silicon, install the optional MLX execution dependencies when your change needs them:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
python -m pip install -e ".[dev,mlx]"
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Most tests use small synthetic Safetensors fixtures and do not require model downloads or real
|
|
40
|
+
weights.
|
|
41
|
+
|
|
42
|
+
## Run the checks
|
|
43
|
+
|
|
44
|
+
The local CI mirror is the preferred full check:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
./scripts/ci-local.sh
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
You can also run the checks individually:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
.venv/bin/ruff check .
|
|
54
|
+
.venv/bin/ruff format --check .
|
|
55
|
+
.venv/bin/mypy src
|
|
56
|
+
.venv/bin/pytest -m "not integration"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Real-hardware tests require Apple Silicon and the MLX dependencies:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
.venv/bin/pytest -m integration
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Pull request guidance
|
|
66
|
+
|
|
67
|
+
A helpful pull request:
|
|
68
|
+
|
|
69
|
+
- explains what changed, why it helps users, and any known limitations;
|
|
70
|
+
- stays focused enough to review and test;
|
|
71
|
+
- includes tests for changed behavior and documentation for user-facing changes;
|
|
72
|
+
- reports the commands and hardware used for validation;
|
|
73
|
+
- labels architecture priors, measured evidence, runtime smokes, and certification claims
|
|
74
|
+
accurately; and
|
|
75
|
+
- does not include credentials, private paths, downloaded model weights, or local-only evidence.
|
|
76
|
+
|
|
77
|
+
Maintainers may ask for additional evidence when a change affects conversion correctness,
|
|
78
|
+
checkpoint compatibility, quality claims, or release gates.
|
|
79
|
+
|
|
80
|
+
## Clean-room and evidence boundary
|
|
81
|
+
|
|
82
|
+
AXQuant is independently implemented against public MLX, MLX-LM, MLX-Audio, and MLX-VLM
|
|
83
|
+
interfaces. Contributions must not import, vendor, translate, or copy mlx-optiq implementation
|
|
84
|
+
code, tests, documentation, calibration data, or generated metadata.
|
|
85
|
+
|
|
86
|
+
New model families begin at the `inspect-only` support tier. Promotion requires real-checkpoint
|
|
87
|
+
classification, conversion, and runtime evidence. Architecture-prior output must never be
|
|
88
|
+
presented as measured sensitivity, and a successful conversion or runtime smoke must not be
|
|
89
|
+
presented as quality certification.
|
|
90
|
+
|
|
91
|
+
## License
|
|
92
|
+
|
|
93
|
+
By submitting a contribution, you agree that it may be distributed under the project's
|
|
94
|
+
[MIT License](LICENSE).
|
axquant-1.3.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 AutomatosX / DEFAI Digital
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|