Pulse Decide 150M v0.1 — weights, config, demo GIF
Browse files- .gitattributes +1 -0
- LICENSE +40 -0
- README.md +129 -1
- config.json +16 -0
- pulse_beat.gif +3 -0
- pulse_decide_150m.pt +3 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
pulse_beat.gif filter=lfs diff=lfs merge=lfs -text
|
LICENSE
CHANGED
|
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Pulse Research Preview License (pulse-research-preview)
|
| 2 |
+
Applies to: Pulse Decide 150M
|
| 3 |
+
Copyright (c) 2026 RouterML
|
| 4 |
+
|
| 5 |
+
STATUS
|
| 6 |
+
This is an early research preview, not a production release. It is provided for research,
|
| 7 |
+
evaluation and experimentation.
|
| 8 |
+
|
| 9 |
+
GRANT
|
| 10 |
+
Subject to the conditions below, you are granted a non-exclusive, worldwide, royalty-free
|
| 11 |
+
licence to download, use, evaluate, study and modify these model weights, and to publish
|
| 12 |
+
results obtained with them.
|
| 13 |
+
|
| 14 |
+
CONDITIONS
|
| 15 |
+
1. Attribution. Retain this notice and credit "Pulse Decide 150M (RouterML)" in any
|
| 16 |
+
publication, product or derivative that uses these weights.
|
| 17 |
+
|
| 18 |
+
2. Upstream data licences. These weights were derived from a corpus assembled from ~40
|
| 19 |
+
public text-classification datasets whose licences differ. Some are permissive; some are
|
| 20 |
+
research/non-commercial only; some derive from content whose platform Terms of Service
|
| 21 |
+
restrict redistribution. RouterML publishes the weights, not the training data, and makes
|
| 22 |
+
no representation that any particular downstream use is permitted by those upstream
|
| 23 |
+
licences. YOU ARE RESPONSIBLE for verifying that your intended use — in particular any
|
| 24 |
+
commercial use — complies with the licences and terms of the underlying datasets.
|
| 25 |
+
|
| 26 |
+
3. No high-stakes use. Not evaluated for fairness, safety or robustness. Do not use for
|
| 27 |
+
consequential decisions about people (employment, credit, housing, insurance, legal,
|
| 28 |
+
medical or safety-critical matters) without your own independent evaluation and
|
| 29 |
+
appropriate human oversight.
|
| 30 |
+
|
| 31 |
+
4. No endorsement. Do not use RouterML's names or marks to imply endorsement of your work.
|
| 32 |
+
|
| 33 |
+
DISCLAIMER
|
| 34 |
+
THE WEIGHTS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
| 35 |
+
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
| 36 |
+
PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL ROUTERML BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
| 37 |
+
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
| 38 |
+
IN CONNECTION WITH THE WEIGHTS OR THEIR USE.
|
| 39 |
+
|
| 40 |
+
A cleanly-licensed release trained only on permissively-licensed sources is planned.
|
README.md
CHANGED
|
@@ -1,5 +1,133 @@
|
|
| 1 |
---
|
| 2 |
license: other
|
| 3 |
license_name: pulse-research-preview
|
| 4 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
license: other
|
| 3 |
license_name: pulse-research-preview
|
| 4 |
+
tags:
|
| 5 |
+
- decision-model
|
| 6 |
+
- text-classification
|
| 7 |
+
- zero-shot-classification
|
| 8 |
+
- on-device
|
| 9 |
+
- non-generative
|
| 10 |
+
library_name: pytorch
|
| 11 |
---
|
| 12 |
+
|
| 13 |
+
# Pulse Decide 150M
|
| 14 |
+
|
| 15 |
+
**RouterML's on-device decision model.** 149.3M parameters (~570MB fp32). Non-generative:
|
| 16 |
+
it *scores* typed decisions rather than generating text, which is why it runs on a laptop
|
| 17 |
+
instead of a server.
|
| 18 |
+
|
| 19 |
+
> Makes typed decisions — choice, boolean, multi-label, ordinal — over **arbitrary runtime
|
| 20 |
+
> schemas**, offline, on-device.
|
| 21 |
+
|
| 22 |
+
**Status: `v0.1` research preview.** This is an early research model, not a production release.
|
| 23 |
+
|
| 24 |
+

|
| 25 |
+
|
| 26 |
+
*One customer message, routed twice. Without governed context Pulse isn't confident enough,
|
| 27 |
+
so it escalates rather than guessing. With governed context it decides — 99.7% confident,
|
| 28 |
+
on-device, in ~32ms.*
|
| 29 |
+
|
| 30 |
+
## What it does
|
| 31 |
+
|
| 32 |
+
Given a piece of text (the *state*) and a set of candidate labels supplied **at runtime**,
|
| 33 |
+
Pulse scores each candidate and returns a decision plus a confidence. The label set does not
|
| 34 |
+
need to be seen during training — that is the "arbitrary schema" property.
|
| 35 |
+
|
| 36 |
+
## Key facts
|
| 37 |
+
|
| 38 |
+
| | |
|
| 39 |
+
|---|---|
|
| 40 |
+
| Parameters | **149.3M** (0.149B) |
|
| 41 |
+
| Encoder | `answerdotai/ModernBERT-base` |
|
| 42 |
+
| Architecture | cross-encoder decision scorer (non-generative) |
|
| 43 |
+
| Size on disk | ~570MB (fp32); ~150MB at int8 |
|
| 44 |
+
| Runs on | CPU / Apple MPS / CUDA — **offline, no data leaves the device** |
|
| 45 |
+
| Decision types | choice, boolean, multi-label, ordinal |
|
| 46 |
+
|
| 47 |
+
## Performance
|
| 48 |
+
|
| 49 |
+
Pulse is designed to run **behind a confidence gate** — answering what it is confident about
|
| 50 |
+
and escalating the rest. That selective mode is how it is intended to be deployed, so it is
|
| 51 |
+
what we report here. Measured on held-out, schema-disjoint evaluation sets (label sets never
|
| 52 |
+
seen in training) at confidence threshold 0.5:
|
| 53 |
+
|
| 54 |
+
| evaluation set | answering everything | confident subset only |
|
| 55 |
+
|---|---:|---|
|
| 56 |
+
| MASSIVE (intent, 60 labels) | 47.6% | **71.1%** at 47% coverage |
|
| 57 |
+
| macro (3 held-out sets) | ~51% | **59.5%** at 63% coverage |
|
| 58 |
+
|
| 59 |
+
Accuracy on *accepted* decisions is meaningfully higher than on forced answers — at the cost
|
| 60 |
+
of escalating the remainder. This is the intended operating mode.
|
| 61 |
+
|
| 62 |
+
> **A same-split benchmark evaluation against other published decision models is forthcoming.**
|
| 63 |
+
> We make no claim of matching or exceeding any other model at this time.
|
| 64 |
+
|
| 65 |
+
## Intended use
|
| 66 |
+
|
| 67 |
+
- Research on small, non-generative decision models and governed routing
|
| 68 |
+
- On-device / offline decisioning where data cannot leave the machine
|
| 69 |
+
- As the local tier of an escalation system (cheap local decision → escalate when unsure)
|
| 70 |
+
|
| 71 |
+
## Limitations
|
| 72 |
+
|
| 73 |
+
- **Multi-label is weak** (~8% exact-set on FD multi-label heads). The model often identifies
|
| 74 |
+
the right labels but selects the wrong *number* of them. Active work.
|
| 75 |
+
- **Confidence calibration drifts between training runs**; treat thresholds as needing
|
| 76 |
+
per-deployment calibration rather than as universal constants.
|
| 77 |
+
- Not evaluated for fairness, safety, or high-stakes domains. **Do not use for consequential
|
| 78 |
+
decisions without your own evaluation.**
|
| 79 |
+
- English only.
|
| 80 |
+
- Early research preview — interfaces and weights may change.
|
| 81 |
+
|
| 82 |
+
## Training data and licensing ⚠️
|
| 83 |
+
|
| 84 |
+
Trained on a derived corpus assembled from **40 public text-classification datasets**
|
| 85 |
+
(contamination-audited against all evaluation sets; near-duplicate filtered).
|
| 86 |
+
|
| 87 |
+
**The source datasets carry mixed licenses**, including:
|
| 88 |
+
- ~24 permissive (Apache-2.0, CC-BY, MIT-like)
|
| 89 |
+
- several **research/non-commercial-only** datasets
|
| 90 |
+
- several derived from **Twitter/X content**, whose Terms of Service restrict redistribution
|
| 91 |
+
|
| 92 |
+
**We publish the model weights, not the training data.** Because the corpus mixes
|
| 93 |
+
research-only and ToS-restricted sources, **users are responsible for verifying that their
|
| 94 |
+
intended use complies with the underlying dataset licenses.** A cleanly-licensed
|
| 95 |
+
(permissive-only) release is planned.
|
| 96 |
+
|
| 97 |
+
## Usage
|
| 98 |
+
|
| 99 |
+
```python
|
| 100 |
+
import torch
|
| 101 |
+
from pulse.model import PulseConfig, PulseUnified, load_tokenizer
|
| 102 |
+
|
| 103 |
+
blob = torch.load("pulse_decide_150m.pt", map_location="cpu", weights_only=True)
|
| 104 |
+
cfg = PulseConfig(**blob["cfg"])
|
| 105 |
+
tok = load_tokenizer(cfg)
|
| 106 |
+
model = PulseUnified(cfg); model.load_state_dict(blob["state_dict"]); model.eval()
|
| 107 |
+
|
| 108 |
+
state = "My card was declined at the store this morning."
|
| 109 |
+
choices = ["billing", "fraud", "technical", "account_access"]
|
| 110 |
+
|
| 111 |
+
first = [f"{state} [SEP] Which category applies?"] * len(choices)
|
| 112 |
+
enc = tok(first, choices, truncation=True, max_length=cfg.max_length,
|
| 113 |
+
padding=True, return_tensors="pt")
|
| 114 |
+
with torch.no_grad():
|
| 115 |
+
scores = model.score_pairs(enc["input_ids"], enc["attention_mask"])
|
| 116 |
+
print(choices[int(scores.argmax())])
|
| 117 |
+
```
|
| 118 |
+
|
| 119 |
+
## Model family
|
| 120 |
+
|
| 121 |
+
Pulse Decide is the decision model inside **RouterML**, which adds the governance layer —
|
| 122 |
+
eligibility, confidence gating, escalation and verification — around it.
|
| 123 |
+
|
| 124 |
+
## Citation
|
| 125 |
+
|
| 126 |
+
```bibtex
|
| 127 |
+
@software{pulse_decide_150m,
|
| 128 |
+
title = {Pulse Decide 150M: an on-device non-generative decision model},
|
| 129 |
+
author = {RouterML},
|
| 130 |
+
year = {2026},
|
| 131 |
+
note = {v0.1 research preview}
|
| 132 |
+
}
|
| 133 |
+
```
|
config.json
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"model_name": "Pulse Decide 150M",
|
| 3 |
+
"developer": "RouterML",
|
| 4 |
+
"architecture": "cross-encoder decision scorer (non-generative)",
|
| 5 |
+
"encoder": "answerdotai/ModernBERT-base",
|
| 6 |
+
"parameters": 149300000,
|
| 7 |
+
"version": "v0.1-research-preview",
|
| 8 |
+
"decision_types": [
|
| 9 |
+
"choice",
|
| 10 |
+
"boolean",
|
| 11 |
+
"multi_label",
|
| 12 |
+
"ordinal"
|
| 13 |
+
],
|
| 14 |
+
"checkpoint_sha256": "424c9e2bf6acda3ef792cae8d8b7cfe70829633893b5d0af250e8259b3832f95",
|
| 15 |
+
"checkpoint_file": "pulse_decide_150m.pt"
|
| 16 |
+
}
|
pulse_beat.gif
ADDED
|
Git LFS Details
|
pulse_decide_150m.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:424c9e2bf6acda3ef792cae8d8b7cfe70829633893b5d0af250e8259b3832f95
|
| 3 |
+
size 597307292
|