marisming commited on
Commit
9fdd079
·
verified ·
1 Parent(s): ff76985

Publish 9 pretraining and 27 complete source-selected models

Browse files

Original October 2 weights, strict portable CPU loader, exact shared tokenizer, source-selected head and parent identities. No retraining or new benchmark scoring; no blanket weight license assigned.

This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. ENVIRONMENT_NOTE.json +10 -0
  2. README.md +167 -0
  3. build_catalog.py +141 -0
  4. catalog_build_audit.json +336 -0
  5. checkpoints/pretrain/EE/pt0/model.pt +3 -0
  6. checkpoints/pretrain/EE/pt1/model.pt +3 -0
  7. checkpoints/pretrain/EE/pt2/model.pt +3 -0
  8. checkpoints/pretrain/EP/pt0/model.pt +3 -0
  9. checkpoints/pretrain/EP/pt1/model.pt +3 -0
  10. checkpoints/pretrain/EP/pt2/model.pt +3 -0
  11. checkpoints/pretrain/ES/pt0/model.pt +3 -0
  12. checkpoints/pretrain/ES/pt1/model.pt +3 -0
  13. checkpoints/pretrain/ES/pt2/model.pt +3 -0
  14. checkpoints/source/EE/pt0/ft0/best.pt +3 -0
  15. checkpoints/source/EE/pt0/ft1/best.pt +3 -0
  16. checkpoints/source/EE/pt0/ft2/best.pt +3 -0
  17. checkpoints/source/EE/pt1/ft0/best.pt +3 -0
  18. checkpoints/source/EE/pt1/ft1/best.pt +3 -0
  19. checkpoints/source/EE/pt1/ft2/best.pt +3 -0
  20. checkpoints/source/EE/pt2/ft0/best.pt +3 -0
  21. checkpoints/source/EE/pt2/ft1/best.pt +3 -0
  22. checkpoints/source/EE/pt2/ft2/best.pt +3 -0
  23. checkpoints/source/EP/pt0/ft0/best.pt +3 -0
  24. checkpoints/source/EP/pt0/ft1/best.pt +3 -0
  25. checkpoints/source/EP/pt0/ft2/best.pt +3 -0
  26. checkpoints/source/EP/pt1/ft0/best.pt +3 -0
  27. checkpoints/source/EP/pt1/ft1/best.pt +3 -0
  28. checkpoints/source/EP/pt1/ft2/best.pt +3 -0
  29. checkpoints/source/EP/pt2/ft0/best.pt +3 -0
  30. checkpoints/source/EP/pt2/ft1/best.pt +3 -0
  31. checkpoints/source/EP/pt2/ft2/best.pt +3 -0
  32. checkpoints/source/ES/pt0/ft0/best.pt +3 -0
  33. checkpoints/source/ES/pt0/ft1/best.pt +3 -0
  34. checkpoints/source/ES/pt0/ft2/best.pt +3 -0
  35. checkpoints/source/ES/pt1/ft0/best.pt +3 -0
  36. checkpoints/source/ES/pt1/ft1/best.pt +3 -0
  37. checkpoints/source/ES/pt1/ft2/best.pt +3 -0
  38. checkpoints/source/ES/pt2/ft0/best.pt +3 -0
  39. checkpoints/source/ES/pt2/ft1/best.pt +3 -0
  40. checkpoints/source/ES/pt2/ft2/best.pt +3 -0
  41. config.json +86 -0
  42. cpu_replay_audit.json +34 -0
  43. example_pairs.json +10 -0
  44. inference.py +213 -0
  45. model_catalog.json +1156 -0
  46. portable_core.py +241 -0
  47. requirements-inference.txt +4 -0
  48. test_audit.json +12 -0
  49. test_inference.py +159 -0
  50. test_output.txt +22 -0
ENVIRONMENT_NOTE.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "status": "observed_and_documented",
3
+ "torch_imported_version": "2.3.0+cu121",
4
+ "torch_cuda_build": "12.1",
5
+ "torch_distribution_metadata": "2.9.1",
6
+ "cpu_replay_imported_binary": "2.3.0+cu121",
7
+ "clean_environment_installation_validated": false,
8
+ "historical_training_binary_version_established": false,
9
+ "scope": "Current CPU portable-loader checks; distribution metadata is inconsistent with imported module. This addendum does not alter checkpoints, scientific scores or the frozen core."
10
+ }
README.md ADDED
@@ -0,0 +1,167 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language:
3
+ - en
4
+ tags:
5
+ - biology
6
+ - protein
7
+ - gpt2
8
+ - reproducibility
9
+ - research
10
+ ---
11
+
12
+ # bio2nl: the 2026-10-02 model collection
13
+
14
+ This package describes **9 freshly pretrained GPT-2-style models and 27 complete
15
+ source-validation-selected protein-pair classifiers**. It includes the exact
16
+ shared 32,000-entry BPE tokenizer, all configuration/provenance identities and an
17
+ offline CPU loader. Weights are the original files, not converted or retrained.
18
+ The model repository is `dnagpt/bio2nl-models`. Pin an immutable repository
19
+ revision when downloading; the accompanying GitHub release records the verified commit.
20
+
21
+ ## Scope and scientific interpretation
22
+
23
+ EP pretraining mixes English and natural protein, ES mixes the same English and
24
+ residue-shuffled protein, and EE uses English plus additional English. Each run
25
+ uses 16,777,216 input tokens and 1,024 updates. Each condition has three
26
+ pretraining seeds. Each pretrained model has three source fine-tuning seeds.
27
+ Fine-tuning uses 8,044 protein sequence-pair training examples for five epochs;
28
+ minimum source validation cross-entropy selects the saved epoch, ties earlier.
29
+ Every selected checkpoint includes the fine-tuned backbone and its original
30
+ two-logit classifier head. No English pair labels trained or selected these heads.
31
+
32
+ These are exploratory research models. Protein labels measure the experiment's
33
+ operational sequence similarity, not verified structural or remote homology.
34
+ The current EP source-test accuracy is about 50.8%; its English transfer results
35
+ do not demonstrate reliable fixed-head sentence-similarity classification. A
36
+ modest exploratory ranking difference is reported in the accompanying study.
37
+ The CPU examples here are software checks, not new scientific evaluations.
38
+
39
+ Source and result release:
40
+ [GitHub immutable source](https://github.com/maris205/bio2nl/tree/0d91df978ab5ac8604a9216bb5a6036605aea910/releases/2026-10-03-v1/source)
41
+ and [Hugging Face protein/code release](https://huggingface.co/datasets/dnagpt/bio2nl/tree/62ced1ec44444b1879f2c473c553e6b5a9c6767f/releases/2026-10-03-v1).
42
+
43
+ ## File identities and model identifiers
44
+
45
+ The trusted `model_catalog.json` SHA-256 is:
46
+
47
+ ```
48
+ 5f6694f206084ad51dcc27c1485c4b4d000ffe5023310482aab367d0815df067
49
+ ```
50
+
51
+ The catalog binds every file's size/SHA, complete tensor-state digest, backbone
52
+ and head digests, full config, tokenizer, training protocol and prepared-data
53
+ manifest. Classifier entries also bind the source-selected epoch and the exact
54
+ pretraining parent. These hashes are independently projected from the frozen
55
+ training/source-selection records; a digest merely declared by a checkpoint is
56
+ not trusted.
57
+
58
+ | Identifier | Artifact |
59
+ |---|---|
60
+ | `EP-pt0` | Pretrained causal LM, condition EP, pretraining seed 0 |
61
+ | `EP-pt0-ft0` | Complete source-selected EP classifier, pretraining seed 0, fine-tuning seed 0 |
62
+ | `ES-pt1-ft2` | Complete source-selected ES classifier, pretraining seed 1, fine-tuning seed 2 |
63
+
64
+ Conditions are `EP`, `ES`, `EE`; both seed indices range from 0 to 2. All 36
65
+ weights total **15,845,506,290 bytes**. One checkpoint is about 440 MB. A
66
+ classifier is self-contained: its parent pretraining weight need not be downloaded
67
+ for inference. `upload_mapping.json` is a maintainer inventory with relative
68
+ original paths; it is not used by the public loader.
69
+
70
+ ## Download only the selected model
71
+
72
+ Use the immutable model-repository commit recorded by the publication receipt.
73
+ Download `inference.py`, `portable_core.py`, `model_catalog.json`, `config.json`,
74
+ `tokenizer.json`, `example_pairs.json`, and one checkpoint, for example
75
+ `checkpoints/source/EP/pt0/ft0/best.pt`. Preserve this relative layout. The
76
+ `--checkpoint` option supports a differently located weight while keeping all
77
+ digest and provenance checks.
78
+
79
+ For example, after installing `huggingface_hub`:
80
+
81
+ ```python
82
+ from huggingface_hub import snapshot_download
83
+
84
+ snapshot_download(
85
+ repo_id="dnagpt/bio2nl-models",
86
+ revision="<immutable model-repository commit from the publication receipt>",
87
+ local_dir="bio2nl-models",
88
+ allow_patterns=["inference.py", "portable_core.py", "model_catalog.json",
89
+ "config.json", "tokenizer.json", "example_pairs.json",
90
+ "checkpoints/source/EP/pt0/ft0/best.pt"],
91
+ )
92
+ ```
93
+
94
+ ## Offline verification and inference
95
+
96
+ The CPU checks used Python 3.12.3 and imported PyTorch 2.3.0+cu121.
97
+ The local distribution metadata incorrectly reported torch 2.9.1; see
98
+ `ENVIRONMENT_NOTE.json`. The requirements describe the observed import versions,
99
+ not a separately verified clean installation or a proven historical training binary.
100
+ Run in the directory containing the downloaded package. No network, credentials,
101
+ GPU, training acceptance, historical workspace path or benchmark examples are
102
+ required by the inference commands.
103
+
104
+ ```bash
105
+ python inference.py verify \
106
+ --catalog model_catalog.json \
107
+ --catalog-sha256 5f6694f206084ad51dcc27c1485c4b4d000ffe5023310482aab367d0815df067 \
108
+ --artifact-root . --model-id EP-pt0-ft0
109
+
110
+ python inference.py predict \
111
+ --catalog model_catalog.json \
112
+ --catalog-sha256 5f6694f206084ad51dcc27c1485c4b4d000ffe5023310482aab367d0815df067 \
113
+ --artifact-root . --model-id EP-pt0-ft0 --pairs example_pairs.json
114
+ ```
115
+
116
+ Input is a JSON list of objects with exactly `sentence1` and `sentence2`. The
117
+ program refuses labels, empty endpoints, unknown/special content tokens, failed
118
+ text roundtrips and hash/provenance mismatches. It independently caps each
119
+ endpoint at 255 content tokens, emits `a + SEP + b + EOS`, right-pads with ID 0,
120
+ and pools the last attention-mask-valid position. Output reports truncation,
121
+ both log probabilities, probability for fixed label 1, the label-1 minus label-0
122
+ margin, and uncalibrated argmax predictions (ties label 0). No polarity reversal,
123
+ threshold adjustment, target calibration or pooling substitution occurs.
124
+
125
+ `verify` also supports pretraining IDs such as `EP-pt0`; pair classification
126
+ requires a `-ft` classifier. Programmatic `load_model` returns a standard
127
+ `GPT2LMHeadModel` for a pretraining ID, or the complete `TransferClassifier`.
128
+
129
+ The portable example uses **CPU FP32**. The study's held-out scoring used FP32
130
+ weights with CUDA BF16 autocast. These regimes need not produce bitwise-equal
131
+ scores. `cpu_replay_audit.json` checks the portable implementation against the
132
+ original frozen implementation under the same CPU FP32 regime, using one source
133
+ training protein pair and two handwritten English pairs. It does not recompute
134
+ the study's benchmark tables.
135
+
136
+ ## Validation and maintenance
137
+
138
+ `portable_core.py` is a byte-identical copy of the original frozen model module
139
+ (SHA-256 `b2362edf8850fe20fbd23cc958a71f92ac2a187de4316f53f8750d3bca857592`).
140
+ `catalog_build_audit.json` records independent file/state/config/finiteness
141
+ verification of all 36 original checkpoints. `test_inference.py` covers file and
142
+ catalog tampering, wrong parent/job/epoch/config, missing or malformed heads,
143
+ nonfinite states, tokenizer tampering, path escapes and endpoint truncation.
144
+
145
+ ```bash
146
+ python -m unittest discover -s . -p test_inference.py -v
147
+ ```
148
+
149
+ `build_catalog.py` and `validate_cpu_replay.py` are maintainer-only provenance
150
+ tools that take an explicit original workspace root. They are not needed by
151
+ users loading this public package. No weight is copied by the catalog builder.
152
+
153
+ ## Data attribution and licensing status
154
+
155
+ The protein inputs derive from UniProtKB/Swiss-Prot with sequence-source
156
+ attribution in the accompanying protein release. English pretraining uses the
157
+ documented OpenWebText selection. The experiment-generated shared BPE vocabulary
158
+ was trained on 16 MiB each of English and protein training text; it is reused from
159
+ the historical rebuilt v2 tokenizer. The tokenizer is not an independently
160
+ trained model for every later holdout. Corpus membership and exposure limitations
161
+ remain those described in the study and data card.
162
+
163
+ **No model-weight license has been assigned in this release.** No license grant
164
+ is inferred from training-data licenses or code provenance. Accordingly, this
165
+ card deliberately omits the Hugging Face `license` metadata field. Public
166
+ availability alone does not establish unrestricted redistribution or commercial
167
+ use rights. Any later license assignment must be a separate documented change.
build_catalog.py ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Project original verified artifacts into a public path-independent catalog.
2
+
3
+ Maintainer tool only: no network access and no weight copying. The upload map
4
+ uses workspace-relative source paths and public repository-relative destinations.
5
+ """
6
+ from __future__ import annotations
7
+
8
+ import argparse
9
+ from datetime import datetime, timezone
10
+ import json
11
+ from pathlib import Path
12
+ import shutil
13
+
14
+ import torch
15
+
16
+ from inference import canonical_sha, file_sha, state_parts, require
17
+ import portable_core as core
18
+
19
+
20
+ TRAINING = Path("bio2nl/review/new_data_full_training_v1_2026-10-02")
21
+ ASSETS = Path("release_staging/revision_2026-10-03_v1/source/metadata/models_assets.json")
22
+ TOKENIZER = Path("data_rebuild/2026-10-01-portable-v2/tokenizers/mixed_bpe/tokenizer.json")
23
+
24
+
25
+ def write(path, value):
26
+ require(not path.exists(), "Refuse to overwrite generated artifact")
27
+ path.write_text(json.dumps(value, indent=2, sort_keys=True, allow_nan=False) + "\n")
28
+
29
+
30
+ def run(workspace, output):
31
+ workspace, output = Path(workspace).resolve(), Path(output).resolve()
32
+ output.mkdir(exist_ok=True, parents=True)
33
+ require(not (output / "model_catalog.json").exists(), "Catalog already exists")
34
+ assets = json.loads((workspace / ASSETS).read_text())
35
+ selection_path = workspace / TRAINING / "results/source_selection.json"
36
+ selection = json.loads(selection_path.read_text())
37
+ require(file_sha(selection_path) == assets["source_selection_sha256"], "Source selection digest differs")
38
+ require(selection["status"] == "frozen" and selection["conditions_filtered_by_score"] is False,
39
+ "Source selection was not frozen")
40
+ protocol_path = workspace / TRAINING / "protocol.json"
41
+ require(file_sha(protocol_path) == selection["protocol_sha256"], "Training protocol digest differs")
42
+ protocol = json.loads(protocol_path.read_text())
43
+ config = core.make_config(protocol["design"]).to_dict()
44
+ torch.set_num_threads(4)
45
+ selected = {(x["job"]["condition"], x["job"]["pt_seed"], x["job"]["ft_seed"]): x for x in selection["selected"]}
46
+ require(len(selected) == 27 and len(assets["files"]) == 36, "Incomplete model grid")
47
+ tokenizer_file = workspace / TOKENIZER
48
+ tokenizer_sha = file_sha(tokenizer_file)
49
+ require(tokenizer_sha == protocol["design"]["tokenizer"]["sha256"], "Shared tokenizer differs")
50
+ tokenizer_json = json.loads(tokenizer_file.read_text())
51
+ tokens = [x["content"] for x in sorted(tokenizer_json["added_tokens"], key=lambda x: x["id"])]
52
+ require(len(tokens) == 4, "Unexpected tokenizer special tokens")
53
+ catalog = {"schema_version": 1, "release_id": "bio2nl-2026-10-02-models-v1", "model_repository": "dnagpt/bio2nl-models",
54
+ "weight_license_status": "unassigned; no license grant is inferred from code or training-data licenses",
55
+ "training_protocol_sha256": selection["protocol_sha256"], "prepared_manifest_sha256": selection["prepared_manifest_sha256"],
56
+ "source_selection_sha256": file_sha(selection_path), "source_assets_manifest_sha256": file_sha(workspace / ASSETS),
57
+ "frozen_model_implementation_sha256": file_sha(workspace / TRAINING / "code_snapshot/model.py"),
58
+ "config": config, "config_canonical_sha256": canonical_sha(config),
59
+ "conditions": {"EP": "English + natural protein", "ES": "English + residue-shuffled protein", "EE": "English + additional English"},
60
+ "tokenizer": {"path": "tokenizer.json", "sha256": tokenizer_sha, "bytes": tokenizer_file.stat().st_size,
61
+ "vocab_size": 32000, "special_tokens": tokens,
62
+ "training_recipe": "Shared byte-level BPE trained on 16 MiB English and 16 MiB protein training text; historical v2 tokenizer reused"},
63
+ "inference": {"endpoint_cap": 255, "context_length": 512, "format": "a[:255] + [SEP=2] + b[:255] + [EOS=1]",
64
+ "padding": "right, PAD=0", "pooling": "last attention-mask-valid token (EOS)",
65
+ "score_direction": "label 1", "decision": "argmax; ties label 0", "calibration": "none",
66
+ "reference_scoring_precision": "FP32 weights with CUDA BF16 autocast",
67
+ "portable_example_precision": "CPU FP32; exact CUDA BF16 predictions are not promised"},
68
+ "models": []}
69
+ mapping = []
70
+ audit = []
71
+ by_id = {}
72
+ for asset in assets["files"]:
73
+ path = workspace / asset["path"]
74
+ require(path.stat().st_size == asset["bytes"] and file_sha(path) == asset["sha256"], "Original weight digest differs")
75
+ classifier = "ft_seed" in asset
76
+ condition, pt = asset["condition"], asset["pt_seed"]
77
+ model_id = f"{condition}-pt{pt}" + (f"-ft{asset['ft_seed']}" if classifier else "")
78
+ remote = f"checkpoints/source/{condition}/pt{pt}/ft{asset['ft_seed']}/best.pt" if classifier else f"checkpoints/pretrain/{condition}/pt{pt}/model.pt"
79
+ meta_path = path.parent / "metadata.json"
80
+ meta = json.loads(meta_path.read_text())
81
+ require(meta["status"] == "completed" and meta["run_kind"] == "full", "Incomplete original run")
82
+ payload = torch.load(path, map_location="cpu", weights_only=True, mmap=True)
83
+ kind = "source_classifier" if classifier else "causal_lm"
84
+ job = {"condition": condition, "pt_seed": pt, "smoke": False}
85
+ if classifier:
86
+ job["ft_seed"] = asset["ft_seed"]
87
+ require(payload["schema_version"] == 1 and payload["kind"] == kind and payload["metadata"]["job"] == job,
88
+ "Original checkpoint identity differs")
89
+ require(payload["metadata"]["protocol_sha256"] == selection["protocol_sha256"] and
90
+ payload["metadata"]["prepared_manifest_sha256"] == selection["prepared_manifest_sha256"], "Original provenance differs")
91
+ require(canonical_sha(payload["config"]) == canonical_sha(config), "Original complete config differs")
92
+ state = payload["state_dict"]
93
+ require(all(x.dtype == torch.float32 and torch.isfinite(x).all() for x in state.values()), "Invalid weight tensor")
94
+ digest = core.state_digest(state)
95
+ require(digest == payload["state_sha256"] == meta["checkpoint"]["state_sha256"], "Original state digest differs")
96
+ backbone, head = state_parts(state, kind)
97
+ entry = {"id": model_id, "kind": kind, "job": job,
98
+ "checkpoint": {"path": remote, "sha256": asset["sha256"], "bytes": asset["bytes"]},
99
+ "state_sha256": digest, "state_tensor_count": len(state), "backbone_state_sha256": backbone,
100
+ "head_state_sha256": head, "config_sha256": canonical_sha(config), "tokenizer_sha256": tokenizer_sha,
101
+ "training_result_sha256": file_sha(meta_path),
102
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)" if classifier else "tied 32000 x 768 language-model output embedding"}
103
+ if classifier:
104
+ chosen = selected[(condition, pt, asset["ft_seed"])]
105
+ require(chosen["checkpoint"]["sha256"] == asset["sha256"] and chosen["checkpoint"]["state_sha256"] == digest and
106
+ chosen["source_result"]["sha256"] == file_sha(meta_path), "Frozen selection differs")
107
+ require(payload["metadata"]["epoch"] == chosen["best_epoch"] == asset["best_epoch"] == meta["best_epoch"], "Selected epoch differs")
108
+ parent = by_id[f"{condition}-pt{pt}"]
109
+ require(meta["pretraining_checkpoint"]["sha256"] == parent["checkpoint"]["sha256"] and
110
+ meta["pretraining_checkpoint"]["state_sha256"] == parent["state_sha256"] and
111
+ meta["new_parent_backbone_exactly_inherited"] is True, "Parent link differs")
112
+ require(tuple(state["score.weight"].shape) == (2, 768), "Original classifier head differs")
113
+ entry.update(selected_epoch=chosen["best_epoch"], selection="minimum source validation CE; ties earlier epoch",
114
+ pretraining_parent={"id": parent["id"], "sha256": parent["checkpoint"]["sha256"], "state_sha256": parent["state_sha256"]})
115
+ else:
116
+ require(torch.equal(state["lm_head.weight"], state["transformer.wte.weight"]), "LM tied aliases differ")
117
+ entry.update(pretraining_steps=meta["updates"], input_tokens=meta["input_tokens"])
118
+ catalog["models"].append(entry)
119
+ by_id[model_id] = entry
120
+ mapping.append({"source_relative": asset["path"], "path_in_repo": remote, "sha256": asset["sha256"], "bytes": asset["bytes"]})
121
+ audit.append({"id": model_id, "file_verified": True, "state_verified": True, "config_verified": True,
122
+ "finite_fp32": True, "source_selection_verified": classifier, "tensor_count": len(state)})
123
+ del payload, state
124
+ print("verified", model_id, flush=True)
125
+ shutil.copyfile(tokenizer_file, output / "tokenizer.json")
126
+ write(output / "config.json", config)
127
+ write(output / "model_catalog.json", catalog)
128
+ write(output / "upload_mapping.json", {"schema_version": 1, "model_repository": "dnagpt/bio2nl-models", "repo_type": "model",
129
+ "scope": "Existing original weights; no second weight copy; package support files added separately", "weights": mapping})
130
+ write(output / "catalog_build_audit.json", {"status": "passed", "completed_at_utc": datetime.now(timezone.utc).isoformat(),
131
+ "models": audit, "weight_files": len(mapping), "weight_bytes": sum(x["bytes"] for x in mapping),
132
+ "catalog_sha256": file_sha(output / "model_catalog.json"), "weight_files_copied": 0,
133
+ "trained_or_scored_benchmarks": False, "gpu_used": False})
134
+
135
+
136
+ if __name__ == "__main__":
137
+ parser = argparse.ArgumentParser(description=__doc__)
138
+ parser.add_argument("--workspace", type=Path, required=True)
139
+ parser.add_argument("--output", type=Path, required=True)
140
+ args = parser.parse_args()
141
+ run(args.workspace, args.output)
catalog_build_audit.json ADDED
@@ -0,0 +1,336 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "catalog_sha256": "5f6694f206084ad51dcc27c1485c4b4d000ffe5023310482aab367d0815df067",
3
+ "completed_at_utc": "2026-10-03T08:13:32.395981+00:00",
4
+ "gpu_used": false,
5
+ "models": [
6
+ {
7
+ "config_verified": true,
8
+ "file_verified": true,
9
+ "finite_fp32": true,
10
+ "id": "EP-pt0",
11
+ "source_selection_verified": false,
12
+ "state_verified": true,
13
+ "tensor_count": 149
14
+ },
15
+ {
16
+ "config_verified": true,
17
+ "file_verified": true,
18
+ "finite_fp32": true,
19
+ "id": "EP-pt1",
20
+ "source_selection_verified": false,
21
+ "state_verified": true,
22
+ "tensor_count": 149
23
+ },
24
+ {
25
+ "config_verified": true,
26
+ "file_verified": true,
27
+ "finite_fp32": true,
28
+ "id": "EP-pt2",
29
+ "source_selection_verified": false,
30
+ "state_verified": true,
31
+ "tensor_count": 149
32
+ },
33
+ {
34
+ "config_verified": true,
35
+ "file_verified": true,
36
+ "finite_fp32": true,
37
+ "id": "ES-pt0",
38
+ "source_selection_verified": false,
39
+ "state_verified": true,
40
+ "tensor_count": 149
41
+ },
42
+ {
43
+ "config_verified": true,
44
+ "file_verified": true,
45
+ "finite_fp32": true,
46
+ "id": "ES-pt1",
47
+ "source_selection_verified": false,
48
+ "state_verified": true,
49
+ "tensor_count": 149
50
+ },
51
+ {
52
+ "config_verified": true,
53
+ "file_verified": true,
54
+ "finite_fp32": true,
55
+ "id": "ES-pt2",
56
+ "source_selection_verified": false,
57
+ "state_verified": true,
58
+ "tensor_count": 149
59
+ },
60
+ {
61
+ "config_verified": true,
62
+ "file_verified": true,
63
+ "finite_fp32": true,
64
+ "id": "EE-pt0",
65
+ "source_selection_verified": false,
66
+ "state_verified": true,
67
+ "tensor_count": 149
68
+ },
69
+ {
70
+ "config_verified": true,
71
+ "file_verified": true,
72
+ "finite_fp32": true,
73
+ "id": "EE-pt1",
74
+ "source_selection_verified": false,
75
+ "state_verified": true,
76
+ "tensor_count": 149
77
+ },
78
+ {
79
+ "config_verified": true,
80
+ "file_verified": true,
81
+ "finite_fp32": true,
82
+ "id": "EE-pt2",
83
+ "source_selection_verified": false,
84
+ "state_verified": true,
85
+ "tensor_count": 149
86
+ },
87
+ {
88
+ "config_verified": true,
89
+ "file_verified": true,
90
+ "finite_fp32": true,
91
+ "id": "EP-pt0-ft0",
92
+ "source_selection_verified": true,
93
+ "state_verified": true,
94
+ "tensor_count": 149
95
+ },
96
+ {
97
+ "config_verified": true,
98
+ "file_verified": true,
99
+ "finite_fp32": true,
100
+ "id": "EP-pt0-ft1",
101
+ "source_selection_verified": true,
102
+ "state_verified": true,
103
+ "tensor_count": 149
104
+ },
105
+ {
106
+ "config_verified": true,
107
+ "file_verified": true,
108
+ "finite_fp32": true,
109
+ "id": "EP-pt0-ft2",
110
+ "source_selection_verified": true,
111
+ "state_verified": true,
112
+ "tensor_count": 149
113
+ },
114
+ {
115
+ "config_verified": true,
116
+ "file_verified": true,
117
+ "finite_fp32": true,
118
+ "id": "ES-pt0-ft0",
119
+ "source_selection_verified": true,
120
+ "state_verified": true,
121
+ "tensor_count": 149
122
+ },
123
+ {
124
+ "config_verified": true,
125
+ "file_verified": true,
126
+ "finite_fp32": true,
127
+ "id": "ES-pt0-ft1",
128
+ "source_selection_verified": true,
129
+ "state_verified": true,
130
+ "tensor_count": 149
131
+ },
132
+ {
133
+ "config_verified": true,
134
+ "file_verified": true,
135
+ "finite_fp32": true,
136
+ "id": "ES-pt0-ft2",
137
+ "source_selection_verified": true,
138
+ "state_verified": true,
139
+ "tensor_count": 149
140
+ },
141
+ {
142
+ "config_verified": true,
143
+ "file_verified": true,
144
+ "finite_fp32": true,
145
+ "id": "EE-pt0-ft0",
146
+ "source_selection_verified": true,
147
+ "state_verified": true,
148
+ "tensor_count": 149
149
+ },
150
+ {
151
+ "config_verified": true,
152
+ "file_verified": true,
153
+ "finite_fp32": true,
154
+ "id": "EE-pt0-ft1",
155
+ "source_selection_verified": true,
156
+ "state_verified": true,
157
+ "tensor_count": 149
158
+ },
159
+ {
160
+ "config_verified": true,
161
+ "file_verified": true,
162
+ "finite_fp32": true,
163
+ "id": "EE-pt0-ft2",
164
+ "source_selection_verified": true,
165
+ "state_verified": true,
166
+ "tensor_count": 149
167
+ },
168
+ {
169
+ "config_verified": true,
170
+ "file_verified": true,
171
+ "finite_fp32": true,
172
+ "id": "EP-pt1-ft0",
173
+ "source_selection_verified": true,
174
+ "state_verified": true,
175
+ "tensor_count": 149
176
+ },
177
+ {
178
+ "config_verified": true,
179
+ "file_verified": true,
180
+ "finite_fp32": true,
181
+ "id": "EP-pt1-ft1",
182
+ "source_selection_verified": true,
183
+ "state_verified": true,
184
+ "tensor_count": 149
185
+ },
186
+ {
187
+ "config_verified": true,
188
+ "file_verified": true,
189
+ "finite_fp32": true,
190
+ "id": "EP-pt1-ft2",
191
+ "source_selection_verified": true,
192
+ "state_verified": true,
193
+ "tensor_count": 149
194
+ },
195
+ {
196
+ "config_verified": true,
197
+ "file_verified": true,
198
+ "finite_fp32": true,
199
+ "id": "ES-pt1-ft0",
200
+ "source_selection_verified": true,
201
+ "state_verified": true,
202
+ "tensor_count": 149
203
+ },
204
+ {
205
+ "config_verified": true,
206
+ "file_verified": true,
207
+ "finite_fp32": true,
208
+ "id": "ES-pt1-ft1",
209
+ "source_selection_verified": true,
210
+ "state_verified": true,
211
+ "tensor_count": 149
212
+ },
213
+ {
214
+ "config_verified": true,
215
+ "file_verified": true,
216
+ "finite_fp32": true,
217
+ "id": "ES-pt1-ft2",
218
+ "source_selection_verified": true,
219
+ "state_verified": true,
220
+ "tensor_count": 149
221
+ },
222
+ {
223
+ "config_verified": true,
224
+ "file_verified": true,
225
+ "finite_fp32": true,
226
+ "id": "EE-pt1-ft0",
227
+ "source_selection_verified": true,
228
+ "state_verified": true,
229
+ "tensor_count": 149
230
+ },
231
+ {
232
+ "config_verified": true,
233
+ "file_verified": true,
234
+ "finite_fp32": true,
235
+ "id": "EE-pt1-ft1",
236
+ "source_selection_verified": true,
237
+ "state_verified": true,
238
+ "tensor_count": 149
239
+ },
240
+ {
241
+ "config_verified": true,
242
+ "file_verified": true,
243
+ "finite_fp32": true,
244
+ "id": "EE-pt1-ft2",
245
+ "source_selection_verified": true,
246
+ "state_verified": true,
247
+ "tensor_count": 149
248
+ },
249
+ {
250
+ "config_verified": true,
251
+ "file_verified": true,
252
+ "finite_fp32": true,
253
+ "id": "EP-pt2-ft0",
254
+ "source_selection_verified": true,
255
+ "state_verified": true,
256
+ "tensor_count": 149
257
+ },
258
+ {
259
+ "config_verified": true,
260
+ "file_verified": true,
261
+ "finite_fp32": true,
262
+ "id": "EP-pt2-ft1",
263
+ "source_selection_verified": true,
264
+ "state_verified": true,
265
+ "tensor_count": 149
266
+ },
267
+ {
268
+ "config_verified": true,
269
+ "file_verified": true,
270
+ "finite_fp32": true,
271
+ "id": "EP-pt2-ft2",
272
+ "source_selection_verified": true,
273
+ "state_verified": true,
274
+ "tensor_count": 149
275
+ },
276
+ {
277
+ "config_verified": true,
278
+ "file_verified": true,
279
+ "finite_fp32": true,
280
+ "id": "ES-pt2-ft0",
281
+ "source_selection_verified": true,
282
+ "state_verified": true,
283
+ "tensor_count": 149
284
+ },
285
+ {
286
+ "config_verified": true,
287
+ "file_verified": true,
288
+ "finite_fp32": true,
289
+ "id": "ES-pt2-ft1",
290
+ "source_selection_verified": true,
291
+ "state_verified": true,
292
+ "tensor_count": 149
293
+ },
294
+ {
295
+ "config_verified": true,
296
+ "file_verified": true,
297
+ "finite_fp32": true,
298
+ "id": "ES-pt2-ft2",
299
+ "source_selection_verified": true,
300
+ "state_verified": true,
301
+ "tensor_count": 149
302
+ },
303
+ {
304
+ "config_verified": true,
305
+ "file_verified": true,
306
+ "finite_fp32": true,
307
+ "id": "EE-pt2-ft0",
308
+ "source_selection_verified": true,
309
+ "state_verified": true,
310
+ "tensor_count": 149
311
+ },
312
+ {
313
+ "config_verified": true,
314
+ "file_verified": true,
315
+ "finite_fp32": true,
316
+ "id": "EE-pt2-ft1",
317
+ "source_selection_verified": true,
318
+ "state_verified": true,
319
+ "tensor_count": 149
320
+ },
321
+ {
322
+ "config_verified": true,
323
+ "file_verified": true,
324
+ "finite_fp32": true,
325
+ "id": "EE-pt2-ft2",
326
+ "source_selection_verified": true,
327
+ "state_verified": true,
328
+ "tensor_count": 149
329
+ }
330
+ ],
331
+ "status": "passed",
332
+ "trained_or_scored_benchmarks": false,
333
+ "weight_bytes": 15845506290,
334
+ "weight_files": 36,
335
+ "weight_files_copied": 0
336
+ }
checkpoints/pretrain/EE/pt0/model.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5af7730f436af372a0d43bfed57f87a3ea2e6aa4826493aa21eacd3acdd4dccc
3
+ size 440148490
checkpoints/pretrain/EE/pt1/model.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:653a88903ee373e5b8933c71d386a64ca6840249f9a42cc2c992b0202f04739f
3
+ size 440148490
checkpoints/pretrain/EE/pt2/model.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:68e49c6af5cb3fa34b1820925cb1751055c38c25de8122b5ba19a40937ad0ba9
3
+ size 440148490
checkpoints/pretrain/EP/pt0/model.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f6d44eb163960891e8af7d4f701580c852534f3ab476d9b6c281903f3c329327
3
+ size 440148490
checkpoints/pretrain/EP/pt1/model.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:09c034afc616d6ed529fe62af1c604a07e0bc64a32f58630908300caf250c44a
3
+ size 440148490
checkpoints/pretrain/EP/pt2/model.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a1285feb6eb6380bfedfe670a27e9f09b19163b33f76145cc008de0b1e223155
3
+ size 440148490
checkpoints/pretrain/ES/pt0/model.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:452c6178f682ae50e53c8df1311134e188c99d2fcce7805f0d65d379910f277d
3
+ size 440148490
checkpoints/pretrain/ES/pt1/model.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2f357c92c20c633a636f936246bfeadec31a9ee8792bfcaef1db2acf3ee1a737
3
+ size 440148490
checkpoints/pretrain/ES/pt2/model.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e954373b086d2d3fe3b015440a185f4a146e01825007bc57cbcc609ed3d30254
3
+ size 440148490
checkpoints/source/EE/pt0/ft0/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c1aa8820704665541550d7f59fed367c30dcc55b60c90f4ea2dcec75dce4103e
3
+ size 440154440
checkpoints/source/EE/pt0/ft1/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2a3ac91f4392196e836221e0435388b0e6ecae6c117be26f2b43de3e6507c4a1
3
+ size 440154440
checkpoints/source/EE/pt0/ft2/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:22d6e120e8f24fb5b0bb15bcb2d463733dea39d6599ed0234841cb9ff47f2ee1
3
+ size 440154440
checkpoints/source/EE/pt1/ft0/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7e75b5380df75393dae4a125df812f6500288955ab92a20ef610eb15eaff646f
3
+ size 440154440
checkpoints/source/EE/pt1/ft1/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c869b1c0c8cf4288485936795fbb8263b5af55bc39fa9df0513758c5cbfd5a87
3
+ size 440154440
checkpoints/source/EE/pt1/ft2/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0db9423ef969016260d1ddbbf700d5bbc71340b6847e0c8ecf5e4696fa2bb732
3
+ size 440154440
checkpoints/source/EE/pt2/ft0/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:92946799e5a378609b6dae042db4c263e53fd8123f101102a3e50b1c8a694b1a
3
+ size 440154440
checkpoints/source/EE/pt2/ft1/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3879fab3b33328347f852ac813bbc194be808526b4b97b1613292126b56f7751
3
+ size 440154440
checkpoints/source/EE/pt2/ft2/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c2fcac930e4a69d8138dc508ca4471f52be6ce76c8a90efd819b0780f73225b5
3
+ size 440154440
checkpoints/source/EP/pt0/ft0/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:574117f9bbbaa589a0f1fd726567ead899510c05bcbcc0cbf71e3b57c72edebb
3
+ size 440154440
checkpoints/source/EP/pt0/ft1/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a5c9522ed086bb54ce62ca74717c130143cfe07352b07a698529f1bedb497b6c
3
+ size 440154440
checkpoints/source/EP/pt0/ft2/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:19277d64bb879906e98df99d1c77623c46d8ccad2c33eda796ba1b9bcd4cf3b5
3
+ size 440154440
checkpoints/source/EP/pt1/ft0/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1a4e205e237b684cc14b79aea27a59ba45adb68e3e2ee0d345a7476433d88e3c
3
+ size 440154440
checkpoints/source/EP/pt1/ft1/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2e3ad2344834e5a70403bbef8c19f55aacb6b25b83725138bb82e2274723797c
3
+ size 440154440
checkpoints/source/EP/pt1/ft2/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:47615a93378959abbe6ffaf3475a6561ec9c6d11a94a04da6954b6801994704e
3
+ size 440154440
checkpoints/source/EP/pt2/ft0/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7ecaeba8d20e8f65b78a11412817da9cdaf84127c03765c1fb95a44442f921f4
3
+ size 440154440
checkpoints/source/EP/pt2/ft1/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:34c588c5e10d7ba6c6320cc59cf883ad47465cdcf9a07d540a45e55720e993eb
3
+ size 440154440
checkpoints/source/EP/pt2/ft2/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c1af8f442b9e13944e2bb5158900c2f1ca824af7583ebcb5a365d6b6317cdd3f
3
+ size 440154440
checkpoints/source/ES/pt0/ft0/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:69069d19cade14739612d991743be14f3debe97e8c8cf48379810bed1498e913
3
+ size 440154440
checkpoints/source/ES/pt0/ft1/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:bde6f1f919b7f5657edb0edb920941df3db8a88dd44089acd05b6b89c29c19be
3
+ size 440154440
checkpoints/source/ES/pt0/ft2/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ec82de031e16af6005b1221327e6b58f9b8d1dc8f1a0072325a33453575b3b51
3
+ size 440154440
checkpoints/source/ES/pt1/ft0/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b24e6de1f73186bc5167afce790c5794dd109f1d077fde1dc207ff4c360bed5c
3
+ size 440154440
checkpoints/source/ES/pt1/ft1/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d43962d06f256000a8707dbc61e3d860dcebd4d50e0ac77b724ef921a79aae2c
3
+ size 440154440
checkpoints/source/ES/pt1/ft2/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:fe879c8b4f45a84e08d728affc2c4cd6d28fb87b92cc8759b4ddc408f786d8f9
3
+ size 440154440
checkpoints/source/ES/pt2/ft0/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4e3193aba5334d7c1093a156b8dc72b3690ac3cce149373c7aa01958e2dceb73
3
+ size 440154440
checkpoints/source/ES/pt2/ft1/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5509eb7ac7f77b3378874e9f5ceb2d51176ff1b175edaec8bd86449596335c48
3
+ size 440154440
checkpoints/source/ES/pt2/ft2/best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:bbe4ea6d3953fb9c4e954952c7deb3cbbfde9ad102de1c797fcb35333e4e41e5
3
+ size 440154440
config.json ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_name_or_path": "",
3
+ "activation_function": "gelu_new",
4
+ "add_cross_attention": false,
5
+ "architectures": null,
6
+ "attn_pdrop": 0.1,
7
+ "bad_words_ids": null,
8
+ "begin_suppress_tokens": null,
9
+ "bos_token_id": 1,
10
+ "chunk_size_feed_forward": 0,
11
+ "cross_attention_hidden_size": null,
12
+ "decoder_start_token_id": null,
13
+ "diversity_penalty": 0.0,
14
+ "do_sample": false,
15
+ "early_stopping": false,
16
+ "embd_pdrop": 0.1,
17
+ "encoder_no_repeat_ngram_size": 0,
18
+ "eos_token_id": 1,
19
+ "exponential_decay_length_penalty": null,
20
+ "finetuning_task": null,
21
+ "forced_bos_token_id": null,
22
+ "forced_eos_token_id": null,
23
+ "id2label": {
24
+ "0": "LABEL_0",
25
+ "1": "LABEL_1"
26
+ },
27
+ "initializer_range": 0.02,
28
+ "is_decoder": false,
29
+ "is_encoder_decoder": false,
30
+ "label2id": {
31
+ "LABEL_0": 0,
32
+ "LABEL_1": 1
33
+ },
34
+ "layer_norm_epsilon": 1e-05,
35
+ "length_penalty": 1.0,
36
+ "max_length": 20,
37
+ "min_length": 0,
38
+ "model_type": "gpt2",
39
+ "n_ctx": 512,
40
+ "n_embd": 768,
41
+ "n_head": 12,
42
+ "n_inner": 3072,
43
+ "n_layer": 12,
44
+ "n_positions": 512,
45
+ "no_repeat_ngram_size": 0,
46
+ "num_beam_groups": 1,
47
+ "num_beams": 1,
48
+ "num_return_sequences": 1,
49
+ "output_attentions": false,
50
+ "output_hidden_states": false,
51
+ "output_scores": false,
52
+ "pad_token_id": 0,
53
+ "prefix": null,
54
+ "problem_type": null,
55
+ "pruned_heads": {},
56
+ "remove_invalid_values": false,
57
+ "reorder_and_upcast_attn": false,
58
+ "repetition_penalty": 1.0,
59
+ "resid_pdrop": 0.1,
60
+ "return_dict": true,
61
+ "return_dict_in_generate": false,
62
+ "scale_attn_by_inverse_layer_idx": false,
63
+ "scale_attn_weights": true,
64
+ "sep_token_id": null,
65
+ "summary_activation": null,
66
+ "summary_first_dropout": 0.1,
67
+ "summary_proj_to_labels": true,
68
+ "summary_type": "cls_index",
69
+ "summary_use_proj": true,
70
+ "suppress_tokens": null,
71
+ "task_specific_params": null,
72
+ "temperature": 1.0,
73
+ "tf_legacy_loss": false,
74
+ "tie_encoder_decoder": false,
75
+ "tie_word_embeddings": true,
76
+ "tokenizer_class": null,
77
+ "top_k": 50,
78
+ "top_p": 1.0,
79
+ "torch_dtype": null,
80
+ "torchscript": false,
81
+ "transformers_version": "4.45.2",
82
+ "typical_p": 1.0,
83
+ "use_bfloat16": false,
84
+ "use_cache": false,
85
+ "vocab_size": 32000
86
+ }
cpu_replay_audit.json ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "all_encodings_exact": true,
3
+ "batch_size_1_vs_3_max_abs_log_probability_difference": 1.1920928955078125e-07,
4
+ "benchmark_scores_computed": false,
5
+ "catalog_sha256": "5f6694f206084ad51dcc27c1485c4b4d000ffe5023310482aab367d0815df067",
6
+ "classifier_id": "EP-pt0-ft0",
7
+ "classifier_max_abs_log_probability_difference": 0.0,
8
+ "classifier_predictions_exact": true,
9
+ "code_sha256": {
10
+ "inference.py": "43f5a1c770354b588b046ff02e4d03df4c13086224df4fba1285f8f2b3cf91ec",
11
+ "portable_core.py": "b2362edf8850fe20fbd23cc958a71f92ac2a187de4316f53f8750d3bca857592",
12
+ "validate_cpu_replay.py": "c8d232a6a386b6ce2a1d204887c0d582cd12d90b7988ed315158f1ed141f8ac4"
13
+ },
14
+ "completed_at_utc": "2026-10-03T08:22:48.747609+00:00",
15
+ "cpu_threads": 4,
16
+ "device": "cpu",
17
+ "examples": {
18
+ "handwritten_english_pairs": 2,
19
+ "source_training_protein_pairs": 1,
20
+ "source_training_row_id": "a4478a3375338815d4abef8adc599c5dd44affd5a4265ebb2a350890b8327e81"
21
+ },
22
+ "fixed_batch_padding_tolerance": 1e-05,
23
+ "gpu_used": false,
24
+ "limitation": "CPU FP32 replay validates portable loading/encoding. It does not promise bitwise equality with prior CUDA BF16 benchmark predictions.",
25
+ "optimizer_updates": 0,
26
+ "original_training_first_row_input_exact": true,
27
+ "portable_core_sha256": "b2362edf8850fe20fbd23cc958a71f92ac2a187de4316f53f8750d3bca857592",
28
+ "precision": "float32",
29
+ "pretraining_id": "EP-pt0",
30
+ "pretraining_max_abs_logit_difference": 0.0,
31
+ "reference_encoding_code_sha256": "c3e2f213da25ca7576a2875f77b33c9fa50b4ffc670a11c402d407708c9ee5bc",
32
+ "reference_model_code_sha256": "b2362edf8850fe20fbd23cc958a71f92ac2a187de4316f53f8750d3bca857592",
33
+ "status": "passed"
34
+ }
example_pairs.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "sentence1": "A small bird sits beside the window.",
4
+ "sentence2": "A bird is sitting next to a window."
5
+ },
6
+ {
7
+ "sentence1": "The protein sequence is an experimental input.",
8
+ "sentence2": "The train leaves at noon."
9
+ }
10
+ ]
inference.py ADDED
@@ -0,0 +1,213 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Offline CPU inference with independently pinned model catalog and artifacts.
2
+
3
+ No downloads, training, benchmark scoring or workspace-dependent imports occur.
4
+ The catalog digest must be obtained from a trusted release, not from a changed
5
+ local catalog. Checkpoints are the original complete weights-only PyTorch files.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import argparse
10
+ import hashlib
11
+ import json
12
+ from pathlib import Path, PurePosixPath
13
+ import re
14
+
15
+ import numpy as np
16
+ import torch
17
+ from tokenizers import Tokenizer
18
+
19
+ import portable_core as core
20
+
21
+
22
+ def require(ok, message):
23
+ if not ok:
24
+ raise ValueError(message)
25
+
26
+
27
+ def canonical_sha(value):
28
+ return hashlib.sha256(json.dumps(value, sort_keys=True, separators=(",", ":"), allow_nan=False).encode()).hexdigest()
29
+
30
+
31
+ def file_sha(path):
32
+ with Path(path).open("rb") as stream:
33
+ return hashlib.file_digest(stream, "sha256").hexdigest()
34
+
35
+
36
+ def safe_path(root, relative):
37
+ require(isinstance(relative, str) and relative and "\\" not in relative and "\0" not in relative,
38
+ "Invalid artifact path")
39
+ item = PurePosixPath(relative)
40
+ require(not item.is_absolute() and str(item) == relative and not any(x in ("", ".", "..") for x in item.parts),
41
+ "Artifact path must be canonical and relative")
42
+ root = Path(root).resolve()
43
+ target = (root / relative).resolve()
44
+ require(target.is_relative_to(root), "Artifact escapes artifact root")
45
+ return target
46
+
47
+
48
+ def verify_file(path, descriptor):
49
+ require(Path(path).is_file() and Path(path).stat().st_size == descriptor["bytes"], "Artifact size differs")
50
+ require(file_sha(path) == descriptor["sha256"], "Artifact SHA-256 differs")
51
+
52
+
53
+ def read_catalog(path, expected_sha256):
54
+ require(isinstance(expected_sha256, str) and re.fullmatch(r"[0-9a-f]{64}", expected_sha256),
55
+ "Trusted catalog SHA-256 is required")
56
+ raw = Path(path).read_bytes()
57
+ require(hashlib.sha256(raw).hexdigest() == expected_sha256, "Catalog SHA-256 differs")
58
+ catalog = json.loads(raw)
59
+ require(catalog.get("schema_version") == 1 and catalog.get("release_id") == "bio2nl-2026-10-02-models-v1",
60
+ "Unknown model catalog")
61
+ entries = catalog["models"]
62
+ expected = {f"{c}-pt{p}" for c in ("EP", "ES", "EE") for p in range(3)}
63
+ expected |= {f"{c}-pt{p}-ft{f}" for c in ("EP", "ES", "EE") for p in range(3) for f in range(3)}
64
+ require(len(entries) == 36 and len({x["id"] for x in entries}) == 36 and {x["id"] for x in entries} == expected,
65
+ "Catalog model grid differs")
66
+ for entry in entries:
67
+ require(entry["config_sha256"] == canonical_sha(catalog["config"]), "Config identity differs")
68
+ require(entry["tokenizer_sha256"] == catalog["tokenizer"]["sha256"], "Tokenizer identity differs")
69
+ job = entry["job"]
70
+ classifier = entry["kind"] == "source_classifier"
71
+ require(entry["kind"] in ("causal_lm", "source_classifier") and job.get("smoke") is False,
72
+ "Unexpected checkpoint kind/job")
73
+ suffix = f"-ft{job['ft_seed']}" if classifier else ""
74
+ require(entry["id"] == f"{job['condition']}-pt{job['pt_seed']}" + suffix, "Model/job identity differs")
75
+ if classifier:
76
+ parents = [p for p in entries if p["id"] == entry["pretraining_parent"]["id"]]
77
+ require(len(parents) == 1, "Missing classifier parent")
78
+ parent = parents[0]
79
+ require(parent["kind"] == "causal_lm" and parent["job"]["condition"] == job["condition"] and
80
+ parent["job"]["pt_seed"] == job["pt_seed"] and
81
+ entry["pretraining_parent"]["sha256"] == parent["checkpoint"]["sha256"] and
82
+ entry["pretraining_parent"]["state_sha256"] == parent["state_sha256"],
83
+ "Classifier pretraining-parent provenance differs")
84
+ require(type(entry["selected_epoch"]) is int and 1 <= entry["selected_epoch"] <= 5,
85
+ "Invalid source-selected epoch")
86
+ return catalog
87
+
88
+
89
+ def select(catalog, model_id):
90
+ rows = [entry for entry in catalog["models"] if entry["id"] == model_id]
91
+ require(len(rows) == 1, "Unknown model identifier")
92
+ return rows[0]
93
+
94
+
95
+ def load_tokenizer(catalog, artifact_root):
96
+ descriptor = catalog["tokenizer"]
97
+ path = safe_path(artifact_root, descriptor["path"])
98
+ verify_file(path, descriptor)
99
+ tokenizer = Tokenizer.from_file(str(path))
100
+ require(tokenizer.get_vocab_size() == 32000 and
101
+ [tokenizer.token_to_id(s) for s in descriptor["special_tokens"]] == [0, 1, 2, 3],
102
+ "Tokenizer vocabulary or special-token identities differ")
103
+ require(tokenizer.padding is None and tokenizer.truncation is None, "Unexpected tokenizer padding/truncation")
104
+ return tokenizer
105
+
106
+
107
+ def state_parts(state, kind):
108
+ prefix = "transformer." if kind == "causal_lm" else "backbone."
109
+ backbone = {key[len(prefix):]: value for key, value in state.items() if key.startswith(prefix)}
110
+ head_name = "lm_head.weight" if kind == "causal_lm" else "score.weight"
111
+ require(backbone and head_name in state, "Incomplete backbone/head state")
112
+ return core.state_digest(backbone), core.state_digest({head_name: state[head_name]})
113
+
114
+
115
+ def config_for_core(public_config):
116
+ """Restore integer-keyed config maps without mutating the public catalog."""
117
+ config = json.loads(json.dumps(public_config))
118
+ for field in ("id2label", "pruned_heads"):
119
+ config[field] = {int(key): value for key, value in config[field].items()}
120
+ return config
121
+
122
+
123
+ def original_config_sha_after_load(config):
124
+ """Transformers 4.45.2 from_dict adds only this runtime key in-place."""
125
+ original = dict(config)
126
+ require(original.pop("attn_implementation", None) is None, "Unexpected injected attention implementation")
127
+ return canonical_sha(original)
128
+
129
+
130
+ def load_model(catalog, model_id, artifact_root, checkpoint_override=None):
131
+ entry = select(catalog, model_id)
132
+ path = Path(checkpoint_override) if checkpoint_override is not None else safe_path(artifact_root, entry["checkpoint"]["path"])
133
+ require(path.stat().st_size == entry["checkpoint"]["bytes"], "Checkpoint size differs")
134
+ model, payload = core.load_checkpoint(path,
135
+ expected_sha256=entry["checkpoint"]["sha256"], expected_kind=entry["kind"], expected_job=entry["job"],
136
+ expected_state_sha256=entry["state_sha256"], expected_protocol_sha256=catalog["training_protocol_sha256"],
137
+ expected_manifest_sha256=catalog["prepared_manifest_sha256"], expected_epoch=entry.get("selected_epoch"),
138
+ expected_config=config_for_core(catalog["config"]))
139
+ require(original_config_sha_after_load(payload["config"]) == entry["config_sha256"], "Full checkpoint config differs")
140
+ backbone_sha, head_sha = state_parts(payload["state_dict"], entry["kind"])
141
+ require(backbone_sha == entry["backbone_state_sha256"] and head_sha == entry["head_state_sha256"],
142
+ "Backbone/head identity differs")
143
+ require(len(payload["state_dict"]) == entry["state_tensor_count"], "Tensor inventory differs")
144
+ if entry["kind"] == "source_classifier":
145
+ require(model.score.bias is None and tuple(model.score.weight.shape) == (2, 768), "Classifier head shape differs")
146
+ del payload
147
+ return model
148
+
149
+
150
+ def encode_pairs(tokenizer, pairs):
151
+ require(isinstance(pairs, list) and pairs, "Supply at least one sentence pair")
152
+ ids = np.zeros((len(pairs), 512), dtype=np.int64)
153
+ masks = np.zeros_like(ids)
154
+ details = []
155
+ for index, pair in enumerate(pairs):
156
+ require(isinstance(pair, dict) and set(pair) == {"sentence1", "sentence2"},
157
+ "Each pair requires only sentence1 and sentence2; labels are not accepted")
158
+ original = []
159
+ for field in ("sentence1", "sentence2"):
160
+ text = pair[field]
161
+ require(isinstance(text, str) and bool(text), "Empty/nontext endpoint")
162
+ content = tokenizer.encode(text, add_special_tokens=False).ids
163
+ require(content and all(4 <= token < 32000 for token in content), "Unknown/special content token")
164
+ require(tokenizer.decode(content, skip_special_tokens=False) == text, "Text roundtrip failed")
165
+ original.append(content)
166
+ joined = original[0][:255] + [2] + original[1][:255] + [1]
167
+ ids[index, :len(joined)] = joined
168
+ masks[index, :len(joined)] = 1
169
+ details.append({"original_content_tokens": [len(x) for x in original],
170
+ "truncated_endpoints": [len(x) > 255 for x in original], "encoded_length": len(joined)})
171
+ return {"input_ids": ids, "attention_mask": masks, "labels": np.zeros(len(pairs), dtype=np.int64)}, details
172
+
173
+
174
+ def predict_pairs(model, tokenizer, pairs, batch_size=1):
175
+ arrays, details = encode_pairs(tokenizer, pairs)
176
+ predicted = core.predict_source(model, arrays, batch_size=batch_size, device="cpu", precision="float32")
177
+ values = []
178
+ for logp, pred, detail in zip(predicted["log_probabilities"], predicted["predictions"], details):
179
+ values.append({**detail, "log_probabilities": logp.tolist(), "probability_label_1": float(np.exp(logp[1])),
180
+ "logit_margin_label_1_minus_0": float(logp[1] - logp[0]), "predicted_label": int(pred)})
181
+ return values
182
+
183
+
184
+ def main():
185
+ parser = argparse.ArgumentParser(description=__doc__)
186
+ parser.add_argument("command", choices=("verify", "predict"))
187
+ parser.add_argument("--catalog", type=Path, required=True)
188
+ parser.add_argument("--catalog-sha256", required=True)
189
+ parser.add_argument("--artifact-root", type=Path, required=True)
190
+ parser.add_argument("--model-id", required=True, help="For example EP-pt0-ft0 or EP-pt0")
191
+ parser.add_argument("--checkpoint", type=Path, help="Explicit relocated checkpoint; all hashes still apply")
192
+ parser.add_argument("--pairs", type=Path, help="JSON array with sentence1/sentence2, without labels")
193
+ parser.add_argument("--batch-size", type=int, default=1)
194
+ parser.add_argument("--cpu-threads", type=int, default=4)
195
+ args = parser.parse_args()
196
+ require(args.cpu_threads > 0, "Invalid CPU thread count")
197
+ torch.set_num_threads(args.cpu_threads)
198
+ torch.set_float32_matmul_precision("highest")
199
+ catalog = read_catalog(args.catalog, args.catalog_sha256)
200
+ tokenizer = load_tokenizer(catalog, args.artifact_root)
201
+ model = load_model(catalog, args.model_id, args.artifact_root, args.checkpoint)
202
+ result = {"model_id": args.model_id, "checkpoint_sha256": select(catalog, args.model_id)["checkpoint"]["sha256"],
203
+ "catalog_sha256": args.catalog_sha256, "device": "cpu", "precision": "float32", "verified": True}
204
+ if args.command == "predict":
205
+ require(select(catalog, args.model_id)["kind"] == "source_classifier", "Pair inference requires a complete classifier")
206
+ require(args.pairs is not None, "--pairs is required for prediction")
207
+ result.update(fixed_direction="label_1", decision_rule="argmax_ties_label_0",
208
+ predictions=predict_pairs(model, tokenizer, json.loads(args.pairs.read_text()), args.batch_size))
209
+ print(json.dumps(result, indent=2, allow_nan=False))
210
+
211
+
212
+ if __name__ == "__main__":
213
+ main()
model_catalog.json ADDED
@@ -0,0 +1,1156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "conditions": {
3
+ "EE": "English + additional English",
4
+ "EP": "English + natural protein",
5
+ "ES": "English + residue-shuffled protein"
6
+ },
7
+ "config": {
8
+ "_name_or_path": "",
9
+ "activation_function": "gelu_new",
10
+ "add_cross_attention": false,
11
+ "architectures": null,
12
+ "attn_pdrop": 0.1,
13
+ "bad_words_ids": null,
14
+ "begin_suppress_tokens": null,
15
+ "bos_token_id": 1,
16
+ "chunk_size_feed_forward": 0,
17
+ "cross_attention_hidden_size": null,
18
+ "decoder_start_token_id": null,
19
+ "diversity_penalty": 0.0,
20
+ "do_sample": false,
21
+ "early_stopping": false,
22
+ "embd_pdrop": 0.1,
23
+ "encoder_no_repeat_ngram_size": 0,
24
+ "eos_token_id": 1,
25
+ "exponential_decay_length_penalty": null,
26
+ "finetuning_task": null,
27
+ "forced_bos_token_id": null,
28
+ "forced_eos_token_id": null,
29
+ "id2label": {
30
+ "0": "LABEL_0",
31
+ "1": "LABEL_1"
32
+ },
33
+ "initializer_range": 0.02,
34
+ "is_decoder": false,
35
+ "is_encoder_decoder": false,
36
+ "label2id": {
37
+ "LABEL_0": 0,
38
+ "LABEL_1": 1
39
+ },
40
+ "layer_norm_epsilon": 1e-05,
41
+ "length_penalty": 1.0,
42
+ "max_length": 20,
43
+ "min_length": 0,
44
+ "model_type": "gpt2",
45
+ "n_ctx": 512,
46
+ "n_embd": 768,
47
+ "n_head": 12,
48
+ "n_inner": 3072,
49
+ "n_layer": 12,
50
+ "n_positions": 512,
51
+ "no_repeat_ngram_size": 0,
52
+ "num_beam_groups": 1,
53
+ "num_beams": 1,
54
+ "num_return_sequences": 1,
55
+ "output_attentions": false,
56
+ "output_hidden_states": false,
57
+ "output_scores": false,
58
+ "pad_token_id": 0,
59
+ "prefix": null,
60
+ "problem_type": null,
61
+ "pruned_heads": {},
62
+ "remove_invalid_values": false,
63
+ "reorder_and_upcast_attn": false,
64
+ "repetition_penalty": 1.0,
65
+ "resid_pdrop": 0.1,
66
+ "return_dict": true,
67
+ "return_dict_in_generate": false,
68
+ "scale_attn_by_inverse_layer_idx": false,
69
+ "scale_attn_weights": true,
70
+ "sep_token_id": null,
71
+ "summary_activation": null,
72
+ "summary_first_dropout": 0.1,
73
+ "summary_proj_to_labels": true,
74
+ "summary_type": "cls_index",
75
+ "summary_use_proj": true,
76
+ "suppress_tokens": null,
77
+ "task_specific_params": null,
78
+ "temperature": 1.0,
79
+ "tf_legacy_loss": false,
80
+ "tie_encoder_decoder": false,
81
+ "tie_word_embeddings": true,
82
+ "tokenizer_class": null,
83
+ "top_k": 50,
84
+ "top_p": 1.0,
85
+ "torch_dtype": null,
86
+ "torchscript": false,
87
+ "transformers_version": "4.45.2",
88
+ "typical_p": 1.0,
89
+ "use_bfloat16": false,
90
+ "use_cache": false,
91
+ "vocab_size": 32000
92
+ },
93
+ "config_canonical_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
94
+ "frozen_model_implementation_sha256": "b2362edf8850fe20fbd23cc958a71f92ac2a187de4316f53f8750d3bca857592",
95
+ "inference": {
96
+ "calibration": "none",
97
+ "context_length": 512,
98
+ "decision": "argmax; ties label 0",
99
+ "endpoint_cap": 255,
100
+ "format": "a[:255] + [SEP=2] + b[:255] + [EOS=1]",
101
+ "padding": "right, PAD=0",
102
+ "pooling": "last attention-mask-valid token (EOS)",
103
+ "portable_example_precision": "CPU FP32; exact CUDA BF16 predictions are not promised",
104
+ "reference_scoring_precision": "FP32 weights with CUDA BF16 autocast",
105
+ "score_direction": "label 1"
106
+ },
107
+ "model_repository": "dnagpt/bio2nl-models",
108
+ "models": [
109
+ {
110
+ "backbone_state_sha256": "46847dccfcf055c1dffd61b49aab0788118c0f8cdb57f2985ef2121267a7923c",
111
+ "checkpoint": {
112
+ "bytes": 440148490,
113
+ "path": "checkpoints/pretrain/EP/pt0/model.pt",
114
+ "sha256": "f6d44eb163960891e8af7d4f701580c852534f3ab476d9b6c281903f3c329327"
115
+ },
116
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
117
+ "head_description": "tied 32000 x 768 language-model output embedding",
118
+ "head_state_sha256": "864d94b74f04ec00873ad45ede838366f35715975b2c9b17a745862136d4692a",
119
+ "id": "EP-pt0",
120
+ "input_tokens": 16777216,
121
+ "job": {
122
+ "condition": "EP",
123
+ "pt_seed": 0,
124
+ "smoke": false
125
+ },
126
+ "kind": "causal_lm",
127
+ "pretraining_steps": 1024,
128
+ "state_sha256": "246ecad3c16ba27a98e38fb99a8065dbe8b30514db32f080a088e4b7dc7197b9",
129
+ "state_tensor_count": 149,
130
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
131
+ "training_result_sha256": "45c54f2e63aed2ae8832a7372aa74a0309c0ebbea98eb8d938f2cc9ed044bb6a"
132
+ },
133
+ {
134
+ "backbone_state_sha256": "e69423b4455a141f87d42fb2093e683a124c59fb16c1b451f0ddcf7ebcbe6261",
135
+ "checkpoint": {
136
+ "bytes": 440148490,
137
+ "path": "checkpoints/pretrain/EP/pt1/model.pt",
138
+ "sha256": "09c034afc616d6ed529fe62af1c604a07e0bc64a32f58630908300caf250c44a"
139
+ },
140
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
141
+ "head_description": "tied 32000 x 768 language-model output embedding",
142
+ "head_state_sha256": "79da0d94521174151af7cf2a4c834b264df5c4e862371934db74e95954305e9a",
143
+ "id": "EP-pt1",
144
+ "input_tokens": 16777216,
145
+ "job": {
146
+ "condition": "EP",
147
+ "pt_seed": 1,
148
+ "smoke": false
149
+ },
150
+ "kind": "causal_lm",
151
+ "pretraining_steps": 1024,
152
+ "state_sha256": "75b547c5e431c1d995755d054a0b7aad403c2aaa463eedb1bdd38c634b098159",
153
+ "state_tensor_count": 149,
154
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
155
+ "training_result_sha256": "0aa1e7683afad1a5e325bc36d236227f26860694ac70afe33ca4335d14e80e44"
156
+ },
157
+ {
158
+ "backbone_state_sha256": "e01b2e73ef3b92dafca5230b73522e051129d2037ab41394e1d5eb306a63cb53",
159
+ "checkpoint": {
160
+ "bytes": 440148490,
161
+ "path": "checkpoints/pretrain/EP/pt2/model.pt",
162
+ "sha256": "a1285feb6eb6380bfedfe670a27e9f09b19163b33f76145cc008de0b1e223155"
163
+ },
164
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
165
+ "head_description": "tied 32000 x 768 language-model output embedding",
166
+ "head_state_sha256": "0dde349ccabaaae961f360ba0b71811b4457dff2b9dd6c0e104b89e022f92b9b",
167
+ "id": "EP-pt2",
168
+ "input_tokens": 16777216,
169
+ "job": {
170
+ "condition": "EP",
171
+ "pt_seed": 2,
172
+ "smoke": false
173
+ },
174
+ "kind": "causal_lm",
175
+ "pretraining_steps": 1024,
176
+ "state_sha256": "76e0af261c311b5bd49ffe47e72e7065d4f2405f1213222bff12cb42817f3f87",
177
+ "state_tensor_count": 149,
178
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
179
+ "training_result_sha256": "fa0385a030aeb97c295aa2bb7983dee396e9189f31aa5a4c19302c9862941567"
180
+ },
181
+ {
182
+ "backbone_state_sha256": "ba8e639f5618984aa88f011f3ef6c6de8eed57638a3a943fe3e47465bbb10e3d",
183
+ "checkpoint": {
184
+ "bytes": 440148490,
185
+ "path": "checkpoints/pretrain/ES/pt0/model.pt",
186
+ "sha256": "452c6178f682ae50e53c8df1311134e188c99d2fcce7805f0d65d379910f277d"
187
+ },
188
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
189
+ "head_description": "tied 32000 x 768 language-model output embedding",
190
+ "head_state_sha256": "2c5d023746adbcb65f94caf6bae71fc5422e7faf9f445c539fb0e3117aab2f35",
191
+ "id": "ES-pt0",
192
+ "input_tokens": 16777216,
193
+ "job": {
194
+ "condition": "ES",
195
+ "pt_seed": 0,
196
+ "smoke": false
197
+ },
198
+ "kind": "causal_lm",
199
+ "pretraining_steps": 1024,
200
+ "state_sha256": "53fc36f1cfcaedde896d0fce93d53c3040a670fb76a479311fb91c898f0af7ba",
201
+ "state_tensor_count": 149,
202
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
203
+ "training_result_sha256": "bbf0317458cc5b7bad58d3393d04fd0467fc72ea817551f4c97223eaa35e6dca"
204
+ },
205
+ {
206
+ "backbone_state_sha256": "7a9dde5809d278c9f48e263263ad833fe784b461aecb5419fc7f4d557fb4ab7e",
207
+ "checkpoint": {
208
+ "bytes": 440148490,
209
+ "path": "checkpoints/pretrain/ES/pt1/model.pt",
210
+ "sha256": "2f357c92c20c633a636f936246bfeadec31a9ee8792bfcaef1db2acf3ee1a737"
211
+ },
212
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
213
+ "head_description": "tied 32000 x 768 language-model output embedding",
214
+ "head_state_sha256": "fefbb337fbd1d392b37b395cf2edb35a1e0e5ae072d021bbfb4c040efccd576a",
215
+ "id": "ES-pt1",
216
+ "input_tokens": 16777216,
217
+ "job": {
218
+ "condition": "ES",
219
+ "pt_seed": 1,
220
+ "smoke": false
221
+ },
222
+ "kind": "causal_lm",
223
+ "pretraining_steps": 1024,
224
+ "state_sha256": "1da85f639f02e8a9a2fe41db83f7c951cef9a235466a340da3b4d94dfc2d8cfc",
225
+ "state_tensor_count": 149,
226
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
227
+ "training_result_sha256": "884f4cbb144127de4ce3e8dd01b78039a9fae95a199e5ba80eb3a8c5d7a16fd7"
228
+ },
229
+ {
230
+ "backbone_state_sha256": "7c9720e05764f2e9893191b12ae39c07ba7af8a55beacc1670a79add479a9c24",
231
+ "checkpoint": {
232
+ "bytes": 440148490,
233
+ "path": "checkpoints/pretrain/ES/pt2/model.pt",
234
+ "sha256": "e954373b086d2d3fe3b015440a185f4a146e01825007bc57cbcc609ed3d30254"
235
+ },
236
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
237
+ "head_description": "tied 32000 x 768 language-model output embedding",
238
+ "head_state_sha256": "d55dd319963c2dff048185623ee3121ead803b0f3297c817d4358b119c1a53e4",
239
+ "id": "ES-pt2",
240
+ "input_tokens": 16777216,
241
+ "job": {
242
+ "condition": "ES",
243
+ "pt_seed": 2,
244
+ "smoke": false
245
+ },
246
+ "kind": "causal_lm",
247
+ "pretraining_steps": 1024,
248
+ "state_sha256": "531f13ab25facf6a21f3a730dd3cbebc82d8f79aa24526fdde96f57dbd7097d9",
249
+ "state_tensor_count": 149,
250
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
251
+ "training_result_sha256": "f3ae824b0126b2d239cd8a25b4eebd5840a87507eedce3b9f4a83211d8b83bbb"
252
+ },
253
+ {
254
+ "backbone_state_sha256": "cc03cacccecd691268649146d0f709f6b4548463727d9fb61cba69b9ae43a761",
255
+ "checkpoint": {
256
+ "bytes": 440148490,
257
+ "path": "checkpoints/pretrain/EE/pt0/model.pt",
258
+ "sha256": "5af7730f436af372a0d43bfed57f87a3ea2e6aa4826493aa21eacd3acdd4dccc"
259
+ },
260
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
261
+ "head_description": "tied 32000 x 768 language-model output embedding",
262
+ "head_state_sha256": "f3c5b803b261a26cfc969c726871427ee9771169b2eec9eb3981e3fcc04a096f",
263
+ "id": "EE-pt0",
264
+ "input_tokens": 16777216,
265
+ "job": {
266
+ "condition": "EE",
267
+ "pt_seed": 0,
268
+ "smoke": false
269
+ },
270
+ "kind": "causal_lm",
271
+ "pretraining_steps": 1024,
272
+ "state_sha256": "be2793719f6a9cbd4d15528e4c0295d8a1558eb7b0ecf098eceb00c2cee35ecd",
273
+ "state_tensor_count": 149,
274
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
275
+ "training_result_sha256": "08c64e01c921c313f60272c8ff6cfb4f7a77909662de43b2af6ad52ed6305838"
276
+ },
277
+ {
278
+ "backbone_state_sha256": "1677dae3fcded88212e65045cb9399548e6e6b1a364cf44e85785ee78626a4c2",
279
+ "checkpoint": {
280
+ "bytes": 440148490,
281
+ "path": "checkpoints/pretrain/EE/pt1/model.pt",
282
+ "sha256": "653a88903ee373e5b8933c71d386a64ca6840249f9a42cc2c992b0202f04739f"
283
+ },
284
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
285
+ "head_description": "tied 32000 x 768 language-model output embedding",
286
+ "head_state_sha256": "b99147643f7a4bb91fc7ea39edae68ec4d9015b767e92c7a9cfec47bf5b8943e",
287
+ "id": "EE-pt1",
288
+ "input_tokens": 16777216,
289
+ "job": {
290
+ "condition": "EE",
291
+ "pt_seed": 1,
292
+ "smoke": false
293
+ },
294
+ "kind": "causal_lm",
295
+ "pretraining_steps": 1024,
296
+ "state_sha256": "2081069fd01c7c0d80bea6899bab92996f17480b375d625edb1e7095445ac622",
297
+ "state_tensor_count": 149,
298
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
299
+ "training_result_sha256": "d0dff9e41c053c0983a5bc952898265f24edd35d0baea47b28a5aa6c7b4dfe81"
300
+ },
301
+ {
302
+ "backbone_state_sha256": "aee2a29f1a4a6ce76ed3fa124f85cc39ba1aa317fc2970e4a692ee4dcec75209",
303
+ "checkpoint": {
304
+ "bytes": 440148490,
305
+ "path": "checkpoints/pretrain/EE/pt2/model.pt",
306
+ "sha256": "68e49c6af5cb3fa34b1820925cb1751055c38c25de8122b5ba19a40937ad0ba9"
307
+ },
308
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
309
+ "head_description": "tied 32000 x 768 language-model output embedding",
310
+ "head_state_sha256": "a1bfc20e2807ee202e50a6e4f474054e11fcc2e10e9659bc9b75fbc70cfb06a7",
311
+ "id": "EE-pt2",
312
+ "input_tokens": 16777216,
313
+ "job": {
314
+ "condition": "EE",
315
+ "pt_seed": 2,
316
+ "smoke": false
317
+ },
318
+ "kind": "causal_lm",
319
+ "pretraining_steps": 1024,
320
+ "state_sha256": "7b2de62c97d190cced9341476a36d0d281805c6f163f908099e7b600582897ea",
321
+ "state_tensor_count": 149,
322
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
323
+ "training_result_sha256": "85817c18ccea3f2d1b1f2780a92901903f775a1362f8c3be3892886ad51863d3"
324
+ },
325
+ {
326
+ "backbone_state_sha256": "723965894f5d1ee4ddb6071944bdef3901ee9305d6d40441a86db67f0124a79b",
327
+ "checkpoint": {
328
+ "bytes": 440154440,
329
+ "path": "checkpoints/source/EP/pt0/ft0/best.pt",
330
+ "sha256": "574117f9bbbaa589a0f1fd726567ead899510c05bcbcc0cbf71e3b57c72edebb"
331
+ },
332
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
333
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
334
+ "head_state_sha256": "ce0e964f2bdcb9af6c77b5c0af05ae1e90472c95aa33d77676c59b3c7f195ee1",
335
+ "id": "EP-pt0-ft0",
336
+ "job": {
337
+ "condition": "EP",
338
+ "ft_seed": 0,
339
+ "pt_seed": 0,
340
+ "smoke": false
341
+ },
342
+ "kind": "source_classifier",
343
+ "pretraining_parent": {
344
+ "id": "EP-pt0",
345
+ "sha256": "f6d44eb163960891e8af7d4f701580c852534f3ab476d9b6c281903f3c329327",
346
+ "state_sha256": "246ecad3c16ba27a98e38fb99a8065dbe8b30514db32f080a088e4b7dc7197b9"
347
+ },
348
+ "selected_epoch": 4,
349
+ "selection": "minimum source validation CE; ties earlier epoch",
350
+ "state_sha256": "2d7c592dbb1825cdfcf7b62b50e2e238784724c722d2207b4a8af0ea937a152f",
351
+ "state_tensor_count": 149,
352
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
353
+ "training_result_sha256": "1caa48707e014ce011a873819c9c90261d0be643b7a4d0cdf12f843327cf7578"
354
+ },
355
+ {
356
+ "backbone_state_sha256": "f6ff607c6203d848701c1f8f465c0590f6514a4baa27aa6f24376bd9b06f2522",
357
+ "checkpoint": {
358
+ "bytes": 440154440,
359
+ "path": "checkpoints/source/EP/pt0/ft1/best.pt",
360
+ "sha256": "a5c9522ed086bb54ce62ca74717c130143cfe07352b07a698529f1bedb497b6c"
361
+ },
362
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
363
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
364
+ "head_state_sha256": "b2f08aae473191eb7e30dac84c48ad119f52899623b64a1df34cc52d297b9e97",
365
+ "id": "EP-pt0-ft1",
366
+ "job": {
367
+ "condition": "EP",
368
+ "ft_seed": 1,
369
+ "pt_seed": 0,
370
+ "smoke": false
371
+ },
372
+ "kind": "source_classifier",
373
+ "pretraining_parent": {
374
+ "id": "EP-pt0",
375
+ "sha256": "f6d44eb163960891e8af7d4f701580c852534f3ab476d9b6c281903f3c329327",
376
+ "state_sha256": "246ecad3c16ba27a98e38fb99a8065dbe8b30514db32f080a088e4b7dc7197b9"
377
+ },
378
+ "selected_epoch": 4,
379
+ "selection": "minimum source validation CE; ties earlier epoch",
380
+ "state_sha256": "03fec3d6542957306b1cd01e19b852e3ec8e94642c761ae27adc62b1c0cc7247",
381
+ "state_tensor_count": 149,
382
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
383
+ "training_result_sha256": "604ba22dc8da9abded55361e192ef3984c4b3052086795091e449b894a1af9df"
384
+ },
385
+ {
386
+ "backbone_state_sha256": "acfac562250062feb6aa69a5d604ba235b56b47cc6ac14590da6ff414df61dd9",
387
+ "checkpoint": {
388
+ "bytes": 440154440,
389
+ "path": "checkpoints/source/EP/pt0/ft2/best.pt",
390
+ "sha256": "19277d64bb879906e98df99d1c77623c46d8ccad2c33eda796ba1b9bcd4cf3b5"
391
+ },
392
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
393
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
394
+ "head_state_sha256": "b6216d87f9855cf295082ece2b0d8c5f22477c475598ea24f80c9fba74df36b9",
395
+ "id": "EP-pt0-ft2",
396
+ "job": {
397
+ "condition": "EP",
398
+ "ft_seed": 2,
399
+ "pt_seed": 0,
400
+ "smoke": false
401
+ },
402
+ "kind": "source_classifier",
403
+ "pretraining_parent": {
404
+ "id": "EP-pt0",
405
+ "sha256": "f6d44eb163960891e8af7d4f701580c852534f3ab476d9b6c281903f3c329327",
406
+ "state_sha256": "246ecad3c16ba27a98e38fb99a8065dbe8b30514db32f080a088e4b7dc7197b9"
407
+ },
408
+ "selected_epoch": 5,
409
+ "selection": "minimum source validation CE; ties earlier epoch",
410
+ "state_sha256": "3d57d437443593afa95af3cbb64afbb0648c56d6b4f4d7afb8ce37621dff3b11",
411
+ "state_tensor_count": 149,
412
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
413
+ "training_result_sha256": "4b5207bad2e467064b9ca25d9cf498dcff1e458bedfd79dba01efab7882bdecd"
414
+ },
415
+ {
416
+ "backbone_state_sha256": "5c8397b6f4c4961d34e03072aa0f91871312f0c02e8967dd7c6f2bb09ca85795",
417
+ "checkpoint": {
418
+ "bytes": 440154440,
419
+ "path": "checkpoints/source/ES/pt0/ft0/best.pt",
420
+ "sha256": "69069d19cade14739612d991743be14f3debe97e8c8cf48379810bed1498e913"
421
+ },
422
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
423
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
424
+ "head_state_sha256": "2bd44f45605a18f99d3b6e96431ad800ffec52839704eafcfd49c9a264b046b6",
425
+ "id": "ES-pt0-ft0",
426
+ "job": {
427
+ "condition": "ES",
428
+ "ft_seed": 0,
429
+ "pt_seed": 0,
430
+ "smoke": false
431
+ },
432
+ "kind": "source_classifier",
433
+ "pretraining_parent": {
434
+ "id": "ES-pt0",
435
+ "sha256": "452c6178f682ae50e53c8df1311134e188c99d2fcce7805f0d65d379910f277d",
436
+ "state_sha256": "53fc36f1cfcaedde896d0fce93d53c3040a670fb76a479311fb91c898f0af7ba"
437
+ },
438
+ "selected_epoch": 1,
439
+ "selection": "minimum source validation CE; ties earlier epoch",
440
+ "state_sha256": "aa1e0fa9bc5db4d86a54955d54a3346b1757a3da807489c796b808487f647131",
441
+ "state_tensor_count": 149,
442
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
443
+ "training_result_sha256": "00f8407bd63ca5f6c317c4c43fb82f266efb82fb96e546d066cddbec1ebfb26b"
444
+ },
445
+ {
446
+ "backbone_state_sha256": "57b2db2c96583382e7a49ec85474d377cf8555815cb717cc4720cc138576711d",
447
+ "checkpoint": {
448
+ "bytes": 440154440,
449
+ "path": "checkpoints/source/ES/pt0/ft1/best.pt",
450
+ "sha256": "bde6f1f919b7f5657edb0edb920941df3db8a88dd44089acd05b6b89c29c19be"
451
+ },
452
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
453
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
454
+ "head_state_sha256": "1bbe058fde769286e8a0611f2b789bf1425e770de7c1319438b4f93b4626c6d1",
455
+ "id": "ES-pt0-ft1",
456
+ "job": {
457
+ "condition": "ES",
458
+ "ft_seed": 1,
459
+ "pt_seed": 0,
460
+ "smoke": false
461
+ },
462
+ "kind": "source_classifier",
463
+ "pretraining_parent": {
464
+ "id": "ES-pt0",
465
+ "sha256": "452c6178f682ae50e53c8df1311134e188c99d2fcce7805f0d65d379910f277d",
466
+ "state_sha256": "53fc36f1cfcaedde896d0fce93d53c3040a670fb76a479311fb91c898f0af7ba"
467
+ },
468
+ "selected_epoch": 2,
469
+ "selection": "minimum source validation CE; ties earlier epoch",
470
+ "state_sha256": "4ea04eb3dcaf63935cb0e377d2489a5126c987cdcd4bf2350ccf5c2f2b0ae8f8",
471
+ "state_tensor_count": 149,
472
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
473
+ "training_result_sha256": "23032955f58927fb361524d180a546af201e1b46b5d8e2ad58e4d08c109a0cb5"
474
+ },
475
+ {
476
+ "backbone_state_sha256": "a45ce8b281d893d86c0d1fcae7eaff9cc2c6e0a60b05a9064195e9eafc915979",
477
+ "checkpoint": {
478
+ "bytes": 440154440,
479
+ "path": "checkpoints/source/ES/pt0/ft2/best.pt",
480
+ "sha256": "ec82de031e16af6005b1221327e6b58f9b8d1dc8f1a0072325a33453575b3b51"
481
+ },
482
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
483
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
484
+ "head_state_sha256": "ff98005b3c9f32818e3315544ee5b359ea2086116b8461b95e2516696f193adb",
485
+ "id": "ES-pt0-ft2",
486
+ "job": {
487
+ "condition": "ES",
488
+ "ft_seed": 2,
489
+ "pt_seed": 0,
490
+ "smoke": false
491
+ },
492
+ "kind": "source_classifier",
493
+ "pretraining_parent": {
494
+ "id": "ES-pt0",
495
+ "sha256": "452c6178f682ae50e53c8df1311134e188c99d2fcce7805f0d65d379910f277d",
496
+ "state_sha256": "53fc36f1cfcaedde896d0fce93d53c3040a670fb76a479311fb91c898f0af7ba"
497
+ },
498
+ "selected_epoch": 2,
499
+ "selection": "minimum source validation CE; ties earlier epoch",
500
+ "state_sha256": "fe232820c5a890ca2358bb63b1a56f67e15036c47bafbc178ddc48f55e0661d8",
501
+ "state_tensor_count": 149,
502
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
503
+ "training_result_sha256": "b2b434faadb87ddc9158dcddfbd3d03b7dff3c3a022bbbfeb99e74f48c9ba450"
504
+ },
505
+ {
506
+ "backbone_state_sha256": "3728d8e1d773d2160557e98192a815861fce61991957be1bf6a546c9a69a6ddc",
507
+ "checkpoint": {
508
+ "bytes": 440154440,
509
+ "path": "checkpoints/source/EE/pt0/ft0/best.pt",
510
+ "sha256": "c1aa8820704665541550d7f59fed367c30dcc55b60c90f4ea2dcec75dce4103e"
511
+ },
512
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
513
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
514
+ "head_state_sha256": "b0b0bf2750b6c488a9ef24e88b2e5ea979d4cfe29697c799f1b27469e5efca1f",
515
+ "id": "EE-pt0-ft0",
516
+ "job": {
517
+ "condition": "EE",
518
+ "ft_seed": 0,
519
+ "pt_seed": 0,
520
+ "smoke": false
521
+ },
522
+ "kind": "source_classifier",
523
+ "pretraining_parent": {
524
+ "id": "EE-pt0",
525
+ "sha256": "5af7730f436af372a0d43bfed57f87a3ea2e6aa4826493aa21eacd3acdd4dccc",
526
+ "state_sha256": "be2793719f6a9cbd4d15528e4c0295d8a1558eb7b0ecf098eceb00c2cee35ecd"
527
+ },
528
+ "selected_epoch": 1,
529
+ "selection": "minimum source validation CE; ties earlier epoch",
530
+ "state_sha256": "1757b63b89c41333c8c4fed755a57f0c1d6c27954bb6d628bd89cfb5aaad085d",
531
+ "state_tensor_count": 149,
532
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
533
+ "training_result_sha256": "12f42581fe70e1f537e3abaa9b74ce92bc9b25f13eed5dbc742b3c088d55a1e0"
534
+ },
535
+ {
536
+ "backbone_state_sha256": "59013342320d1d7a743a495be78711fec93341047e644e0c1faa8263d6fd71f8",
537
+ "checkpoint": {
538
+ "bytes": 440154440,
539
+ "path": "checkpoints/source/EE/pt0/ft1/best.pt",
540
+ "sha256": "2a3ac91f4392196e836221e0435388b0e6ecae6c117be26f2b43de3e6507c4a1"
541
+ },
542
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
543
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
544
+ "head_state_sha256": "f4ddd3d3da12ee2830aea75ddfc039db98553b21287ec5464faa66bcc054e084",
545
+ "id": "EE-pt0-ft1",
546
+ "job": {
547
+ "condition": "EE",
548
+ "ft_seed": 1,
549
+ "pt_seed": 0,
550
+ "smoke": false
551
+ },
552
+ "kind": "source_classifier",
553
+ "pretraining_parent": {
554
+ "id": "EE-pt0",
555
+ "sha256": "5af7730f436af372a0d43bfed57f87a3ea2e6aa4826493aa21eacd3acdd4dccc",
556
+ "state_sha256": "be2793719f6a9cbd4d15528e4c0295d8a1558eb7b0ecf098eceb00c2cee35ecd"
557
+ },
558
+ "selected_epoch": 4,
559
+ "selection": "minimum source validation CE; ties earlier epoch",
560
+ "state_sha256": "34db029a40eef36d13cd998b60134d40d14faf7734616f3e2a7bab6ea732b17e",
561
+ "state_tensor_count": 149,
562
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
563
+ "training_result_sha256": "3d30522a8ae34c545eb0d5629804232b1c8a2e099c488f21c0193934b36533fc"
564
+ },
565
+ {
566
+ "backbone_state_sha256": "0df838819909faa38db698bd711529be3d2fd4b076859c46a4720cbe3fdc03f4",
567
+ "checkpoint": {
568
+ "bytes": 440154440,
569
+ "path": "checkpoints/source/EE/pt0/ft2/best.pt",
570
+ "sha256": "22d6e120e8f24fb5b0bb15bcb2d463733dea39d6599ed0234841cb9ff47f2ee1"
571
+ },
572
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
573
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
574
+ "head_state_sha256": "3e996e0f448d66d72e033902f741bd68b53d1b53530d1a519643cdf4048de64e",
575
+ "id": "EE-pt0-ft2",
576
+ "job": {
577
+ "condition": "EE",
578
+ "ft_seed": 2,
579
+ "pt_seed": 0,
580
+ "smoke": false
581
+ },
582
+ "kind": "source_classifier",
583
+ "pretraining_parent": {
584
+ "id": "EE-pt0",
585
+ "sha256": "5af7730f436af372a0d43bfed57f87a3ea2e6aa4826493aa21eacd3acdd4dccc",
586
+ "state_sha256": "be2793719f6a9cbd4d15528e4c0295d8a1558eb7b0ecf098eceb00c2cee35ecd"
587
+ },
588
+ "selected_epoch": 4,
589
+ "selection": "minimum source validation CE; ties earlier epoch",
590
+ "state_sha256": "d448ae3be2e175876403773442f1d22216182a6102697191e6c6dba022b3bef8",
591
+ "state_tensor_count": 149,
592
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
593
+ "training_result_sha256": "06d73f8a737c536e7d56416b0c20ddbb7b4cecd028a829828ec16e1c4b38ec30"
594
+ },
595
+ {
596
+ "backbone_state_sha256": "53a54e3b371a9e284333d75e587202d9ac6d611d6920b3cd24a324e5bf26160f",
597
+ "checkpoint": {
598
+ "bytes": 440154440,
599
+ "path": "checkpoints/source/EP/pt1/ft0/best.pt",
600
+ "sha256": "1a4e205e237b684cc14b79aea27a59ba45adb68e3e2ee0d345a7476433d88e3c"
601
+ },
602
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
603
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
604
+ "head_state_sha256": "aa55d04a39b38d0029d3c241aed34f3a19d3661d5f44c1713b7f40969c78e311",
605
+ "id": "EP-pt1-ft0",
606
+ "job": {
607
+ "condition": "EP",
608
+ "ft_seed": 0,
609
+ "pt_seed": 1,
610
+ "smoke": false
611
+ },
612
+ "kind": "source_classifier",
613
+ "pretraining_parent": {
614
+ "id": "EP-pt1",
615
+ "sha256": "09c034afc616d6ed529fe62af1c604a07e0bc64a32f58630908300caf250c44a",
616
+ "state_sha256": "75b547c5e431c1d995755d054a0b7aad403c2aaa463eedb1bdd38c634b098159"
617
+ },
618
+ "selected_epoch": 1,
619
+ "selection": "minimum source validation CE; ties earlier epoch",
620
+ "state_sha256": "18ea6da80c0554321a0c226b5776eb0bd9202943d316c380beb9292b6e0307d4",
621
+ "state_tensor_count": 149,
622
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
623
+ "training_result_sha256": "ee45255532196a6639d8b2a6d53146276e7866e4f1f3261ebe2053738704e27b"
624
+ },
625
+ {
626
+ "backbone_state_sha256": "38c35efc7c17e78d05b8ef2f427d8359275698fb9506413a156aa08373bbadb2",
627
+ "checkpoint": {
628
+ "bytes": 440154440,
629
+ "path": "checkpoints/source/EP/pt1/ft1/best.pt",
630
+ "sha256": "2e3ad2344834e5a70403bbef8c19f55aacb6b25b83725138bb82e2274723797c"
631
+ },
632
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
633
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
634
+ "head_state_sha256": "e7ce95e30e08bd2d1e6d8edd20c526fa36bcced29dc49a5f68f911c1e00d9abb",
635
+ "id": "EP-pt1-ft1",
636
+ "job": {
637
+ "condition": "EP",
638
+ "ft_seed": 1,
639
+ "pt_seed": 1,
640
+ "smoke": false
641
+ },
642
+ "kind": "source_classifier",
643
+ "pretraining_parent": {
644
+ "id": "EP-pt1",
645
+ "sha256": "09c034afc616d6ed529fe62af1c604a07e0bc64a32f58630908300caf250c44a",
646
+ "state_sha256": "75b547c5e431c1d995755d054a0b7aad403c2aaa463eedb1bdd38c634b098159"
647
+ },
648
+ "selected_epoch": 4,
649
+ "selection": "minimum source validation CE; ties earlier epoch",
650
+ "state_sha256": "13a2cfcdd361e229e179d3868c4818558657b9440196658269cba769267930c7",
651
+ "state_tensor_count": 149,
652
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
653
+ "training_result_sha256": "8310e8b4c2a20b0aae6d28c688b411c449064e7b02e78027c7e75126acbc5da3"
654
+ },
655
+ {
656
+ "backbone_state_sha256": "cafe4df0d4e922fc3eab0436527226edf072d2d4d1ade2398606ecfadc4e19d1",
657
+ "checkpoint": {
658
+ "bytes": 440154440,
659
+ "path": "checkpoints/source/EP/pt1/ft2/best.pt",
660
+ "sha256": "47615a93378959abbe6ffaf3475a6561ec9c6d11a94a04da6954b6801994704e"
661
+ },
662
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
663
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
664
+ "head_state_sha256": "248c6b293dd9c6f4e88b2c9f6c3749f72c3d18ec48fdca4ca4b1c3ed4a403412",
665
+ "id": "EP-pt1-ft2",
666
+ "job": {
667
+ "condition": "EP",
668
+ "ft_seed": 2,
669
+ "pt_seed": 1,
670
+ "smoke": false
671
+ },
672
+ "kind": "source_classifier",
673
+ "pretraining_parent": {
674
+ "id": "EP-pt1",
675
+ "sha256": "09c034afc616d6ed529fe62af1c604a07e0bc64a32f58630908300caf250c44a",
676
+ "state_sha256": "75b547c5e431c1d995755d054a0b7aad403c2aaa463eedb1bdd38c634b098159"
677
+ },
678
+ "selected_epoch": 5,
679
+ "selection": "minimum source validation CE; ties earlier epoch",
680
+ "state_sha256": "a3add110ff52792e7df7f540925b06da42649a418d48e01a6318c05dd90b7908",
681
+ "state_tensor_count": 149,
682
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
683
+ "training_result_sha256": "f6eaa338c9d649a440915a333a02d62800c39104180f628c12cfbb4d35d0783a"
684
+ },
685
+ {
686
+ "backbone_state_sha256": "fefb18acf164508f3291214deadc1a3433b09ac60a26c6bf18aafb604f4652f3",
687
+ "checkpoint": {
688
+ "bytes": 440154440,
689
+ "path": "checkpoints/source/ES/pt1/ft0/best.pt",
690
+ "sha256": "b24e6de1f73186bc5167afce790c5794dd109f1d077fde1dc207ff4c360bed5c"
691
+ },
692
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
693
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
694
+ "head_state_sha256": "ed7651fe8547a4a1bbf3acf883e9c2e8303b3573ac541ffc90c3ca3defe280d1",
695
+ "id": "ES-pt1-ft0",
696
+ "job": {
697
+ "condition": "ES",
698
+ "ft_seed": 0,
699
+ "pt_seed": 1,
700
+ "smoke": false
701
+ },
702
+ "kind": "source_classifier",
703
+ "pretraining_parent": {
704
+ "id": "ES-pt1",
705
+ "sha256": "2f357c92c20c633a636f936246bfeadec31a9ee8792bfcaef1db2acf3ee1a737",
706
+ "state_sha256": "1da85f639f02e8a9a2fe41db83f7c951cef9a235466a340da3b4d94dfc2d8cfc"
707
+ },
708
+ "selected_epoch": 4,
709
+ "selection": "minimum source validation CE; ties earlier epoch",
710
+ "state_sha256": "03adfbec615f0493463f5404db8b8510dae1487145caa2c0ff17f5ba7e0b9aba",
711
+ "state_tensor_count": 149,
712
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
713
+ "training_result_sha256": "ebc41837d2f6351175a71f3752ad20e57c18138691fef0764b90f9c61d218452"
714
+ },
715
+ {
716
+ "backbone_state_sha256": "7b46c42e1a21ea63275edba2629205b85bd57d597e098782a51063f9d0232cf3",
717
+ "checkpoint": {
718
+ "bytes": 440154440,
719
+ "path": "checkpoints/source/ES/pt1/ft1/best.pt",
720
+ "sha256": "d43962d06f256000a8707dbc61e3d860dcebd4d50e0ac77b724ef921a79aae2c"
721
+ },
722
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
723
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
724
+ "head_state_sha256": "4d7cf2502b9de435fd76220dce1c0025078c9108dc36a356a2e3ec5d96e6542a",
725
+ "id": "ES-pt1-ft1",
726
+ "job": {
727
+ "condition": "ES",
728
+ "ft_seed": 1,
729
+ "pt_seed": 1,
730
+ "smoke": false
731
+ },
732
+ "kind": "source_classifier",
733
+ "pretraining_parent": {
734
+ "id": "ES-pt1",
735
+ "sha256": "2f357c92c20c633a636f936246bfeadec31a9ee8792bfcaef1db2acf3ee1a737",
736
+ "state_sha256": "1da85f639f02e8a9a2fe41db83f7c951cef9a235466a340da3b4d94dfc2d8cfc"
737
+ },
738
+ "selected_epoch": 2,
739
+ "selection": "minimum source validation CE; ties earlier epoch",
740
+ "state_sha256": "8cdfde8b4ee968701fbf1db71b87156286a73e089f2677a7ccaef2ee4447393f",
741
+ "state_tensor_count": 149,
742
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
743
+ "training_result_sha256": "9e857c2113a1f624cf471b8263f3451dbf901542ef40daf23fe3f993206a3019"
744
+ },
745
+ {
746
+ "backbone_state_sha256": "f9efb8be122a08e79d844826d229563070163f258f562cd2bc63d2e7042bc79a",
747
+ "checkpoint": {
748
+ "bytes": 440154440,
749
+ "path": "checkpoints/source/ES/pt1/ft2/best.pt",
750
+ "sha256": "fe879c8b4f45a84e08d728affc2c4cd6d28fb87b92cc8759b4ddc408f786d8f9"
751
+ },
752
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
753
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
754
+ "head_state_sha256": "af479f9e002a231cf4ae8fa4fa01cbb79c4f8fedd7e3b59be63adce2fe93986d",
755
+ "id": "ES-pt1-ft2",
756
+ "job": {
757
+ "condition": "ES",
758
+ "ft_seed": 2,
759
+ "pt_seed": 1,
760
+ "smoke": false
761
+ },
762
+ "kind": "source_classifier",
763
+ "pretraining_parent": {
764
+ "id": "ES-pt1",
765
+ "sha256": "2f357c92c20c633a636f936246bfeadec31a9ee8792bfcaef1db2acf3ee1a737",
766
+ "state_sha256": "1da85f639f02e8a9a2fe41db83f7c951cef9a235466a340da3b4d94dfc2d8cfc"
767
+ },
768
+ "selected_epoch": 5,
769
+ "selection": "minimum source validation CE; ties earlier epoch",
770
+ "state_sha256": "6293d8e506c62ed852f97562dd1a445c27f2c2c44f7cd15f45daa44251605e74",
771
+ "state_tensor_count": 149,
772
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
773
+ "training_result_sha256": "2294494d91cc41a3070ebe400dd57fb3caabb978a56b6d86965be366877bd423"
774
+ },
775
+ {
776
+ "backbone_state_sha256": "892a245d1d3d72d90f85b5226eb83121fbb0dee80da1bf3207517274d1b245e0",
777
+ "checkpoint": {
778
+ "bytes": 440154440,
779
+ "path": "checkpoints/source/EE/pt1/ft0/best.pt",
780
+ "sha256": "7e75b5380df75393dae4a125df812f6500288955ab92a20ef610eb15eaff646f"
781
+ },
782
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
783
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
784
+ "head_state_sha256": "cd55d0669416df9328d738f205a871fed93bace116f92be9b3e845dae373a271",
785
+ "id": "EE-pt1-ft0",
786
+ "job": {
787
+ "condition": "EE",
788
+ "ft_seed": 0,
789
+ "pt_seed": 1,
790
+ "smoke": false
791
+ },
792
+ "kind": "source_classifier",
793
+ "pretraining_parent": {
794
+ "id": "EE-pt1",
795
+ "sha256": "653a88903ee373e5b8933c71d386a64ca6840249f9a42cc2c992b0202f04739f",
796
+ "state_sha256": "2081069fd01c7c0d80bea6899bab92996f17480b375d625edb1e7095445ac622"
797
+ },
798
+ "selected_epoch": 1,
799
+ "selection": "minimum source validation CE; ties earlier epoch",
800
+ "state_sha256": "dc6722503f1fc078719712395780f49ecd49d24af0b36705d58b71578c5a4280",
801
+ "state_tensor_count": 149,
802
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
803
+ "training_result_sha256": "aae2eeddf0405a3fdc434db9f1ceaec2d827bde17692efaf55a9d5ad22d8bab9"
804
+ },
805
+ {
806
+ "backbone_state_sha256": "8b5e303a3c8d47c5237768c54371a42fc86b3ed37bac215e94fc6ffb727388e6",
807
+ "checkpoint": {
808
+ "bytes": 440154440,
809
+ "path": "checkpoints/source/EE/pt1/ft1/best.pt",
810
+ "sha256": "c869b1c0c8cf4288485936795fbb8263b5af55bc39fa9df0513758c5cbfd5a87"
811
+ },
812
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
813
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
814
+ "head_state_sha256": "8b4a07c619c5a583ea3a29c762262f1dd61cbf45b3c4f9638c5fbb13d390475d",
815
+ "id": "EE-pt1-ft1",
816
+ "job": {
817
+ "condition": "EE",
818
+ "ft_seed": 1,
819
+ "pt_seed": 1,
820
+ "smoke": false
821
+ },
822
+ "kind": "source_classifier",
823
+ "pretraining_parent": {
824
+ "id": "EE-pt1",
825
+ "sha256": "653a88903ee373e5b8933c71d386a64ca6840249f9a42cc2c992b0202f04739f",
826
+ "state_sha256": "2081069fd01c7c0d80bea6899bab92996f17480b375d625edb1e7095445ac622"
827
+ },
828
+ "selected_epoch": 4,
829
+ "selection": "minimum source validation CE; ties earlier epoch",
830
+ "state_sha256": "0a29cb65c4b2279ac65c69d30fa48730fcf3c443bfb699f648a155df8869d38b",
831
+ "state_tensor_count": 149,
832
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
833
+ "training_result_sha256": "07432909d3ef0b1a24860ffcb100289e54f54c1c38a85afacf4bafb260aa8fee"
834
+ },
835
+ {
836
+ "backbone_state_sha256": "4a2c9dd0f700196201949d044b6749533a5057cdf627010c2bf255e4dda42132",
837
+ "checkpoint": {
838
+ "bytes": 440154440,
839
+ "path": "checkpoints/source/EE/pt1/ft2/best.pt",
840
+ "sha256": "0db9423ef969016260d1ddbbf700d5bbc71340b6847e0c8ecf5e4696fa2bb732"
841
+ },
842
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
843
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
844
+ "head_state_sha256": "aa7e1329289dd57a8dec2a01220fad56337c3629ffdd1caf7f662f9c703f3c44",
845
+ "id": "EE-pt1-ft2",
846
+ "job": {
847
+ "condition": "EE",
848
+ "ft_seed": 2,
849
+ "pt_seed": 1,
850
+ "smoke": false
851
+ },
852
+ "kind": "source_classifier",
853
+ "pretraining_parent": {
854
+ "id": "EE-pt1",
855
+ "sha256": "653a88903ee373e5b8933c71d386a64ca6840249f9a42cc2c992b0202f04739f",
856
+ "state_sha256": "2081069fd01c7c0d80bea6899bab92996f17480b375d625edb1e7095445ac622"
857
+ },
858
+ "selected_epoch": 2,
859
+ "selection": "minimum source validation CE; ties earlier epoch",
860
+ "state_sha256": "5c324f5ab182218ec35c3a7dd4df800e900836ce5e8195e999d05a1a627e1beb",
861
+ "state_tensor_count": 149,
862
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
863
+ "training_result_sha256": "09c04fbc107c9759bf755851015d493bd51e0c86f379eb5512aef77c0fcb79f2"
864
+ },
865
+ {
866
+ "backbone_state_sha256": "5cec49bff5231109310f7657e16aae77fed7ee053a23a3ea02e18210df0b8e71",
867
+ "checkpoint": {
868
+ "bytes": 440154440,
869
+ "path": "checkpoints/source/EP/pt2/ft0/best.pt",
870
+ "sha256": "7ecaeba8d20e8f65b78a11412817da9cdaf84127c03765c1fb95a44442f921f4"
871
+ },
872
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
873
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
874
+ "head_state_sha256": "2540f121300980c92e16ea23a81233f991f176205f93aec2d3cb16e577e267ec",
875
+ "id": "EP-pt2-ft0",
876
+ "job": {
877
+ "condition": "EP",
878
+ "ft_seed": 0,
879
+ "pt_seed": 2,
880
+ "smoke": false
881
+ },
882
+ "kind": "source_classifier",
883
+ "pretraining_parent": {
884
+ "id": "EP-pt2",
885
+ "sha256": "a1285feb6eb6380bfedfe670a27e9f09b19163b33f76145cc008de0b1e223155",
886
+ "state_sha256": "76e0af261c311b5bd49ffe47e72e7065d4f2405f1213222bff12cb42817f3f87"
887
+ },
888
+ "selected_epoch": 1,
889
+ "selection": "minimum source validation CE; ties earlier epoch",
890
+ "state_sha256": "277347056d1b01883f3904a44b5a5811a0a9d4885e4e099deb2dc0e443e1dda9",
891
+ "state_tensor_count": 149,
892
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
893
+ "training_result_sha256": "f5493458ecf9bcfd654f07d1382fde315aa8edeffa219ed5fcdeb59664f0148e"
894
+ },
895
+ {
896
+ "backbone_state_sha256": "34a5a3529c4519d6cc2ef55ca15a9c8f22fb5b0951951d868238e335b8251a5f",
897
+ "checkpoint": {
898
+ "bytes": 440154440,
899
+ "path": "checkpoints/source/EP/pt2/ft1/best.pt",
900
+ "sha256": "34c588c5e10d7ba6c6320cc59cf883ad47465cdcf9a07d540a45e55720e993eb"
901
+ },
902
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
903
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
904
+ "head_state_sha256": "ece0a91d346641a5d5e035ea74f2d2bab123779aa23f5175297989f815c2e273",
905
+ "id": "EP-pt2-ft1",
906
+ "job": {
907
+ "condition": "EP",
908
+ "ft_seed": 1,
909
+ "pt_seed": 2,
910
+ "smoke": false
911
+ },
912
+ "kind": "source_classifier",
913
+ "pretraining_parent": {
914
+ "id": "EP-pt2",
915
+ "sha256": "a1285feb6eb6380bfedfe670a27e9f09b19163b33f76145cc008de0b1e223155",
916
+ "state_sha256": "76e0af261c311b5bd49ffe47e72e7065d4f2405f1213222bff12cb42817f3f87"
917
+ },
918
+ "selected_epoch": 4,
919
+ "selection": "minimum source validation CE; ties earlier epoch",
920
+ "state_sha256": "923cb47e0b918ffa2c6c449089c6d678aa60b876961e0bb317f80760032e7e40",
921
+ "state_tensor_count": 149,
922
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
923
+ "training_result_sha256": "f989b0df62e72edde1f5e253a0636a0973a265ce00641c55ced221a6c439d46e"
924
+ },
925
+ {
926
+ "backbone_state_sha256": "42b7478758a5b5aadebc220632e2223f60f60030a91474c9f9d0fc9db8c08687",
927
+ "checkpoint": {
928
+ "bytes": 440154440,
929
+ "path": "checkpoints/source/EP/pt2/ft2/best.pt",
930
+ "sha256": "c1af8f442b9e13944e2bb5158900c2f1ca824af7583ebcb5a365d6b6317cdd3f"
931
+ },
932
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
933
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
934
+ "head_state_sha256": "06928d7c19bf664d442b4a8c940e97685952d489b9afca318058fd50deb7611c",
935
+ "id": "EP-pt2-ft2",
936
+ "job": {
937
+ "condition": "EP",
938
+ "ft_seed": 2,
939
+ "pt_seed": 2,
940
+ "smoke": false
941
+ },
942
+ "kind": "source_classifier",
943
+ "pretraining_parent": {
944
+ "id": "EP-pt2",
945
+ "sha256": "a1285feb6eb6380bfedfe670a27e9f09b19163b33f76145cc008de0b1e223155",
946
+ "state_sha256": "76e0af261c311b5bd49ffe47e72e7065d4f2405f1213222bff12cb42817f3f87"
947
+ },
948
+ "selected_epoch": 2,
949
+ "selection": "minimum source validation CE; ties earlier epoch",
950
+ "state_sha256": "ad2bbfa5c830e6c29c07c6925db5f34fe3d94ceb1eee89015a1193a02d659d37",
951
+ "state_tensor_count": 149,
952
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
953
+ "training_result_sha256": "51cbf2fe41459089fb5967d69a40e5314456943530617e18ae86974e6744f4a9"
954
+ },
955
+ {
956
+ "backbone_state_sha256": "1a6e6d138b3859bc7b04fa1cba932e0757fd9d24e6bce2f443a9de9abd35f0fc",
957
+ "checkpoint": {
958
+ "bytes": 440154440,
959
+ "path": "checkpoints/source/ES/pt2/ft0/best.pt",
960
+ "sha256": "4e3193aba5334d7c1093a156b8dc72b3690ac3cce149373c7aa01958e2dceb73"
961
+ },
962
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
963
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
964
+ "head_state_sha256": "b9e5f287d9078622ffc96b4a95195c379d9ea8cdf5d3148da06be519a4777272",
965
+ "id": "ES-pt2-ft0",
966
+ "job": {
967
+ "condition": "ES",
968
+ "ft_seed": 0,
969
+ "pt_seed": 2,
970
+ "smoke": false
971
+ },
972
+ "kind": "source_classifier",
973
+ "pretraining_parent": {
974
+ "id": "ES-pt2",
975
+ "sha256": "e954373b086d2d3fe3b015440a185f4a146e01825007bc57cbcc609ed3d30254",
976
+ "state_sha256": "531f13ab25facf6a21f3a730dd3cbebc82d8f79aa24526fdde96f57dbd7097d9"
977
+ },
978
+ "selected_epoch": 4,
979
+ "selection": "minimum source validation CE; ties earlier epoch",
980
+ "state_sha256": "1e42c68537988297c3ca34b739231b86e27c3531b10461d2d5cb8a7f293c39c4",
981
+ "state_tensor_count": 149,
982
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
983
+ "training_result_sha256": "de3f41dac006cece0480313f3dbcd05d1ace0b1bb85473cbe50ac99f0aecbf99"
984
+ },
985
+ {
986
+ "backbone_state_sha256": "ddf2792b06f5a24061c1a815ded8be91593ed167e813be80ee87b8daa5c5c440",
987
+ "checkpoint": {
988
+ "bytes": 440154440,
989
+ "path": "checkpoints/source/ES/pt2/ft1/best.pt",
990
+ "sha256": "5509eb7ac7f77b3378874e9f5ceb2d51176ff1b175edaec8bd86449596335c48"
991
+ },
992
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
993
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
994
+ "head_state_sha256": "b9620ddc3c45f58f7d49fb211744029068cc4f461f350aca25827c91cf00c1b7",
995
+ "id": "ES-pt2-ft1",
996
+ "job": {
997
+ "condition": "ES",
998
+ "ft_seed": 1,
999
+ "pt_seed": 2,
1000
+ "smoke": false
1001
+ },
1002
+ "kind": "source_classifier",
1003
+ "pretraining_parent": {
1004
+ "id": "ES-pt2",
1005
+ "sha256": "e954373b086d2d3fe3b015440a185f4a146e01825007bc57cbcc609ed3d30254",
1006
+ "state_sha256": "531f13ab25facf6a21f3a730dd3cbebc82d8f79aa24526fdde96f57dbd7097d9"
1007
+ },
1008
+ "selected_epoch": 2,
1009
+ "selection": "minimum source validation CE; ties earlier epoch",
1010
+ "state_sha256": "572ab4979350470329ffa11a1588c3c8732071b90f0b59ae9d9fc56c3c2f40a5",
1011
+ "state_tensor_count": 149,
1012
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
1013
+ "training_result_sha256": "f7634a33e3ef27f1744a77dcb02cb1e301b49978185a21f527aa6a95ce9511e5"
1014
+ },
1015
+ {
1016
+ "backbone_state_sha256": "bda43b7b2920f13c9cbcdcfec2937cf57e3817deaf11a1dc22a83e217509d49f",
1017
+ "checkpoint": {
1018
+ "bytes": 440154440,
1019
+ "path": "checkpoints/source/ES/pt2/ft2/best.pt",
1020
+ "sha256": "bbe4ea6d3953fb9c4e954952c7deb3cbbfde9ad102de1c797fcb35333e4e41e5"
1021
+ },
1022
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
1023
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
1024
+ "head_state_sha256": "5307fc528cfce750104759418259f9708bc2187e3c62db0667249d403f7e637c",
1025
+ "id": "ES-pt2-ft2",
1026
+ "job": {
1027
+ "condition": "ES",
1028
+ "ft_seed": 2,
1029
+ "pt_seed": 2,
1030
+ "smoke": false
1031
+ },
1032
+ "kind": "source_classifier",
1033
+ "pretraining_parent": {
1034
+ "id": "ES-pt2",
1035
+ "sha256": "e954373b086d2d3fe3b015440a185f4a146e01825007bc57cbcc609ed3d30254",
1036
+ "state_sha256": "531f13ab25facf6a21f3a730dd3cbebc82d8f79aa24526fdde96f57dbd7097d9"
1037
+ },
1038
+ "selected_epoch": 2,
1039
+ "selection": "minimum source validation CE; ties earlier epoch",
1040
+ "state_sha256": "0a5566ddf15c0ede4cb0f426c65f306b500f1d06990ab8dd30594c45351f98fc",
1041
+ "state_tensor_count": 149,
1042
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
1043
+ "training_result_sha256": "b766d4109670f9b379f9ccb9555dcdfb737b710aea733bad1b2108a66b50b353"
1044
+ },
1045
+ {
1046
+ "backbone_state_sha256": "6bafb6cdbdbe0e7605f56fb89916075cd9fab07eac1f55878b33f21ad0f0deb1",
1047
+ "checkpoint": {
1048
+ "bytes": 440154440,
1049
+ "path": "checkpoints/source/EE/pt2/ft0/best.pt",
1050
+ "sha256": "92946799e5a378609b6dae042db4c263e53fd8123f101102a3e50b1c8a694b1a"
1051
+ },
1052
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
1053
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
1054
+ "head_state_sha256": "042e8bd55fa3a70ee7322751e5aa6a9553c0c170740ade25656de18072cd92bd",
1055
+ "id": "EE-pt2-ft0",
1056
+ "job": {
1057
+ "condition": "EE",
1058
+ "ft_seed": 0,
1059
+ "pt_seed": 2,
1060
+ "smoke": false
1061
+ },
1062
+ "kind": "source_classifier",
1063
+ "pretraining_parent": {
1064
+ "id": "EE-pt2",
1065
+ "sha256": "68e49c6af5cb3fa34b1820925cb1751055c38c25de8122b5ba19a40937ad0ba9",
1066
+ "state_sha256": "7b2de62c97d190cced9341476a36d0d281805c6f163f908099e7b600582897ea"
1067
+ },
1068
+ "selected_epoch": 4,
1069
+ "selection": "minimum source validation CE; ties earlier epoch",
1070
+ "state_sha256": "b1d17fffef0c2f464c5b085cced5319dabda23713f98c8ea3049743f4e0e62b8",
1071
+ "state_tensor_count": 149,
1072
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
1073
+ "training_result_sha256": "c2da98507c582107c17e22bb2716d4521801514a2404e7f41062e0cf7c514dcc"
1074
+ },
1075
+ {
1076
+ "backbone_state_sha256": "3ad28c6dcf2c4cd47057cc9c45c97e853b2986a0cee6ff8c12c4f0ef504ea3a5",
1077
+ "checkpoint": {
1078
+ "bytes": 440154440,
1079
+ "path": "checkpoints/source/EE/pt2/ft1/best.pt",
1080
+ "sha256": "3879fab3b33328347f852ac813bbc194be808526b4b97b1613292126b56f7751"
1081
+ },
1082
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
1083
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
1084
+ "head_state_sha256": "065531cd87316409c14083b53d208ac1fd9743a805c472d0cd09bcd635acae70",
1085
+ "id": "EE-pt2-ft1",
1086
+ "job": {
1087
+ "condition": "EE",
1088
+ "ft_seed": 1,
1089
+ "pt_seed": 2,
1090
+ "smoke": false
1091
+ },
1092
+ "kind": "source_classifier",
1093
+ "pretraining_parent": {
1094
+ "id": "EE-pt2",
1095
+ "sha256": "68e49c6af5cb3fa34b1820925cb1751055c38c25de8122b5ba19a40937ad0ba9",
1096
+ "state_sha256": "7b2de62c97d190cced9341476a36d0d281805c6f163f908099e7b600582897ea"
1097
+ },
1098
+ "selected_epoch": 4,
1099
+ "selection": "minimum source validation CE; ties earlier epoch",
1100
+ "state_sha256": "8b6d74f95cefdb63cf9d8d2634689152687797fc480bae1756c12c3447257792",
1101
+ "state_tensor_count": 149,
1102
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
1103
+ "training_result_sha256": "3993f66eec458e2d47994a4f04d63694698aa9c605186c8b749d7cfda62f46f4"
1104
+ },
1105
+ {
1106
+ "backbone_state_sha256": "7ba012459b15d25e49bfa6a31e83494f3d201a2abf4e736b2fedbef1ff76472e",
1107
+ "checkpoint": {
1108
+ "bytes": 440154440,
1109
+ "path": "checkpoints/source/EE/pt2/ft2/best.pt",
1110
+ "sha256": "c2fcac930e4a69d8138dc508ca4471f52be6ce76c8a90efd819b0780f73225b5"
1111
+ },
1112
+ "config_sha256": "3e9e1f209ac83fa7b67a3ed566d7266c61f7bd4e4100a66d329810b0a866a6b2",
1113
+ "head_description": "two-logit bias-free linear score.weight (2 x 768)",
1114
+ "head_state_sha256": "76a717c181c2186b0142b5e09329c5365fe7569a0652a486d38beba576a7f5b9",
1115
+ "id": "EE-pt2-ft2",
1116
+ "job": {
1117
+ "condition": "EE",
1118
+ "ft_seed": 2,
1119
+ "pt_seed": 2,
1120
+ "smoke": false
1121
+ },
1122
+ "kind": "source_classifier",
1123
+ "pretraining_parent": {
1124
+ "id": "EE-pt2",
1125
+ "sha256": "68e49c6af5cb3fa34b1820925cb1751055c38c25de8122b5ba19a40937ad0ba9",
1126
+ "state_sha256": "7b2de62c97d190cced9341476a36d0d281805c6f163f908099e7b600582897ea"
1127
+ },
1128
+ "selected_epoch": 4,
1129
+ "selection": "minimum source validation CE; ties earlier epoch",
1130
+ "state_sha256": "bc4ea0f5bb08aa2589a3e6ed714f2228522cc07189d89cc705a1abf562a489d2",
1131
+ "state_tensor_count": 149,
1132
+ "tokenizer_sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
1133
+ "training_result_sha256": "7d89dd8f1e7ef94c867f444024111e0f3f41ab8769ed5fd566b876de8d256940"
1134
+ }
1135
+ ],
1136
+ "prepared_manifest_sha256": "2ea23ffd2793ed2142156f2942cc4bfb77767a0c3e87ba668a77c34a3a16c010",
1137
+ "release_id": "bio2nl-2026-10-02-models-v1",
1138
+ "schema_version": 1,
1139
+ "source_assets_manifest_sha256": "c6341ac0e8a810fa807d46d45c9358e189290a37af5870136bfcbd504b1efdd5",
1140
+ "source_selection_sha256": "48de918e0b4a2b12ac3021072f601e2b1caf61730c77097fa9bfbfc75e15fb4c",
1141
+ "tokenizer": {
1142
+ "bytes": 2122913,
1143
+ "path": "tokenizer.json",
1144
+ "sha256": "1bb8092348368961ca211cbf4d066a0e0ebf612b35b401b07ed173476088130b",
1145
+ "special_tokens": [
1146
+ "<|pad_v2|>",
1147
+ "<|eos_v2|>",
1148
+ "<|pair_v2|>",
1149
+ "<|unk_v2|>"
1150
+ ],
1151
+ "training_recipe": "Shared byte-level BPE trained on 16 MiB English and 16 MiB protein training text; historical v2 tokenizer reused",
1152
+ "vocab_size": 32000
1153
+ },
1154
+ "training_protocol_sha256": "60ce5e0518475fb0e4ba8a83d34d45fbe4c89e74e12fb984abbe41c8fd3eff24",
1155
+ "weight_license_status": "unassigned; no license grant is inferred from code or training-data licenses"
1156
+ }
portable_core.py ADDED
@@ -0,0 +1,241 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Portable GPT-2 models for the frozen joint-pretraining experiment.
2
+
3
+ No workspace paths, legacy module imports, downloads or device initialization are
4
+ performed at import time. Checkpoints are accepted only with independently trusted
5
+ file, tensor-state, job and provenance identities. The caller supplies those
6
+ identities from the verified archive; a hash read from the checkpoint itself is
7
+ not an independent trust anchor.
8
+ """
9
+ from __future__ import annotations
10
+
11
+ from contextlib import nullcontext
12
+ import hashlib
13
+ import json
14
+ from pathlib import Path
15
+ import re
16
+ from typing import Mapping
17
+
18
+ import numpy as np
19
+ import torch
20
+ from torch import nn
21
+ from torch.nn import functional as F
22
+ from transformers import GPT2Config, GPT2LMHeadModel, GPT2Model
23
+
24
+
25
+ def require(condition, message):
26
+ if not condition:
27
+ raise ValueError(message)
28
+
29
+
30
+ def _sha256(value, name):
31
+ require(isinstance(value, str) and re.fullmatch(r"[0-9a-f]{64}", value) is not None,
32
+ "Invalid " + name)
33
+ return value
34
+
35
+
36
+ def state_digest(state):
37
+ """Exact legacy name/dtype/shape framing, including all tied aliases."""
38
+ digest = hashlib.sha256()
39
+ require(isinstance(state, Mapping) and bool(state), "Empty or invalid tensor state")
40
+ require(all(isinstance(name, str) and torch.is_tensor(value)
41
+ for name, value in state.items()), "Invalid tensor-state entry")
42
+ for name, tensor in sorted(state.items()):
43
+ value = tensor.detach().cpu().contiguous()
44
+ header = json.dumps([name, str(value.dtype), list(value.shape)], separators=(",", ":")).encode()
45
+ digest.update(len(header).to_bytes(8, "big"))
46
+ digest.update(header)
47
+ data = value.numpy().tobytes()
48
+ digest.update(len(data).to_bytes(8, "big"))
49
+ digest.update(data)
50
+ return digest.hexdigest()
51
+
52
+
53
+ def snapshot_state(model):
54
+ """Copy finite FP32 tensors to CPU while retaining exact shared aliases."""
55
+ aliases, result = {}, {}
56
+ for name, tensor in model.state_dict().items():
57
+ require(tensor.dtype == torch.float32 and torch.isfinite(tensor).all().item(),
58
+ "Invalid/nonfinite FP32 state: " + name)
59
+ key = (tensor.data_ptr(), tuple(tensor.shape), tuple(tensor.stride()), str(tensor.dtype))
60
+ if key not in aliases:
61
+ aliases[key] = tensor.detach().cpu().clone().contiguous()
62
+ result[name] = aliases[key]
63
+ return result
64
+
65
+
66
+ def _seed(seed):
67
+ require(type(seed) is int and seed >= 0, "Seed must be a nonnegative integer")
68
+ return seed
69
+
70
+
71
+ def make_config(design):
72
+ """Construct the offline architecture described by the frozen protocol."""
73
+ pretraining, tokenizer = design["pretraining"], design["tokenizer"]
74
+ values = dict(pretraining["architecture"])
75
+ require(values.pop("model_type", "gpt2") == "gpt2", "Only GPT-2 is supported")
76
+ config = GPT2Config(**values, vocab_size=tokenizer["vocab_size"],
77
+ n_positions=pretraining["context_length"], n_ctx=pretraining["context_length"],
78
+ bos_token_id=tokenizer["eos_token_id"], eos_token_id=tokenizer["eos_token_id"],
79
+ pad_token_id=tokenizer["pad_token_id"])
80
+ config._attn_implementation = "sdpa"
81
+ config.use_cache = False
82
+ return config
83
+
84
+
85
+ def create_pretraining_model(design, seed):
86
+ """Create a fresh FP32 LM without consuming the caller's CPU/GPU RNG."""
87
+ with torch.random.fork_rng(devices=[]):
88
+ torch.random.default_generator.manual_seed(_seed(seed))
89
+ return GPT2LMHeadModel(make_config(design)).float()
90
+
91
+
92
+ class TransferClassifier(nn.Module):
93
+ """Original backbone/score state names and mask-based final-token pooling."""
94
+
95
+ def __init__(self, backbone, head_seed):
96
+ super().__init__()
97
+ if isinstance(backbone, GPT2LMHeadModel):
98
+ backbone = backbone.transformer
99
+ if not isinstance(backbone, GPT2Model):
100
+ raise TypeError("Expected GPT2Model or GPT2LMHeadModel")
101
+ self.backbone = backbone
102
+ with torch.random.fork_rng(devices=[]):
103
+ torch.random.default_generator.manual_seed(_seed(head_seed))
104
+ self.score = nn.Linear(backbone.config.n_embd, 2, bias=False, device="cpu", dtype=torch.float32)
105
+ nn.init.normal_(self.score.weight, std=0.02)
106
+ reference = next(backbone.parameters())
107
+ self.score.to(device=reference.device, dtype=reference.dtype)
108
+
109
+ def forward(self, input_ids, attention_mask):
110
+ require(input_ids.ndim == 2 and input_ids.shape == attention_mask.shape,
111
+ "Input/mask dimensions differ")
112
+ require(input_ids.shape[0] > 0 and input_ids.shape[1] > 0 and
113
+ torch.all((attention_mask == 0) | (attention_mask == 1)).item() and
114
+ torch.all(attention_mask.sum(1) > 0).item(), "Invalid or empty attention mask")
115
+ hidden = self.backbone(input_ids=input_ids, attention_mask=attention_mask,
116
+ use_cache=False, return_dict=True).last_hidden_state
117
+ positions = torch.arange(input_ids.shape[1], device=input_ids.device).expand_as(input_ids)
118
+ last = positions.masked_fill(attention_mask == 0, -1).amax(dim=1)
119
+ return self.score(hidden[torch.arange(input_ids.shape[0], device=input_ids.device), last])
120
+
121
+
122
+ def create_classifier(lm, fine_tuning_seed):
123
+ """Reuse the complete LM backbone and initialize only the two-logit head."""
124
+ require(isinstance(lm, GPT2LMHeadModel), "SFT must start from a complete GPT-2 LM")
125
+ return TransferClassifier(lm, fine_tuning_seed).float()
126
+
127
+
128
+ def load_checkpoint(path, *, expected_sha256, expected_kind, expected_job,
129
+ expected_state_sha256, expected_protocol_sha256, expected_manifest_sha256,
130
+ expected_epoch=None, expected_config=None):
131
+ """Safely load a trusted frozen checkpoint on CPU with exact provenance.
132
+
133
+ The file SHA is checked on the same open file handle used for weights-only
134
+ deserialization. There is deliberately no unsafe pickle fallback. Returned
135
+ models are in evaluation mode with gradients disabled; training from a new
136
+ initialization uses the constructors above.
137
+ """
138
+ for value, name in ((expected_sha256, "file SHA-256"),
139
+ (expected_state_sha256, "state SHA-256"),
140
+ (expected_protocol_sha256, "protocol SHA-256"),
141
+ (expected_manifest_sha256, "manifest SHA-256")):
142
+ _sha256(value, name)
143
+ require(expected_kind in ("causal_lm", "source_classifier"), "Invalid expected checkpoint kind")
144
+ require(isinstance(expected_job, dict) and bool(expected_job), "Expected job identity is required")
145
+ require(expected_epoch is None or (type(expected_epoch) is int and expected_epoch > 0),
146
+ "Invalid expected epoch")
147
+ with Path(path).open("rb") as stream:
148
+ digest = hashlib.sha256()
149
+ for chunk in iter(lambda: stream.read(4 * 1024 * 1024), b""):
150
+ digest.update(chunk)
151
+ require(digest.hexdigest() == expected_sha256, "Checkpoint file SHA-256 differs")
152
+ stream.seek(0)
153
+ payload = torch.load(stream, map_location="cpu", weights_only=True)
154
+ require(isinstance(payload, dict) and type(payload.get("schema_version")) is int and
155
+ payload["schema_version"] == 1 and payload.get("kind") == expected_kind,
156
+ "Invalid checkpoint schema/kind")
157
+ metadata, config_values, state = payload.get("metadata"), payload.get("config"), payload.get("state_dict")
158
+ require(isinstance(metadata, dict) and isinstance(config_values, dict), "Invalid checkpoint metadata/config")
159
+ require(metadata.get("job") == expected_job, "Checkpoint job differs")
160
+ require(metadata.get("protocol_sha256") == expected_protocol_sha256, "Checkpoint protocol differs")
161
+ require(metadata.get("prepared_manifest_sha256") == expected_manifest_sha256, "Checkpoint manifest differs")
162
+ require(expected_epoch is None or metadata.get("epoch") == expected_epoch, "Checkpoint epoch differs")
163
+ require(payload.get("state_sha256") == expected_state_sha256, "Checkpoint declared state differs")
164
+ require(isinstance(state, Mapping) and bool(state) and
165
+ all(isinstance(name, str) and torch.is_tensor(value) and value.dtype == torch.float32
166
+ and torch.isfinite(value).all().item() for name, value in state.items()),
167
+ "Invalid/nonfinite FP32 checkpoint state")
168
+ require(state_digest(state) == expected_state_sha256, "Checkpoint tensor-state SHA-256 differs")
169
+ require(config_values.get("model_type", "gpt2") == "gpt2", "Invalid checkpoint architecture")
170
+ if expected_config is not None:
171
+ require(isinstance(expected_config, Mapping) and bool(expected_config), "Invalid expected config")
172
+ require(all(config_values.get(key) == value for key, value in expected_config.items()),
173
+ "Checkpoint config differs")
174
+ config = GPT2Config.from_dict(config_values)
175
+ config._attn_implementation = "sdpa"
176
+ config.use_cache = False
177
+ with torch.random.fork_rng(devices=[]):
178
+ if expected_kind == "causal_lm":
179
+ model = GPT2LMHeadModel(config)
180
+ else:
181
+ model = TransferClassifier(GPT2Model(config), 0)
182
+ model.load_state_dict(state, strict=True)
183
+ require(state_digest(model.state_dict()) == expected_state_sha256, "Reloaded model state differs")
184
+ model.float().eval().requires_grad_(False)
185
+ return model, payload
186
+
187
+
188
+ def _as_numpy(value):
189
+ return value.detach().cpu().numpy() if torch.is_tensor(value) else np.asarray(value)
190
+
191
+
192
+ def validate_arrays(arrays, config):
193
+ """Reject inconsistent encodings without silently changing any input row."""
194
+ require(isinstance(arrays, Mapping) and {"input_ids", "attention_mask", "labels"} <= arrays.keys(),
195
+ "Missing encoded arrays")
196
+ values = {name: _as_numpy(arrays[name]) for name in ("input_ids", "attention_mask", "labels")}
197
+ ids, mask, labels = (values[name] for name in ("input_ids", "attention_mask", "labels"))
198
+ require(all(value.dtype == np.int64 for value in values.values()), "Encoded arrays must be int64")
199
+ require(ids.ndim == 2 and ids.shape == mask.shape and labels.shape == (len(ids),) and
200
+ len(ids) > 0 and 0 < ids.shape[1] <= config.n_positions, "Invalid encoded array dimensions")
201
+ require(np.all((ids >= 0) & (ids < config.vocab_size)), "Token ID outside vocabulary")
202
+ require(np.all((mask == 0) | (mask == 1)) and np.all(mask.sum(1) > 0) and
203
+ np.all(np.diff(mask, axis=1) <= 0), "Expected nonempty right-padded binary masks")
204
+ require(np.all((labels == 0) | (labels == 1)), "Expected binary labels")
205
+ return values
206
+
207
+
208
+ @torch.inference_mode()
209
+ def predict_source(model, arrays, batch_size=32, device="cpu", precision="float32"):
210
+ """Fixed-head inference; label 1 direction and argmax ties to label 0."""
211
+ require(isinstance(model, TransferClassifier), "Expected a complete source classifier")
212
+ require(type(batch_size) is int and batch_size > 0, "Invalid batch size")
213
+ device = torch.device(device)
214
+ require((device.type == "cpu" and precision == "float32") or
215
+ (device.type == "cuda" and precision == "bfloat16"), "Explicit CPU FP32 or CUDA BF16 required")
216
+ if device.type == "cuda":
217
+ require(torch.cuda.is_available() and torch.cuda.is_bf16_supported(), "CUDA BF16 unavailable")
218
+ require(not torch.backends.cuda.matmul.allow_tf32 and not torch.backends.cudnn.allow_tf32,
219
+ "TF32 must be disabled for fixed scoring")
220
+ if device.index is None:
221
+ device = torch.device("cuda", torch.cuda.current_device())
222
+ require(all(parameter.device == device and parameter.dtype == torch.float32
223
+ for parameter in model.parameters()), "Model must already be FP32 on the explicit device")
224
+ values = validate_arrays(arrays, model.backbone.config)
225
+ model.eval()
226
+ chunks = []
227
+ for start in range(0, len(values["labels"]), batch_size):
228
+ stop = min(start + batch_size, len(values["labels"]))
229
+ batch_mask = values["attention_mask"][start:stop]
230
+ maximum = int(batch_mask.sum(1).max())
231
+ width = min(batch_mask.shape[1], ((maximum + 7) // 8) * 8)
232
+ ids = torch.as_tensor(values["input_ids"][start:stop, :width], device=device)
233
+ mask = torch.as_tensor(batch_mask[:, :width], device=device)
234
+ context = torch.autocast("cuda", dtype=torch.bfloat16) if device.type == "cuda" else nullcontext()
235
+ with context:
236
+ logits = model(ids, mask)
237
+ logp = F.log_softmax(logits.float(), dim=-1)
238
+ require(torch.isfinite(logp).all().item(), "Nonfinite source predictions")
239
+ chunks.append(logp.cpu().numpy().astype(np.float64))
240
+ logp = np.concatenate(chunks)
241
+ return {"labels": values["labels"].copy(), "log_probabilities": logp, "predictions": logp.argmax(1)}
requirements-inference.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ numpy==2.2.6
2
+ torch==2.3.0
3
+ transformers==4.45.2
4
+ tokenizers==0.20.0
test_audit.json ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "code_sha256": {
3
+ "inference.py": "43f5a1c770354b588b046ff02e4d03df4c13086224df4fba1285f8f2b3cf91ec",
4
+ "portable_core.py": "b2362edf8850fe20fbd23cc958a71f92ac2a187de4316f53f8750d3bca857592",
5
+ "test_inference.py": "26a8dd9c94fee295a7ba20ae65da922975f6ee1a66ad9f500fea16c8ad63f3d8"
6
+ },
7
+ "completed_at_utc": "2026-10-03T08:22:52.059505+00:00",
8
+ "errors": 0,
9
+ "failures": 0,
10
+ "status": "passed",
11
+ "tests_run": 17
12
+ }
test_inference.py ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Integrity/adversarial tests; no large models, GPU or training required."""
2
+ import copy
3
+ import json
4
+ from pathlib import Path
5
+ import tempfile
6
+ import unittest
7
+
8
+ import numpy as np
9
+ import torch
10
+ from transformers import GPT2Config, GPT2Model
11
+
12
+ import inference as api
13
+ import portable_core as core
14
+
15
+
16
+ HERE = Path(__file__).resolve().parent
17
+
18
+
19
+ class IntegrityTests(unittest.TestCase):
20
+ @classmethod
21
+ def setUpClass(cls):
22
+ torch.set_num_threads(2)
23
+
24
+ def setUp(self):
25
+ self.temp = tempfile.TemporaryDirectory()
26
+ self.root = Path(self.temp.name)
27
+ cfg = GPT2Config(vocab_size=37, n_positions=32, n_ctx=32, n_embd=16, n_layer=1, n_head=2,
28
+ n_inner=32, eos_token_id=1, pad_token_id=0)
29
+ cfg._attn_implementation = "sdpa"
30
+ model = core.TransferClassifier(GPT2Model(cfg), 0)
31
+ self.payload = {"schema_version": 1, "kind": "source_classifier", "config": cfg.to_dict(),
32
+ "metadata": {"job": {"condition": "EP", "pt_seed": 0, "ft_seed": 0, "smoke": False},
33
+ "protocol_sha256": "a" * 64, "prepared_manifest_sha256": "b" * 64, "epoch": 2},
34
+ "state_dict": core.snapshot_state(model)}
35
+ self.path = self.root / "toy.pt"
36
+ self.save()
37
+
38
+ def tearDown(self):
39
+ self.temp.cleanup()
40
+
41
+ def save(self):
42
+ self.payload["state_sha256"] = core.state_digest(self.payload["state_dict"])
43
+ torch.save(self.payload, self.path)
44
+ self.kw = dict(expected_sha256=api.file_sha(self.path), expected_kind="source_classifier",
45
+ expected_job=self.payload["metadata"]["job"], expected_state_sha256=self.payload["state_sha256"],
46
+ expected_protocol_sha256="a" * 64, expected_manifest_sha256="b" * 64, expected_epoch=2,
47
+ expected_config=self.payload["config"])
48
+
49
+ def test_intact_reloads(self):
50
+ model, payload = core.load_checkpoint(self.path, **self.kw)
51
+ self.assertEqual(core.state_digest(model.state_dict()), payload["state_sha256"])
52
+ self.assertFalse(model.training)
53
+ self.assertTrue(all(not x.requires_grad for x in model.parameters()))
54
+
55
+ def test_corrupt_file_rejected(self):
56
+ with self.path.open("ab") as stream:
57
+ stream.write(b"tampered")
58
+ with self.assertRaisesRegex(ValueError, "file SHA"):
59
+ core.load_checkpoint(self.path, **self.kw)
60
+
61
+ def test_missing_head_rejected_even_with_new_digest(self):
62
+ del self.payload["state_dict"]["score.weight"]
63
+ self.save()
64
+ with self.assertRaises(RuntimeError):
65
+ core.load_checkpoint(self.path, **self.kw)
66
+
67
+ def test_wrong_head_shape_rejected_even_with_new_digest(self):
68
+ self.payload["state_dict"]["score.weight"] = torch.zeros(3, 16)
69
+ self.save()
70
+ with self.assertRaises(RuntimeError):
71
+ core.load_checkpoint(self.path, **self.kw)
72
+
73
+ def test_provenance_rejected(self):
74
+ for key in ("expected_protocol_sha256", "expected_manifest_sha256", "expected_state_sha256"):
75
+ changed = dict(self.kw, **{key: "c" * 64})
76
+ with self.assertRaises(ValueError):
77
+ core.load_checkpoint(self.path, **changed)
78
+
79
+ def test_wrong_job_rejected(self):
80
+ changed = dict(self.kw, expected_job={**self.kw["expected_job"], "ft_seed": 1})
81
+ with self.assertRaisesRegex(ValueError, "job differs"):
82
+ core.load_checkpoint(self.path, **changed)
83
+
84
+ def test_wrong_epoch_rejected(self):
85
+ with self.assertRaisesRegex(ValueError, "epoch differs"):
86
+ core.load_checkpoint(self.path, **{**self.kw, "expected_epoch": 1})
87
+
88
+ def test_wrong_config_rejected(self):
89
+ with self.assertRaisesRegex(ValueError, "config differs"):
90
+ core.load_checkpoint(self.path, **{**self.kw, "expected_config": {"n_embd": 32}})
91
+
92
+ def test_json_config_label_keys_roundtrip(self):
93
+ public_config = json.loads(json.dumps(self.payload["config"]))
94
+ digest = api.canonical_sha(public_config)
95
+ expected = api.config_for_core(public_config)
96
+ model, payload = core.load_checkpoint(self.path, **{**self.kw, "expected_config": expected})
97
+ self.assertEqual(api.original_config_sha_after_load(payload["config"]), digest)
98
+ self.assertEqual(api.canonical_sha(public_config), digest)
99
+
100
+ def test_unexpected_config_runtime_value_rejected(self):
101
+ changed = {**self.payload["config"], "attn_implementation": "eager"}
102
+ with self.assertRaisesRegex(ValueError, "injected attention"):
103
+ api.original_config_sha_after_load(changed)
104
+
105
+ def test_nonfinite_rejected(self):
106
+ self.payload["state_dict"]["score.weight"][0, 0] = float("nan")
107
+ self.save()
108
+ with self.assertRaisesRegex(ValueError, "nonfinite"):
109
+ core.load_checkpoint(self.path, **self.kw)
110
+
111
+ def test_path_escape_and_ambiguity_rejected(self):
112
+ for relative in ("../secret", "/tmp/file", "a/../b", "a//b", "./a", "a\\b"):
113
+ with self.assertRaises(ValueError):
114
+ api.safe_path(self.root, relative)
115
+
116
+ def test_catalog_file_tamper(self):
117
+ path = HERE / "model_catalog.json"
118
+ original = path.read_bytes()
119
+ bad = self.root / "catalog.json"
120
+ bad.write_bytes(original + b" ")
121
+ with self.assertRaisesRegex(ValueError, "Catalog SHA"):
122
+ api.read_catalog(bad, api.file_sha(path))
123
+
124
+ def test_wrong_parent_rejected_with_rehashed_catalog(self):
125
+ data = json.loads((HERE / "model_catalog.json").read_text())
126
+ entry = next(x for x in data["models"] if x["kind"] == "source_classifier")
127
+ entry["pretraining_parent"]["id"] = "ES-pt0"
128
+ path = self.root / "catalog.json"
129
+ path.write_text(json.dumps(data))
130
+ with self.assertRaisesRegex(ValueError, "parent provenance"):
131
+ api.read_catalog(path, api.file_sha(path))
132
+
133
+ def test_tokenizer_hash_tamper(self):
134
+ catalog = json.loads((HERE / "model_catalog.json").read_text())
135
+ raw = (HERE / "tokenizer.json").read_bytes()
136
+ (self.root / "tokenizer.json").write_bytes(raw.replace(b"BPE", b"XYZ", 1))
137
+ with self.assertRaisesRegex(ValueError, "SHA"):
138
+ api.load_tokenizer(catalog, self.root)
139
+
140
+ def test_encoding_caps_and_roundtrip(self):
141
+ catalog = json.loads((HERE / "model_catalog.json").read_text())
142
+ tokenizer = api.load_tokenizer(catalog, HERE)
143
+ pair = {"sentence1": "hello world " * 400, "sentence2": "protein " * 400}
144
+ arrays, info = api.encode_pairs(tokenizer, [pair])
145
+ a = tokenizer.encode(pair["sentence1"], add_special_tokens=False).ids[:255]
146
+ b = tokenizer.encode(pair["sentence2"], add_special_tokens=False).ids[:255]
147
+ self.assertEqual(arrays["input_ids"][0].tolist(), a + [2] + b + [1])
148
+ self.assertTrue(arrays["attention_mask"].all())
149
+ self.assertEqual(info[0]["truncated_endpoints"], [True, True])
150
+
151
+ def test_labels_or_empty_endpoints_rejected(self):
152
+ tokenizer = api.load_tokenizer(json.loads((HERE / "model_catalog.json").read_text()), HERE)
153
+ for pair in ({"sentence1": "a", "sentence2": "b", "label": 1}, {"sentence1": "", "sentence2": "b"}):
154
+ with self.assertRaises(ValueError):
155
+ api.encode_pairs(tokenizer, [pair])
156
+
157
+
158
+ if __name__ == "__main__":
159
+ unittest.main()
test_output.txt ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ test_catalog_file_tamper (test_inference.IntegrityTests.test_catalog_file_tamper) ... ok
2
+ test_corrupt_file_rejected (test_inference.IntegrityTests.test_corrupt_file_rejected) ... ok
3
+ test_encoding_caps_and_roundtrip (test_inference.IntegrityTests.test_encoding_caps_and_roundtrip) ... ok
4
+ test_intact_reloads (test_inference.IntegrityTests.test_intact_reloads) ... ok
5
+ test_json_config_label_keys_roundtrip (test_inference.IntegrityTests.test_json_config_label_keys_roundtrip) ... ok
6
+ test_labels_or_empty_endpoints_rejected (test_inference.IntegrityTests.test_labels_or_empty_endpoints_rejected) ... ok
7
+ test_missing_head_rejected_even_with_new_digest (test_inference.IntegrityTests.test_missing_head_rejected_even_with_new_digest) ... ok
8
+ test_nonfinite_rejected (test_inference.IntegrityTests.test_nonfinite_rejected) ... ok
9
+ test_path_escape_and_ambiguity_rejected (test_inference.IntegrityTests.test_path_escape_and_ambiguity_rejected) ... ok
10
+ test_provenance_rejected (test_inference.IntegrityTests.test_provenance_rejected) ... ok
11
+ test_tokenizer_hash_tamper (test_inference.IntegrityTests.test_tokenizer_hash_tamper) ... ok
12
+ test_unexpected_config_runtime_value_rejected (test_inference.IntegrityTests.test_unexpected_config_runtime_value_rejected) ... ok
13
+ test_wrong_config_rejected (test_inference.IntegrityTests.test_wrong_config_rejected) ... ok
14
+ test_wrong_epoch_rejected (test_inference.IntegrityTests.test_wrong_epoch_rejected) ... ok
15
+ test_wrong_head_shape_rejected_even_with_new_digest (test_inference.IntegrityTests.test_wrong_head_shape_rejected_even_with_new_digest) ... ok
16
+ test_wrong_job_rejected (test_inference.IntegrityTests.test_wrong_job_rejected) ... ok
17
+ test_wrong_parent_rejected_with_rehashed_catalog (test_inference.IntegrityTests.test_wrong_parent_rejected_with_rehashed_catalog) ... ok
18
+
19
+ ----------------------------------------------------------------------
20
+ Ran 17 tests in 0.361s
21
+
22
+ OK