---
library_name: coreml
license: openrail
base_model: Reza2kn/Bina-0.1-Koochik
base_model_relation: quantized
pipeline_tag: image-to-text
tags:
- coreml
- apple-silicon
- ocr
- persian
- qwen3_5
- surya-ocr
---
# Bina 0.1 CoreML — بینا ۰.۱ برای CoreML
This is the fixed-512 CoreML runtime for
[`Reza2kn/Bina-0.1-Koochik`](https://huggingface.co/Reza2kn/Bina-0.1-Koochik),
the merged BF16 Persian OCR baseline.
## Precision: BF16 source, mixed CoreML runtime
This is **not** labeled as a literal BF16 CoreML model. Core ML Tools 9.0 does
not expose BF16 as an ML Program compute precision. The parity-qualified build
uses:
- vision encoder: CoreML **FP32**;
- language prefill: CoreML **FP16**;
- autoregressive decode step: CoreML **FP16**;
- host token embeddings and M-RoPE tables: **FP32**.
An all-FP16 attempt was rejected because FP16 vision changed the first greedy
token. Keeping vision in FP32 restored exact greedy transcripts while retaining
FP16 for the two large language graphs.
## Parity evidence
All comparisons use deterministic greedy decoding, EOS token `2`, the same
BF16 source checkpoint, and the exact Bina transcription prompt:
```text
OCR this image. Return only the exact text visible in the image, preserving Persian, numbers, line breaks, and punctuation. Do not explain.
```
| Gate | Result |
| --- | ---: |
| Synthetic compiled CoreML canary | 22/22 tokens exact through EOS |
| Two real Persian pages | 128/128 checked tokens exact (64-token cap per page) |
| Real Persian line crop, Python-hosted CoreML | 25/25 tokens and text exact through EOS |
| Same Persian crop, native Swift host | 25/25 tokens and text exact through EOS |
The native crop transcript is exactly:
```text
گزارش سالانه دیتاک -۱۴۰۲
```
Receipts are under [`validation/`](validation/). The Swift receipt exercises
the actual CoreML packages, FP32 host assets, cache updates, baked M-RoPE tables,
Fuse tokenizer decoding, and EOS stopping without loading the PyTorch model.
## Runtime contract
This release intentionally has one static shape:
- centered white `512 × 512` RGB canvas;
- `pixel_values`: `[1024, 1536]`, Float32;
- 256 merged image tokens;
- prompt length: 416 tokens;
- M-RoPE delta: `-240` (baked into the native decode tables);
- cache length: 1024;
- maximum generated length before the cache boundary: 608 tokens.
The qualified preprocessing path is PIL RGB + LANCZOS aspect-fit into the
centered white canvas, followed by the checked-in processor. The Swift
`generate(pixelValues:)` path is parity-qualified. The convenience Swift
`generate(image:)` path uses CoreGraphics and is **not** claimed to be
pixel-identical to PIL.
This is not yet the six-aspect-bucket Bina/Flax runtime and is not a drop-in
replacement for every dynamic Surya page shape. Use this release only for the
fixed-512 contract above.
## Files
- `surya_vision_fp32.mlpackage` — Bina-specific vision encoder.
- `surya_prefill_fp16_seq416_cache1024.mlpackage` — language prefill and initial cache.
- `surya_decode_step_fp16_cache1024.mlpackage` — one autoregressive decode step.
- `native_assets/` — FP32 token embedding, prompt embeddings, M-RoPE tables,
tokenizer vocabulary, constants, and a synthetic canary tensor.
- `native/SuryaCoreMLRuntime/` — Swift Package for macOS 14+ / iOS 17+.
- `processor/` — exact tokenizer and processor configuration.
- `scripts/` — conversion, fixture preparation, and parity validators.
The internal `Surya` names reflect the upstream architecture; all three graphs
contain the Bina 0.1 fine-tuned weights.
## Native smoke test
Clone with Git LFS, then run the release build from the repository root:
```bash
git lfs install
git lfs pull
cd native/SuryaCoreMLRuntime
swift run -c release surya-coreml-smoke \
--model-dir ../.. \
--pixel-values-fp32 ../../native_assets/canary_pixel_values_fp32.bin \
--max-tokens 64
```
Expected token IDs:
```text
2009 2046 2054 2047 2041 2035 2037 1979 136 1072 2020 2047 2052 2033 2044 1979 1982 55 1992 13 13 2
```
Expected text:
```text
Invoice 123
Total $42.00
```
To prepare an exact fixed-512 tensor for another image:
```bash
python scripts/prepare_bina_coreml_fixtures.py \
--runtime-script scripts/export_surya_coreml_runtime.py \
--image /path/to/image.png \
--output-dir prepared
```
Then pass `prepared/.pixel_values_fp32.bin` to the Swift executable.
## Source provenance
- source model: `Reza2kn/Bina-0.1-Koochik`;
- source revision: `9b5812be94e3e015142da22a4b61b34aad5d2c02`;
- source `model.safetensors` SHA-256:
`2193be4ef3d2366438121a15b7a1dea2bb85b24f83145e5a39bfa1f387891ada`;
- source `config.json` SHA-256:
`e0de22be177070f206106c184d062176fcda591d9114068c42489ffc550488de`;
- architecture: `Qwen3_5ForConditionalGeneration`;
- conversion host: Apple M2, macOS 26.5.1;
- toolchain: Python 3.11.11, PyTorch 2.12.0, Transformers 5.13.1,
Core ML Tools 9.0, Xcode 26.5.
Package and native-asset hashes are recorded in
[`coreml_runtime_manifest.json`](coreml_runtime_manifest.json).
## خلاصه فارسی
این مخزن نسخهٔ CoreML مدل بینا ۰.۱ است. وزن مبدأ BF16 است، اما چون CoreML
خروجی محاسباتی BF16 ارائه نمیکند، انکودر تصویر با FP32 و بخش زبانی با FP16
تبدیل شده است. در آزمون واقعی فارسی، خروجی CoreML و مدل اصلی BF16 تا توکن EOS
کاملاً یکسان بود؛ همین آزمون با میزبان Swift نیز ۲۵ از ۲۵ توکن و متن دقیقاً
یکسان داد. این نسخه فعلاً فقط قرارداد ثابت ۵۱۲×۵۱۲ را پشتیبانی میکند.
## License
This derivative follows the source model's OpenRAIL license. Review the source
and upstream Surya OCR 2 terms before redistribution or deployment.