einkpub β model weights for einkpdf
NNEF exports of the two models einkpdf uses to
turn research PDFs into EPUBs sized for a 7" e-ink reader. Both run under
tract on CPU β no GPU, and no Python at
inference time.
A page is rasterized, the layout model finds the labelled regions and their reading order, and the transcriber turns the page into structured markdown. The layout half exists because the transcriber emits no coordinates at all, so there would otherwise be nothing to crop a figure from.
β οΈ This repository holds two models under two different licences
HuggingFace has one licence field per repository, so this one is tagged other.
The licence depends on which files you use.
| Path | Model | Licence |
|---|---|---|
/ |
NuExtract3 transcriber | Apache-2.0 β see LICENSE, NOTICE |
/layout |
surya layout predictor | CC-BY-NC-SA-4.0 β see layout/LICENSE, layout/NOTICE |
If you take only the transcriber, Apache-2.0 governs and there is no
non-commercial restriction. If you take anything under layout/, the
CC-BY-NC-SA-4.0 terms apply to those files, including the non-commercial and
share-alike conditions.
surya's author waives the non-commercial term for organizations under $5M USD in gross revenue over the most recent 12 months and under $5M in lifetime VC/angel funding, that are not competitive with the Datalab API. That waiver is theirs to grant, not this repository's to pass on β commercial licensing is available from Datalab.
Files
Transcriber β Apache-2.0
| File | Size | Purpose |
|---|---|---|
vision.nnef.tgz |
1.3 GB | Vision tower |
decoder.nnef.tgz |
2.3 GB | Text decoder |
tokenizer.json |
20 MB | HuggingFace tokenizer |
einkpdf.json |
4 KB | Runtime config consumed by einkpdf |
Layout β CC-BY-NC-SA-4.0
| File | Size | Purpose |
|---|---|---|
layout/layout_predictor_encoder.nnef.tgz |
299 MB | Vision encoder |
layout/layout_predictor_decoder_prefill.nnef.tgz |
219 MB | Decoder, prefill pass |
layout/layout_predictor_decoder_iter.nnef.tgz |
199 MB | Decoder, iterative pass |
layout/layout_config.json |
1 KB | Slicer and preprocessor config |
layout/model_config.json |
6 KB | Decoder token config |
Changes from the base models
Transcriber, from numind/NuExtract3:
- Converted from safetensors to NNEF for tract.
- Weights at f16; the decoder additionally quantized to Q4_0, cutting peak RSS from ~21 GB to ~6 GB and running ~1.76x faster on CPU.
- No fine-tuning.
Layout, from surya (checkpoint
2025_02_18):
- Converted from PyTorch to NNEF, split into encoder, decoder-prefill and decoder-iterative graphs.
- No fine-tuning.
Neither conversion changes model architecture, and both are intended to match their originals. The layout preprocessor is checked against golden arrays from surya's Python implementation.
A note on operator names
The layout graphs were exported against tract 0.21 and still name
tract_onnx_is_nan, which tract 0.23 moved into core as tract_core_is_nan.
einkpdf re-registers the old name at load time rather than requiring a
re-export; anything else loading these graphs on tract β₯ 0.23 will need to do the
same.