A3-Doc / README.md
nbeerbower's picture
Add model card (weights uploading separately)
c7c5ed8 verified
|
Raw
History Blame Contribute Delete
5.58 kB
---
license: apache-2.0
language:
- en
pipeline_tag: image-text-to-text
tags:
- multimodal
- vlm
- artemis-vlm
- document-understanding
- chart-understanding
- ocr
- mistral
- qwen3-vl
- schneewolf-labs
- a-series
base_model: schneewolflabs/A3
datasets:
- schneewolflabs/ChartDocMix-v1
---
# A3-Doc
**A3-Doc** is a document + chart understanding specialist in the Schneewolf
Labs A-series — a focused-excellence Stage-2 full fine-tune of
[**A3**](https://huggingface.co/schneewolflabs/A3) on
[ChartDocMix-v1](https://huggingface.co/datasets/schneewolflabs/ChartDocMix-v1).
Where [A3-Instruct](https://huggingface.co/schneewolflabs/A3-Instruct) is the
generalist sibling, A3-Doc trades breadth for depth on the ChartQA / DocVQA /
InfoVQA / TextVQA / OCRBench class of tasks.
## What it is
| | |
|---|---|
| Architecture | Qwen3-VL ViT (frozen, ~0.41 B) + 2-layer MLP projector (trained) + A2/Mistral decoder (full FFT) |
| Total params | **12.69 B** (12.28 B trainable in Stage-2; ViT frozen) |
| Base | [`schneewolflabs/A3`](https://huggingface.co/schneewolflabs/A3) |
| Training corpus | [`schneewolflabs/ChartDocMix-v1`](https://huggingface.co/datasets/schneewolflabs/ChartDocMix-v1) (241,435 rows: ~96% doc/chart/OCR VQA + 4% identity rehearsal) |
| Epochs | 1 (15,075 steps) |
| Effective batch | 16 (bs 1 × grad-accum 16) |
| Optimizer | paged AdamW 8-bit |
| Learning rate | 1e-5, cosine, warmup 3% |
| Max seq length | 2048 |
| **Vision token cap** | **max_pixels = 512×512 (262 K px)** — see the resolution note below |
| Hardware | 1× NVIDIA GB10 (DGX Spark, 128 GB unified) |
| Wall-clock | ~3.3 days |
| Final eval loss | **0.499** (down from 0.647 at the first eval) |
The single-domain corpus is far more learnable than the generalist mix: A3-Doc
reaches eval loss 0.499, well under A3-Instruct's 0.752 on the broad corpus.
## Benchmarks
Greedy decoding, lmms-eval terse-answer prompt convention, 500-row validation
slices (a fast read — see caveats). Metrics: ChartQA relaxed accuracy, DocVQA /
InfoVQA ANLS, TextVQA VQA-accuracy, OCRBench contains-accuracy.
| Benchmark | A3-Doc | Metric |
|---|---|---|
| ChartQA | 53.2 | relaxed acc |
| DocVQA | 48.4 | ANLS |
| InfoVQA | 34.2 | ANLS |
| TextVQA | 71.6 | VQA acc |
| OCRBench | 67.0 (670/1000) | contains |
For a Path-B graft trained on 241 K rows, **TextVQA and OCRBench are genuinely
respectable** — scene-text and OCR transferred well. DocVQA/InfoVQA are the
weak spots, and the reason is known (below).
**Caveats:** numbers are a 500-row slice, not full splits. ChartQA's `test`
split interleaves `human_test` (harder) and `augmented_test` (easier) and the
published number averages both — a flat 500-row sample may over-represent one
type. Treat these as indicative, not leaderboard-final.
## The resolution finding (important)
A3-Doc was trained **and** evaluated at `max_pixels = 512×512`. DocVQA and
InfoVQA are high-resolution document scans where text is tiny, so at 512² much
of the text is illegible. This is the dominant limiter on those two tasks.
Diagnostic — **eval-only**, no retraining, same 200 rows:
| Benchmark | @512² (262 K px) | @1280² (1.64 M px) | Δ |
|---|---|---|---|
| DocVQA (ANLS) | 0.525 | **0.580** | **+5.5** |
| InfoVQA (ANLS) | 0.385 | **0.420** | **+3.5** |
The frozen ViT + projector + decoder **generalize to higher visual-token
counts despite only seeing 512² in training**. The eval-only gain is a floor;
a retrain at higher `max_pixels` should beat it. If you run A3-Doc yourself,
**raise `max_pixels`** (the `ArtemisVLMProcessor` accepts it) for document
tasks — it costs more tokens/latency but helps.
## Intended use
Document & chart VQA, infographic QA, OCR-style reading, chart captioning. For
broad conversation/creative use reach for
[A3-Instruct](https://huggingface.co/schneewolflabs/A3-Instruct); for dense
image captioning reach for [A3](https://huggingface.co/schneewolflabs/A3).
## Inference
```python
from transformers import AutoConfig, AutoTokenizer
from artemis_vlm import ArtemisVLMForConditionalGeneration, ArtemisVLMProcessor
import torch
ckpt = "schneewolflabs/A3-Doc"
model = ArtemisVLMForConditionalGeneration.from_pretrained(ckpt, dtype=torch.bfloat16).to("cuda")
cfg = AutoConfig.from_pretrained(ckpt, trust_remote_code=True)
tok = AutoTokenizer.from_pretrained(ckpt, trust_remote_code=True)
# raise max_pixels for document tasks (training default was 512*512):
proc = ArtemisVLMProcessor(tokenizer=tok, vision_config=cfg.vision_config,
max_pixels=1280*1280)
```
Also runs in llama.cpp via the `Schneewolf-Labs/llama.cpp` fork's Artemis VLM
mmproj graft (same pattern as A3 / A3-Instruct).
## Roadmap — A3-Doc-v2
The resolution finding points to the obvious next lever: **retrain at
1024²–1280² max_pixels** rather than 512². Same corpus, same recipe, higher
vision budget. Expected to push DocVQA/InfoVQA well past the eval-only gains.
## Lineage
- [`schneewolflabs/A3`](https://huggingface.co/schneewolflabs/A3) — Stage-1 base (projector-only alignment)
- [`schneewolflabs/A2`](https://huggingface.co/schneewolflabs/A2) — text decoder (Mistral 12.3 B)
- [`schneewolflabs/ChartDocMix-v1`](https://huggingface.co/datasets/schneewolflabs/ChartDocMix-v1) — training corpus
- [`schneewolflabs/i-DPO`](https://huggingface.co/datasets/schneewolflabs/i-DPO) — identity/voice anti-drift bedrock
## License
apache-2.0, consistent with the rest of the A-series lineage. Constituent
training sources carry their own licenses (see the ChartDocMix-v1 card).