andhakanoon commited on
Commit
2eedc6a
·
verified ·
1 Parent(s): d380b91

model card: lean results with the scoreboard chart

Browse files
Files changed (1) hide show
  1. README.md +16 -63
README.md CHANGED
@@ -36,52 +36,22 @@ left to right, which is what makes it fast enough to generate a screen while the
36
 
37
  The [generative-ui-bench](https://github.com/thesysdev/generative-ui-bench) protocol: 46 screen
38
  briefs in five size bands, 4 generations each, thinking off, one shared system prompt for every
39
- model, scored by the benchmark's own validator (parses, renders a root, every reference resolves,
40
- every component reachable, required and enum props check out, coverage floor). Raw outputs for
41
- oui-1 are committed to the benchmark repo so the number can be rescored offline.
42
-
43
- | Model | Active params | Complete runs |
44
- |---|---|---|
45
- | **oui-1** (this model, 48 denoising steps) | 4B | **132/184 (71.7%)** |
46
- | Gemma 4 31B | 31B | 86/184 (46.7%) |
47
- | Phi-4 14B | 14B | 81/184 (44.0%) |
48
- | Gemma 4 26B-A4B (autoregressive twin) | 4B | 55/184 (29.9%) |
49
- | DiffusionGemma 26B-A4B-it (base, 48 denoising steps) | 4B | 24/184 (13.0%) |
50
-
51
- By band (complete runs of 40/40/40/32/32): oui-1 38 · 34 · 24 · 19 · 17; Gemma 4 31B
52
- 17 · 18 · 26 · 14 · 11. oui-1 wins the two lighter bands, the dense band and the densest; the 31B keeps the medium band (26 to 24).
53
-
54
- Temperature: the benchmark passes 0.7 to every model, but DiffusionGemma ignores per-request
55
- temperature and seed (vLLM applies the checkpoint's own schedule, 0.8 annealing to 0.4 across the
56
- denoising steps), so both diffusion rows ran at that fixed schedule. Thinking: off for both, the
57
- benchmark's uniform condition. With thinking enabled oui-1 scores 119/184; it skips the thinking
58
- channel in 167 of 184 outputs and the ones that think complete at the same rate.
59
-
60
- On 100 fresh briefs written after training in the same numbered register (never seen by the
61
- model, one generation each, internal scorer): 69/100.
62
-
63
- Speed, 48 denoising steps, single request on one A100 80GB (vLLM 0.24 FP8, entropy-bound sampler,
64
- wall-clock from request to last byte including the ~5k-token prompt), all 46 benchmark briefs,
65
- median per band: lightest screens (~9 statements) 1.0 s, light (~15) 1.5 s, medium (~30) 2.8 s,
66
- dense (~46) 4.6 s, densest (~64) 5.7 s; across the 46, median 2.6 s, p90 5.7 s, about 206
67
- completion tokens per second of wall-clock (250 to 360 tokens per second after the first canvas).
68
- The sampler stops early on its own (15 to 23 denoising steps per 256-token canvas on average), so
69
- the step cap matters little above 32: on the public protocol 32 steps score 134/184, 48 (the
70
- checkpoint default, used for every number here) 132/184, 64 steps 126/184; 16 steps collapse to
71
- 59/184 because the forced commit breaks the wiring. Four concurrent requests give about 54 screens
72
- a minute at 170 aggregate tokens per second; on short screens the prompt prefill dominates and
73
- does not batch well.
74
 
75
  ## What it was trained on
76
 
77
- All training data was generated: screens written by larger models from briefs and kept only
78
- when they passed the openui-lang parser, then several rounds of self-distillation in which the
79
- model's own outputs were parser-filtered, near-misses were minimally repaired, and the survivors
80
- were trained on. The training set covers the OpenUI benchmark's component library, a phone-OS
81
- component library, and about 25 other component libraries (chat, dashboard, report, and synthetic
82
- schemas) so that the model reads a schema rather than memorising one. The benchmark briefs were
83
- among the briefs used to generate self-distillation data; the model never saw a human- or
84
- teacher-written answer to them. The training set is not released.
85
 
86
  ## How to use
87
 
@@ -106,7 +76,8 @@ vllm serve thesysdev/OUI-1 --trust-remote-code --max-model-len 16384 --quantizat
106
  ```
107
 
108
  Then call it as an OpenAI-compatible chat model. `temperature` and `seed` are ignored (diffusion
109
- models use a fixed internal schedule); keep `max_tokens` at 4096 or below.
 
110
 
111
  ```python
112
  from openai import OpenAI
@@ -172,7 +143,7 @@ messages = [{"role": "system", "content": open("system-prompt.txt").read()},
172
  {"role": "user", "content": brief}]
173
  ids = processor.apply_chat_template(messages, tokenize=True, add_generation_prompt=True, return_tensors="pt").to("cuda")
174
  gc = model.generation_config # entropy-bound sampler, 48 steps, from the checkpoint
175
- gc.max_new_tokens = 256 * 16 # up to 16 canvases; EOS stops earlier
176
  out = model.generate(input_ids=ids, generation_config=gc)
177
  print(processor.decode(out.sequences[0, ids.shape[1]:], skip_special_tokens=True))
178
  ```
@@ -194,24 +165,6 @@ Cover every numbered item.
194
 
195
  Plain-prose briefs also work; component names in the brief ("a table", "a chart") do not help.
196
 
197
- ## Known limitations
198
-
199
- - **Long briefs.** Past roughly 18 numbered items the reference graph breaks: root commits to a
200
- subset of sections and later ones are written but never attached.
201
- - **Dense screens.** On the benchmark's medium band the model completes 24 of 40 runs against Gemma 4 31B's 26; on the densest band 17 of 32.
202
- - **A stock cast.** The model reuses a small set of invented names, dates and numbers across
203
- unrelated screens. Inject real data or names in the brief if it matters.
204
- - **Valid is not the same as good.** Some parser-valid screens have tables with uneven column
205
- lengths, a redefined name, or a boilerplate status tag. Render-time checks are advisable.
206
- - **Positional slots on second-turn screens.** In multi-turn use (a tap sends the previous screen
207
- back as context) the model sometimes drops a `null` from a five-slot component such as
208
- `ListItem(title, subtitle, leading, trailing, action)`, which puts the action in the wrong slot. A
209
- one-line rule in the system prompt fixes this in our testing; a lenient renderer also can.
210
- - **Follow-ups.** Detail and confirmation screens often carry only one action.
211
- - **Other libraries.** The model reads unseen component schemas and writes valid code for most
212
- small screens, with fewer components than a native answer.
213
- - **Empty or off-format input** produces a confident screen rather than a clarification.
214
-
215
  ## Intended use
216
 
217
  Generating UI screens for OpenUI-based applications where latency matters and a small,
 
36
 
37
  The [generative-ui-bench](https://github.com/thesysdev/generative-ui-bench) protocol: 46 screen
38
  briefs in five size bands, 4 generations each, thinking off, one shared system prompt for every
39
+ model, scored by the benchmark's own validator. Base DiffusionGemma 24/184 (13.0%); oui-1
40
+ 132/184 (71.7%). Raw outputs for oui-1 are committed to the benchmark repo so the number can be
41
+ rescored offline.
42
+
43
+ ![OpenUI score vs active parameters, open-weight models up to 31B active](scoreboard.png)
44
+
45
+ Every number here was measured with the serving settings below (vLLM 0.24, FP8, the checkpoint's
46
+ own sampler at 48 denoising steps). One request at a time on an A100 80GB, a light screen takes
47
+ about a second and a dense one three to six seconds, prompt included.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
 
49
  ## What it was trained on
50
 
51
+ Generated data only: screens written by larger models from briefs and kept when they passed the
52
+ openui-lang parser, then rounds of self-distillation on the model's own parser-checked outputs,
53
+ with near-misses minimally repaired. 27 component libraries in all, so the model reads a schema
54
+ rather than memorising one.
 
 
 
 
55
 
56
  ## How to use
57
 
 
76
  ```
77
 
78
  Then call it as an OpenAI-compatible chat model. `temperature` and `seed` are ignored (diffusion
79
+ models use a fixed internal schedule). The benchmark runs at `max_tokens` 8192; 4096 covers every
80
+ screen in the bands above.
81
 
82
  ```python
83
  from openai import OpenAI
 
143
  {"role": "user", "content": brief}]
144
  ids = processor.apply_chat_template(messages, tokenize=True, add_generation_prompt=True, return_tensors="pt").to("cuda")
145
  gc = model.generation_config # entropy-bound sampler, 48 steps, from the checkpoint
146
+ gc.max_new_tokens = 256 * 32 # up to 32 canvases, the benchmark's 8,192 ceiling; EOS stops earlier
147
  out = model.generate(input_ids=ids, generation_config=gc)
148
  print(processor.decode(out.sequences[0, ids.shape[1]:], skip_special_tokens=True))
149
  ```
 
165
 
166
  Plain-prose briefs also work; component names in the brief ("a table", "a chart") do not help.
167
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
168
  ## Intended use
169
 
170
  Generating UI screens for OpenUI-based applications where latency matters and a small,