Views
No views yet
sarashina2_vision)はmlx-vlm本体に未収録のため、
リポジトリ同梱のモデルクラスを先にimportしてください。pip install "mlx-vlm==0.6.6" torch torchvision pillow protobuf sentencepiece1import sys
2from huggingface_hub import snapshot_download
3
4path = snapshot_download("tokimoa/sarashina2.2-ocr-mlx-4bit")
5sys.path.insert(0, path)
6import sarashina2_vision # noqa: F401 mlx_vlm.models.sarashina2_vision として登録
7
8import mlx.core as mx
9from pathlib import Path
10from PIL import Image
11from transformers import AutoProcessor
12from mlx_vlm.utils import load_model
13from mlx_vlm.models.cache import KVCache
14
15model = load_model(Path(path))
16processor = AutoProcessor.from_pretrained(path, trust_remote_code=True)
17
18image = Image.open("document.png").convert("RGB")
19message = [{"role": "user", "content": [{"type": "image", "image": image}]}]
20inputs = processor.apply_chat_template(
21 message, tokenize=True, add_generation_prompt=True,
22 return_dict=True, return_tensors="np")
23
24# greedy + repetition_penalty 1.2(元モデル推奨設定)
25cache = [KVCache() for _ in model.layers]
26logits = model(mx.array(inputs["input_ids"]), mx.array(inputs["pixel_values"]),
27 cache=cache, image_grid_thw=mx.array(inputs["image_grid_thw"])).logits
28seen = {int(t) for t in inputs["input_ids"][0]}
29tokens = []
30for _ in range(3000):
31 logit = logits[0, -1, :].astype(mx.float32)
32 idx = mx.array(sorted(seen))
33 vals = logit[idx]
34 logit[idx] = mx.where(vals < 0, vals * 1.2, vals / 1.2)
35 tok = int(mx.argmax(logit).item())
36 if tok == 2: # </s>
37 break
38 tokens.append(tok)
39 seen.add(tok)
40 logits = model.language_model(mx.array([[tok]]), cache=cache).logits
41
42print(processor.decode(tokens, skip_special_tokens=True))mlx_vlm.convert(q_bits=4, group_size=64)+独自モデルクラス
(Qwen2-VL ViT+deepstack merger+Llama-3B+interleaved M-RoPE spatial_resetバリアント)configuration_sarashina2_vision.py はtransformers v5の型検証
(Qwen2VLVisionConfig.mlp_ratio: int と実値3.7362の衝突)を回避したパッチ版