"""Frozen V4.1 virtual union; deterministic maps can be rebuilt on AutoDL.""" import json from pathlib import Path import numpy as np from vimeml.training.data import file_sha, write_json from vimeml.training.data_v2 import PrefixCropWindowDataset from vimeml.training.data_mixture import JoinedPrefixWindows from vimeml.posttraining.streams import ConversionWindows ROOT=Path(__file__).resolve().parents[3] def window_sentences(dataset, ids): position=np.searchsorted(dataset.end,ids,side='right') previous=np.zeros(len(ids),dtype=np.int64) present=position>0 previous[present]=dataset.end[position[present]-1]-dataset.sentences[position[present]-1]-1 sentences=ids-previous candidates=np.flatnonzero(position=dataset.first[position[candidates]]] sentences[extra]=dataset.sentences[position[extra]] return sentences def prepare_maps(directory, root=ROOT): directory,root=Path(directory),Path(root) request=json.loads((directory/'request.json').read_text('utf-8')) expected=json.loads((directory/'manifest.json').read_text('utf-8')) if (directory/'manifest.json').exists() else None if expected and all((directory/r['file']).exists() and file_sha(directory/r['file'])==r['sha256'] for r in expected['epochs']): return expected keep_path=root/request['old_keep'] if file_sha(keep_path)!=request['old_keep_sha256']: raise ValueError('Old training exclusion mask changed') keep=np.load(keep_path,mmap_mode='r',allow_pickle=False) bases=[] for record in request['joined_stores']: if file_sha(root/record['token_dir']/'manifest.json')!=record['token_manifest_sha256'] or file_sha(root/record['index_dir']/'manifest.json')!=record['window_manifest_sha256']: raise ValueError('Joined bank identity changed') bases.append(PrefixCropWindowDataset(root/record['token_dir'],root/record['index_dir'], seed=request['seed'],probability=request['crop_probability'],min_remaining_tokens=request['crop_minimum'])) joined=JoinedPrefixWindows(bases,0,[{int(k):v for k,v in r['source_map'].items()} for r in request['joined_stores']]) try: chunks=[] for start in range(0,len(bases[0]),262144): ids=np.arange(start,min(len(bases[0]),start+262144),dtype=np.int64) chunks.append(ids[keep[window_sentences(bases[0],ids)]]) web=np.concatenate(chunks) chat=np.arange(len(bases[0]),len(joined),dtype=np.int64) records=[] for epoch in range(request['epochs']): joined.set_epoch(epoch) web_tokens=0 for start in range(0,len(web),262144): web_tokens+=int(joined.window_lengths(web[start:start+262144]).sum()) chat_lengths=joined.window_lengths(chat) target=round(web_tokens*request['chat_fraction']/(1-request['chat_fraction'])) rng=np.random.default_rng(request['seed']+epoch) chosen,used=[],0 while used