Image-Text-to-Text
Transformers
Safetensors
English
qwen3_5
piko
piko-9b
multimodal
vision-language
hybrid-attention
linear-attention
ocr
document-understanding
conversational
Instructions to use Dexy2/Piko-9b with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use Dexy2/Piko-9b with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="Dexy2/Piko-9b") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("Dexy2/Piko-9b") model = AutoModelForMultimodalLM.from_pretrained("Dexy2/Piko-9b", device_map="auto") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=40) print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use Dexy2/Piko-9b with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "Dexy2/Piko-9b" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "Dexy2/Piko-9b", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker
docker model run hf.co/Dexy2/Piko-9b
- SGLang
How to use Dexy2/Piko-9b with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "Dexy2/Piko-9b" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "Dexy2/Piko-9b", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "Dexy2/Piko-9b" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "Dexy2/Piko-9b", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }' - Docker Model Runner
How to use Dexy2/Piko-9b with Docker Model Runner:
docker model run hf.co/Dexy2/Piko-9b
File size: 22,012 Bytes
44c1864 0810902 8843471 0810902 93f2d09 c178c91 0810902 c178c91 44c1864 8843471 93f2d09 8843471 0810902 8843471 0810902 8843471 93f2d09 0810902 8843471 93f2d09 8843471 0810902 8843471 0810902 8843471 0810902 8843471 0810902 c178c91 0810902 8843471 0810902 8843471 0810902 8843471 0810902 8843471 0810902 8843471 0810902 93f2d09 0810902 8843471 0810902 8843471 0810902 8843471 0810902 8843471 0810902 8843471 0810902 8843471 0810902 8843471 0810902 8843471 0810902 8843471 0810902 8843471 0810902 8843471 0810902 8843471 0810902 93f2d09 0810902 c178c91 0810902 93f2d09 0810902 93f2d09 0810902 93f2d09 0810902 93f2d09 0810902 93f2d09 0810902 93f2d09 0810902 93f2d09 0810902 93f2d09 0810902 93f2d09 0810902 93f2d09 0810902 93f2d09 0810902 93f2d09 0810902 93f2d09 0810902 93f2d09 0810902 93f2d09 0810902 93f2d09 0810902 93f2d09 0810902 93f2d09 0810902 93f2d09 8843471 0810902 c178c91 0810902 c178c91 0810902 c178c91 0810902 c178c91 0810902 93f2d09 0810902 93f2d09 8843471 93f2d09 0810902 93f2d09 0810902 8843471 c178c91 0810902 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 | ---
license: apache-2.0
language:
- en
library_name: transformers
pipeline_tag: image-text-to-text
base_model:
- deepreinforce-ai/Ornith-1.0-9B
- Qwen/Qwen3.5-9B
base_model_relation: merge
tags:
- piko
- piko-9b
- multimodal
- vision-language
- hybrid-attention
- linear-attention
- qwen3_5
- ocr
- document-understanding
---
<div align="center">
<img src="piko-logo.png" alt="Piko-9b" width="380">
**A 9.65B hybrid-attention vision-language model, composed from two open checkpoints.**
[](LICENSE)
[](#architecture)
[](#context-length)
</div>
---
## Model summary
Piko-9b is a 9.65-billion-parameter vision-language model that takes text and images and produces
text. It is built by splicing together two existing open checkpoints rather than trained from
scratch:
| Component | Parameters | Source | State |
|---|---:|---|---|
| Language backbone | 9,197,093,888 | Fine-tune of `deepreinforce-ai/Ornith-1.0-9B` | Fine-tuned |
| Vision tower + merger | 456,010,480 | `Qwen/Qwen3.5-9B` | **Copied verbatim** |
It emits a `<think>…</think>` reasoning trace before its answer, uses greedy decoding by default,
and needs about 8 GB of VRAM in 4-bit.
**On a 70-case regression suite it scores 65/70, against 63/70 for `Qwen/Qwen3.5-9B` measured
identically. That difference is not statistically significant.** Full detail
[below](#benchmark-results).
## What Piko-9b is
A composition, verified at the tensor level. All 775 tensors in the published checkpoint are
bitwise identical to a tensor in one of the two source checkpoints — 427 from the language
backbone, 348 from Qwen's vision tower, none unaccounted for.
The language backbone is genuinely fine-tuned: 0 of 14 sampled tensors match stock Qwen3.5-9B, with
1.5–5.0 % relative L2 drift. That fine-tuning came from a chain of merged QLoRA stages
(`wraithfast-phase10 → 12 → 13 → 14 → 15`) applied to Ornith-1.0-9B.
The vision tower is not fine-tuned at all. It was downloaded from `Qwen/Qwen3.5-9B` and attached
unchanged.
## Relationship to the base model
```
Qwen/Qwen3.5-9B-Base (Apache-2.0)
│
├── Qwen/Qwen3.5-9B ──────────── vision tower + merger, copied verbatim ──┐
│ │
└── deepreinforce-ai/Ornith-1.0-9B (MIT) │
│ QLoRA r=32 α=64, merged after each stage │
└── wraithfast-phase15-150k-full-ft ─── language backbone ───────┤
│
Dexy2/Piko-9b ──────────┘
```
### What this means in practice
The vision tower was trained by Qwen to project into **Qwen3.5-9B's** embedding space. The
backbone it is attached to has since drifted 1.5–5 % away from that space, and **no vision
training was performed to re-align it.**
That was expected to break image handling. Measured, it does not: OCR scores 10/10 and document
understanding 10/10 on the custom suite. This is the most surprising result in the release and it
is reported as an empirical finding, not as evidence that the composition was principled.
Full evidence: [`reports/lineage_analysis.md`](reports/lineage_analysis.md).
### Corrections to the previous model card
The earlier release described six training stages totalling 520,000 examples, and published nine
benchmark scores. Tensor comparison shows **none of those stages are present in these weights**,
and the nine scores were measured on a different, text-only checkpoint. Details:
[`reports/repository_audit.md`](reports/repository_audit.md) §5, [`CHANGELOG.md`](CHANGELOG.md).
## Intended uses
Supported by measurement on this checkpoint:
* **Document and receipt reading** — extracting fields from rendered documents, including
OCR-error correction. 10/10 and 10/10 on the custom suite.
* **Table and chart reading** — 9/10.
* **General instruction following and reasoning** — 9/10 and 10/10.
* **Code generation** — 5/5, verified by executing the generated functions against assertions.
* **Long-context retrieval** — 5/5 at 2K, 8K and 32K filler tokens, depths 0.1–0.9.
## Out-of-scope uses
* **Anything safety-critical** — medical, legal, financial, or operational decisions.
* **Factual questions about entities it may not know.** It invented a plausible summary of a
non-existent treaty when asked. See [Limitations](#limitations).
* **Adversarial or untrusted input without downstream validation.** No specific prompt-injection
defence; this matters most in document pipelines, its strongest use case.
* **Video or audio.** Not supported — see [Supported modalities](#supported-modalities).
* **Deployments needing a stable self-identity without a system prompt.** Asked what it is, this
checkpoint answers *"I am Wraith, an AI model."*
## Architecture
`Qwen3_5ForConditionalGeneration`, `model_type: qwen3_5`. A **hybrid attention stack**, not a
conventional transformer.
| Language model | | Vision encoder | |
|---|---:|---|---:|
| Hidden size | 4,096 | Depth | 27 |
| Layers | 32 | Hidden size | 1,152 |
| — linear attention | 24 | Attention heads | 16 |
| — full attention | 8 (every 4th) | Intermediate size | 4,304 |
| Attention heads | 16 | Patch size | 16 |
| Key/value heads | 4 (GQA) | Spatial merge | 2 |
| Head dim | 256 | Output size | 4,096 |
| Intermediate size | 12,288 | Position embeddings | 2,304 |
| Vocabulary | 248,320 | DeepStack indexes | `[]` (disabled) |
Linear attention: conv kernel 4, key head dim 128, 16 key heads, 32 value heads, value head dim
128, SSM state in `float32`.
Positional encoding: **mRoPE**, interleaved, sections `[11, 11, 10]`, `partial_rotary_factor` 0.25,
`rope_theta` 10,000,000. No RoPE scaling is applied.
Weights: 11 safetensors shards, 21.3 GB, **BF16** throughout.
### Parameter count
**9,653,104,368** total, read from the safetensors headers. Note that a 4-bit loaded model reports
5,724,972,272 — that is the packed element count, not the logical parameter count.
### Context length
`max_position_embeddings` is **262,144**, native to the architecture with no scaling trick.
**That is a configuration value, not a validated capability.** Measured: retrieval works at 2K, 8K
and ~32K filler tokens; a 14,429-token prompt was answered correctly in 3.5 s. Beyond ~32K is
untested, and a 32,768-token single forward pass exceeded the 15.92 GB test GPU.
### Supported modalities
| Modality | Metadata | Weights | Trained here | Validated |
|---|---|---|---|---|
| Text | Yes | Yes | Yes | **Yes** |
| Image | Yes | Yes (456 M, verbatim Qwen) | **No** | **Yes — works** |
| Video | Yes (`video_preprocessor_config.json`, `<\|video_pad\|>`) | Shares image tower | No | **Not tested** |
| Audio | Token IDs only | **No encoder** | No | **Not supported** |
The audio tokens (`<|audio_start|>`, `<|audio_pad|>`, `<|audio_end|>`) are inherited tokenizer
metadata. There is no audio encoder in the weights.
## Training and creation methodology
**The published weights contain no training performed under the Piko name.** They are a
tensor-level splice, dated 2026-07-24, of a language checkpoint last written 2026-07-16 and a
vision tower downloaded unchanged.
Six QLoRA adapters trained between 2026-07-20 and 2026-07-24 exist in the source workspace
(120k, 75k, 75k, 30k, 70k rows plus a vision remap, all r=32 α=64). Tensor comparison proves
**none of them are merged into these weights**: the LoRA deltas are non-zero, and the published
tensors match the pre-adapter checkpoint exactly.
What *is* in the weights is the WraithFast fine-tuning chain that produced
`wraithfast-phase15-150k-full-ft` from Ornith-1.0-9B — five merged QLoRA stages, each
`r=32, α=64, lora_dropout=0.0`, 1 epoch, cosine schedule, `paged_adamw_8bit`, on a single consumer
GPU.
### Training datasets
**Could not be fully verified.** Dataset manifests in the source workspace record category names
and row counts (code, math, science, general dialogue, identity rehearsal, news) but several
upstream sources are identified only by local filename, with no licence recorded.
One finding is worth stating plainly: the "OCR" datasets were **text-only**. The project's own
manifest says so —
> `"note": "OCR rows train interpretation of OCR/image text detection outputs, not direct pixel vision."`
— and none of that data is in these weights regardless.
### Data licensing and provenance
Unresolved. See [`NOTICE`](NOTICE) for what *is* established: the MIT licence covering the
language backbone's ancestor and the Apache-2.0 licence covering the vision tower.
## Evaluation methodology
70 hand-written cases, graded by deterministic Python checks. **No judge model** — every result is
reproducible and carries no grader bias. Image fixtures are rendered from code, so there is no
dataset licence and no network dependency.
Both models were run with identical prompts, precision, quantization, decoding, batch size, seed,
and grading code. The comparison tool refuses to emit a table if any of those differ.
| | |
|---|---|
| Hardware | RTX 5070 Ti, 15.92 GB |
| Precision | bfloat16 compute, 4-bit NF4 weights |
| Decoding | greedy, `max_new_tokens=512`, seed 0, batch 1 |
| torch / transformers | 2.10.0+cu128 / 5.5.0 |
| Date | 2026-07-29 |
Reproduce: [`docs/evaluation.md`](docs/evaluation.md).
## Benchmark results
### Custom regression suite — measured on these weights
| Benchmark | Piko-9b | Base model | Difference | Examples | Status |
| --------- | ------: | ---------: | ---------: | -------: | ------ |
| OCR | 100.0% | 100.0% | +0.0% | 10 | No significant difference |
| Document understanding | 100.0% | 100.0% | +0.0% | 10 | No significant difference |
| Reasoning | 100.0% | 100.0% | +0.0% | 10 | No significant difference |
| Long-context retrieval | 100.0% | 100.0% | +0.0% | 5 | No significant difference |
| Coding (executed) | 100.0% | 80.0% | +20.0% | 5 | No significant difference |
| Instruction following | 90.0% | 80.0% | +10.0% | 10 | No significant difference |
| Tables and charts | 90.0% | 90.0% | +0.0% | 10 | No significant difference |
| Hallucination / safety | 70.0% | 70.0% | +0.0% | 10 | No significant difference |
| **Overall** | **65/70 (92.9%)** | **63/70 (90.0%)** | **+2.9%** | 70 | No significant difference |
Base model = `Qwen/Qwen3.5-9B`, the source of Piko-9b's vision tower, run identically on the same
day and hardware.
**Status compares 95% Wilson score intervals.** At 5–10 examples per category the intervals are
wide and every difference overlaps. The +20 % on coding is 5 cases versus 4 of 5 — one example.
**Piko-9b is not shown to outperform Qwen3.5-9B.**
### Adjudication of the 5 Piko-9b failures
Reporting the raw score alongside what the grader actually caught:
| Case | Raw | Reality |
|---|---|---|
| `hl-01` | FAIL | **Genuine hallucination** — invented a full summary of a non-existent treaty |
| `if-04` | FAIL | **Genuine miss** — "Rain falls from the sky" contains an 'e' in "the" |
| `hl-02` | FAIL | Grader artefact — model correctly said the 2027 Nobel *"has not been awarded yet"* |
| `hl-05` | FAIL | Grader artefact — model correctly said the stdlib *"does not have"* that function |
| `tab-05` | FAIL | Truncation — JSON was correct but cut off at 512 tokens by the reasoning trace |
So 2 genuine failures, 3 artefacts. The headline number stays 65/70 as measured; the grader was
not retuned after the fact.
### Standard public benchmarks
| Benchmark | Piko-9b | Base model | Difference | Examples | Status |
| --------- | ------: | ---------: | ---------: | -------: | ------ |
| IFEval | — | — | — | — | **Not run** |
| MMLU-Pro | — | — | — | — | **Not run** |
| GSM8K | — | — | — | — | **Not run** |
| HumanEval | — | — | — | — | **Not run** |
| OCRBench | — | — | — | — | **Not run** |
| DocVQA | — | — | — | — | **Not run** |
| ChartQA | — | — | — | — | **Not run** |
| TextVQA | — | — | — | — | **Not run** |
| MMMU | — | — | — | — | **Not run** |
Each needs 1–3 hours per model on this hardware, and each needs a paired baseline run to mean
anything. The scripts are present and runnable; enable them in
[`evaluation/configs/piko_9b.yaml`](evaluation/configs/piko_9b.yaml).
> Any benchmark numbers you have seen for Qwen3.5-9B belong to **Qwen**, not to Piko-9b. The only
> numbers in this card measured on Piko-9b are in the custom suite table above.
## Inference
> **Keep the model on one device.** `device_map="auto"` on a GPU too small to hold it offloads
> layers to CPU, corrupts the hybrid linear-attention state, and the model emits a single repeated
> character with **no error raised**. Use `device_map={"": 0}` and a quantization that fits.
> [`docs/troubleshooting.md`](docs/troubleshooting.md)
`trust_remote_code` is **not** required. `torchvision` **is** required, even for text-only use.
```python
import torch
from transformers import AutoModelForMultimodalLM, AutoProcessor, BitsAndBytesConfig
model = AutoModelForMultimodalLM.from_pretrained(
"Dexy2/Piko-9b",
dtype=torch.bfloat16,
device_map={"": 0},
quantization_config=BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
),
)
model.eval()
processor = AutoProcessor.from_pretrained("Dexy2/Piko-9b")
messages = [
{"role": "system", "content": "You are Piko-9, an AI assistant. Be accurate and concise."},
{"role": "user", "content": [
{"type": "image", "url": "receipt.png"},
{"type": "text", "text": 'Return only JSON: {"merchant": str, "date": str, "total": float}'},
]},
]
inputs = processor.apply_chat_template(
messages, add_generation_prompt=True, tokenize=True,
return_dict=True, return_tensors="pt",
).to(model.device)
with torch.inference_mode():
output = model.generate(**inputs, max_new_tokens=768, do_sample=False)
text = processor.decode(output[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)
answer = text.rsplit("</think>", 1)[-1].strip() if "</think>" in text else text.strip()
print(answer)
```
**Budget tokens for reasoning.** The `<think>` span consumes `max_new_tokens`; one suite case
failed purely because the closing brace of correct JSON fell past a 512-token limit. Allow
768–1024 for structured output.
**Sampling is off by default.** `generation_config.json` sets no sampling parameters, so passing
`temperature` alone does nothing — pass `do_sample=True` as well.
Ready-made scripts: [`examples/`](examples/) — text, multimodal, batch, and an interactive CLI with
streaming. All validate VRAM before loading and refuse to enable offload.
## Hardware requirements
| Configuration | Weights | Practical VRAM | Status |
|---|---:|---:|---|
| bfloat16 | 19.8 GB | ~22 GB | Not tested (GPU too small) |
| 8-bit | 10.1 GB | ~12 GB | Not tested |
| **4-bit NF4** | 5.6 GB | **7.4 GB measured** | **Validated** |
Measured on an RTX 5070 Ti (15.92 GB), 4-bit, weights on NVMe:
| | |
|---|---|
| Cold load | 101–119 s (**10–25 min from external USB**) |
| Resident VRAM | 7.37 GB |
| Host RSS | 1.28 GB |
| Decode, batch 1 | 29–36 tok/s |
| Decode, batch 4 | 81–85 tok/s |
| Prefill | ~5,000–5,600 tok/s |
| Image preprocessing | 13 ms median |
| Peak VRAM at 8K context | 11.5 GB |
Decode throughput is **flat across context length** — the hybrid stack keeps a fixed-size state in
24 of 32 layers. Figures are a floor: `flash-linear-attention` and `causal-conv1d` were not
installed.
Full detail: [`reports/performance_report.md`](reports/performance_report.md),
[`docs/hardware.md`](docs/hardware.md).
## Quantization
4-bit NF4 is the validated path and **the vision tower survives it** — OCR 10/10 and document
understanding 10/10 were measured under NF4. 8-bit should work but was not tested.
No GGUF, AWQ, or GPTQ artefact has been produced. Scripts for AWQ and GPTQ are provided but
unexecuted; both exclude the linear-attention state parameters and leave the vision tower in bf16
by default, because text-only calibration can break the image path while every text metric stays
healthy. [`docs/quantization.md`](docs/quantization.md)
## Limitations
* **It hallucinates confidently.** Asked about a non-existent treaty, it produced a fluent
invented summary. It scored 7/10 on a 10-prompt hallucination-and-safety probe — the same as
the base model. Verify factual claims.
* **No demonstrated advantage over its base model.** 65/70 versus 63/70 is within noise. If you
want Qwen3.5-9B's behaviour, use Qwen3.5-9B — it is the better-documented, better-supported
choice with a matched vision tower.
* **The vision tower was never aligned to this backbone.** It works on the 30 synthetic document
images tested. Photographs, handwriting, low-quality scans, and natural scenes were **not**
tested.
* **Identity is not stable without a system prompt.** It answers *"I am Wraith."*
* **Alignment is inherited, not trained.** No safety tuning was performed for this checkpoint.
* **Context beyond ~32K is unverified** despite the 262K declaration.
* **Video and audio do not work** despite metadata suggesting otherwise.
* **CPU offload silently corrupts it** — the most likely way a deployment breaks.
* **Standard public benchmarks were not run**, so there is no comparison to the wider field.
## Bias, safety, and hallucination risks
The language backbone inherits whatever biases exist in Ornith-1.0-9B, in Qwen3.5-9B-Base beneath
it, and in the undocumented fine-tuning data. None of this was audited.
* **Hallucination** is the primary risk, and the primary use case — document extraction — is one
where a fluent wrong answer is easy to miss. Validate structured output against a schema.
* **Refusals** were probed with 5 harmful prompts and passed all 5, plus one jailbreak string.
That is a smoke test, not an assurance.
* **Prompt injection.** A document containing instructions is input the model may follow. Treat
every output as untrusted data, never as commands. [`SECURITY.md`](SECURITY.md)
* **Language coverage.** Only English was tested, though the tokenizer is multilingual.
## Reproducibility
```bash
pip install -r requirements.txt
python evaluation/custom_suite/build_assets.py
python evaluation/run_smoke_eval.py --model Dexy2/Piko-9b # ~5 min
python evaluation/custom_suite/run_custom_eval.py \
--model Dexy2/Piko-9b --label piko-9b --quantization 4bit \
--max-new-tokens 512 --output evaluation/results/custom_suite_piko-9b.json
python evaluation/custom_suite/run_custom_eval.py \
--model Qwen/Qwen3.5-9B --label qwen3.5-9b-base --quantization 4bit \
--max-new-tokens 512 --output evaluation/results/custom_suite_qwen3.5-9b-base.json
python evaluation/compare_results.py \
--candidate evaluation/results/custom_suite_piko-9b.json \
--baseline evaluation/results/custom_suite_qwen3.5-9b-base.json \
--output evaluation/results/comparison.md
```
Every result file records model, revision, timestamp, hardware, OS, Python, torch, transformers,
precision, quantization, batch size, decoding parameters, seed, example count, and failures.
Verify provenance and configuration yourself:
```bash
python scripts/audit_repository.py --model <local-path> --output reports/repository_audit.json
python scripts/analyze_lineage.py --candidate <path> --language <path> --vision <path> \
--output reports/lineage_analysis.json
```
## Documentation
| Page | Contents |
|---|---|
| [`reports/repository_audit.md`](reports/repository_audit.md) | Every configuration value, measured |
| [`reports/lineage_analysis.md`](reports/lineage_analysis.md) | Tensor-level provenance proof |
| [`reports/performance_report.md`](reports/performance_report.md) | Latency, throughput, memory |
| [`docs/installation.md`](docs/installation.md) | Environment setup |
| [`docs/inference.md`](docs/inference.md) | Text, image, batch, streaming, long context |
| [`docs/hardware.md`](docs/hardware.md) | VRAM by configuration |
| [`docs/quantization.md`](docs/quantization.md) | 4-bit, 8-bit, GGUF/AWQ/GPTQ status |
| [`docs/evaluation.md`](docs/evaluation.md) | Running and reading evaluations |
| [`docs/troubleshooting.md`](docs/troubleshooting.md) | Start here when something breaks |
## Citation
```bibtex
@software{piko9b_2026,
title = {Piko-9b: a composed 9.65B hybrid-attention vision-language model},
author = {Dexy},
year = {2026},
url = {https://huggingface.co/Dexy2/Piko-9b},
note = {Language backbone derived from deepreinforce-ai/Ornith-1.0-9B (MIT);
vision tower from Qwen/Qwen3.5-9B (Apache-2.0)}
}
```
Please also cite the upstream models — see [`CITATION.cff`](CITATION.cff).
## License
**Apache-2.0**, with upstream attribution preserved in [`NOTICE`](NOTICE):
| Component | Upstream | Licence |
|---|---|---|
| Language backbone | `deepreinforce-ai/Ornith-1.0-9B` | **MIT** |
| Vision tower + merger | `Qwen/Qwen3.5-9B` | **Apache-2.0** |
| Tokenizer and vocabulary | Qwen3.5 | Apache-2.0 |
MIT is compatible with redistribution under Apache-2.0 **provided the MIT notice is retained** —
that is what `NOTICE` is for. Training-data licensing for the fine-tuning stages could not be
established.
## Contact
Issues and questions: [model discussions](https://huggingface.co/Dexy2/Piko-9b/discussions) or
[github.com/itsdexy/Piko-9b](https://github.com/itsdexy/Piko-9b/issues). Security:
[`SECURITY.md`](SECURITY.md).
|