Toddler-Jev / batch_inference.py
vyomie's picture
Release Toddler-Jev 1.0.0
8e516d4 verified
Raw History Blame Contribute Delete
1.78 kB
"""TeenageWorks batch inference CLI. Built with Qwen; see LICENSE."""
import argparse
import json
from pathlib import Path
from toddler_jev import ToddlerJev
def main():
p = argparse.ArgumentParser()
p.add_argument('--input', required=True, help='JSONL: audio, question, options; optional id')
p.add_argument('--output', required=True)
p.add_argument('--batch-size', type=int, default=1)
p.add_argument('--model', default=str(Path(__file__).parent))
p.add_argument('--revision', default='v1.0.0')
p.add_argument('--device', default=None)
args = p.parse_args()
if args.batch_size < 1:
p.error('--batch-size must be positive')
source, target = Path(args.input).resolve(), Path(args.output).resolve()
if source == target or target.exists():
p.error('Output must be a new file')
model = ToddlerJev.from_pretrained(args.model, revision=args.revision, device=args.device)
def flush(batch, output):
for row, result in zip(batch, model.predict_batch(batch)):
if 'id' in row:
result['id'] = row['id']
output.write(json.dumps(result) + '\n')
output.flush()
with source.open(encoding='utf-8') as source_file, target.open('x', encoding='utf-8') as output:
batch = []
for line in source_file:
if not line.strip():
continue
row = json.loads(line)
audio = Path(row['audio'])
row['audio'] = str(audio if audio.is_absolute() else source.parent / audio)
batch.append(row)
if len(batch) == args.batch_size:
flush(batch, output)
batch = []
if batch:
flush(batch, output)
if __name__ == '__main__':
main()