# tokenize rendered jsonl with the pruned tokenizer into packed arrays (ids, loss mask, doc offsets) import json, sys, os, glob, numpy as np from transformers import AutoTokenizer from multiprocessing import Pool # usage: tokenize_data.py [jsonl ...], all of data/rendered when none is given # documents longer than MAX_TOKENS are dropped so that every document fits in one training window MAX_TOKENS=2046 model_dir=sys.argv[1]; out_dir=sys.argv[2]; os.makedirs(out_dir,exist_ok=True) tok=None def init(): global tok; tok=AutoTokenizer.from_pretrained(model_dir) def work(lines): docs=[json.loads(l) for l in lines] enc=tok([d["text"] for d in docs],return_offsets_mapping=True,add_special_tokens=False) out=[] for d,ids,offs in zip(docs,enc["input_ids"],enc["offset_mapping"]): mask=np.zeros(len(ids),dtype=np.uint8) starts=np.array([o[0] for o in offs]); ends=np.array([o[1] for o in offs]) for a,b in d["spans"]: mask[(ends>a)&(starts