lm_human_preferences/language/datasets.py (92 lines of code) (raw):

import random from typing import Dict import tensorflow as tf from lm_human_preferences.datasets.books import books_generator from lm_human_preferences.datasets.cnndm import cnndm_generator from lm_human_preferences.datasets.tldr import tldr_generator _registry: Dict[str, "Dataset"] = {} class Dataset: def __init__( self, name, *, generator=None, ): global _registry assert name not in _registry _registry[name] = self self.name = name self.generator = generator def tf_dataset( self, sequence_length, *, mode, encoder=None, seed=0, comm=None, shuffle=True, repeat_count=None, # Defaults to infinite repeat # trims so that it starts right after start token start_token=None, # trims off last end_token end_token=None, padding_token=None, ): if padding_token is None: padding_token = encoder.padding_token def _generator(): inner_gen = self.generator(mode, seed=seed, shuffle=shuffle, comm=comm) for text in inner_gen: tokens = encoder.encode(text) if start_token is not None: try: first_index = tokens.index(start_token)+1 if first_index < len(tokens): tokens = tokens[first_index:] except: continue tokens = tokens[:sequence_length] if end_token is not None: try: last_index = len(tokens)-tokens[::-1].index(end_token) tokens = tokens[:last_index] except: continue if len(tokens) < sequence_length: tokens = tokens + [padding_token] * (sequence_length - len(tokens)) assert len(tokens) == sequence_length yield dict(tokens=tokens) tf_dataset = tf.data.Dataset.from_generator( _generator, output_types=dict(tokens=tf.int32), output_shapes=dict(tokens=(sequence_length,)), ) tf_dataset = tf_dataset.repeat(repeat_count) if comm is not None: num_shards = comm.Get_size() shard_idx = comm.Get_rank() if num_shards > 1: assert seed is not None tf_dataset = tf_dataset.shard(num_shards, shard_idx) return tf_dataset def get_dataset(name) -> Dataset: global _registry return _registry[name] CnnDm = Dataset( "cnndm", generator=cnndm_generator, ) Tldr = Dataset( "tldr", generator=tldr_generator, ) Books = Dataset( "books", generator=books_generator, ) def test_generator(mode, seed=0, shuffle=False, comm=None): while True: yield ''.join([random.choice('abcdefghijklmnopqrstuvwxyz.') for _ in range(40)]) Test = Dataset( "test", generator=test_generator ) """ import tensorflow as tf from lm_human_preferences.language.datasets import Books as ds from lm_human_preferences.language.encodings import Main as encoding e = encoding.get_encoder() x = ds.tf_dataset(16, mode='test', encoder=e) op = x.make_one_shot_iterator().get_next() s = tf.Session() while True: print(e.decode(s.run(op)['tokens'])) input() """