File size: 7,076 Bytes
f49ac6e
2eec02e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Bitforge Precision Lab</title>
<style>
:root { color-scheme: dark; font-family: Inter, ui-sans-serif, system-ui; }
* { box-sizing: border-box; }
body { margin: 0; min-height: 100vh; background: #060817; color: #edf4ff; }
canvas { position: fixed; inset: 0; width: 100%; height: 100%; opacity: .55; }
main { position: relative; z-index: 1; width: min(1080px, 92vw); margin: auto;
  padding: 72px 0 96px; }
.eyebrow { color: #73e6ff; letter-spacing: .18em; text-transform: uppercase;
  font-size: .75rem; font-weight: 800; }
h1 { font-size: clamp(3rem, 8vw, 7rem); line-height: .9; margin: 14px 0 24px;
  background: linear-gradient(120deg,#fff,#74e7ff 55%,#b48cff);
  -webkit-background-clip: text; color: transparent; }
.lead { max-width: 760px; color: #b8c7e6; font-size: 1.2rem; line-height: 1.65; }
.actions { display: flex; flex-wrap: wrap; gap: 12px; margin: 30px 0 48px; }
a { color: inherit; }
.button { padding: 12px 18px; border-radius: 999px; text-decoration: none;
  background: #eaf8ff; color: #07101c; font-weight: 800; }
.button.alt { background: #171d38cc; color: #dce8ff; border: 1px solid #415078; }
.grid { display: grid; grid-template-columns: 1.1fr .9fr; gap: 20px; }
.card { border: 1px solid #344269; background: #0c1128dd; border-radius: 24px;
  padding: 24px; backdrop-filter: blur(18px); box-shadow: 0 24px 80px #0008; }
h2 { margin-top: 0; }
pre { white-space: pre-wrap; word-break: break-word; color: #a9bddf;
  max-height: 520px; overflow: auto; }
ul { max-height: 520px; overflow: auto; padding-left: 1.2rem; color: #a9bddf; }
li { margin: 8px 0; }
input { width: 100%; padding: 12px; border-radius: 12px; border: 1px solid #344269;
  background: #070b1a; color: white; margin-bottom: 12px; }
@media (max-width: 780px) { .grid { grid-template-columns: 1fr; } }
</style>
</head>
<body>
<canvas id="field"></canvas>
<main>
  <div class="eyebrow">Jacob Garcia · Hugging Face Model Foundry</div>
  <h1>Bitforge Precision Lab</h1>
  <p class="lead">Interactive FP32, binary, and ternary comparison. This showcase backs up the
  trained artifacts, measured evaluation, and complete runnable source.</p>
  <div class="actions">
    <a class="button" href="https://huggingface.co/spaces/ARotting/bitforge-precision-lab/tree/main">Explore every file</a>
    <a class="button alt" href="https://huggingface.co/ARotting">View the full foundry</a>
  </div>
  <div class="grid">
    <section class="card">
      <h2>Verified project card</h2>
      <pre># BitForge 1-bit

BitForge trains and compares a full-precision digit classifier, a strict one-bit
weight model, and a ternary-weight model. The low-bit students use straight-through
quantization during training and learn from both labels and the full-precision
teacher&#x27;s softened output distribution.

The binary deployment artifact stores each matrix weight as one packed sign bit,
plus one floating-point scale per output channel and floating-point biases. The
project reports both classification accuracy and the measured inference payload.
Activations, scales, and biases remain floating point, so this is specifically a
one-bit **matrix-weight** experiment rather than a claim that every operation or
parameter is one bit.

## Verified results

| Variant | Test accuracy | Accuracy change |
| --- | ---: | ---: |
| FP32 teacher | 95.78% | reference |
| Packed binary matrix weights | 94.22% | -1.56 points |
| Ternary matrix weights | 95.11% | -0.67 points |

Each network has 4,810 parameters, including 4,736 matrix weights. The measured
inference payload fell from 19,240 bytes for FP32 parameters to 1,184 bytes for
packed signs, per-channel scales, and biases, a 16.25 times reduction. The `.npz`
container itself is 3,270 bytes because it also carries names, shapes, and archive
metadata. An independent reload of the packed signs reproduced 94.22% accuracy.

## Reproduce

```powershell
uv run python projects/bitforge-1bit/train.py
```
</pre>
      <h2>Evaluation snapshot</h2>
      <pre>{
  &quot;benchmark&quot;: &quot;BitForge 1-bit&quot;,
  &quot;parameters_per_variant&quot;: 4810,
  &quot;matrix_weight_count&quot;: 4736,
  &quot;test&quot;: {
    &quot;fp32&quot;: {
      &quot;accuracy&quot;: 0.9577777777777777,
      &quot;cross_entropy&quot;: 0.1542476937174797
    },
    &quot;binary_weight&quot;: {
      &quot;accuracy&quot;: 0.9422222222222222,
      &quot;cross_entropy&quot;: 0.2073044627904892
    },
    &quot;ternary_weight&quot;: {
      &quot;accuracy&quot;: 0.9511111111111111,
      &quot;cross_entropy&quot;: 0.19603287428617477
    }
  },
  &quot;storage&quot;: {
    &quot;fp32_parameter_payload_bytes&quot;: 19240,
    &quot;packed_payload_bytes&quot;: 1184,
    &quot;container_bytes&quot;: 3270,
    &quot;measured_payload_compression&quot;: 16.25
  },
  &quot;precision_boundary&quot;: {
    &quot;matrix_weights&quot;: &quot;one packed bit in binary variant&quot;,
    &quot;scales&quot;: &quot;float32 per output channel&quot;,
    &quot;biases&quot;: &quot;float32&quot;,
    &quot;activations&quot;: &quot;float32&quot;
  }
}</pre>
    </section>
    <section class="card">
      <h2>Backed-up artifact tree</h2>
      <input id="filter" placeholder="Filter files…" autocomplete="off">
      <ul id="files"><li><code>README.md</code></li>
<li><code>__pycache__/app.cpython-311.pyc</code></li>
<li><code>__pycache__/model.cpython-311.pyc</code></li>
<li><code>__pycache__/packing.cpython-311.pyc</code></li>
<li><code>__pycache__/train.cpython-311.pyc</code></li>
<li><code>app.py</code></li>
<li><code>artifacts/bitforge-1bit/binary_qat.safetensors</code></li>
<li><code>artifacts/bitforge-1bit/binary_weights.npz</code></li>
<li><code>artifacts/bitforge-1bit/evaluation.json</code></li>
<li><code>artifacts/bitforge-1bit/fp32.safetensors</code></li>
<li><code>artifacts/bitforge-1bit/ternary_qat.safetensors</code></li>
<li><code>data/split_manifest.parquet</code></li>
<li><code>model.py</code></li>
<li><code>packing.py</code></li>
<li><code>requirements.txt</code></li>
<li><code>train.py</code></li></ul>
    </section>
  </div>
</main>
<script>
const canvas=document.querySelector('#field'),ctx=canvas.getContext('2d');
let dots=[];
function resize(){canvas.width=innerWidth;canvas.height=innerHeight;
dots=Array.from({length:90},()=>({x:Math.random()*innerWidth,
y:Math.random()*innerHeight,vx:(Math.random()-.5)*.35,vy:(Math.random()-.5)*.35}));}
function draw(){ctx.clearRect(0,0,canvas.width,canvas.height);
for(const d of dots){d.x=(d.x+d.vx+innerWidth)%innerWidth;
d.y=(d.y+d.vy+innerHeight)%innerHeight;ctx.fillStyle='#65dcff99';
ctx.beginPath();ctx.arc(d.x,d.y,1.4,0,7);ctx.fill();}requestAnimationFrame(draw);}
addEventListener('resize',resize);resize();draw();
document.querySelector('#filter').addEventListener('input',e=>{
const q=e.target.value.toLowerCase();for(const li of document.querySelectorAll('li'))
li.hidden=!li.textContent.toLowerCase().includes(q);});
</script>
</body>
</html>