Tensor proto 大于 2GB 问题

我的 weight matrix 有几 G,feed 不进去,需要怎样才能解决这个问题呢?

image


kaede1993 2018-7-22 23:08:50

1)简单的方案 使用 tf.Variable 的 load 函数,先初始化 variable,然后调用 load;
例如加载一个很大的外部变量

import tensorflow as tf
from gensim import models

model = models.KeyedVectors.load_word2vec_format (’./GoogleNews-vectors-negative300.bin’, binary=True)
X = model.syn0

embeddings = tf.Variable (tf.random_uniform (X.shape, minval=-0.1, maxval=0.1), trainable=False)

sess = tf.Session ()
sess.run (tf.global_variables_initializer ())
embeddings.load (model.syn0, sess)

  1. 看下 load 的代码,就知道直接用 feed_dict 赋予这个变量的 tensor
    sess.run (embeddings.initializer, feed_dict={embeddings.initial_value:X})

尽量少用大的 constant 内容,这部分尽量抽离出来,constant 内容会被打包进到整个 tensorflow 的图结构体中


bigfundamental 发表于 2018-7-23 11:20:55

谢谢您,我刚开始用 tf 所以不太懂,我是否可以理解为在定义 Variable 的时候不能传入一个很大的数据,但是在定义好这个 Variable 之后就可以随便对它进行处理。

比如:
我想将我的 Weight matrix 初始化为一个 (2^22, 2^8) 的矩阵 A,我不能直接用 W = tf.Variable (A)。但是可以通过先定义一个 W1 = tf.Variable ([1, 2^8]) 的变量和一个 (2^22, 1) 的矩阵 B,然后再利用 W = tf.matmul (B, W1) 得到我想要的 W?


kaede1993 发表于 2018-7-23 19:29:59

这个问题比较底层,假如要理解,就得理解 tensorflow 的设计机制,包括 Graph/Operation 以及序列化的一些 GraphDef/OpDef/NodeDef 这些 protobuf 的序列化数据结构;我个人建议你直接自己写代码试验下,你上述讲的 mat,也是一样的,会触发 2G 的限制,本质上跟赋值没什么太大的区别

其实记住一点就行了,就是在所有 tf 的操作中,尽量避免它的参数为大的 constant 常数
你用两个小常量的方式可以在某些时候绕过单个 tensor 2G 的问题,也就是说静态的两个小数组常量数据量比你相乘的 constant 少,可以 work;

但是这种方式你编程得多麻烦啊,而且当你这种小变量积累很多之后,整个 graph 还会有 2G 的限制检查,就是 GraphDef 2G 的错误报警
所以我不是特别推荐这种方式


bigfundamental 发表于 2018-7-24 09:37:10

tf.Variable 函数


cloump 发表于 2018-7-27 10:03:21