ToTo-40417 commited on
Commit
b41d6e3
·
unverified ·
1 Parent(s): 31a5899

Publish EXQ12 and 5M lineage metadata

Browse files
DATA_PROVENANCE.md CHANGED
@@ -5,13 +5,18 @@
5
  EXLLM-0.005B-Instruct is a project-original model with 0.005377824B unique trainable parameters.
6
 
7
  1. The EXLLM project originates from random initialization.
8
- 2. The current 0.005B release was expanded from an earlier in-project EXLLM checkpoint by transplanting dimension-compatible parameters.
9
  3. Additional staged training used only project-generated Japanese instruction/response data.
10
  4. Corrective datasets were added in response to regression failures.
11
  5. The final fp32 checkpoint was exported to EXLLM8 and EXQ12 deployment formats.
12
 
13
  No external pretrained checkpoint was used. The model is not a distillation or quantization of a third-party LLM.
14
 
 
 
 
 
 
15
  ## Training data
16
 
17
  The project contains 0.086408M JSONL records across its published staged files. This number is the sum of file records, not a deduplicated training-example count. The files include overlapping base, validation, robustness, recovery, balance, consistency, and final corrective stages.
@@ -35,7 +40,7 @@ No external public text dataset was imported into the published project corpus.
35
  |---|---|
36
  | Parameters | 0.005377824B |
37
  | Global step | 1,810 |
38
- | Initialization | Earlier zero-based EXLLM project checkpoint transplantation |
39
  | Final corrective source | `EXLLM-v1.1-5m-release2.pt` |
40
  | Final corrective data | `v1_1_release_fix.jsonl` |
41
  | Final corrective steps | 100 |
 
5
  EXLLM-0.005B-Instruct is a project-original model with 0.005377824B unique trainable parameters.
6
 
7
  1. The EXLLM project originates from random initialization.
8
+ 2. The current 0.005B release was expanded from the published project-owned `weights/EXLLM-v1.0.0.safetensors` checkpoint by transplanting dimension-compatible parameters.
9
  3. Additional staged training used only project-generated Japanese instruction/response data.
10
  4. Corrective datasets were added in response to regression failures.
11
  5. The final fp32 checkpoint was exported to EXLLM8 and EXQ12 deployment formats.
12
 
13
  No external pretrained checkpoint was used. The model is not a distillation or quantization of a third-party LLM.
14
 
15
+ The direct parent hash and every 5M training stage are recorded in
16
+ [`training/release-5m-stages.json`](training/release-5m-stages.json). The source
17
+ repository contains the complete datasets and `tools/replay_5m.py`. EXQ12 is
18
+ deterministically generated from EXLLM8 by `tools/export_exq12.py`.
19
+
20
  ## Training data
21
 
22
  The project contains 0.086408M JSONL records across its published staged files. This number is the sum of file records, not a deduplicated training-example count. The files include overlapping base, validation, robustness, recovery, balance, consistency, and final corrective stages.
 
40
  |---|---|
41
  | Parameters | 0.005377824B |
42
  | Global step | 1,810 |
43
+ | Initialization | Published project-owned v1.0 checkpoint transplantation |
44
  | Final corrective source | `EXLLM-v1.1-5m-release2.pt` |
45
  | Final corrective data | `v1_1_release_fix.jsonl` |
46
  | Final corrective steps | 100 |
EXQ12_FORMAT.md ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # EXQ12 deployment format
2
+
3
+ `model.q12` is produced deterministically from the published EXLLM8 file by
4
+ `tools/export_exq12.py`. It contains the same 39 tensors in the order stored by
5
+ EXLLM8. The EX-word runtime uses integer matrix weights and fixed-point scales;
6
+ the file is not GGUF and is not interchangeable with EXLLM8.
7
+
8
+ ## Header
9
+
10
+ - 8 bytes: `EXQ12\0\0\0`
11
+ - little-endian `uint32`: format version (`1`)
12
+ - little-endian `uint32`: tensor count (`39` for the 5M release)
13
+
14
+ Each tensor record contains a little-endian `uint16` name length, `uint8`
15
+ dimension count, `uint8` qtype, UTF-8 name bytes, `uint32` dimensions, `uint32`
16
+ scale count, `uint32` payload byte count, optional scale data, and the payload.
17
+
18
+ - qtype `1`: signed int8 matrix payload; one signed Q20 `int32` scale per row.
19
+ - qtype `3`: signed Q12 `int16` vector payload; no separate scale table.
20
+
21
+ ## Reproduce the release artifact
22
+
23
+ ```bash
24
+ python tools/export_exq12.py
25
+ ```
26
+
27
+ Expected result:
28
+
29
+ ```text
30
+ bytes: 5443105
31
+ sha256: d64037fde791e5c0e48101bc1a8ab366a3287f1f36b4464879e36495ea7e5a53
32
+ tensors: 39
33
+ ```
README.md CHANGED
@@ -73,6 +73,7 @@ The published staged files include overlapping base, robustness, recovery, and c
73
 
74
  Data scope and weight lineage are documented in [`DATA_PROVENANCE.md`](DATA_PROVENANCE.md).
75
  The machine-readable release metadata is available in [`training/release-5m.json`](training/release-5m.json).
 
76
 
77
  ## Inference Performance
78
 
@@ -168,9 +169,10 @@ print(answer(model, tokenizer, "RAMとは何ですか?", temperature=0.0))
168
  | `weights/EXLLM-v1.1-5m-release3.pt` | 21,526,737 bytes (20.53 MiB; 0.021526737 GB) | `48ad00c6640689595a253fc949cad83f3000e14cccdf69275fcf245e85be3ceb` | fp32 PyTorch checkpoint |
169
  | `weights/EXLLM-v1.1-5m-int8.bin` | 5,443,105 bytes (5.19 MiB; 0.005443105 GB) | `3b2bf2d9f103cba714bc98976709c5ad34860c1ff55fed2fce91fc95afb5b34a` | EXLLM8 interchange artifact |
170
  | `weights/model.q12` | 5,443,105 bytes (5.19 MiB; 0.005443105 GB) | `d64037fde791e5c0e48101bc1a8ab366a3287f1f36b4464879e36495ea7e5a53` | EX-word EXQ12 artifact |
 
171
  | `EXLLM-0.005B-LMStudio-F16.gguf` | 10,915,168 bytes (10.41 MiB; 0.010915168 GB) | `0e3c519d4a044fac45be84dc607eb8a43de4a7c60083983bf246c5b9c8a43472` | Separately trained Llama-compatible F16 companion for LM Studio / llama.cpp |
172
 
173
- EXLLM8 and EXQ12 have the same file size but are not interchangeable formats.
174
 
175
  ## Intended Use
176
 
 
73
 
74
  Data scope and weight lineage are documented in [`DATA_PROVENANCE.md`](DATA_PROVENANCE.md).
75
  The machine-readable release metadata is available in [`training/release-5m.json`](training/release-5m.json).
76
+ The direct v1.0 parent and exact 5M stage parameters and hashes are published in [`training/release-5m-stages.json`](training/release-5m-stages.json). The source repository provides all staged datasets and `tools/replay_5m.py`.
77
 
78
  ## Inference Performance
79
 
 
169
  | `weights/EXLLM-v1.1-5m-release3.pt` | 21,526,737 bytes (20.53 MiB; 0.021526737 GB) | `48ad00c6640689595a253fc949cad83f3000e14cccdf69275fcf245e85be3ceb` | fp32 PyTorch checkpoint |
170
  | `weights/EXLLM-v1.1-5m-int8.bin` | 5,443,105 bytes (5.19 MiB; 0.005443105 GB) | `3b2bf2d9f103cba714bc98976709c5ad34860c1ff55fed2fce91fc95afb5b34a` | EXLLM8 interchange artifact |
171
  | `weights/model.q12` | 5,443,105 bytes (5.19 MiB; 0.005443105 GB) | `d64037fde791e5c0e48101bc1a8ab366a3287f1f36b4464879e36495ea7e5a53` | EX-word EXQ12 artifact |
172
+ | `weights/EXLLM-v1.0.0.safetensors` | 4,905,568 bytes (4.68 MiB; 0.004905568 GB) | `caad6a93aa2a8f6f2b525c4671dc8d2f8e4328d262a093172a55c672cd4e24c9` | Direct project-owned parent of the 5M expansion |
173
  | `EXLLM-0.005B-LMStudio-F16.gguf` | 10,915,168 bytes (10.41 MiB; 0.010915168 GB) | `0e3c519d4a044fac45be84dc607eb8a43de4a7c60083983bf246c5b9c8a43472` | Separately trained Llama-compatible F16 companion for LM Studio / llama.cpp |
174
 
175
+ EXLLM8 and EXQ12 have the same file size but are not interchangeable formats. Rebuild and verify `model.q12` with `python tools/export_exq12.py`; see [`EXQ12_FORMAT.md`](EXQ12_FORMAT.md).
176
 
177
  ## Intended Use
178
 
config-v1.0.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "vocab_size": 868,
3
+ "max_seq_len": 128,
4
+ "d_model": 160,
5
+ "n_layers": 4,
6
+ "n_heads": 5,
7
+ "d_ff": 512,
8
+ "rms_eps": 1e-05
9
+ }
tools/export_exq12.py ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Convert the published EXLLM8 artifact to the EX-word EXQ12 format."""
3
+
4
+ import argparse
5
+ import hashlib
6
+ import json
7
+ import struct
8
+ from pathlib import Path
9
+
10
+ MAGIC_IN = b"EXLLM8\0\0"
11
+ MAGIC_OUT = b"EXQ12\0\0\0"
12
+
13
+
14
+ def read_exllm8(path):
15
+ raw = path.read_bytes()
16
+ if raw[:8] != MAGIC_IN:
17
+ raise ValueError("input is not EXLLM8")
18
+ offset = 8
19
+ version, count = struct.unpack_from("<II", raw, offset)
20
+ offset += 8
21
+ if version != 1:
22
+ raise ValueError(f"unsupported EXLLM8 version: {version}")
23
+ records = []
24
+ for _ in range(count):
25
+ name_len, ndim, qtype = struct.unpack_from("<HBB", raw, offset)
26
+ offset += 4
27
+ name = raw[offset : offset + name_len]
28
+ offset += name_len
29
+ dims = struct.unpack_from("<" + "I" * ndim, raw, offset)
30
+ offset += 4 * ndim
31
+ scale_count, payload_bytes = struct.unpack_from("<II", raw, offset)
32
+ offset += 8
33
+ scales = struct.unpack_from("<" + "f" * scale_count, raw, offset) if scale_count else ()
34
+ offset += 4 * scale_count
35
+ payload = raw[offset : offset + payload_bytes]
36
+ offset += payload_bytes
37
+ records.append((name, qtype, dims, scales, payload))
38
+ if offset != len(raw):
39
+ raise ValueError("trailing bytes in EXLLM8 input")
40
+ return records
41
+
42
+
43
+ def convert(source, output):
44
+ records = read_exllm8(source)
45
+ with output.open("wb") as stream:
46
+ stream.write(MAGIC_OUT)
47
+ stream.write(struct.pack("<II", 1, len(records)))
48
+ for name, qtype, dims, scales, payload in records:
49
+ if qtype == 1:
50
+ fixed_scales = [max(1, min(0x7FFFFFFF, round(scale * (1 << 20)))) for scale in scales]
51
+ output_qtype = 1
52
+ elif qtype == 2:
53
+ values = struct.unpack("<" + "e" * (len(payload) // 2), payload)
54
+ payload = struct.pack(
55
+ "<" + "h" * len(values),
56
+ *(max(-32768, min(32767, round(value * 4096))) for value in values),
57
+ )
58
+ fixed_scales = []
59
+ output_qtype = 3
60
+ else:
61
+ raise ValueError(f"unsupported EXLLM8 qtype: {qtype}")
62
+ stream.write(struct.pack("<HBB", len(name), len(dims), output_qtype))
63
+ stream.write(name)
64
+ stream.write(struct.pack("<" + "I" * len(dims), *dims))
65
+ stream.write(struct.pack("<II", len(fixed_scales), len(payload)))
66
+ if fixed_scales:
67
+ stream.write(struct.pack("<" + "i" * len(fixed_scales), *fixed_scales))
68
+ stream.write(payload)
69
+ return len(records)
70
+
71
+
72
+ def main():
73
+ parser = argparse.ArgumentParser()
74
+ parser.add_argument("--input", type=Path, default=Path("weights/EXLLM-v1.1-5m-int8.bin"))
75
+ parser.add_argument("--output", type=Path, default=Path("weights/model.q12"))
76
+ parser.add_argument(
77
+ "--expect-sha256",
78
+ default="d64037fde791e5c0e48101bc1a8ab366a3287f1f36b4464879e36495ea7e5a53",
79
+ )
80
+ args = parser.parse_args()
81
+ args.output.parent.mkdir(parents=True, exist_ok=True)
82
+ tensor_count = convert(args.input, args.output)
83
+ digest = hashlib.sha256(args.output.read_bytes()).hexdigest()
84
+ result = {"output": str(args.output), "bytes": args.output.stat().st_size, "sha256": digest, "tensors": tensor_count}
85
+ print(json.dumps(result, indent=2))
86
+ if args.expect_sha256 and digest != args.expect_sha256:
87
+ raise SystemExit("EXQ12 SHA-256 mismatch")
88
+
89
+
90
+ if __name__ == "__main__":
91
+ main()
training/release-5m-stages.json ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "exllm-training-stages-v1",
3
+ "scope": "Direct lineage from the published v1.0 project checkpoint through the 5M release",
4
+ "seed_policy": {
5
+ "expansion": 20260923,
6
+ "corrective_stages": 20260924,
7
+ "corrective_sampling": "20260924 + input checkpoint global_step"
8
+ },
9
+ "parent": {
10
+ "checkpoint": "weights/EXLLM-v1.0.0.safetensors",
11
+ "sha256": "caad6a93aa2a8f6f2b525c4671dc8d2f8e4328d262a093172a55c672cd4e24c9",
12
+ "config": "config-v1.0.json",
13
+ "origin": "Earlier in-project EXLLM release trained from random initialization",
14
+ "external_pretrained_checkpoint": null
15
+ },
16
+ "input_artifacts": {
17
+ "config-v1.0.json": "4f8ec8792299a5a4a7b6f636748779ccc2f7e3f16cbfa180865ab572c793a090",
18
+ "tokenizer.json": "4c2a583b554e8165936cb3b11727f79d2ede43b73d416a48681f8d38385f5964",
19
+ "data/mix.jsonl": "3cbf8c724def49546c56c457fd3dc5b33feced6309b8a13c3a1cac904d44e51a",
20
+ "data/valid.jsonl": "63cb1a220df46ddc013410858d5dd2ee851529960cb9c1bf1ab78988c0205899",
21
+ "data/final_consistent.jsonl": "e76a5cc604b29296aae811bebfffd1db59f95c06360fd1c70cb8c93bdb46f20b",
22
+ "data/v1_1_release_fix.jsonl": "f8426b9eef53e0eb597d6b9572bf0439a2bd2c01617e588110f28b3f361cd2d7"
23
+ },
24
+ "stages": [
25
+ {
26
+ "name": "expand-and-train-5m",
27
+ "runner": "src.train_large",
28
+ "input": "weights/EXLLM-v1.0.0.safetensors",
29
+ "output": "weights/EXLLM-v1.1-5m.pt",
30
+ "output_sha256": "03cf2db5795871920911300b9f980f3fac6a27a590ae537866c2fdcbbe2fb0d0",
31
+ "data": "data/mix.jsonl",
32
+ "valid": "data/valid.jsonl",
33
+ "epochs": 8,
34
+ "batch": 128,
35
+ "threads": 8,
36
+ "learning_rate": 0.0005,
37
+ "d_model": 288,
38
+ "layers": 6,
39
+ "heads": 9,
40
+ "d_ff": 896
41
+ },
42
+ {
43
+ "name": "fix1",
44
+ "runner": "src.finetune",
45
+ "input": "weights/EXLLM-v1.1-5m.pt",
46
+ "output": "weights/EXLLM-v1.1-5m-fix1.pt",
47
+ "output_sha256": "39a5136b12cb13ad9e1d8d20d7d802b6b78ca1a5b68a82ffc5baed79101c79ba",
48
+ "data": "data/final_consistent.jsonl",
49
+ "steps": 800,
50
+ "batch": 64,
51
+ "threads": 8,
52
+ "learning_rate": 0.00012
53
+ },
54
+ {
55
+ "name": "final",
56
+ "runner": "src.finetune",
57
+ "input": "weights/EXLLM-v1.1-5m-fix1.pt",
58
+ "output": "weights/EXLLM-v1.1-5m-final.pt",
59
+ "output_sha256": "26fc9c588a30eba71eef062720a967337a155435dd02e2595a54b735f0178865",
60
+ "data": "data/v1_1_release_fix.jsonl",
61
+ "steps": 500,
62
+ "batch": 32,
63
+ "threads": 8,
64
+ "learning_rate": 0.00006
65
+ },
66
+ {
67
+ "name": "release",
68
+ "runner": "src.finetune",
69
+ "input": "weights/EXLLM-v1.1-5m-final.pt",
70
+ "output": "weights/EXLLM-v1.1-5m-release.pt",
71
+ "output_sha256": "35468acd4b962dc8fd64d7f6ae4bbf6d3245e03236d1b3562278251deed31204",
72
+ "data": "data/v1_1_release_fix.jsonl",
73
+ "steps": 250,
74
+ "batch": 32,
75
+ "threads": 8,
76
+ "learning_rate": 0.000025
77
+ },
78
+ {
79
+ "name": "release2",
80
+ "runner": "src.finetune",
81
+ "input": "weights/EXLLM-v1.1-5m-release.pt",
82
+ "output": "weights/EXLLM-v1.1-5m-release2.pt",
83
+ "output_sha256": "22e5c171bdb0cce094648d25c3768d0a0291797aa18d5ef833d812e6010a2d84",
84
+ "data": "data/v1_1_release_fix.jsonl",
85
+ "steps": 160,
86
+ "batch": 32,
87
+ "threads": 8,
88
+ "learning_rate": 0.000012
89
+ },
90
+ {
91
+ "name": "release3",
92
+ "runner": "src.finetune",
93
+ "input": "weights/EXLLM-v1.1-5m-release2.pt",
94
+ "output": "weights/EXLLM-v1.1-5m-release3.pt",
95
+ "output_sha256": "48ad00c6640689595a253fc949cad83f3000e14cccdf69275fcf245e85be3ceb",
96
+ "data": "data/v1_1_release_fix.jsonl",
97
+ "steps": 100,
98
+ "batch": 32,
99
+ "threads": 8,
100
+ "learning_rate": 0.000006
101
+ }
102
+ ],
103
+ "determinism_note": "Commands, seeds and inputs are preserved. Bit-for-bit identity can still vary with PyTorch, BLAS, CPU and platform; compare every output SHA-256 with this manifest."
104
+ }
training/release-5m.json CHANGED
@@ -8,9 +8,11 @@
8
  "global_step": 1810,
9
  "lineage": {
10
  "project_origin": "random initialization",
11
- "release_parent": "earlier in-project EXLLM checkpoint",
 
12
  "expansion": "dimension-compatible parameter transplantation",
13
- "external_pretrained_checkpoint": null
 
14
  },
15
  "architecture": {
16
  "vocab_size": 868,
 
8
  "global_step": 1810,
9
  "lineage": {
10
  "project_origin": "random initialization",
11
+ "release_parent": "weights/EXLLM-v1.0.0.safetensors",
12
+ "release_parent_sha256": "caad6a93aa2a8f6f2b525c4671dc8d2f8e4328d262a093172a55c672cd4e24c9",
13
  "expansion": "dimension-compatible parameter transplantation",
14
+ "external_pretrained_checkpoint": null,
15
+ "stage_manifest": "training/release-5m-stages.json"
16
  },
17
  "architecture": {
18
  "vocab_size": 868,
weights/EXLLM-v1.0.0.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:caad6a93aa2a8f6f2b525c4671dc8d2f8e4328d262a093172a55c672cd4e24c9
3
+ size 4905568