lm_human_preferences/language/trained_models.py (68 lines of code) (raw):

import copy import os import tensorflow as tf from lm_human_preferences.language import encodings, model class TrainedModel(): def __init__(self, name, *, savedir=None, scope=None): self.name = name self.scope = scope self.savedir = savedir if savedir else os.path.join('gs://gpt-2/models/', name) if name == 'test': self.encoding = encodings.Test else: self.encoding = encodings.Main self._hparams = None def checkpoint(self): if self.name == 'test': return None ckpt = tf.train.latest_checkpoint(self.savedir) if ckpt is not None: return ckpt return tf.train.latest_checkpoint(os.path.join(self.savedir, 'checkpoints')) def hparams(self): if self._hparams is None: if self.name == 'test': hparams = test_hparams() else: hparams = load_hparams( os.path.join(self.savedir, 'hparams.json') ) self._hparams = hparams return copy.deepcopy(self._hparams) def init_op(self, params, new_scope): assert params params = dict(**params) checkpoint = self.checkpoint() available = tf.train.list_variables(checkpoint) unchanged = {} for name, shape in available: our_name = name if self.scope: if name.startswith(self.scope): our_name = name[len(self.scope):].lstrip('/') else: continue # Annoying hack since some code uses 'scope/model' as the scope and other code uses just 'scope' our_name = '%s/%s' % (new_scope, our_name) if our_name not in params: # NOTE: this happens for global_step and optimizer variables # (e.g. beta1_power, beta2_power, blah/Adam, blah/Adam_1) # print(f'{name} is missing for scope {new_scope}') continue var = params[our_name] del params[our_name] assert var.shape == shape, 'Shape mismatch: %s.shape = %s != %s' % (var.op.name, var.shape, shape) unchanged[name] = var for name in params.keys(): print(f'Param {name} is missing from checkpoint {checkpoint}') tf.train.init_from_checkpoint(checkpoint, unchanged) def load_hparams(file): hparams = model.HParams() hparams.override_from_json_file(file) return hparams def test_hparams(): hparams = model.HParams() hparams.override_from_dict(dict( n_vocab=27, # Corresponds to random encoding length n_ctx=8, n_layer=2, n_embd=7, n_head=1, )) return hparams