Paddle 使用NumpyArrayInitializer初始化embedding层爆内存

ssgvzors  于 2021-11-30  发布在  Java
关注(0)|答案(4)|浏览(331)
  • 标题:使用NumpyArrayInitializer初始化embedding层爆内存
  • 版本、环境信息:

   1)PaddlePaddle版本:PaddlePaddle 1.8.0
   2)AIStudio

  • 问题描述:使用NumpyArrayInitializer初始化embedding层爆内存

用来初始化的数组大小为200w*300,也就5G大小,但是创建embedding的时候内存激增直到被killed(aistudio内存大小32G)

embedding_params = fluid.ParamAttr(name='emb', initializer=fluid.initializer.NumpyArrayInitializer(We), trainable=False)
emb = fluid.embedding( input=data, size=[input_dim, emb_dim], is_sparse=True, param_attr=embedding_params)

其中We的shape为200w*300

gmxoilav

gmxoilav1#

请问下你的input_dim, emb_dim对应也是200w, 300吗?另外你的输入data的shape是多少呢

dphi5xsq

dphi5xsq2#

嗯是的,定位到爆内存的代码是https://github.com/PaddlePaddle/Paddle/blob/release/1.8/python/paddle/fluid/initializer.py
第888行:
values = [float(v) for v in np_value.flat]
这句代码试图把数组里的数一个个取出来组成list,这一步内存消耗很大。
我把这行代码修改成
values = np_value.flatten()
这样内存只需增加一倍的数组大小,也就是5G

j91ykkif

j91ykkif3#

现在numpy initializer的assign方式和assign op的使用方式是相同的,我确认下这种转换方法能不能优化下,你这边修改成flatten()能够正常运行了吗

相关问题