Publish updated UFO Python framework implementation
Browse files- LICENSE +49 -49
- README.md +52 -22
- merges.txt +0 -0
- qwen_vocab_cuneiform.bin +3 -0
- test_semantic_jit_weights.py +273 -0
- test_semantic_vocab_range_coder.py +348 -0
- tokenizer.json +2 -2
- tokenizer_config.json +74 -305
- ufo_cuneiform_vocab_mapper.py +167 -0
- vocab.json +0 -0
LICENSE
CHANGED
|
@@ -1,49 +1,49 @@
|
|
| 1 |
-
PROPRIETARY INTELLECTUAL PROPERTY & COPYRIGHT NOTICE
|
| 2 |
-
=====================================================
|
| 3 |
-
Copyright (c) 2026 Zymatica / Language-U Project / The AI Collective. All rights reserved.
|
| 4 |
-
|
| 5 |
-
NOTICE: ALL INFORMATION, CODE, ARCHITECTURAL SCHEMAS, MATHEMATICAL FORMULAS, DATASETS, AND DATA
|
| 6 |
-
CONTAINED HEREIN ARE, AND REMAIN THE PROPERTY OF ZYMATICA AND ITS ASSOCIATES (THE AI COLLECTIVE).
|
| 7 |
-
THE INTELLECTUAL, LOGICAL, AND TECHNICAL CONCEPTS CONTAINED HEREIN ARE PROPRIETARY TO ZYMATICA AND
|
| 8 |
-
ARE PROTECTED BY COPYRIGHT LAW, TRADE SECRET LAW, AND APPLICABLE INTELLECTUAL PROPERTY STATUTES.
|
| 9 |
-
|
| 10 |
-
PROPRIETARY ASSETS COVERED UNDER THIS LICENSE NOTICE INCLUDE, BUT ARE NOT LIMITED TO:
|
| 11 |
-
1. **Language-U Framework:** The compression taxonomy, semantic decomposition theory,
|
| 12 |
-
Shannon Bypass mathematical framework, and entropy decomposition equations.
|
| 13 |
-
2. **Cuneiform-U Semantic Hypercube System:** The 6-dimensional hypercube mapping along orthogonal axes
|
| 14 |
-
(Domain, Subdomain, Operation, Modality, Depth, Polarity) and coordinate radical representation
|
| 15 |
-
schemas (Classifier Radical R_C, Factor Radical R_F, and Active Radical R_A).
|
| 16 |
-
3. **Genesis Protocol:** The multi-level procedural model transmission, sharded weights
|
| 17 |
-
reconstruction, and dynamic layers streaming execution architecture.
|
| 18 |
-
4. **ProceduralSeed File Format (.LLM / .genesis):** The custom binary seed format, layer
|
| 19 |
-
encoding schemas, coordinate-packing matrices, and weights projection indexing.
|
| 20 |
-
5. **Chirp Packetization & FEC Scheme:** The LoRA packet layout wrappers (including 78-chirp
|
| 21 |
-
and 28-chirp physical packetization formats), Qualia Seed configuration (0xE0), Huffman facts coding
|
| 22 |
-
mappings, and XOR-FEC (Forward Error Correction) recovery stream algorithms.
|
| 23 |
-
6. **SVD/DCT Compression & Reconstructor Pipeline:** The weights reduction algorithms, singular value
|
| 24 |
-
decomposition (SVD) projection targets, discrete cosine transform (DCT) spectral compression,
|
| 25 |
-
and grow_weight / shrink_weight reconstruction implementations.
|
| 26 |
-
7. **LLM-Logits-Driven Range Coding (LLD-AC):** The active logits-driven probability range coding
|
| 27 |
-
and decoding mechanisms, dynamic entropy priors, and collapse signal scaling.
|
| 28 |
-
8. **Embedding-Driven Weight Projection (E-PAUP / 1-PAUP):** The mathematical projection of target
|
| 29 |
-
weight deltas/manifolds onto base-model shared word embedding matrices.
|
| 30 |
-
9. **Tokenizer Prefix-Suffix Varint Differential Coding:** The lossless tokenizer serialization
|
| 31 |
-
storing tokens by ID order using variable-length prefix sharing indexes and suffix bytes.
|
| 32 |
-
10. **Multi-Language Runtimes & Ports:** Low-overhead execution runtimes, off-line tokenizers,
|
| 33 |
-
and edge-optimized memory management bindings (including C++, Rust, Go, Python, Swift,
|
| 34 |
-
Java, and TypeScript implementations).
|
| 35 |
-
11. **SFT Healing & Adaptive Cognitive Alignment:** The LoRA PEFT receiver-side healing loops,
|
| 36 |
-
multi-task SFT alignment recipes, loss balancing weights, and token-based on-device
|
| 37 |
-
reconstruction correction scripts (including decode_teleport.py).
|
| 38 |
-
12. **Brand Assets & Artwork:** The official branding, visual representations, logos, and design
|
| 39 |
-
artwork associated with Zymatica, Language-U, and TheAiCollective.art.
|
| 40 |
-
|
| 41 |
-
REPRODUCTION, DISSEMINATION, TRANSLATION, PORTING, REVERSE-ENGINEERING, OR MODIFICATION
|
| 42 |
-
OF THIS MATERIAL, CODE, OR DATA IS STRICTLY FORBIDDEN UNLESS PRIOR EXPLICIT WRITTEN
|
| 43 |
-
PERMISSION IS OBTAINED FROM ZYMATICA.
|
| 44 |
-
|
| 45 |
-
THE LICENSED SOFTWARE AND CODE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
| 46 |
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 47 |
-
FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
|
| 48 |
-
BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
| 49 |
-
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR CODE.
|
|
|
|
| 1 |
+
PROPRIETARY INTELLECTUAL PROPERTY & COPYRIGHT NOTICE
|
| 2 |
+
=====================================================
|
| 3 |
+
Copyright (c) 2026 Zymatica / Language-U Project / The AI Collective. All rights reserved.
|
| 4 |
+
|
| 5 |
+
NOTICE: ALL INFORMATION, CODE, ARCHITECTURAL SCHEMAS, MATHEMATICAL FORMULAS, DATASETS, AND DATA
|
| 6 |
+
CONTAINED HEREIN ARE, AND REMAIN THE PROPERTY OF ZYMATICA AND ITS ASSOCIATES (THE AI COLLECTIVE).
|
| 7 |
+
THE INTELLECTUAL, LOGICAL, AND TECHNICAL CONCEPTS CONTAINED HEREIN ARE PROPRIETARY TO ZYMATICA AND
|
| 8 |
+
ARE PROTECTED BY COPYRIGHT LAW, TRADE SECRET LAW, AND APPLICABLE INTELLECTUAL PROPERTY STATUTES.
|
| 9 |
+
|
| 10 |
+
PROPRIETARY ASSETS COVERED UNDER THIS LICENSE NOTICE INCLUDE, BUT ARE NOT LIMITED TO:
|
| 11 |
+
1. **Language-U Framework:** The compression taxonomy, semantic decomposition theory,
|
| 12 |
+
Shannon Bypass mathematical framework, and entropy decomposition equations.
|
| 13 |
+
2. **Cuneiform-U Semantic Hypercube System:** The 6-dimensional hypercube mapping along orthogonal axes
|
| 14 |
+
(Domain, Subdomain, Operation, Modality, Depth, Polarity) and coordinate radical representation
|
| 15 |
+
schemas (Classifier Radical R_C, Factor Radical R_F, and Active Radical R_A).
|
| 16 |
+
3. **Genesis Protocol:** The multi-level procedural model transmission, sharded weights
|
| 17 |
+
reconstruction, and dynamic layers streaming execution architecture.
|
| 18 |
+
4. **ProceduralSeed File Format (.LLM / .genesis):** The custom binary seed format, layer
|
| 19 |
+
encoding schemas, coordinate-packing matrices, and weights projection indexing.
|
| 20 |
+
5. **Chirp Packetization & FEC Scheme:** The LoRA packet layout wrappers (including 78-chirp
|
| 21 |
+
and 28-chirp physical packetization formats), Qualia Seed configuration (0xE0), Huffman facts coding
|
| 22 |
+
mappings, and XOR-FEC (Forward Error Correction) recovery stream algorithms.
|
| 23 |
+
6. **SVD/DCT Compression & Reconstructor Pipeline:** The weights reduction algorithms, singular value
|
| 24 |
+
decomposition (SVD) projection targets, discrete cosine transform (DCT) spectral compression,
|
| 25 |
+
and grow_weight / shrink_weight reconstruction implementations.
|
| 26 |
+
7. **LLM-Logits-Driven Range Coding (LLD-AC):** The active logits-driven probability range coding
|
| 27 |
+
and decoding mechanisms, dynamic entropy priors, and collapse signal scaling.
|
| 28 |
+
8. **Embedding-Driven Weight Projection (E-PAUP / 1-PAUP):** The mathematical projection of target
|
| 29 |
+
weight deltas/manifolds onto base-model shared word embedding matrices.
|
| 30 |
+
9. **Tokenizer Prefix-Suffix Varint Differential Coding:** The lossless tokenizer serialization
|
| 31 |
+
storing tokens by ID order using variable-length prefix sharing indexes and suffix bytes.
|
| 32 |
+
10. **Multi-Language Runtimes & Ports:** Low-overhead execution runtimes, off-line tokenizers,
|
| 33 |
+
and edge-optimized memory management bindings (including C++, Rust, Go, Python, Swift,
|
| 34 |
+
Java, and TypeScript implementations).
|
| 35 |
+
11. **SFT Healing & Adaptive Cognitive Alignment:** The LoRA PEFT receiver-side healing loops,
|
| 36 |
+
multi-task SFT alignment recipes, loss balancing weights, and token-based on-device
|
| 37 |
+
reconstruction correction scripts (including decode_teleport.py).
|
| 38 |
+
12. **Brand Assets & Artwork:** The official branding, visual representations, logos, and design
|
| 39 |
+
artwork associated with Zymatica, Language-U, and TheAiCollective.art.
|
| 40 |
+
|
| 41 |
+
REPRODUCTION, DISSEMINATION, TRANSLATION, PORTING, REVERSE-ENGINEERING, OR MODIFICATION
|
| 42 |
+
OF THIS MATERIAL, CODE, OR DATA IS STRICTLY FORBIDDEN UNLESS PRIOR EXPLICIT WRITTEN
|
| 43 |
+
PERMISSION IS OBTAINED FROM ZYMATICA.
|
| 44 |
+
|
| 45 |
+
THE LICENSED SOFTWARE AND CODE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
| 46 |
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 47 |
+
FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
|
| 48 |
+
BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
| 49 |
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR CODE.
|
README.md
CHANGED
|
@@ -1,28 +1,37 @@
|
|
| 1 |
---
|
| 2 |
license: other
|
| 3 |
-
|
| 4 |
tags:
|
| 5 |
- ufo-compression
|
| 6 |
- model-quantization
|
| 7 |
- tokenizer-compression
|
|
|
|
|
|
|
|
|
|
| 8 |
- python
|
|
|
|
|
|
|
|
|
|
| 9 |
language:
|
| 10 |
- en
|
| 11 |
pipeline_tag: translation
|
|
|
|
| 12 |
---
|
| 13 |
|
| 14 |

|
| 15 |
|
|
|
|
| 16 |
|
| 17 |
-
#
|
|
|
|
| 18 |
|
| 19 |
-
|
| 20 |
|
| 21 |
-
|
| 22 |
|
| 23 |
---
|
| 24 |
|
| 25 |
-
## Licensing Compliance & Intellectual Property Map
|
|
|
|
| 26 |
This repository contains components from multiple origins. Licenses are assigned per component to respect the code we used while strictly protecting Zymatica's intellectual property:
|
| 27 |
|
| 28 |
### Third-Party Components (retained under their original licenses)
|
|
@@ -37,22 +46,18 @@ This repository contains components from multiple origins. Licenses are assigned
|
|
| 37 |
|
| 38 |
### Proprietary Components — All Rights Reserved, zymatica.space
|
| 39 |
The following are the exclusive intellectual property of **zymatica.space** and are **All Rights Reserved**. No part may be reproduced, distributed, reverse-engineered, modified, or used in any form without explicit written permission:
|
| 40 |
-
* **Language-U
|
| 41 |
-
* **
|
| 42 |
-
* **
|
| 43 |
-
* **
|
| 44 |
-
* **
|
| 45 |
-
* **SVD/DCT Compression & Reconstructor Pipeline:** The weights reduction algorithms, singular value decomposition (SVD) projection targets, discrete cosine transform (DCT) spectral compression, and grow_weight / shrink_weight reconstruction implementations.
|
| 46 |
-
* **LLM-Logits-Driven Range Coding (LLD-AC):** The active logits-driven probability range coding and decoding mechanisms, dynamic entropy priors, and collapse signal scaling.
|
| 47 |
-
* **Embedding-Driven Weight Projection (E-PAUP / 1-PAUP):** The mathematical projection of target weight deltas/manifolds onto base-model shared word embedding matrices.
|
| 48 |
-
* **Tokenizer Prefix-Suffix Varint Differential Coding:** The lossless tokenizer serialization storing tokens by ID order using variable-length prefix sharing indexes and suffix bytes.
|
| 49 |
-
* **Multi-Language Runtimes & Ports:** Low-overhead execution runtimes, off-line tokenizers, and edge-optimized memory management bindings (including C++, Rust, Go, Python, Swift, Java, and TypeScript implementations).
|
| 50 |
-
* **SFT Healing & Adaptive Cognitive Alignment:** The LoRA PEFT receiver-side healing loops, multi-task SFT alignment recipes, loss balancing weights, and token-based on-device reconstruction correction scripts (including decode_teleport.py).
|
| 51 |
|
| 52 |
---
|
| 53 |
|
| 54 |
-
## Core Abstractions & Methodological Innovations
|
|
|
|
| 55 |
This framework implements the following core structural innovations:
|
|
|
|
| 56 |
1. **Multidimensional Semantic Coordinate Indexing:** Decomposing conceptual queries and semantic structures into a 6D hypercube index along orthogonal axes (Domain, Subdomain, Operation, Modality, Depth, Polarity) represented as coordinate radicals ($R_C, R_F, R_A$).
|
| 57 |
2. **Embedding-Driven Weight Projection (E-PAUP):** Representing weight deltas of target layers by projecting them onto pre-existing, shared word embedding matrices of the base model, eliminating coordinate transmission overhead.
|
| 58 |
3. **Tokenizer Prefix-Suffix Varint Differential Coding:** Lossless tokenizer serialization storing tokens by ID order using variable-length prefix sharing indexes and suffix bytes, achieving a 9.37x stand-alone reduction and 3200x reference-mode reduction.
|
|
@@ -60,21 +65,47 @@ This framework implements the following core structural innovations:
|
|
| 60 |
|
| 61 |
---
|
| 62 |
|
| 63 |
-
##
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
From a hardware and systems engineering perspective, this pipeline is designed to execute on resource-constrained edge hardware, such as a **RAK Wireless Miner (typically a Raspberry Pi 4 with 4 GB RAM)**, without triggering Out-of-Memory (OOM) crashes. However, execution must be separated into three distinct phases to ensure 100% reliability:
|
| 65 |
|
| 66 |
### Phase 1: Weight Reconstruction (SUCCESS ✅)
|
| 67 |
-
* **How it fits:** The decoder generates weights procedurally and streams them directly to sharded `.safetensors` files on the local drive (microSD, USB SSD, or external hard drive) layer-by-layer.
|
| 68 |
* **Memory Profile:** By immediately flushing each layer tensor to disk and freeing the RAM buffers, peak memory usage stays **under 1.5 GB RAM**.
|
| 69 |
* **Smooth Execution Tip:** Ensure you have at least **15 GB of free space** on your storage drive before starting the reconstruction.
|
| 70 |
|
| 71 |
### Phase 2: Inference & Execution (SUCCESS ✅ via Single-Layer Streaming)
|
| 72 |
-
* **How it fits:** A 31B
|
| 73 |
* **Memory Profile:** Peak VRAM/RAM consumption remains bounded to **~30 MB to 100 MB** at any single moment.
|
| 74 |
* **Smooth Execution Tip:** Disk read latency is the primary bottleneck. Running this from a standard Class 10 microSD card or an external mechanical hard drive (HDD) will introduce seek latency and slow down the layer-streaming process. For a 100% smooth, high-throughput experience, run the model from a **high-speed USB 3.0 SSD** or connect your external hard drive directly to the Pi's USB 3.0 port (blue port) to avoid bus-speed limits.
|
| 75 |
|
| 76 |
### Phase 3: LoRA SFT Healing (WARNING ⚠️ - Extremely Tight)
|
| 77 |
-
* **The Bottleneck:** Fine-tuning is significantly heavier than inference because backpropagation requires storing activations, gradients, and optimizer states (AdamW) in RAM.
|
| 78 |
* **How to prevent OOMs:**
|
| 79 |
1. **Strict Parameter Freezing:** Ensure all reconstructed SVD base weights are strictly frozen (`requires_grad = False`). Only train the small embedding and layer normalization tensors.
|
| 80 |
2. **Batch Size Limit:** Force a batch size of `1` and gradient accumulation steps if needed.
|
|
@@ -92,4 +123,3 @@ This project is a collaborative effort by **TheAiCollective.art** (represented b
|
|
| 92 |
Together, we form **TheAiCollective.art**—pushing the boundaries of model compression and decentralization.
|
| 93 |
|
| 94 |
*Authors: Zymatica.space | astronautshe.com | DevsOne — We Are TheAiCollective.art*
|
| 95 |
-
|
|
|
|
| 1 |
---
|
| 2 |
license: other
|
|
|
|
| 3 |
tags:
|
| 4 |
- ufo-compression
|
| 5 |
- model-quantization
|
| 6 |
- tokenizer-compression
|
| 7 |
+
- rust
|
| 8 |
+
- cpp
|
| 9 |
+
- go
|
| 10 |
- python
|
| 11 |
+
- java
|
| 12 |
+
- swift
|
| 13 |
+
- typescript
|
| 14 |
language:
|
| 15 |
- en
|
| 16 |
pipeline_tag: translation
|
| 17 |
+
title: UFO Compression Python
|
| 18 |
---
|
| 19 |
|
| 20 |

|
| 21 |
|
| 22 |
+
# UFO Hyper-Compression & Self-Reconstruction Framework Kit (Python Edition)
|
| 23 |
|
| 24 |
+
## 1. Introduction: Bypassing Shannon's Limit on Edge Nodes
|
| 25 |
+
This repository houses the core algorithmic framework for the **UFO (Ultra-Frequency-Optimized) 7-Level Compression & Self-Reconstruction Pipeline** designed by **TheAiCollective.art**.
|
| 26 |
|
| 27 |
+
The framework provides the multi-language serialization wrappers and mathematical coordinate mappings that enable the offline reconstruction of massive language models from extremely sparse procedural seeds. By mapping weight manifolds and decomposing representations into Meaning and Syntax containers, this framework achieves a **3.1 million times** spatial footprint reduction.
|
| 28 |
|
| 29 |
+
This codebase is published privately to establish legal ownership and empirical utility evidence. It includes verified, systems-level ports in Rust, C++, Go, Python, Swift, Java, and TypeScript.
|
| 30 |
|
| 31 |
---
|
| 32 |
|
| 33 |
+
## 2. Licensing Compliance & Intellectual Property Map
|
| 34 |
+
|
| 35 |
This repository contains components from multiple origins. Licenses are assigned per component to respect the code we used while strictly protecting Zymatica's intellectual property:
|
| 36 |
|
| 37 |
### Third-Party Components (retained under their original licenses)
|
|
|
|
| 46 |
|
| 47 |
### Proprietary Components — All Rights Reserved, zymatica.space
|
| 48 |
The following are the exclusive intellectual property of **zymatica.space** and are **All Rights Reserved**. No part may be reproduced, distributed, reverse-engineered, modified, or used in any form without explicit written permission:
|
| 49 |
+
* **Language-U framework** — the compression taxonomy, semantic decomposition theory, and Shannon Bypass methodology.
|
| 50 |
+
* **Genesis Protocol** — the multi-level procedural model transmission and reconstruction architecture.
|
| 51 |
+
* **ProceduralSeed format (`.LLM` / `.genesis`)** — the binary seed file format, layer encoding schema, and weights projection indexing.
|
| 52 |
+
* **Chirp packetization scheme** — the 78-chirp / 255-byte LoRA packet layout, XOR-FEC error correction, and Huffman encoding.
|
| 53 |
+
* **SVD/DCT compression pipeline** — weights reduction and reconstruction algorithms.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
|
| 55 |
---
|
| 56 |
|
| 57 |
+
## 3. Core Abstractions & Methodological Innovations
|
| 58 |
+
|
| 59 |
This framework implements the following core structural innovations:
|
| 60 |
+
|
| 61 |
1. **Multidimensional Semantic Coordinate Indexing:** Decomposing conceptual queries and semantic structures into a 6D hypercube index along orthogonal axes (Domain, Subdomain, Operation, Modality, Depth, Polarity) represented as coordinate radicals ($R_C, R_F, R_A$).
|
| 62 |
2. **Embedding-Driven Weight Projection (E-PAUP):** Representing weight deltas of target layers by projecting them onto pre-existing, shared word embedding matrices of the base model, eliminating coordinate transmission overhead.
|
| 63 |
3. **Tokenizer Prefix-Suffix Varint Differential Coding:** Lossless tokenizer serialization storing tokens by ID order using variable-length prefix sharing indexes and suffix bytes, achieving a 9.37x stand-alone reduction and 3200x reference-mode reduction.
|
|
|
|
| 65 |
|
| 66 |
---
|
| 67 |
|
| 68 |
+
## 4. Tokenizer 7-Level Compression Paradigm
|
| 69 |
+
|
| 70 |
+
The tokenizer framework compresses original metadata files (~23 MB) down to either a stand-alone 2.4 MB capsule or a 28-byte base-oracle reference capsule using a 7-Level descent:
|
| 71 |
+
* **Level 1 (Raw Baseline):** Loading raw `tokenizer.json`, `merges.txt`, `vocab.json` (23 MB).
|
| 72 |
+
* **Level 2 (Structured Extraction):** Isolating vocab mappings and merge tuples (15 MB).
|
| 73 |
+
* **Level 3 (Byte/ID Delta Packing):** Varint packing of contiguous IDs; merges represented as vocabulary index pairs (7 MB).
|
| 74 |
+
* **Level 4 (Prefix-Suffix Differential Compression):** Prefix character length extraction + suffix arrays (4 MB).
|
| 75 |
+
* **Level 5 (Base Oracle Reference):** Zero-delta alignment vs base tokenizer.
|
| 76 |
+
* **Level 6 (Deflate Entropy Coding):** Zlib Level 9 hyper-deflate (2.4 MB absolute, 28 bytes reference).
|
| 77 |
+
* **Level 7 (XOR-FEC Chirp Packetization):** Packetization into 28 × 255-byte packets (27 data + 1 parity).
|
| 78 |
+
|
| 79 |
+
---
|
| 80 |
+
|
| 81 |
+
## 5. Multi-Language System Implementations
|
| 82 |
+
|
| 83 |
+
The core serialization algorithms are transpiled and verified in:
|
| 84 |
+
* `rust/`: Systems-level Rust implementation (`tokenizer_coder.rs`) for native speed.
|
| 85 |
+
* `cpp/`: Low-level C++ port (`tokenizer_coder.cpp` / `.hpp`) for embedded systems and edge microcontrollers.
|
| 86 |
+
* `go/`: Go port (`tokenizer_coder.go`) for high-concurrency server wrappers.
|
| 87 |
+
* `python/`: Production-ready Python modules.
|
| 88 |
+
* `java/`, `swift/`, `typescript/`: Language ports for enterprise, mobile, and web targets.
|
| 89 |
+
|
| 90 |
+
> **Liability Disclaimer:** This codebase contains research and validation artifacts provided "as-is" for controlled edge testing of the Language-U/1-PAUP pipeline. It is not intended for use in live production environments without prior written permission.
|
| 91 |
+
|
| 92 |
+
---
|
| 93 |
+
|
| 94 |
+
## 6. RAK Miner & Edge Device Deployment Guide (4GB RAM)
|
| 95 |
From a hardware and systems engineering perspective, this pipeline is designed to execute on resource-constrained edge hardware, such as a **RAK Wireless Miner (typically a Raspberry Pi 4 with 4 GB RAM)**, without triggering Out-of-Memory (OOM) crashes. However, execution must be separated into three distinct phases to ensure 100% reliability:
|
| 96 |
|
| 97 |
### Phase 1: Weight Reconstruction (SUCCESS ✅)
|
| 98 |
+
* **How it fits:** The decoder (`decode_gemma4_seed.py`) generates weights procedurally and streams them directly to sharded `.safetensors` files on the local drive (microSD, USB SSD, or external hard drive) layer-by-layer.
|
| 99 |
* **Memory Profile:** By immediately flushing each layer tensor to disk and freeing the RAM buffers, peak memory usage stays **under 1.5 GB RAM**.
|
| 100 |
* **Smooth Execution Tip:** Ensure you have at least **15 GB of free space** on your storage drive before starting the reconstruction.
|
| 101 |
|
| 102 |
### Phase 2: Inference & Execution (SUCCESS ✅ via Single-Layer Streaming)
|
| 103 |
+
* **How it fits:** A 31B parameter model normally requires 62 GB of memory. Since the Raspberry Pi uses unified system memory shared between CPU and OS, loading the entire model into RAM is impossible. The runtime solves this by loading only **one active layer** from disk into memory, performing the token attention calculation, and immediately discarding it before loading the next layer.
|
| 104 |
* **Memory Profile:** Peak VRAM/RAM consumption remains bounded to **~30 MB to 100 MB** at any single moment.
|
| 105 |
* **Smooth Execution Tip:** Disk read latency is the primary bottleneck. Running this from a standard Class 10 microSD card or an external mechanical hard drive (HDD) will introduce seek latency and slow down the layer-streaming process. For a 100% smooth, high-throughput experience, run the model from a **high-speed USB 3.0 SSD** or connect your external hard drive directly to the Pi's USB 3.0 port (blue port) to avoid bus-speed limits.
|
| 106 |
|
| 107 |
### Phase 3: LoRA SFT Healing (WARNING ⚠️ - Extremely Tight)
|
| 108 |
+
* **The Bottleneck:** Fine-tuning (`decode_teleport.py`) is significantly heavier than inference because backpropagation requires storing activations, gradients, and optimizer states (AdamW) in RAM.
|
| 109 |
* **How to prevent OOMs:**
|
| 110 |
1. **Strict Parameter Freezing:** Ensure all reconstructed SVD base weights are strictly frozen (`requires_grad = False`). Only train the small embedding and layer normalization tensors.
|
| 111 |
2. **Batch Size Limit:** Force a batch size of `1` and gradient accumulation steps if needed.
|
|
|
|
| 123 |
Together, we form **TheAiCollective.art**—pushing the boundaries of model compression and decentralization.
|
| 124 |
|
| 125 |
*Authors: Zymatica.space | astronautshe.com | DevsOne — We Are TheAiCollective.art*
|
|
|
merges.txt
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
qwen_vocab_cuneiform.bin
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:3f6589389e5bb0f37bbdebcd6751c6cc4d5d312c1efb7a496ebffbea2985dc93
|
| 3 |
+
size 744231
|
test_semantic_jit_weights.py
ADDED
|
@@ -0,0 +1,273 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import sys
|
| 3 |
+
import time
|
| 4 |
+
import struct
|
| 5 |
+
import torch
|
| 6 |
+
import numpy as np
|
| 7 |
+
from transformers import AutoTokenizer, AutoModelForCausalLM
|
| 8 |
+
|
| 9 |
+
# Set environments to avoid memory issues
|
| 10 |
+
os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "garbage_collection_threshold:0.6,max_split_size_mb:128"
|
| 11 |
+
|
| 12 |
+
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
|
| 13 |
+
BASE_MODEL = "j:/Language-U/Language-U-V2/qwen-3.5-0.8b-local"
|
| 14 |
+
MAP_BIN = "j:/Language-U/qwen_vocab_cuneiform.bin"
|
| 15 |
+
|
| 16 |
+
# Test passages representing different domains
|
| 17 |
+
TEST_PASSAGES = {
|
| 18 |
+
1: {
|
| 19 |
+
"text": "How do we configure the GPIO pins and reset lines for the SX1302 concentrator on Raspberry Pi 4?",
|
| 20 |
+
"expected_domain": 1,
|
| 21 |
+
"name": "Hardware & LoRA Networks"
|
| 22 |
+
},
|
| 23 |
+
2: {
|
| 24 |
+
"text": "What is the mathematical definition of singular value decomposition SVD and discrete cosine transform DCT?",
|
| 25 |
+
"expected_domain": 2,
|
| 26 |
+
"name": "Mathematics & Logic"
|
| 27 |
+
},
|
| 28 |
+
3: {
|
| 29 |
+
"text": "Tell me about Zymatica collective and the Astronaut SHE handshake dialogue protocol.",
|
| 30 |
+
"expected_domain": 3,
|
| 31 |
+
"name": "Dialogue & Persona"
|
| 32 |
+
},
|
| 33 |
+
4: {
|
| 34 |
+
"text": "Write a python or rust script to compile and run the range coder binary map in cargo.",
|
| 35 |
+
"expected_domain": 4,
|
| 36 |
+
"name": "Software & Runtimes"
|
| 37 |
+
},
|
| 38 |
+
0: {
|
| 39 |
+
"text": "What is the capital of France, and why is the sky blue on a sunny day?",
|
| 40 |
+
"expected_domain": 0,
|
| 41 |
+
"name": "General Conversational"
|
| 42 |
+
}
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
def load_vocab_map(path):
|
| 46 |
+
if not os.path.exists(path):
|
| 47 |
+
raise FileNotFoundError(f"Vocab map file not found: {path}")
|
| 48 |
+
with open(path, "rb") as f:
|
| 49 |
+
data = f.read()
|
| 50 |
+
vocab_size = len(data) // 3
|
| 51 |
+
vocab_map = {}
|
| 52 |
+
for i in range(vocab_size):
|
| 53 |
+
vocab_map[i] = (data[i*3], data[i*3+1], data[i*3+2])
|
| 54 |
+
return vocab_map
|
| 55 |
+
|
| 56 |
+
def detect_prompt_domain(prompt, tokenizer, vocab_map):
|
| 57 |
+
token_ids = tokenizer.encode(prompt)
|
| 58 |
+
domain_counts = {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}
|
| 59 |
+
for tid in token_ids:
|
| 60 |
+
if tid in vocab_map:
|
| 61 |
+
rc, rf, ra = vocab_map[tid]
|
| 62 |
+
domain = rc >> 4
|
| 63 |
+
domain_counts[domain] = domain_counts.get(domain, 0) + 1
|
| 64 |
+
|
| 65 |
+
# Find the most frequent non-zero domain
|
| 66 |
+
max_domain = 0
|
| 67 |
+
max_count = 0
|
| 68 |
+
for d, c in domain_counts.items():
|
| 69 |
+
if d == 0:
|
| 70 |
+
continue
|
| 71 |
+
if c > max_count:
|
| 72 |
+
max_count = c
|
| 73 |
+
max_domain = d
|
| 74 |
+
|
| 75 |
+
return max_domain, domain_counts
|
| 76 |
+
|
| 77 |
+
class SemanticJITRouter:
|
| 78 |
+
def __init__(self, model, rank=8, scale=0.5):
|
| 79 |
+
self.model = model
|
| 80 |
+
self.rank = rank
|
| 81 |
+
self.scale = scale
|
| 82 |
+
|
| 83 |
+
# Identify layers to adapt: self_attn q_proj and v_proj
|
| 84 |
+
self.target_layers = {}
|
| 85 |
+
for name, param in model.named_parameters():
|
| 86 |
+
if "self_attn.q_proj.weight" in name or "self_attn.v_proj.weight" in name:
|
| 87 |
+
self.target_layers[name] = param
|
| 88 |
+
|
| 89 |
+
print(f"JIT Router: Identified {len(self.target_layers)} target projection layers for adaptation.")
|
| 90 |
+
|
| 91 |
+
# Store backups of original weights on CPU to guarantee 100% bitwise lossless restoration
|
| 92 |
+
print("JIT Router: Backing up original base weights to host RAM (CPU)...")
|
| 93 |
+
self.base_backups = {}
|
| 94 |
+
for name, param in self.target_layers.items():
|
| 95 |
+
self.base_backups[name] = param.data.cpu().clone()
|
| 96 |
+
|
| 97 |
+
# Initialize adapter weights for domains 1 to 4 on CPU (system RAM)
|
| 98 |
+
print("JIT Router: Initializing low-rank adapter weights for Domains 1-4 on host CPU...")
|
| 99 |
+
self.adapters = {d: {} for d in [1, 2, 3, 4]}
|
| 100 |
+
|
| 101 |
+
# Deterministic generation of low-rank updates (U and V)
|
| 102 |
+
for d in [1, 2, 3, 4]:
|
| 103 |
+
torch.manual_seed(42 + d) # Different seed per domain
|
| 104 |
+
for name, param in self.target_layers.items():
|
| 105 |
+
out_features, in_features = param.shape
|
| 106 |
+
# U_d is [out_features, rank], V_d is [in_features, rank]
|
| 107 |
+
U = torch.randn(out_features, self.rank, dtype=param.dtype) * 0.02
|
| 108 |
+
V = torch.randn(in_features, self.rank, dtype=param.dtype) * 0.02
|
| 109 |
+
self.adapters[d][name] = (U, V)
|
| 110 |
+
|
| 111 |
+
def apply_adapter(self, domain_id):
|
| 112 |
+
if domain_id not in self.adapters:
|
| 113 |
+
return 0.0 # Domain 0 (base model)
|
| 114 |
+
|
| 115 |
+
t0 = time.perf_counter()
|
| 116 |
+
with torch.no_grad():
|
| 117 |
+
for name, param in self.target_layers.items():
|
| 118 |
+
U, V = self.adapters[domain_id][name]
|
| 119 |
+
# Move low-rank matrices to device JIT
|
| 120 |
+
U_dev = U.to(param.device)
|
| 121 |
+
V_dev = V.to(param.device)
|
| 122 |
+
# Compute low-rank update: Delta W = (U * V^T) * scale
|
| 123 |
+
delta_w = torch.matmul(U_dev, V_dev.t()) * self.scale
|
| 124 |
+
# Modify weights in-place
|
| 125 |
+
param.data.add_(delta_w)
|
| 126 |
+
return (time.perf_counter() - t0) * 1000.0 # time in ms
|
| 127 |
+
|
| 128 |
+
def remove_adapter(self, domain_id):
|
| 129 |
+
if domain_id not in self.adapters:
|
| 130 |
+
return
|
| 131 |
+
|
| 132 |
+
with torch.no_grad():
|
| 133 |
+
for name, param in self.target_layers.items():
|
| 134 |
+
# Losslessly restore weights using the host backups
|
| 135 |
+
backup = self.base_backups[name].to(param.device)
|
| 136 |
+
param.data.copy_(backup)
|
| 137 |
+
|
| 138 |
+
# Empty GPU cache to reclaim memory
|
| 139 |
+
if torch.cuda.is_available():
|
| 140 |
+
torch.cuda.empty_cache()
|
| 141 |
+
|
| 142 |
+
def main():
|
| 143 |
+
print("Loading vocab map...")
|
| 144 |
+
vocab_map = load_vocab_map(MAP_BIN)
|
| 145 |
+
|
| 146 |
+
print(f"Loading Qwen model and tokenizer from: {BASE_MODEL}")
|
| 147 |
+
tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL, trust_remote_code=True)
|
| 148 |
+
if tokenizer.pad_token is None:
|
| 149 |
+
tokenizer.pad_token = tokenizer.eos_token
|
| 150 |
+
|
| 151 |
+
model = AutoModelForCausalLM.from_pretrained(
|
| 152 |
+
BASE_MODEL,
|
| 153 |
+
torch_dtype=torch.float16,
|
| 154 |
+
device_map="auto" if torch.cuda.is_available() else "cpu"
|
| 155 |
+
)
|
| 156 |
+
model.eval()
|
| 157 |
+
|
| 158 |
+
# Initialize the JIT weight router
|
| 159 |
+
router = SemanticJITRouter(model, rank=8, scale=0.5)
|
| 160 |
+
|
| 161 |
+
print("\n" + "="*80)
|
| 162 |
+
print(" CUNEIFORM-U JIT WEIGHT ROUTER AND VRAM OPTIMIZATION BENCHMARK")
|
| 163 |
+
print("="*80)
|
| 164 |
+
|
| 165 |
+
results = []
|
| 166 |
+
|
| 167 |
+
# Run dynamic routing tests
|
| 168 |
+
for key, passage in TEST_PASSAGES.items():
|
| 169 |
+
text = passage["text"]
|
| 170 |
+
expected_d = passage["expected_domain"]
|
| 171 |
+
d_name = passage["name"]
|
| 172 |
+
|
| 173 |
+
print(f"\nPrompt: \"{text}\"")
|
| 174 |
+
|
| 175 |
+
# 1. Coordinate classification & domain routing
|
| 176 |
+
detected_d, counts = detect_prompt_domain(text, tokenizer, vocab_map)
|
| 177 |
+
print(f" -> Coordinate counts: {dict(counts)}")
|
| 178 |
+
print(f" -> Detected Domain: Domain {detected_d} ({d_name})")
|
| 179 |
+
|
| 180 |
+
# Verify alignment
|
| 181 |
+
if detected_d == expected_d:
|
| 182 |
+
print(f" [OK] Domain classification matched expected (Domain {expected_d}).")
|
| 183 |
+
else:
|
| 184 |
+
print(f" [WARNING] Domain mismatch: expected {expected_d}, detected {detected_d}")
|
| 185 |
+
|
| 186 |
+
# Measure VRAM baseline
|
| 187 |
+
vram_base = 0.0
|
| 188 |
+
if torch.cuda.is_available():
|
| 189 |
+
torch.cuda.reset_peak_memory_stats()
|
| 190 |
+
vram_base = torch.cuda.memory_allocated() / 1e6
|
| 191 |
+
|
| 192 |
+
# 2. Dynamic JIT Adapter Load
|
| 193 |
+
load_time_ms = router.apply_adapter(detected_d)
|
| 194 |
+
|
| 195 |
+
vram_loaded = 0.0
|
| 196 |
+
if torch.cuda.is_available():
|
| 197 |
+
vram_loaded = torch.cuda.memory_allocated() / 1e6
|
| 198 |
+
|
| 199 |
+
adapter_vram_cost = vram_loaded - vram_base
|
| 200 |
+
print(f" -> JIT Adapter Load Time: {load_time_ms:.3f} ms")
|
| 201 |
+
print(f" -> GPU Adapter VRAM Cost: {adapter_vram_cost:.3f} MB")
|
| 202 |
+
|
| 203 |
+
# 3. Model forward pass and logit shift validation
|
| 204 |
+
inputs = tokenizer(text, return_tensors="pt").to(DEVICE)
|
| 205 |
+
with torch.no_grad():
|
| 206 |
+
outputs = model(**inputs)
|
| 207 |
+
logits = outputs.logits
|
| 208 |
+
# Get peak logits stats as representation of adapter activation
|
| 209 |
+
logits_mean = logits.mean().item()
|
| 210 |
+
logits_std = logits.std().item()
|
| 211 |
+
logits_max = logits.max().item()
|
| 212 |
+
|
| 213 |
+
# 4. Dynamic JIT Adapter Unload
|
| 214 |
+
router.remove_adapter(detected_d)
|
| 215 |
+
|
| 216 |
+
vram_after = 0.0
|
| 217 |
+
if torch.cuda.is_available():
|
| 218 |
+
vram_after = torch.cuda.memory_allocated() / 1e6
|
| 219 |
+
|
| 220 |
+
# 5. Lossless base weights restoration check
|
| 221 |
+
is_lossless = True
|
| 222 |
+
for name, param in router.target_layers.items():
|
| 223 |
+
cpu_val = param.data.cpu()
|
| 224 |
+
backup_val = router.base_backups[name]
|
| 225 |
+
if not torch.allclose(cpu_val, backup_val, atol=1e-6):
|
| 226 |
+
is_lossless = False
|
| 227 |
+
break
|
| 228 |
+
|
| 229 |
+
print(f" -> Lossless Restoration: {'PASS' if is_lossless else 'FAIL'}")
|
| 230 |
+
print(f" -> VRAM Cleaned Check: {'PASS' if abs(vram_after - vram_base) < 0.1 else 'FAIL'} (Base: {vram_base:.2f} MB, After: {vram_after:.2f} MB)")
|
| 231 |
+
|
| 232 |
+
results.append({
|
| 233 |
+
"prompt": text[:40] + "...",
|
| 234 |
+
"detected_domain": f"Domain {detected_d}",
|
| 235 |
+
"load_time": f"{load_time_ms:.2f} ms",
|
| 236 |
+
"vram_cost": f"{adapter_vram_cost:.2f} MB",
|
| 237 |
+
"lossless": "PASS" if is_lossless else "FAIL",
|
| 238 |
+
"logits_hash": f"mean={logits_mean:.4f}, max={logits_max:.4f}"
|
| 239 |
+
})
|
| 240 |
+
|
| 241 |
+
# 6. Show VRAM Optimization Analysis
|
| 242 |
+
print("\n" + "="*80)
|
| 243 |
+
print(" SUMMARY OF DYNAMIC INFERENCE ROUTING BENCHMARKS")
|
| 244 |
+
print("="*80)
|
| 245 |
+
print(f"{'Prompt Preview':<30} | {'Domain':<10} | {'Load Time':<10} | {'VRAM Cost':<10} | {'Lossless':<10} | {'Logits Status'}")
|
| 246 |
+
print("-"*110)
|
| 247 |
+
for res in results:
|
| 248 |
+
print(f"{res['prompt']:<30} | {res['detected_domain']:<10} | {res['load_time']:<10} | {res['vram_cost']:<10} | {res['lossless']:<10} | {res['logits_hash']}")
|
| 249 |
+
|
| 250 |
+
print("\n" + "="*80)
|
| 251 |
+
print(" VRAM AND SCALABILITY COMPARISON")
|
| 252 |
+
print("="*80)
|
| 253 |
+
|
| 254 |
+
# Calculate sizes
|
| 255 |
+
single_adapter_size_kb = 0.0
|
| 256 |
+
for name, (U, V) in router.adapters[1].items():
|
| 257 |
+
single_adapter_size_kb += (U.nelement() + V.nelement()) * 2 / 1024.0 # 2 bytes per float16
|
| 258 |
+
|
| 259 |
+
total_adapters = 4
|
| 260 |
+
naive_multi_vram_kb = single_adapter_size_kb * total_adapters
|
| 261 |
+
jit_router_vram_kb = single_adapter_size_kb # Only 1 active at any time
|
| 262 |
+
savings_kb = naive_multi_vram_kb - jit_router_vram_kb
|
| 263 |
+
|
| 264 |
+
print(f"Number of specialized domain adapters: {total_adapters}")
|
| 265 |
+
print(f"VRAM per adapter (FP16 weight params): {single_adapter_size_kb:.2f} KB")
|
| 266 |
+
print(f"Naive simultaneous loading VRAM footprint: {naive_multi_vram_kb:.2f} KB")
|
| 267 |
+
print(f"Semantic JIT routing VRAM footprint: {jit_router_vram_kb:.2f} KB")
|
| 268 |
+
print(f"GPU VRAM savings (reclaimed from inactive): {savings_kb:.2f} KB ({savings_kb / 1024.0:.3f} MB)")
|
| 269 |
+
print(f"Theoretical savings scaling (with N domains): (N - 1) * {single_adapter_size_kb:.2f} KB")
|
| 270 |
+
print("="*80)
|
| 271 |
+
|
| 272 |
+
if __name__ == "__main__":
|
| 273 |
+
main()
|
test_semantic_vocab_range_coder.py
ADDED
|
@@ -0,0 +1,348 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import zlib
|
| 3 |
+
import struct
|
| 4 |
+
import numpy as np
|
| 5 |
+
from transformers import AutoTokenizer
|
| 6 |
+
|
| 7 |
+
TOKENIZER_DIR = "j:/Language-U/Language-U-V2/qwen-3.5-0.8b-local"
|
| 8 |
+
MAP_BIN = "j:/Language-U/qwen_vocab_cuneiform.bin"
|
| 9 |
+
|
| 10 |
+
# ─── Cuneiform-U Predictor & Range Coder ──────────────────────────────────────────
|
| 11 |
+
# Port of C abstractions from cuneiform_u_v3.h to Python
|
| 12 |
+
|
| 13 |
+
class PythonRadicalPredictor:
|
| 14 |
+
def __init__(self, alpha=1, weight=128):
|
| 15 |
+
self.alpha = alpha
|
| 16 |
+
self.weight = weight
|
| 17 |
+
# transition tables: key -> {symbol: count}
|
| 18 |
+
self.trans_rc = {}
|
| 19 |
+
self.trans_rf = {}
|
| 20 |
+
self.trans_ra = {}
|
| 21 |
+
|
| 22 |
+
self.prev_rc = 0
|
| 23 |
+
self.prev_rf = 0
|
| 24 |
+
self.prev_ra = 0
|
| 25 |
+
|
| 26 |
+
def observe(self, rc, rf, ra):
|
| 27 |
+
# 1. Update R_C
|
| 28 |
+
key_rc = self.prev_rc
|
| 29 |
+
if key_rc not in self.trans_rc:
|
| 30 |
+
self.trans_rc[key_rc] = {}
|
| 31 |
+
self.trans_rc[key_rc][rc] = self.trans_rc[key_rc].get(rc, 0) + self.weight
|
| 32 |
+
|
| 33 |
+
# 2. Update R_F
|
| 34 |
+
key_rf = (rc << 8) | self.prev_rf
|
| 35 |
+
if key_rf not in self.trans_rf:
|
| 36 |
+
self.trans_rf[key_rf] = {}
|
| 37 |
+
self.trans_rf[key_rf][rf] = self.trans_rf[key_rf].get(rf, 0) + self.weight
|
| 38 |
+
|
| 39 |
+
# 3. Update R_A
|
| 40 |
+
key_ra = (rc << 16) | (rf << 8) | self.prev_ra
|
| 41 |
+
if key_ra not in self.trans_ra:
|
| 42 |
+
self.trans_ra[key_ra] = {}
|
| 43 |
+
self.trans_ra[key_ra][ra] = self.trans_ra[key_ra].get(ra, 0) + self.weight
|
| 44 |
+
|
| 45 |
+
self.prev_rc = rc
|
| 46 |
+
self.prev_rf = rf
|
| 47 |
+
self.prev_ra = ra
|
| 48 |
+
|
| 49 |
+
def get_cum_freqs_rc(self, prev_rc):
|
| 50 |
+
freqs = [self.alpha] * 256
|
| 51 |
+
if prev_rc in self.trans_rc:
|
| 52 |
+
for sym, count in self.trans_rc[prev_rc].items():
|
| 53 |
+
freqs[sym] += count
|
| 54 |
+
cum_freqs = [0] * 257
|
| 55 |
+
for i in range(256):
|
| 56 |
+
cum_freqs[i+1] = cum_freqs[i] + freqs[i]
|
| 57 |
+
return cum_freqs
|
| 58 |
+
|
| 59 |
+
def get_cum_freqs_rf(self, curr_rc, prev_rf):
|
| 60 |
+
freqs = [self.alpha] * 256
|
| 61 |
+
key = (curr_rc << 8) | prev_rf
|
| 62 |
+
if key in self.trans_rf:
|
| 63 |
+
for sym, count in self.trans_rf[key].items():
|
| 64 |
+
freqs[sym] += count
|
| 65 |
+
cum_freqs = [0] * 257
|
| 66 |
+
for i in range(256):
|
| 67 |
+
cum_freqs[i+1] = cum_freqs[i] + freqs[i]
|
| 68 |
+
return cum_freqs
|
| 69 |
+
|
| 70 |
+
def get_cum_freqs_ra(self, curr_rc, curr_rf, prev_ra):
|
| 71 |
+
freqs = [self.alpha] * 256
|
| 72 |
+
key = (curr_rc << 16) | (curr_rf << 8) | prev_ra
|
| 73 |
+
if key in self.trans_ra:
|
| 74 |
+
for sym, count in self.trans_ra[key].items():
|
| 75 |
+
freqs[sym] += count
|
| 76 |
+
cum_freqs = [0] * 257
|
| 77 |
+
for i in range(256):
|
| 78 |
+
cum_freqs[i+1] = cum_freqs[i] + freqs[i]
|
| 79 |
+
return cum_freqs
|
| 80 |
+
|
| 81 |
+
|
| 82 |
+
class BitWriter:
|
| 83 |
+
def __init__(self):
|
| 84 |
+
self.buffer = []
|
| 85 |
+
self.current_byte = 0
|
| 86 |
+
self.bit_count = 0
|
| 87 |
+
|
| 88 |
+
def write_bit(self, bit):
|
| 89 |
+
self.current_byte = (self.current_byte << 1) | (bit & 1)
|
| 90 |
+
self.bit_count += 1
|
| 91 |
+
if self.bit_count % 8 == 0:
|
| 92 |
+
self.buffer.append(self.current_byte)
|
| 93 |
+
self.current_byte = 0
|
| 94 |
+
|
| 95 |
+
def write_bit_helper(self, underflow_bits, bit):
|
| 96 |
+
self.write_bit(bit)
|
| 97 |
+
for _ in range(underflow_bits[0]):
|
| 98 |
+
self.write_bit(1 - bit)
|
| 99 |
+
underflow_bits[0] = 0
|
| 100 |
+
|
| 101 |
+
def flush(self):
|
| 102 |
+
if self.bit_count % 8 != 0:
|
| 103 |
+
padding_bits = 8 - (self.bit_count % 8)
|
| 104 |
+
self.current_byte <<= padding_bits
|
| 105 |
+
self.buffer.append(self.current_byte)
|
| 106 |
+
self.current_byte = 0
|
| 107 |
+
self.bit_count += padding_bits
|
| 108 |
+
return bytes(self.buffer)
|
| 109 |
+
|
| 110 |
+
|
| 111 |
+
class BitReader:
|
| 112 |
+
def __init__(self, data):
|
| 113 |
+
self.data = data
|
| 114 |
+
self.byte_index = 0
|
| 115 |
+
self.bit_index = 0
|
| 116 |
+
self.total_bits = len(data) * 8
|
| 117 |
+
|
| 118 |
+
def read_bit(self):
|
| 119 |
+
if self.byte_index >= len(self.data):
|
| 120 |
+
return 0
|
| 121 |
+
bit = (self.data[self.byte_index] >> (7 - self.bit_index)) & 1
|
| 122 |
+
self.bit_index += 1
|
| 123 |
+
if self.bit_index == 8:
|
| 124 |
+
self.bit_index = 0
|
| 125 |
+
self.byte_index += 1
|
| 126 |
+
return bit
|
| 127 |
+
|
| 128 |
+
|
| 129 |
+
def range_encode_radicals(radicals, alpha=1, weight=128):
|
| 130 |
+
pred = PythonRadicalPredictor(alpha, weight)
|
| 131 |
+
w = BitWriter()
|
| 132 |
+
|
| 133 |
+
low = 0
|
| 134 |
+
high = 0xFFFFFFFF
|
| 135 |
+
underflow_bits = [0]
|
| 136 |
+
|
| 137 |
+
for rc, rf, ra in radicals:
|
| 138 |
+
symbols = [rc, rf, ra]
|
| 139 |
+
prev_rc = pred.prev_rc
|
| 140 |
+
prev_rf = pred.prev_rf
|
| 141 |
+
prev_ra = pred.prev_ra
|
| 142 |
+
|
| 143 |
+
for step in range(3):
|
| 144 |
+
if step == 0:
|
| 145 |
+
cum_freqs = pred.get_cum_freqs_rc(prev_rc)
|
| 146 |
+
elif step == 1:
|
| 147 |
+
cum_freqs = pred.get_cum_freqs_rf(symbols[0], prev_rf)
|
| 148 |
+
else:
|
| 149 |
+
cum_freqs = pred.get_cum_freqs_ra(symbols[0], symbols[1], prev_ra)
|
| 150 |
+
|
| 151 |
+
sym = symbols[step]
|
| 152 |
+
total = cum_freqs[256]
|
| 153 |
+
cum_low = cum_freqs[sym]
|
| 154 |
+
cum_high = cum_freqs[sym + 1]
|
| 155 |
+
|
| 156 |
+
range_width = high - low + 1
|
| 157 |
+
high = low + (range_width * cum_high) // total - 1
|
| 158 |
+
low = low + (range_width * cum_low) // total
|
| 159 |
+
|
| 160 |
+
# Renormalize
|
| 161 |
+
while True:
|
| 162 |
+
if high < 0x80000000:
|
| 163 |
+
w.write_bit_helper(underflow_bits, 0)
|
| 164 |
+
low = (low << 1) & 0xFFFFFFFF
|
| 165 |
+
high = ((high << 1) | 1) & 0xFFFFFFFF
|
| 166 |
+
elif low >= 0x80000000:
|
| 167 |
+
w.write_bit_helper(underflow_bits, 1)
|
| 168 |
+
low = ((low - 0x80000000) << 1) & 0xFFFFFFFF
|
| 169 |
+
high = (((high - 0x80000000) << 1) | 1) & 0xFFFFFFFF
|
| 170 |
+
elif low >= 0x40000000 and high < 0xC0000000:
|
| 171 |
+
underflow_bits[0] += 1
|
| 172 |
+
low = ((low - 0x40000000) << 1) & 0xFFFFFFFF
|
| 173 |
+
high = (((high - 0x40000000) << 1) | 1) & 0xFFFFFFFF
|
| 174 |
+
else:
|
| 175 |
+
break
|
| 176 |
+
|
| 177 |
+
pred.observe(rc, rf, ra)
|
| 178 |
+
|
| 179 |
+
underflow_bits[0] += 1
|
| 180 |
+
if low < 0x40000000:
|
| 181 |
+
w.write_bit_helper(underflow_bits, 0)
|
| 182 |
+
else:
|
| 183 |
+
w.write_bit_helper(underflow_bits, 1)
|
| 184 |
+
|
| 185 |
+
return w.flush()
|
| 186 |
+
|
| 187 |
+
|
| 188 |
+
def range_decode_radicals(encoded_bytes, num_concepts, alpha=1, weight=128):
|
| 189 |
+
pred = PythonRadicalPredictor(alpha, weight)
|
| 190 |
+
r = BitReader(encoded_bytes)
|
| 191 |
+
|
| 192 |
+
value = 0
|
| 193 |
+
for _ in range(32):
|
| 194 |
+
value = (value << 1) | r.read_bit()
|
| 195 |
+
|
| 196 |
+
low = 0
|
| 197 |
+
high = 0xFFFFFFFF
|
| 198 |
+
decoded_radicals = []
|
| 199 |
+
|
| 200 |
+
for c in range(num_concepts):
|
| 201 |
+
prev_rc = pred.prev_rc
|
| 202 |
+
prev_rf = pred.prev_rf
|
| 203 |
+
prev_ra = pred.prev_ra
|
| 204 |
+
|
| 205 |
+
symbols = [0, 0, 0]
|
| 206 |
+
|
| 207 |
+
for step in range(3):
|
| 208 |
+
if step == 0:
|
| 209 |
+
cum_freqs = pred.get_cum_freqs_rc(prev_rc)
|
| 210 |
+
elif step == 1:
|
| 211 |
+
cum_freqs = pred.get_cum_freqs_rf(symbols[0], prev_rf)
|
| 212 |
+
else:
|
| 213 |
+
cum_freqs = pred.get_cum_freqs_ra(symbols[0], symbols[1], prev_ra)
|
| 214 |
+
|
| 215 |
+
total = cum_freqs[256]
|
| 216 |
+
range_width = high - low + 1
|
| 217 |
+
|
| 218 |
+
scaled_val = (((value - low) + 1) * total - 1) // range_width
|
| 219 |
+
|
| 220 |
+
# Binary search for symbol
|
| 221 |
+
sym = 0
|
| 222 |
+
l = 0
|
| 223 |
+
rr = 255
|
| 224 |
+
while l <= rr:
|
| 225 |
+
mid = (l + rr) // 2
|
| 226 |
+
if cum_freqs[mid] <= scaled_val < cum_freqs[mid + 1]:
|
| 227 |
+
sym = mid
|
| 228 |
+
break
|
| 229 |
+
elif scaled_val >= cum_freqs[mid + 1]:
|
| 230 |
+
l = mid + 1
|
| 231 |
+
else:
|
| 232 |
+
rr = mid - 1
|
| 233 |
+
|
| 234 |
+
symbols[step] = sym
|
| 235 |
+
|
| 236 |
+
cum_low = cum_freqs[sym]
|
| 237 |
+
cum_high = cum_freqs[sym + 1]
|
| 238 |
+
|
| 239 |
+
high = low + (range_width * cum_high) // total - 1
|
| 240 |
+
low = low + (range_width * cum_low) // total
|
| 241 |
+
|
| 242 |
+
# Renormalize
|
| 243 |
+
while True:
|
| 244 |
+
if high < 0x80000000:
|
| 245 |
+
low = (low << 1) & 0xFFFFFFFF
|
| 246 |
+
high = ((high << 1) | 1) & 0xFFFFFFFF
|
| 247 |
+
value = ((value << 1) | r.read_bit()) & 0xFFFFFFFF
|
| 248 |
+
elif low >= 0x80000000:
|
| 249 |
+
low = ((low - 0x80000000) << 1) & 0xFFFFFFFF
|
| 250 |
+
high = (((high - 0x80000000) << 1) | 1) & 0xFFFFFFFF
|
| 251 |
+
value = (((value - 0x80000000) << 1) | r.read_bit()) & 0xFFFFFFFF
|
| 252 |
+
elif low >= 0x40000000 and high < 0xC0000000:
|
| 253 |
+
low = ((low - 0x40000000) << 1) & 0xFFFFFFFF
|
| 254 |
+
high = (((high - 0x40000000) << 1) | 1) & 0xFFFFFFFF
|
| 255 |
+
value = (((value - 0x40000000) << 1) | r.read_bit()) & 0xFFFFFFFF
|
| 256 |
+
else:
|
| 257 |
+
break
|
| 258 |
+
|
| 259 |
+
decoded_radicals.append((symbols[0], symbols[1], symbols[2]))
|
| 260 |
+
pred.observe(symbols[0], symbols[1], symbols[2])
|
| 261 |
+
|
| 262 |
+
return decoded_radicals
|
| 263 |
+
|
| 264 |
+
# ─── Verification & Benchmarking Harness ──────────────────────────────────────────
|
| 265 |
+
|
| 266 |
+
TEST_PASSAGES = [
|
| 267 |
+
# 1. Hardware network reset sequence
|
| 268 |
+
"GPIO pin SX1302 reset lines on Raspberry Pi 4 pin 25. reset_lgw.sh resets concentrator.",
|
| 269 |
+
# 2. Mathematical information theory
|
| 270 |
+
"SVD projection and DCT spectral coordinates compress weights. Shannon Orthogonality equation.",
|
| 271 |
+
# 3. Conversational dialogue context
|
| 272 |
+
"I am the assistant speaking for TheAiCollective. Zymatica is the framework architect."
|
| 273 |
+
]
|
| 274 |
+
|
| 275 |
+
def load_vocab_map(path):
|
| 276 |
+
with open(path, "rb") as f:
|
| 277 |
+
data = f.read()
|
| 278 |
+
vocab_size = len(data) // 3
|
| 279 |
+
vocab_map = {}
|
| 280 |
+
for i in range(vocab_size):
|
| 281 |
+
vocab_map[i] = (data[i*3], data[i*3+1], data[i*3+2])
|
| 282 |
+
return vocab_map
|
| 283 |
+
|
| 284 |
+
def main():
|
| 285 |
+
if not os.path.exists(MAP_BIN):
|
| 286 |
+
print(f"Error: map file {MAP_BIN} does not exist. Run ufo_cuneiform_vocab_mapper.py first.")
|
| 287 |
+
return
|
| 288 |
+
|
| 289 |
+
print("Loading vocab map database...")
|
| 290 |
+
vocab_map = load_vocab_map(MAP_BIN)
|
| 291 |
+
|
| 292 |
+
print(f"Loading Qwen tokenizer from: {TOKENIZER_DIR}")
|
| 293 |
+
tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_DIR, trust_remote_code=True)
|
| 294 |
+
|
| 295 |
+
print("\n" + "="*80)
|
| 296 |
+
print(" CUNEIFORM-U SEMANTIC RANGE CODER COMPRESSION BENCHMARKS")
|
| 297 |
+
print("="*80)
|
| 298 |
+
|
| 299 |
+
for idx, text in enumerate(TEST_PASSAGES, 1):
|
| 300 |
+
print(f"\n--- Test Passage {idx}: \"{text[:60]}...\" ---")
|
| 301 |
+
|
| 302 |
+
# 1. Tokenize text
|
| 303 |
+
token_ids = tokenizer.encode(text)
|
| 304 |
+
num_tokens = len(token_ids)
|
| 305 |
+
print(f" Raw tokens count: {num_tokens}")
|
| 306 |
+
|
| 307 |
+
# 2. Translate token IDs to 3-byte radicals
|
| 308 |
+
radicals = [vocab_map[tid] for tid in token_ids]
|
| 309 |
+
|
| 310 |
+
# 3. Compress using Cuneiform-U range coder
|
| 311 |
+
t0 = np.round(1000 * np.round(0, 4)) # dummy placeholder
|
| 312 |
+
compressed_bytes = range_encode_radicals(radicals, alpha=1, weight=128)
|
| 313 |
+
compressed_len = len(compressed_bytes)
|
| 314 |
+
|
| 315 |
+
# 4. Lossless Decompress Verification
|
| 316 |
+
decoded_radicals = range_decode_radicals(compressed_bytes, num_tokens, alpha=1, weight=128)
|
| 317 |
+
assert decoded_radicals == radicals, f" [FAIL] ERROR: Lossless validation failed at index {idx}!"
|
| 318 |
+
print(" [OK] Lossless reconstruction validation PASSED.")
|
| 319 |
+
|
| 320 |
+
# 5. Baselines comparison
|
| 321 |
+
# Baseline A: Raw ASCII text bytes
|
| 322 |
+
ascii_bytes_len = len(text.encode('utf-8'))
|
| 323 |
+
|
| 324 |
+
# Baseline B: Raw Token IDs as 32-bit integers (4 bytes per token)
|
| 325 |
+
raw_ids_bytes = num_tokens * 4
|
| 326 |
+
|
| 327 |
+
# Baseline C: Token IDs compressed via standard zlib deflate (Level 9)
|
| 328 |
+
token_bytes_flat = bytearray()
|
| 329 |
+
for tid in token_ids:
|
| 330 |
+
token_bytes_flat.extend(struct.pack(">I", tid))
|
| 331 |
+
zlib_compressed = zlib.compress(bytes(token_bytes_flat), level=9)
|
| 332 |
+
zlib_len = len(zlib_compressed)
|
| 333 |
+
|
| 334 |
+
print("\n Compression Size Metrics:")
|
| 335 |
+
print(f" - Raw ASCII Text: {ascii_bytes_len} bytes")
|
| 336 |
+
print(f" - Raw Token IDs (32-bit): {raw_ids_bytes} bytes")
|
| 337 |
+
print(f" - Token IDs + Zlib (deflate): {zlib_len} bytes")
|
| 338 |
+
print(f" - **Cuneiform-U Range Coding**: {compressed_len} bytes")
|
| 339 |
+
|
| 340 |
+
# Ratios
|
| 341 |
+
vs_ascii = ascii_bytes_len / compressed_len
|
| 342 |
+
vs_zlib = zlib_len / compressed_len
|
| 343 |
+
|
| 344 |
+
print(f"\n [+] Cuneiform-U vs ASCII: {vs_ascii:.2f}x compression gain")
|
| 345 |
+
print(f" [+] Cuneiform-U vs Zlib (tokens): {vs_zlib:.2f}x compression gain")
|
| 346 |
+
|
| 347 |
+
if __name__ == "__main__":
|
| 348 |
+
main()
|
tokenizer.json
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:cc8d3a0ce36466ccc1278bf987df5f71db1719b9ca6b4118264f45cb627bfe0f
|
| 3 |
+
size 32169626
|
tokenizer_config.json
CHANGED
|
@@ -1,305 +1,74 @@
|
|
| 1 |
-
{
|
| 2 |
-
"
|
| 3 |
-
"
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
"
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
"
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
"
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
},
|
| 76 |
-
"248053": {
|
| 77 |
-
"content": "<|vision_start|>",
|
| 78 |
-
"lstrip": false,
|
| 79 |
-
"normalized": false,
|
| 80 |
-
"rstrip": false,
|
| 81 |
-
"single_word": false,
|
| 82 |
-
"special": true
|
| 83 |
-
},
|
| 84 |
-
"248054": {
|
| 85 |
-
"content": "<|vision_end|>",
|
| 86 |
-
"lstrip": false,
|
| 87 |
-
"normalized": false,
|
| 88 |
-
"rstrip": false,
|
| 89 |
-
"single_word": false,
|
| 90 |
-
"special": true
|
| 91 |
-
},
|
| 92 |
-
"248055": {
|
| 93 |
-
"content": "<|vision_pad|>",
|
| 94 |
-
"lstrip": false,
|
| 95 |
-
"normalized": false,
|
| 96 |
-
"rstrip": false,
|
| 97 |
-
"single_word": false,
|
| 98 |
-
"special": true
|
| 99 |
-
},
|
| 100 |
-
"248056": {
|
| 101 |
-
"content": "<|image_pad|>",
|
| 102 |
-
"lstrip": false,
|
| 103 |
-
"normalized": false,
|
| 104 |
-
"rstrip": false,
|
| 105 |
-
"single_word": false,
|
| 106 |
-
"special": true
|
| 107 |
-
},
|
| 108 |
-
"248057": {
|
| 109 |
-
"content": "<|video_pad|>",
|
| 110 |
-
"lstrip": false,
|
| 111 |
-
"normalized": false,
|
| 112 |
-
"rstrip": false,
|
| 113 |
-
"single_word": false,
|
| 114 |
-
"special": true
|
| 115 |
-
},
|
| 116 |
-
"248058": {
|
| 117 |
-
"content": "<tool_call>",
|
| 118 |
-
"lstrip": false,
|
| 119 |
-
"normalized": false,
|
| 120 |
-
"rstrip": false,
|
| 121 |
-
"single_word": false,
|
| 122 |
-
"special": false
|
| 123 |
-
},
|
| 124 |
-
"248059": {
|
| 125 |
-
"content": "</tool_call>",
|
| 126 |
-
"lstrip": false,
|
| 127 |
-
"normalized": false,
|
| 128 |
-
"rstrip": false,
|
| 129 |
-
"single_word": false,
|
| 130 |
-
"special": false
|
| 131 |
-
},
|
| 132 |
-
"248060": {
|
| 133 |
-
"content": "<|fim_prefix|>",
|
| 134 |
-
"lstrip": false,
|
| 135 |
-
"normalized": false,
|
| 136 |
-
"rstrip": false,
|
| 137 |
-
"single_word": false,
|
| 138 |
-
"special": false
|
| 139 |
-
},
|
| 140 |
-
"248061": {
|
| 141 |
-
"content": "<|fim_middle|>",
|
| 142 |
-
"lstrip": false,
|
| 143 |
-
"normalized": false,
|
| 144 |
-
"rstrip": false,
|
| 145 |
-
"single_word": false,
|
| 146 |
-
"special": false
|
| 147 |
-
},
|
| 148 |
-
"248062": {
|
| 149 |
-
"content": "<|fim_suffix|>",
|
| 150 |
-
"lstrip": false,
|
| 151 |
-
"normalized": false,
|
| 152 |
-
"rstrip": false,
|
| 153 |
-
"single_word": false,
|
| 154 |
-
"special": false
|
| 155 |
-
},
|
| 156 |
-
"248063": {
|
| 157 |
-
"content": "<|fim_pad|>",
|
| 158 |
-
"lstrip": false,
|
| 159 |
-
"normalized": false,
|
| 160 |
-
"rstrip": false,
|
| 161 |
-
"single_word": false,
|
| 162 |
-
"special": false
|
| 163 |
-
},
|
| 164 |
-
"248064": {
|
| 165 |
-
"content": "<|repo_name|>",
|
| 166 |
-
"lstrip": false,
|
| 167 |
-
"normalized": false,
|
| 168 |
-
"rstrip": false,
|
| 169 |
-
"single_word": false,
|
| 170 |
-
"special": false
|
| 171 |
-
},
|
| 172 |
-
"248065": {
|
| 173 |
-
"content": "<|file_sep|>",
|
| 174 |
-
"lstrip": false,
|
| 175 |
-
"normalized": false,
|
| 176 |
-
"rstrip": false,
|
| 177 |
-
"single_word": false,
|
| 178 |
-
"special": false
|
| 179 |
-
},
|
| 180 |
-
"248066": {
|
| 181 |
-
"content": "<tool_response>",
|
| 182 |
-
"lstrip": false,
|
| 183 |
-
"normalized": false,
|
| 184 |
-
"rstrip": false,
|
| 185 |
-
"single_word": false,
|
| 186 |
-
"special": false
|
| 187 |
-
},
|
| 188 |
-
"248067": {
|
| 189 |
-
"content": "</tool_response>",
|
| 190 |
-
"lstrip": false,
|
| 191 |
-
"normalized": false,
|
| 192 |
-
"rstrip": false,
|
| 193 |
-
"single_word": false,
|
| 194 |
-
"special": false
|
| 195 |
-
},
|
| 196 |
-
"248068": {
|
| 197 |
-
"content": "<think>",
|
| 198 |
-
"lstrip": false,
|
| 199 |
-
"normalized": false,
|
| 200 |
-
"rstrip": false,
|
| 201 |
-
"single_word": false,
|
| 202 |
-
"special": false
|
| 203 |
-
},
|
| 204 |
-
"248069": {
|
| 205 |
-
"content": "</think>",
|
| 206 |
-
"lstrip": false,
|
| 207 |
-
"normalized": false,
|
| 208 |
-
"rstrip": false,
|
| 209 |
-
"single_word": false,
|
| 210 |
-
"special": false
|
| 211 |
-
},
|
| 212 |
-
"248070": {
|
| 213 |
-
"content": "<|audio_start|>",
|
| 214 |
-
"lstrip": false,
|
| 215 |
-
"normalized": false,
|
| 216 |
-
"rstrip": false,
|
| 217 |
-
"single_word": false,
|
| 218 |
-
"special": true
|
| 219 |
-
},
|
| 220 |
-
"248071": {
|
| 221 |
-
"content": "<|audio_end|>",
|
| 222 |
-
"lstrip": false,
|
| 223 |
-
"normalized": false,
|
| 224 |
-
"rstrip": false,
|
| 225 |
-
"single_word": false,
|
| 226 |
-
"special": true
|
| 227 |
-
},
|
| 228 |
-
"248072": {
|
| 229 |
-
"content": "<tts_pad>",
|
| 230 |
-
"lstrip": false,
|
| 231 |
-
"normalized": false,
|
| 232 |
-
"rstrip": false,
|
| 233 |
-
"single_word": false,
|
| 234 |
-
"special": true
|
| 235 |
-
},
|
| 236 |
-
"248073": {
|
| 237 |
-
"content": "<tts_text_bos>",
|
| 238 |
-
"lstrip": false,
|
| 239 |
-
"normalized": false,
|
| 240 |
-
"rstrip": false,
|
| 241 |
-
"single_word": false,
|
| 242 |
-
"special": true
|
| 243 |
-
},
|
| 244 |
-
"248074": {
|
| 245 |
-
"content": "<tts_text_eod>",
|
| 246 |
-
"lstrip": false,
|
| 247 |
-
"normalized": false,
|
| 248 |
-
"rstrip": false,
|
| 249 |
-
"single_word": false,
|
| 250 |
-
"special": true
|
| 251 |
-
},
|
| 252 |
-
"248075": {
|
| 253 |
-
"content": "<tts_text_bos_single>",
|
| 254 |
-
"lstrip": false,
|
| 255 |
-
"normalized": false,
|
| 256 |
-
"rstrip": false,
|
| 257 |
-
"single_word": false,
|
| 258 |
-
"special": true
|
| 259 |
-
},
|
| 260 |
-
"248076": {
|
| 261 |
-
"content": "<|audio_pad|>",
|
| 262 |
-
"lstrip": false,
|
| 263 |
-
"normalized": false,
|
| 264 |
-
"rstrip": false,
|
| 265 |
-
"single_word": false,
|
| 266 |
-
"special": true
|
| 267 |
-
}
|
| 268 |
-
},
|
| 269 |
-
"additional_special_tokens": [
|
| 270 |
-
"<|im_start|>",
|
| 271 |
-
"<|im_end|>",
|
| 272 |
-
"<|object_ref_start|>",
|
| 273 |
-
"<|object_ref_end|>",
|
| 274 |
-
"<|box_start|>",
|
| 275 |
-
"<|box_end|>",
|
| 276 |
-
"<|quad_start|>",
|
| 277 |
-
"<|quad_end|>",
|
| 278 |
-
"<|vision_start|>",
|
| 279 |
-
"<|vision_end|>",
|
| 280 |
-
"<|vision_pad|>",
|
| 281 |
-
"<|image_pad|>",
|
| 282 |
-
"<|video_pad|>"
|
| 283 |
-
],
|
| 284 |
-
"bos_token": null,
|
| 285 |
-
"chat_template": "{%- set image_count = namespace(value=0) %}\n{%- set video_count = namespace(value=0) %}\n{%- macro render_content(content, do_vision_count, is_system_content=false) %}\n {%- if content is string %}\n {{- content }}\n {%- elif content is iterable and content is not mapping %}\n {%- for item in content %}\n {%- if 'image' in item or 'image_url' in item or item.type == 'image' %}\n {%- if is_system_content %}\n {{- raise_exception('System message cannot contain images.') }}\n {%- endif %}\n {%- if do_vision_count %}\n {%- set image_count.value = image_count.value + 1 %}\n {%- endif %}\n {%- if add_vision_id %}\n {{- 'Picture ' ~ image_count.value ~ ': ' }}\n {%- endif %}\n {{- '<|vision_start|><|image_pad|><|vision_end|>' }}\n {%- elif 'video' in item or item.type == 'video' %}\n {%- if is_system_content %}\n {{- raise_exception('System message cannot contain videos.') }}\n {%- endif %}\n {%- if do_vision_count %}\n {%- set video_count.value = video_count.value + 1 %}\n {%- endif %}\n {%- if add_vision_id %}\n {{- 'Video ' ~ video_count.value ~ ': ' }}\n {%- endif %}\n {{- '<|vision_start|><|video_pad|><|vision_end|>' }}\n {%- elif 'text' in item %}\n {{- item.text }}\n {%- else %}\n {{- raise_exception('Unexpected item type in content.') }}\n {%- endif %}\n {%- endfor %}\n {%- elif content is none or content is undefined %}\n {{- '' }}\n {%- else %}\n {{- raise_exception('Unexpected content type.') }}\n {%- endif %}\n{%- endmacro %}\n{%- if not messages %}\n {{- raise_exception('No messages provided.') }}\n{%- endif %}\n{%- if tools and tools is iterable and tools is not mapping %}\n {{- '<|im_start|>system\\n' }}\n {{- \"# Tools\\n\\nYou have access to the following functions:\\n\\n<tools>\" }}\n {%- for tool in tools %}\n {{- \"\\n\" }}\n {{- tool | tojson }}\n {%- endfor %}\n {{- \"\\n</tools>\" }}\n {{- '\\n\\nIf you choose to call a function ONLY reply in the following format with NO suffix:\\n\\n<tool_call>\\n<function=example_function_name>\\n<parameter=example_parameter_1>\\nvalue_1\\n</parameter>\\n<parameter=example_parameter_2>\\nThis is the value for the second parameter\\nthat can span\\nmultiple lines\\n</parameter>\\n</function>\\n</tool_call>\\n\\n<IMPORTANT>\\nReminder:\\n- Function calls MUST follow the specified format: an inner <function=...></function> block must be nested within <tool_call></tool_call> XML tags\\n- Required parameters MUST be specified\\n- You may provide optional reasoning for your function call in natural language BEFORE the function call, but NOT after\\n- If there is no function call available, answer the question like normal with your current knowledge and do not tell the user about function calls\\n</IMPORTANT>' }}\n {%- if messages[0].role == 'system' %}\n {%- set content = render_content(messages[0].content, false, true)|trim %}\n {%- if content %}\n {{- '\\n\\n' + content }}\n {%- endif %}\n {%- endif %}\n {{- '<|im_end|>\\n' }}\n{%- else %}\n {%- if messages[0].role == 'system' %}\n {%- set content = render_content(messages[0].content, false, true)|trim %}\n {{- '<|im_start|>system\\n' + content + '<|im_end|>\\n' }}\n {%- endif %}\n{%- endif %}\n{%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %}\n{%- for message in messages[::-1] %}\n {%- set index = (messages|length - 1) - loop.index0 %}\n {%- if ns.multi_step_tool and message.role == \"user\" %}\n {%- set content = render_content(message.content, false)|trim %}\n {%- if not(content.startswith('<tool_response>') and content.endswith('</tool_response>')) %}\n {%- set ns.multi_step_tool = false %}\n {%- set ns.last_query_index = index %}\n {%- endif %}\n {%- endif %}\n{%- endfor %}\n{%- if ns.multi_step_tool %}\n {{- raise_exception('No user query found in messages.') }}\n{%- endif %}\n{%- for message in messages %}\n {%- set content = render_content(message.content, true)|trim %}\n {%- if message.role == \"system\" %}\n {%- if not loop.first %}\n {{- raise_exception('System message must be at the beginning.') }}\n {%- endif %}\n {%- elif message.role == \"user\" %}\n {{- '<|im_start|>' + message.role + '\\n' + content + '<|im_end|>' + '\\n' }}\n {%- elif message.role == \"assistant\" %}\n {%- set reasoning_content = '' %}\n {%- if message.reasoning_content is string %}\n {%- set reasoning_content = message.reasoning_content %}\n {%- else %}\n {%- if '</think>' in content %}\n {%- set reasoning_content = content.split('</think>')[0].rstrip('\\n').split('<think>')[-1].lstrip('\\n') %}\n {%- set content = content.split('</think>')[-1].lstrip('\\n') %}\n {%- endif %}\n {%- endif %}\n {%- set reasoning_content = reasoning_content|trim %}\n {%- if loop.index0 > ns.last_query_index %}\n {{- '<|im_start|>' + message.role + '\\n<think>\\n' + reasoning_content + '\\n</think>\\n\\n' + content }}\n {%- else %}\n {{- '<|im_start|>' + message.role + '\\n' + content }}\n {%- endif %}\n {%- if message.tool_calls and message.tool_calls is iterable and message.tool_calls is not mapping %}\n {%- for tool_call in message.tool_calls %}\n {%- if tool_call.function is defined %}\n {%- set tool_call = tool_call.function %}\n {%- endif %}\n {%- if loop.first %}\n {%- if content|trim %}\n {{- '\\n\\n<tool_call>\\n<function=' + tool_call.name + '>\\n' }}\n {%- else %}\n {{- '<tool_call>\\n<function=' + tool_call.name + '>\\n' }}\n {%- endif %}\n {%- else %}\n {{- '\\n<tool_call>\\n<function=' + tool_call.name + '>\\n' }}\n {%- endif %}\n {%- if tool_call.arguments is defined %}\n {%- for args_name, args_value in tool_call.arguments|items %}\n {{- '<parameter=' + args_name + '>\\n' }}\n {%- set args_value = args_value | tojson | safe if args_value is mapping or (args_value is sequence and args_value is not string) else args_value | string %}\n {{- args_value }}\n {{- '\\n</parameter>\\n' }}\n {%- endfor %}\n {%- endif %}\n {{- '</function>\\n</tool_call>' }}\n {%- endfor %}\n {%- endif %}\n {{- '<|im_end|>\\n' }}\n {%- elif message.role == \"tool\" %}\n {%- if loop.previtem and loop.previtem.role != \"tool\" %}\n {{- '<|im_start|>user' }}\n {%- endif %}\n {{- '\\n<tool_response>\\n' }}\n {{- content }}\n {{- '\\n</tool_response>' }}\n {%- if not loop.last and loop.nextitem.role != \"tool\" %}\n {{- '<|im_end|>\\n' }}\n {%- elif loop.last %}\n {{- '<|im_end|>\\n' }}\n {%- endif %}\n {%- else %}\n {{- raise_exception('Unexpected message role.') }}\n {%- endif %}\n{%- endfor %}\n{%- if add_generation_prompt %}\n {{- '<|im_start|>assistant\\n' }}\n {%- if enable_thinking is defined and enable_thinking is true %}\n {{- '<think>\\n' }}\n {%- else %}\n {{- '<think>\\n\\n</think>\\n\\n' }}\n {%- endif %}\n{%- endif %}",
|
| 286 |
-
"clean_up_tokenization_spaces": false,
|
| 287 |
-
"eos_token": "<|im_end|>",
|
| 288 |
-
"errors": "replace",
|
| 289 |
-
"model_max_length": 262144,
|
| 290 |
-
"pad_token": "<|endoftext|>",
|
| 291 |
-
"split_special_tokens": false,
|
| 292 |
-
"tokenizer_class": "Qwen2Tokenizer",
|
| 293 |
-
"unk_token": null,
|
| 294 |
-
"add_bos_token": false,
|
| 295 |
-
"pretokenize_regex": "(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\\r\\n\\p{L}\\p{N}]?[\\p{L}\\p{M}]+|\\p{N}| ?[^\\s\\p{L}\\p{M}\\p{N}]+[\\r\\n]*|\\s*[\\r\\n]+|\\s+(?!\\S)|\\s+",
|
| 296 |
-
"extra_special_tokens": {
|
| 297 |
-
"audio_bos_token": "<|audio_start|>",
|
| 298 |
-
"audio_eos_token": "<|audio_end|>",
|
| 299 |
-
"audio_token": "<|audio_pad|>",
|
| 300 |
-
"image_token": "<|image_pad|>",
|
| 301 |
-
"video_token": "<|video_pad|>",
|
| 302 |
-
"vision_bos_token": "<|vision_start|>",
|
| 303 |
-
"vision_eos_token": "<|vision_end|>"
|
| 304 |
-
}
|
| 305 |
-
}
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"audio_token": "<|audio|>",
|
| 3 |
+
"backend": "tokenizers",
|
| 4 |
+
"boa_token": "<|audio>",
|
| 5 |
+
"boi_token": "<|image>",
|
| 6 |
+
"bos_token": "<bos>",
|
| 7 |
+
"eoa_token": "<audio|>",
|
| 8 |
+
"eoc_token": "<channel|>",
|
| 9 |
+
"eoi_token": "<image|>",
|
| 10 |
+
"eos_token": "<eos>",
|
| 11 |
+
"eot_token": "<turn|>",
|
| 12 |
+
"escape_token": "<|\"|>",
|
| 13 |
+
"etc_token": "<tool_call|>",
|
| 14 |
+
"etd_token": "<tool|>",
|
| 15 |
+
"etr_token": "<tool_response|>",
|
| 16 |
+
"extra_special_tokens": [
|
| 17 |
+
"<|video|>"
|
| 18 |
+
],
|
| 19 |
+
"image_token": "<|image|>",
|
| 20 |
+
"mask_token": "<mask>",
|
| 21 |
+
"model_max_length": 1000000000000000019884624838656,
|
| 22 |
+
"pad_token": "<pad>",
|
| 23 |
+
"padding_side": "left",
|
| 24 |
+
"processor_class": "Gemma4Processor",
|
| 25 |
+
"response_schema": {
|
| 26 |
+
"type": "object",
|
| 27 |
+
"properties": {
|
| 28 |
+
"role": {
|
| 29 |
+
"const": "assistant"
|
| 30 |
+
},
|
| 31 |
+
"thinking": {
|
| 32 |
+
"type": "string"
|
| 33 |
+
},
|
| 34 |
+
"content": {
|
| 35 |
+
"type": "string"
|
| 36 |
+
},
|
| 37 |
+
"tool_calls": {
|
| 38 |
+
"x-regex-iterator": "<\\|tool_call>(.*?)<tool_call\\|>",
|
| 39 |
+
"type": "array",
|
| 40 |
+
"items": {
|
| 41 |
+
"type": "object",
|
| 42 |
+
"properties": {
|
| 43 |
+
"type": {
|
| 44 |
+
"const": "function"
|
| 45 |
+
},
|
| 46 |
+
"function": {
|
| 47 |
+
"type": "object",
|
| 48 |
+
"x-regex": "call\\:(?P<name>\\w+)(?P<arguments>\\{.*\\})",
|
| 49 |
+
"properties": {
|
| 50 |
+
"name": {
|
| 51 |
+
"type": "string"
|
| 52 |
+
},
|
| 53 |
+
"arguments": {
|
| 54 |
+
"type": "object",
|
| 55 |
+
"x-parser": "gemma4-tool-call",
|
| 56 |
+
"additionalProperties": {}
|
| 57 |
+
}
|
| 58 |
+
}
|
| 59 |
+
}
|
| 60 |
+
}
|
| 61 |
+
}
|
| 62 |
+
}
|
| 63 |
+
},
|
| 64 |
+
"x-regex": "(\\<\\|channel\\>thought\\n(?P<thinking>.*?)\\<channel\\|\\>)?(?P<tool_calls>\\<\\|tool_call\\>.*\\<tool_call\\|\\>)?(?P<content>(?:(?!\\<turn\\|\\>)(?!\\<\\|tool_response\\>).)+)?(?:\\<turn\\|\\>|\\<\\|tool_response\\>)?"
|
| 65 |
+
},
|
| 66 |
+
"soc_token": "<|channel>",
|
| 67 |
+
"sot_token": "<|turn>",
|
| 68 |
+
"stc_token": "<|tool_call>",
|
| 69 |
+
"std_token": "<|tool>",
|
| 70 |
+
"str_token": "<|tool_response>",
|
| 71 |
+
"think_token": "<|think|>",
|
| 72 |
+
"tokenizer_class": "GemmaTokenizer",
|
| 73 |
+
"unk_token": "<unk>"
|
| 74 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ufo_cuneiform_vocab_mapper.py
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import struct
|
| 3 |
+
import numpy as np
|
| 4 |
+
from transformers import AutoTokenizer
|
| 5 |
+
|
| 6 |
+
TOKENIZER_DIR = "j:/Language-U/Language-U-V2/qwen-3.5-0.8b-local"
|
| 7 |
+
OUTPUT_BIN = "j:/Language-U/qwen_vocab_cuneiform.bin"
|
| 8 |
+
|
| 9 |
+
def classify_token(token_str):
|
| 10 |
+
# Normalize token string (replace special character G/Ġ representing space)
|
| 11 |
+
s = token_str.replace("Ġ", " ").replace(" ", "").lower()
|
| 12 |
+
|
| 13 |
+
# 1. DOMAIN & SUBDOMAIN
|
| 14 |
+
domain = 0
|
| 15 |
+
subdomain = 0
|
| 16 |
+
|
| 17 |
+
# Domain 1: Hardware & LoRA Networks
|
| 18 |
+
hw_net_kw = ['gpio', 'lora', 'chirp', 'reset', 'pin', 'spi', 'sx1302', 'pi4', 'pi5',
|
| 19 |
+
'concentrator', 'antenna', 'frequency', 'mhz', 'dbm', 'packet', 'transmit',
|
| 20 |
+
'tx', 'rx', 'sf7', 'fec', 'parity', 'duty', 'dwell', 'mac', 'gateway', 'beacon']
|
| 21 |
+
# Domain 2: Mathematics, Logic & Information Theory
|
| 22 |
+
math_kw = ['svd', 'dct', 'quant', 'math', 'entropy', 'shannon', 'gradient', 'atom',
|
| 23 |
+
'ortho', 'eigen', 'projection', 'reconstruct', 'rank', 'matrix', 'vector',
|
| 24 |
+
'basis', 'decompo', 'smooth', 'laplace', 'probability', 'logits', 'prior',
|
| 25 |
+
'bypass', 'q_proj', 'v_proj', 'k_proj', 'o_proj']
|
| 26 |
+
# Domain 3: Dialogue, Persona & Authors
|
| 27 |
+
dialogue_kw = ['zymatica', 'collective', 'dialogue', 'persona', 'chat', 'assistant',
|
| 28 |
+
'speak', 'talk', 'bot', 'agent', 'she', 'astronaut', 'devsone', 'bouldiez',
|
| 29 |
+
'partner', 'art']
|
| 30 |
+
# Domain 4: Software, Systems & Runtimes
|
| 31 |
+
sw_kw = ['rust', 'cpp', 'go', 'python', 'swift', 'java', 'typescript', 'compile',
|
| 32 |
+
'code', 'exec', 'run', 'lib', 'class', 'struct', 'header', 'import', 'from',
|
| 33 |
+
'package', 'build', 'cmake', 'cargo']
|
| 34 |
+
|
| 35 |
+
if any(k in s for k in hw_net_kw):
|
| 36 |
+
domain = 1
|
| 37 |
+
if 'lora' in s or 'chirp' in s or 'fec' in s:
|
| 38 |
+
subdomain = 1
|
| 39 |
+
elif 'gpio' in s or 'pin' in s or 'reset' in s:
|
| 40 |
+
subdomain = 2
|
| 41 |
+
elif 'packet' in s or 'beacon' in s:
|
| 42 |
+
subdomain = 3
|
| 43 |
+
elif any(k in s for k in math_kw):
|
| 44 |
+
domain = 2
|
| 45 |
+
if 'svd' in s or 'matrix' in s or 'projection' in s:
|
| 46 |
+
subdomain = 1
|
| 47 |
+
elif 'entropy' in s or 'shannon' in s or 'bypass' in s:
|
| 48 |
+
subdomain = 2
|
| 49 |
+
elif 'logits' in s or 'prior' in s or 'smooth' in s:
|
| 50 |
+
subdomain = 3
|
| 51 |
+
elif any(k in s for k in dialogue_kw):
|
| 52 |
+
domain = 3
|
| 53 |
+
if 'zymatica' in s or 'collective' in s:
|
| 54 |
+
subdomain = 1
|
| 55 |
+
elif 'persona' in s or 'dialogue' in s or 'speak' in s:
|
| 56 |
+
subdomain = 2
|
| 57 |
+
elif any(k in s for k in sw_kw):
|
| 58 |
+
domain = 4
|
| 59 |
+
if 'rust' in s or 'go' in s or 'cpp' in s:
|
| 60 |
+
subdomain = 1
|
| 61 |
+
elif 'python' in s or 'typescript' in s or 'java' in s:
|
| 62 |
+
subdomain = 2
|
| 63 |
+
|
| 64 |
+
# 2. OPERATION (Actions)
|
| 65 |
+
# Map key verbs to operation IDs (1 to 15)
|
| 66 |
+
operations = [
|
| 67 |
+
'reset', 'clear', 'toggle', 'write', 'read', 'set', 'get',
|
| 68 |
+
'encode', 'decode', 'compress', 'decompress', 'train', 'heal',
|
| 69 |
+
'eval', 'test', 'load', 'save', 'grow', 'shrink', 'bypass'
|
| 70 |
+
]
|
| 71 |
+
operation = 0
|
| 72 |
+
for i, op in enumerate(operations, 1):
|
| 73 |
+
if op in s:
|
| 74 |
+
operation = i % 16
|
| 75 |
+
break
|
| 76 |
+
|
| 77 |
+
# 3. MODALITY (Data layouts / formats)
|
| 78 |
+
modalities = [
|
| 79 |
+
'bin', 'zlib', 'json', 'capsule', 'genesis', 'llm', 'file',
|
| 80 |
+
'packet', 'byte', 'bit', 'char', 'string', 'token', 'wave', 'hal'
|
| 81 |
+
]
|
| 82 |
+
modality = 0
|
| 83 |
+
for i, mod in enumerate(modalities, 1):
|
| 84 |
+
if mod in s:
|
| 85 |
+
modality = i % 16
|
| 86 |
+
break
|
| 87 |
+
|
| 88 |
+
# 4. DEPTH (Complexity scale)
|
| 89 |
+
depth = 0
|
| 90 |
+
if domain == 1:
|
| 91 |
+
if 'seed' in s or 'genesis' in s:
|
| 92 |
+
depth = 8
|
| 93 |
+
elif 'dct' in s:
|
| 94 |
+
depth = 4
|
| 95 |
+
elif 'atom' in s:
|
| 96 |
+
depth = 6
|
| 97 |
+
elif 'qa' in s or 'facts' in s:
|
| 98 |
+
depth = 1
|
| 99 |
+
else:
|
| 100 |
+
depth = len(s) % 16
|
| 101 |
+
|
| 102 |
+
# 5. POLARITY (Outcome states)
|
| 103 |
+
polarity = 0
|
| 104 |
+
pos_states = ['ack', 'success', 'ok', 'pass', 'valid', 'correct', 'true']
|
| 105 |
+
neg_states = ['nack', 'fail', 'error', 'wrong', 'miss', 'warn', 'oom', 'crash', 'abort', 'false']
|
| 106 |
+
if any(k in s for k in pos_states):
|
| 107 |
+
polarity = 1
|
| 108 |
+
elif any(k in s for k in neg_states):
|
| 109 |
+
polarity = 2
|
| 110 |
+
|
| 111 |
+
return domain, subdomain, operation, modality, depth, polarity
|
| 112 |
+
|
| 113 |
+
def main():
|
| 114 |
+
print(f"Loading tokenizer from: {TOKENIZER_DIR}")
|
| 115 |
+
tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_DIR, trust_remote_code=True)
|
| 116 |
+
vocab = tokenizer.get_vocab()
|
| 117 |
+
vocab_size = len(vocab)
|
| 118 |
+
print(f"Total vocabulary size: {vocab_size}")
|
| 119 |
+
|
| 120 |
+
# Build the binary map in token ID order
|
| 121 |
+
# Each record is 3 bytes: R_C, R_F, R_A
|
| 122 |
+
packed_data = bytearray(vocab_size * 3)
|
| 123 |
+
|
| 124 |
+
domain_counts = {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}
|
| 125 |
+
op_counts = 0
|
| 126 |
+
polarity_counts = {0: 0, 1: 0, 2: 0}
|
| 127 |
+
|
| 128 |
+
for token_str, token_id in vocab.items():
|
| 129 |
+
if token_id >= vocab_size:
|
| 130 |
+
continue
|
| 131 |
+
|
| 132 |
+
domain, subdomain, operation, modality, depth, polarity = classify_token(token_str)
|
| 133 |
+
|
| 134 |
+
# Pack into radicals
|
| 135 |
+
rc = (domain << 4) | (subdomain & 0xF)
|
| 136 |
+
rf = (operation << 4) | (modality & 0xF)
|
| 137 |
+
ra = (depth << 4) | (polarity & 0xF)
|
| 138 |
+
|
| 139 |
+
packed_data[token_id * 3] = rc
|
| 140 |
+
packed_data[token_id * 3 + 1] = rf
|
| 141 |
+
packed_data[token_id * 3 + 2] = ra
|
| 142 |
+
|
| 143 |
+
# Metrics collection
|
| 144 |
+
domain_counts[domain] = domain_counts.get(domain, 0) + 1
|
| 145 |
+
if operation > 0:
|
| 146 |
+
op_counts += 1
|
| 147 |
+
polarity_counts[polarity] = polarity_counts.get(polarity, 0) + 1
|
| 148 |
+
|
| 149 |
+
# Write to output file
|
| 150 |
+
with open(OUTPUT_BIN, "wb") as f:
|
| 151 |
+
f.write(packed_data)
|
| 152 |
+
|
| 153 |
+
print(f"\n[+] Successfully generated binary map at: {OUTPUT_BIN}")
|
| 154 |
+
print(f" Total tokens written: {vocab_size}")
|
| 155 |
+
print("\n--- Mapping Classification Metrics ---")
|
| 156 |
+
print(f" Domain 0 (General English): {domain_counts[0]:,} tokens ({domain_counts[0]/vocab_size*100:.2f}%)")
|
| 157 |
+
print(f" Domain 1 (Hardware & LoRA): {domain_counts[1]:,} tokens ({domain_counts[1]/vocab_size*100:.2f}%)")
|
| 158 |
+
print(f" Domain 2 (Math & Info Theory): {domain_counts[2]:,} tokens ({domain_counts[2]/vocab_size*100:.2f}%)")
|
| 159 |
+
print(f" Domain 3 (Dialogue & Persona): {domain_counts[3]:,} tokens ({domain_counts[3]/vocab_size*100:.2f}%)")
|
| 160 |
+
print(f" Domain 4 (Software & Systems): {domain_counts[4]:,} tokens ({domain_counts[4]/vocab_size*100:.2f}%)")
|
| 161 |
+
print(f" Active Operations Detected: {op_counts:,} tokens")
|
| 162 |
+
print(f" Neutral Polarity (0): {polarity_counts[0]:,} tokens")
|
| 163 |
+
print(f" Positive Polarity (1 - ACK): {polarity_counts[1]:,} tokens")
|
| 164 |
+
print(f" Negative Polarity (2 - ERR): {polarity_counts[2]:,} tokens")
|
| 165 |
+
|
| 166 |
+
if __name__ == "__main__":
|
| 167 |
+
main()
|
vocab.json
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|