Download README.md from kishxrx/ARTN: direct link, hf CLI and curl.
- Browser
- Download file 11.2 kB
-
https://huggingface.co/kishxrx/ARTN/resolve/main/README.md
- Command line
-
hf download hf://kishxrx/ARTN/README.md
-
curl -L -o README.md https://huggingface.co/kishxrx/ARTN/resolve/main/README.md
license: mit
tags:
- ternary-quantization
- 1.58-bit
- experimental
- language-model
- tiny-stories
- adafactor
- bitlinear
- adamw
license_name: mit
license_link: https://opensource.org/licenses/MIT
ARTN - Adaptive Ternary Recurrent Network
1.58-bit Ternary Quantization for Language Models
Experimental implementation of ternary (1.58-bit) quantization for training small language models on extremely limited hardware.
Status: EXPERIMENTAL - Research in Progress
Project Overview
This project explores whether ternary quantization (weights constrained to -1, 0, +1) can be used to train small language models on hardware with:
| Constraint | Value |
|---|---|
| RAM | 4GB |
| CPU | 2-core (no GPU) |
| Storage | ~20GB |
Model Architecture
| Parameter | Value |
|---|---|
| Model type | BitLinearGPT |
| Parameters | 6,856,608 (~6.8M) |
| Hidden size (d_model) | 256 |
| Layers | 6 |
| Attention heads | 8 |
| Feed-forward size | 1024 |
| Max sequence length | 256 |
| Vocabulary size | 4,000 |
| Quantization | Ternary (1.58-bit) |
Research Timeline
Phase 1: Initial Experiments (August 2026)
Early experiments with Adafactor optimizer:
| Attempt | Config | Result | Issue |
|---|---|---|---|
| 5k steps | Beta1=None | COLLAPSED | Model fell into repetitive patterns |
| 50k steps | Beta1=None | COLLAPSED | Entropy dropped to 8.2% |
| 50k steps | Beta1=0.9 | HEALTHY | Learning too slow, val loss 7.56 |
Key Finding: Beta1=None caused collapse. Beta1=0.9 too conservative.
Phase 2: Root Cause Investigation (September 2026)
September 26, 2026: Critical discovery - Adafactor implementation bug identified.
| Issue | Details |
|---|---|
| Bug location | Original Adafactor implementation |
| Bug type | Variance computed but not applied to updates |
| Impact | Optimizer behaved like SGD with momentum |
| Evidence | Lines 152, 170 in src/training/adafactor.py |
Verification: Original optimizer state matched broken implementation, not canonical Adafactor.
Phase 3: Working Models (September 2026)
After identifying the bug, switched to AdamW optimizer:
1. FP32 + AdamW Baseline (August 19, 2026)
| Metric | Value |
|---|---|
| Optimizer | AdamW |
| Steps | 5,000 |
| Val Loss | 1.69 |
| Perplexity | 5.44 |
| Generation | β Coherent stories |
| Status | SUCCESS - Baseline established |
File: checkpoint-fp32-adamw-working.pt
2. BitLinear + AdamW (September 10-11, 2026)
| Metric | Value |
|---|---|
| Optimizer | AdamW |
| Steps | 9,500 |
| Val Loss | 1.92 |
| Perplexity | 6.81 |
| Generation | β Coherent stories |
| Quantization | Ternary (1.58-bit) |
| Status | SUCCESS - Ternary quantization works |
File: checkpoint-bitlinear-adamw-working.pt
Phase 4: Canonical Adafactor Investigation (October 15, 2026)
Implemented and tested canonical Adafactor (matching PyTorch reference):
| Metric | Value |
|---|---|
| Implementation | Verified against PyTorch (0.025% accuracy) |
| Val Loss | 4.82 |
| Perplexity | 124.10 |
| Optimizer State Memory | 0.16 MB (316x less than AdamW) |
| Observed Performance | 2.0x gap vs AdamW on tested configurations |
Note: Performance gap observed, but configurations differed (weight decay, momentum). Investigation ongoing.
Key Findings
1. Ternary Quantization is VIABLE
| Evidence | Result |
|---|---|
| BitLinear + AdamW | Val loss 1.92 (vs FP32 1.69) |
| Performance gap | 13% (acceptable for 85% memory reduction) |
| Generation quality | β Coherent stories |
Conclusion: Ternary quantization works with proper optimizer (AdamW).
2. Optimizer Choice is CRITICAL
| Optimizer | Result | Reason |
|---|---|---|
| Adafactor (buggy) | β FAILED | Variance not applied |
| Adafactor (canonical) | β οΈ 2x gap | Configuration differences |
| AdamW | β WORKS | Proven convergence |
3. Beta1 Trade-off in Adafactor
| Beta1 Value | Learning Speed | Stability | Result |
|---|---|---|---|
| None (0.0) | FAST | UNSTABLE | COLLAPSED |
| 0.9 | SLOW | STABLE | HEALTHY but slow learning |
4. Memory vs Performance Trade-off
| Optimizer | Optimizer State | Performance | Trade-off |
|---|---|---|---|
| AdamW | 51.68 MB | β Best (val loss 1.69-1.92) | More memory |
| Canonical Adafactor | 0.16 MB | β οΈ Gap (val loss 4.82) | 316x less memory |
Use case dependent: AdamW for quality, Adafactor for memory-constrained scenarios.
Checkpoints Included
Working Models (Upload as evidence)
| File | Type | Val Loss | Status | Description |
|---|---|---|---|---|
checkpoint-fp32-adamw-working.pt |
FP32 | 1.69 | β WORKING | AdamW baseline, coherent generation |
checkpoint-bitlinear-adamw-working.pt |
BitLinear | 1.92 | β WORKING | Ternary quantization, coherent generation |
Experimental/Failed Models (Already uploaded)
| File | Type | Val Loss | Status | Description |
|---|---|---|---|---|
checkpoint-step5000-experiment.pt |
BitLinear | 8.45 | β Pipeline verified | First test, proved architecture works |
checkpoint-step50000-failed-collapsed.pt |
BitLinear | 3.16 | β COLLAPSED | Beta1=None, repetitive output |
checkpoint-step50000-experiment-gibberish.pt |
BitLinear | 7.56 | β οΈ Not useful | Beta1=0.9, healthy but slow learning |
Training Configuration
Working Models Configuration
| Setting | FP32 + AdamW | BitLinear + AdamW |
|---|---|---|
| Dataset | TinyStories | TinyStories |
| Steps | 5,000 | 9,500 |
| Batch size | 4 | 4 |
| Gradient accumulation | 8 | 8 |
| Effective batch size | 32 | 32 |
| Optimizer | AdamW | AdamW |
| Max Learning Rate | 0.001 | 0.001 |
| Min Learning Rate | 0.0001 | 0.0001 |
| Warmup steps | 100 | 100 |
| Weight decay | 0.01 | 0.01 |
| Gradient clipping | 1.0 | 1.0 |
Failed Experiments Configuration
| Setting | Value |
|---|---|
| Dataset | TinyStories |
| Samples | 50,000 |
| Batch size | 4 |
| Gradient accumulation | 8 |
| Effective batch size | 32 |
| Optimizer | Adafactor (buggy) |
| Max Learning Rate | 0.0003 |
| Min Learning Rate | 0.00003 |
| Warmup steps | 1,000 |
| Weight decay | 0.01 |
| Gradient clipping | 1.0 |
Total Time Invested
| Phase | Duration | Outcome |
|---|---|---|
| Initial experiments (August) | 167 hours | Identified beta1 issues |
| Root cause investigation (September) | 5 days | Found Adafactor bug |
| Working models (August-September) | 15+ hours | β Both models working |
| Canonical Adafactor (October) | 1 day | Implementation verified, performance gap observed |
Lessons Learned
Technical Lessons
- Optimizer implementation bugs are subtle - Adafactor computed variance but didn't apply it
- Always verify against reference implementations - PyTorch Adafactor differs from custom implementation
- AdamW is robust for ternary quantization - Proven to work where Adafactor failed
- Memory vs performance trade-offs exist - 316x memory savings vs 2x performance gap
- Lower loss β better model - Collapsed model had lower loss (3.16 vs 7.56) due to repetitive output
Research Lessons
- Entropy monitoring is CRITICAL - Loss alone doesn't indicate model health
- Systematic investigation pays off - Line-by-line code audit found the bug
- Document everything - 59 phases of investigation documented
- Test one variable at a time - Controlled experiments essential for debugging
How to Use Working Models
FP32 + AdamW Baseline
import torch
from src.model.gpt import GPT
from src.tokenizer.bpe_tokenizer import BPETokenizer
# Load model architecture (FP32)
model = GPT(
vocab_size=4000,
d_model=256,
n_heads=8,
n_layers=6,
d_ff=1024,
max_seq_len=256
)
# Load checkpoint
checkpoint = torch.load('checkpoint-fp32-adamw-working.pt', map_location='cpu')
model.load_state_dict(checkpoint['model_state_dict'])
model.eval()
# Load tokenizer
tokenizer = BPETokenizer.load('tokenizer.json')
# Generate text
input_ids = torch.tensor([tokenizer.encode("Once upon a time")])
# ... generation code ...
BitLinear + AdamW (Ternary)
import torch
from src.model.bitlinear import BitLinearGPT
from src.tokenizer.bpe_tokenizer import BPETokenizer
# Load model architecture (BitLinear)
model = BitLinearGPT(
vocab_size=4000,
d_model=256,
n_heads=8,
n_layers=6,
d_ff=1024,
max_seq_len=256
)
# Load checkpoint
checkpoint = torch.load('checkpoint-bitlinear-adamw-working.pt', map_location='cpu')
model.load_state_dict(checkpoint['model_state_dict'])
model.eval()
# Load tokenizer
tokenizer = BPETokenizer.load('tokenizer.json')
# Generate text
input_ids = torch.tensor([tokenizer.encode("Once upon a time")])
# ... generation code ...
Tokenizers
| File | Description |
|---|---|
tokenizer-5k-experiment.json |
Tokenizer for early experiments |
tokenizer-50k-experiments.json |
Tokenizer for 50k step experiments |
Source Code
Full source code available at GitHub:
https://github.com/kishxrx/ARTN
Includes:
- Complete training scripts
- Model architecture (FP32 and BitLinear)
- Optimizer implementations
- Training history documentation
- Monitoring tools
- 59 phases of investigation documented
Documentation
Complete investigation documentation:
https://github.com/kishxrx/ARTN/blob/main/experiments/results/ROOT_CAUSE_INVESTIGATION_SUMMARY.md
Covers:
- Phases 1-59 of systematic debugging
- Root cause analysis
- Verification experiments
- Evidence chain
Next Steps
| Phase | Status | Plan |
|---|---|---|
| 1 | β COMPLETE | FP32 baseline established (val loss 1.69) |
| 2 | β COMPLETE | BitLinear + AdamW working (val loss 1.92) |
| 3 | β COMPLETE | Root cause identified (Adafactor bug) |
| 4 | β COMPLETE | Canonical Adafactor implemented and tested |
| 5 | π IN PROGRESS | Scale training with AdamW (longer runs) |
| 6 | π PLANNED | Evaluate on larger datasets |
| 7 | π PLANNED | Release v1.0 with working models |
Citation
If you use this work for learning or research:
@misc{artn-ternary-2026,
author = {kishxrx},
title = {ARTN: Adaptive Ternary Recurrent Network - 1.58-bit Quantization Experiments},
year = {2026},
publisher = {HuggingFace},
url = {https://huggingface.co/kishxrx/ARTN}
}
License
MIT License
Disclaimer
THIS IS EXPERIMENTAL SOFTWARE.
- Working models produce coherent text but are experimental
- Failed models are for learning purposes only
- Not suitable for production use without further testing
- No guarantees of any kind
Contact
- GitHub: https://github.com/kishxrx/ARTN
- HuggingFace: https://huggingface.co/kishxrx
Last Updated: October 15, 2026
Version: v0.2-research-progress