nanojev-coreml / source /preprocessing.py
alexwengg's picture
Publish NanoJev Core ML conversion source without trained weights
ce235ae verified
Raw
History Blame Contribute Delete
1.32 kB
"""Use NanoJev's pinned native renderer for decision requests."""
from __future__ import annotations
from pathlib import Path
import numpy as np
from assets import upstream_module
def prepare_request(root: Path, tokenizer, request: dict, length: int, max_candidates: int):
native = upstream_module(root, "predict_toy_decisions")
examples = native.prepare_examples(request, tokenizer, length)
if len(examples) != 1:
raise ValueError("This Core ML bucket accepts one question per call")
example = examples[0]
paths = example["leaf_tokens"]
if len(paths) > max_candidates:
raise ValueError(f"{len(paths)} candidates exceed bucket capacity {max_candidates}")
pad = tokenizer.pad_token_id
ids = np.full((max_candidates, length), pad, dtype=np.int32)
attention = np.zeros((max_candidates, length), dtype=np.int32)
eos_map = np.zeros((max_candidates, 1, length), dtype=np.float32)
candidate_mask = np.zeros((1, max_candidates), dtype=np.float32)
for index, tokens in enumerate(paths):
ids[index, : len(tokens)] = tokens
attention[index, : len(tokens)] = 1
eos_map[index, 0, len(tokens) - 1] = 1
candidate_mask[0, index] = 1
return {"input_ids": ids, "attention_mask": attention, "eos_map": eos_map}, candidate_mask, example