Spaces:
Running
Running
|
Download DOCS/OVERVIEW.md from sizzlebop/pulpie-webgpu: direct link, hf CLI and curl.
- Browser
- Download file 7.36 kB
-
https://huggingface.co/spaces/sizzlebop/pulpie-webgpu/resolve/main/DOCS/OVERVIEW.md
- Command line
-
hf download hf://spaces/sizzlebop/pulpie-webgpu/DOCS/OVERVIEW.md
-
curl -L -o OVERVIEW.md https://huggingface.co/spaces/sizzlebop/pulpie-webgpu/resolve/main/DOCS/OVERVIEW.md
7.36 kB
Pulpie WebGPU Technical Overview
This document describes the architecture, pipeline stages, and execution flow of the Pulpie WebGPU web application.
High-Level Architecture
Pulpie WebGPU runs the 210M-parameter EuroBERT token classification model entirely inside the user's browser via WebGPU. It eliminates the need for server-side Python backends, CUDA installations, or remote inference APIs.
+-------------------------------------------------------------------------+
| Browser Window |
| |
| [Input: URL or HTML] |
| | |
| v |
| [DOMParser & Sanitization] -> Cleans scripts, styles, metadata |
| | |
| v |
| [Block Extractor] ----------> Tags semantic blocks with _item_id |
| | |
| v |
| [EuroBERT Tokenizer] -------> Encodes block text, injects <|sep|> |
| | |
| v |
| [Chunk Packer] -------------> Bundles blocks up to 1,024-2,048 tokens |
| | |
| v |
| [WebGPU ONNX Runtime] ------> Executes model.onnx via FP32 shaders |
| | |
| v |
| [Logit Evaluator] ----------> Argmax at <|sep|> indices (1=main, 0=drop) |
| | |
| v |
| [DOM Reconstructor] --------> Retains kept blocks, drops boilerplate |
| | |
| v |
| [Turndown Service] ---------> Converts cleaned HTML to Markdown |
| | |
| v |
| [Output Views] -------------> Reader Preview, Markdown, Clean HTML |
+-------------------------------------------------------------------------+
Core Pipeline Stages
1. HTML Simplification and Block Segmentation (html-simplifier.js)
- Uses browser-native
DOMParserto build a clean document object model. - Strips non-content elements:
script,style,noscript,iframe,frame,meta,link, and hidden CSS nodes (display: none,visibility: hidden). - Rewrites relative
srcandhrefattributes to absolute URLs against the page's base origin so that images continue rendering properly in Markdown. - Traverses the DOM tree to extract semantic content blocks: headings (
h1throughh6), paragraphs (p), preformatted code (pre), blockquotes, list items (li), and tables. - Assigns an incremental
_item_idattribute (e.g._item_id="0") to each extracted block.
2. Tokenization and Chunking (tokenizer.js & chunker.js)
- Uses
@huggingface/transformersto run the EuroBERT fast tokenizer directly in JavaScript. - Identifies boundary token IDs:
- BOS:
<|begin_of_text|>(128000) - EOS:
<|end_of_text|>(128001) - SEP:
<|sep|>(128256)
- BOS:
- Packs blocks into contiguous chunks conforming to the 8,192 token limit:
[BOS] block_0 [<|sep|>] block_1 [<|sep|>] ... block_N [<|sep|>] [EOS] - Keeps a parallel array tracking which original block indices correspond to each chunk.
3. WebGPU Neural Inference (webgpu-engine.js)
- Evaluates
navigator.gpuand requests an adapter using thehigh-performancepower preference. - Verifies whether the hardware supports the
shader-f16WGSL extension. - Prepares two 64-bit integer tensors for ONNX Runtime:
input_ids: Shape[1, sequence_length], containing the packed token IDs.attention_mask: Shape[1, sequence_length], initialized to ones.
- Runs the model forward pass on the GPU:
const outputMap = await session.run({ input_ids, attention_mask }); - Returns a
Float32Arrayof logits with shape[1, sequence_length, 2].
4. Delimiter Logit Evaluation
- Finds the exact position of every
<|sep|>token in the sequence. - For each delimiter position
p:- Evaluates
logitMain = logits[p * 2 + 1]versuslogitOther = logits[p * 2 + 0]. - If
logitMain > logitOther, the block is classified as primary content (main). - Otherwise, the block is classified as extraneous boilerplate (
other).
- Evaluates
5. Content Reconstruction and Markdown Conversion (reconstructor.js)
- Clones the tagged DOM and identifies all elements tagged with an
_item_idthat received amainclassification. - Marks those elements, their descendants, and their ancestors up to the document body to be retained.
- Prunes all other elements from the tree.
- Strips zero-sized tracking pixels and 1x1 spacer images.
- Passes the cleaned HTML to a configured
TurndownServiceinstance that applies GitHub-flavored Markdown rules (fenced code blocks, tables, and images).
6. Persistent Model Caching (model-cache.js)
- Interacts with the browser's native
CacheStorageAPI (caches.open('pulpie-onnx-v2')). - Intercepts downloads of
model.onnx(808 MB) and streams chunks while updating the user interface progress bar. - Stores the resulting
Responsein cache so future sessions load in less than 200 milliseconds without network traffic.
File Organization
| Path | Purpose | Lines of Code |
|---|---|---|
index.html |
Semantic markup, modal dialogs, and layout structure | ~355 |
src/main.js |
Event wiring, state coordination, and execution flow | ~474 |
src/style.css |
Vercel-style dark charcoal theme and responsive rules | ~974 |
src/lib/webgpu-engine.js |
WebGPU device detection, session lifecycle, and tensor execution | ~197 |
src/lib/model-cache.js |
Persistent browser cache storage and download progress reporting | ~160 |
src/lib/tokenizer.js |
EuroBERT fast tokenizer wrapper and special token management | ~104 |
src/lib/chunker.js |
Sequence packing within 1,024-2,048 token context window | ~103 |
src/lib/html-simplifier.js |
DOM cleaning, URL resolution, and block segmentation | ~217 |
src/lib/reconstructor.js |
Element pruning and HTML to Markdown conversion | ~173 |
src/lib/ui-renderer.js |
Results view, stats computation, and block inspection rendering | ~81 |
| src/worker.js | Cloudflare Worker edge handler with /api/proxy and static asset routing | ~80 |
| src/lib/url-fetcher.js | Webpage fetching with dedicated edge proxy and fallback | ~95 |
src/lib/samples.js |
Realistic HTML test documents for offline benchmarking | ~135 |