File size: 8,362 Bytes
b87a09e
 
 
 
 
 
d665bad
b87a09e
 
 
26af35f
b87a09e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
562088b
b87a09e
562088b
1cf5164
 
 
 
562088b
 
b87a09e
1cf5164
 
d661569
 
1cf5164
 
 
 
 
 
d661569
 
 
 
 
 
 
 
 
 
 
1cf5164
 
 
 
 
70f2b59
 
 
 
 
 
 
 
1cf5164
 
 
13ef472
 
 
d661569
1cf5164
 
 
 
 
 
 
 
 
d661569
 
13ef472
 
 
 
 
 
 
 
d661569
13ef472
1cf5164
 
 
 
3ce9429
1cf5164
 
3ce9429
 
 
 
1cf5164
 
3ce9429
1cf5164
 
b87a09e
 
 
 
 
 
 
 
 
 
 
 
9434359
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
562088b
100862b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a118554
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3ce9429
a118554
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3ce9429
a118554
 
 
 
 
 
 
 
 
 
562088b
 
 
 
 
 
 
3ce9429
562088b
 
7693666
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
---
language:
- en
- zh
license: mit
base_model: pipenetwork/GLM-5.3-Flash-MLX-4bit
library_name: mlx
pipeline_tag: image-text-to-text
tags:
- mlx
- gbx-lm
- apple-silicon
- expert-paging
- mixture-of-experts
- multimodal
---

# GLM-5.3-Flash-4bit-paged

Expert-paged build of `pipenetwork/GLM-5.3-Flash-MLX-4bit`. The weights that are read a fraction at a time
live in their own containers, so a machine loads what it needs rather than all
of it.

| file | size | holds |
| --- | --- | --- |
| `model.safetensors` | 5.89 GiB | resident weights |
| `experts.bin` | 159.47 GiB | routed experts |
| `mtp/` | 3.90 GiB | draft head, off by default |

Total 169.27 GiB. Of that, 165.37 GiB is the source build, whose bytes moved into

These containers are not a format `mlx-lm` reads. The model runs on
**`gbx_lm`**, a single signed binary for Apple Silicon; there is nothing to
`pip install`.
containers rather than being copied, and 3.90 GiB is the draft head, which no
published build of this model carries.

## Requirements

**Mac**

| | |
| --- | --- |
| macOS | **15.0 or later** |
| chip | **Apple Silicon** (arm64). There is no Intel build. |
| Python | none -- the binary carries what it needs |

**Linux** (gbx-lm v0.8.1 or later)

| | |
| --- | --- |
| machine | **NVIDIA DGX Spark** (GB10). Other Linux machines are not supported yet. |
| system | arm64, glibc 2.39 or later (DGX OS / Ubuntu 24.04) |
| driver | an NVIDIA driver with CUDA 13 support. No CUDA toolkit is needed: the binary carries the CUDA libraries it uses. |
| Python | none |

On a DGX Spark (128 GB) the model does not fit, so its experts are paged from the SSD.

Memory is not a fixed figure for a paged build, and that is the point of one: it
fills what fits and streams the rest from disk. On a 512 GB Mac Studio with room
to spare this model settles at about **172 GB** resident. A smaller machine holds
less and reads more from disk -- slower, but it runs.

How much slower depends on how far the machine is from holding the experts, and
on how fast its disk is. Each token routes to a few experts; the ones already in
memory cost nothing to reach, and the ones that are not have to be read before
that token can finish. A machine holding most of them waits rarely, one holding
few waits often. We have not measured this across machine sizes and will not
guess a figure: what we can say is that the model answers either way, and that
the wait is the SSD's, not the model's.

## Install

```bash
# upgrading? clear the previous version's unpack directory first
rm -rf ~/.libra/cache/onefile/gbx_lm

# on a DGX Spark, use gbx_lm-linux-arm64.tar.gz in place of gbx_lm-darwin-arm64.tar.gz
curl -fL -o gbx_lm-darwin-arm64.tar.gz 'https://github.com/GreenBitAI/gbx-lm/releases/latest/download/gbx_lm-darwin-arm64.tar.gz' \
  && tar -xzf gbx_lm-darwin-arm64.tar.gz gbx_lm \
  && mkdir -p "$HOME/.local/bin" \
  && mv gbx_lm "$HOME/.local/bin/gbx_lm" \
  && chmod +x "$HOME/.local/bin/gbx_lm"

gbx_lm -h
```

The Mac build is signed with a Developer ID and notarised, so macOS runs it
without the usual detour for a downloaded binary.

**`command not found`** -- `$HOME/.local/bin` is not on your `PATH`:

```bash
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc && source ~/.zshrc     # zsh
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bash_profile && source ~/.bash_profile   # bash
```

**`Killed: 9`** (Mac) -- a previous version's files are still in the unpack directory,
and macOS refuses to mix two builds. Run the `rm -rf` line above, then try again.

## Run

```bash
gbx_lm --model GreenBitAI/GLM-5.3-Flash-4bit-paged
```

That serves an OpenAI-compatible API on port 11688, which is its default. The
weights download on first use into `~/.libra/cache/models`; set `HF_HOME` to put
them elsewhere, and `HF_TOKEN` if you meet the Hub's rate limits for anonymous
downloads.

```bash
curl http://127.0.0.1:11688/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{"model":"GreenBitAI/GLM-5.3-Flash-4bit-paged","messages":[{"role":"user","content":"Hello"}]}'
```

Where the weights fit they are filled from `experts.bin` and the model runs the
stock path at stock speed; where they do not, they stream from disk. Reading
the machine decides that, not a flag.

To override that: `GBX_PAGING=off` holds the experts resident.

Checked at build time, while the source checkpoint was still there to compare against:
- **PASS** layer-wise vs resident — 42 layers x 2 draws exact, 60.93 GiB peak for this gate

Quantization, tokenizer, chat template and licence are unchanged from `pipenetwork/GLM-5.3-Flash-MLX-4bit`.

### Images

The model reads images as well as text. Send them as OpenAI `image_url` parts --
an http(s) URL or a base64 `data:` URL:

```bash
curl http://127.0.0.1:11688/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{"model":"GreenBitAI/GLM-5.3-Flash-4bit-paged","messages":[{"role":"user","content":[
        {"type":"text","text":"What is in this picture?"},
        {"type":"image_url","image_url":{"url":"https://example.com/photo.jpg"}}]}]}'
```

From the command line, `--images` takes one or more files:
`gbx_lm generate --model GreenBitAI/GLM-5.3-Flash-4bit-paged --images photo.jpg --prompt "What is in this picture?" --max-tokens 2048`.

### From the command line

From `gbx_lm` v0.7.1, the binary also runs the model without a server -- one
prompt, or an interactive chat:

```bash
GBX_GLM53_MTP=on gbx_lm generate --model GreenBitAI/GLM-5.3-Flash-4bit-paged --prompt "Hello" --max-tokens 2048
GBX_GLM53_MTP=on gbx_lm chat --model GreenBitAI/GLM-5.3-Flash-4bit-paged --max-tokens 2048
```

`gbx_lm generate -h` and `gbx_lm chat -h` list their options. Keep
`--max-tokens` generous: the default is 100 for `generate` and 256 for `chat`,
and the model's reasoning before it answers counts against it. Leave out
`GBX_GLM53_MTP=on` to run without the draft head.

## Coding agents

The server speaks three wire protocols on the same port, so the tools that
expect a hosted API can be pointed at this one:

| path | for |
| --- | --- |
| `/v1/chat/completions` | anything written against the OpenAI API |
| `/v1/responses` | **Codex** |
| `/v1/messages` | **Claude Code** |

**Codex** -- a provider in `~/.codex/config.toml`:

```toml
[model_providers.gbx]
name = "gbx-lm"
base_url = "http://127.0.0.1:11688/v1"
wire_api = "responses"
```

and a profile in `~/.codex/gbx.config.toml`:

```toml
model_provider = "gbx"
model = "GreenBitAI/GLM-5.3-Flash-4bit-paged"
model_context_window = 1048576
```

**Claude Code** -- `~/.claude/gbx.settings.json`:

```json
{
  "env": {
    "ANTHROPIC_BASE_URL": "http://127.0.0.1:11688",
    "ANTHROPIC_AUTH_TOKEN": "local",
    "ANTHROPIC_MODEL": "GreenBitAI/GLM-5.3-Flash-4bit-paged",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "GreenBitAI/GLM-5.3-Flash-4bit-paged"
  }
}
```

Both clients ask for a small model for their own background work, so every name
in the settings has to be one this server is serving.

## The draft head

The `mtp/` folder carries the model's own multi-token prediction head, converted
from `zai-org/GLM-5.3-Flash`, so speculative decoding works from this repository
alone. It is off unless asked for:

```bash
GBX_GLM53_MTP=on gbx_lm --model GreenBitAI/GLM-5.3-Flash-4bit-paged
```

**Up to 1.4x, more as the context grows.**
Measured 2026-10-13 with `gbx_lm` v0.8.0 on a 512 GB Mac Studio (M3 Ultra), weights
resident, greedy, thinking off, 256 tokens a reply, decode timed from the first token.
Short prompts: three each of code, prose and chat, three runs each, the median per kind.
Long contexts: a slice of source code and a question about it, the median of three runs.

| prompt | head off | head on | speedup |
|---|---|---|---|
| short, code | 39.5 tok/s | **55.5** | 1.41x |
| short, prose | 39.5 | **45.8** | 1.16x |
| short, chat | 39.5 | **50.8** | 1.29x |
| 3,400-token context | 32.6 | **40.0** | 1.23x |
| 14,000-token context | 32.2 | **43.8** | 1.36x |
| 29,000-token context | 31.4 | **42.5** | 1.35x |

Code gains most and prose least. With more context behind it the head proposes
better -- it accepts about 63% of what it proposes on short prompts and 75-77%
from 14k tokens on.

Every token the head proposes is checked by the model itself, so the reply is the
model's own either way; the head only saves passes over the weights.