Как удалить непереносимые переменные при сохранении контрольной точки с помощью тензорного оценщика? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть tf-модель для тренировки с необучаемым встраиваемым слоем, размер которого больше 10 ГБ. Я не хочу сохранять эту переменную в моем файле контрольных точек, потому что это занимает слишком много времени и места.

Могу ли я сохранить ckpt без этой необучаемой переменной и нормально использовать tf.estimator?

При обучении модели в распределенном режиме сервер параметров сохранит эту переменную, и для ее синхронизации потребуется слишком много времени. Можно ли избежать этой проблемы? Значения этой переменной не меняются вечно, параметру server ничего не нужно с этим делать, я думаю.

Вот что я пробовал:

  1. Я попытался использовать tf.constant вместо tf.variable, чтобы сохранить это вложение, но я не могу построить такую ​​константу из-за прото-ограничения.

    emb_np = np.load(file_name)
    embedding_table = tf.constant(
        value=emb_np,
        name=embedding_name,
        shape=[vocab_size, embedding_size])
    

    Сообщение об ошибке выглядит так:

    "Cannot create a tensor proto whose content is larger than 2GB."
    

На самом деле, сейчас я не могу получить константу больше 2 ГБ.

  1. Заменить заставку оценки по умолчанию.

    saver=tf.train.Saver(
          var_to_save,
          sharded=True,
          max_to_keep=20,
          keep_checkpoint_every_n_hours=(
              100000),
          defer_build=False,
          save_relative_paths=True)
    

    Я удаляю эту переменную из хранителя оценки по умолчанию, и эта переменная будет инициализирована из другого ckpt при построении модели, но контрольная точка не может использоваться при обучении модели из существующего ckpt и при оценке модели. Сообщения об ошибках выглядят так:

    RuntimeError: Init operations did not make model ready for local_init.  Init op: group_deps, init fn: None, error: Variables not initialized: dense/kernel/Adagrad, dense/bias/Adagrad, dense_1/kernel/Adagrad, dense_1/bias/Adagrad, dense_2/kernel/Adagrad, dense_2/bias/Adagrad, w1/Adagrad
    

Я думаю, что причина в том, что параметр "defer_build" должен быть установлен в ложь при использовании моего списка переменных для определения tf.train.Saver, но я не знаю, как встроить его в мой код, используя оценщик.

  1. Я подумал, что серверу параметров не нужно управлять необучаемыми переменными, но в соответствии с использованием памяти PS незаражаемые переменные сохраняются здесь. Есть ли варианты, чтобы изменить это?
...