首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用来自Tensorflow-Hub的ELMo时,内存消耗大大增加。

使用来自Tensorflow-Hub的ELMo时,内存消耗大大增加。
EN

Stack Overflow用户
提问于 2019-06-07 06:14:19
回答 1查看 1.6K关注 0票数 3

我目前正试图比较数以百万计的文件的相似性。在CPU上进行第一次测试时,我将每个字符减少到大约50个字符,并尝试在这样的情况下为其中10个字符获得ELMo嵌入:

代码语言:javascript
复制
ELMO = "https://tfhub.dev/google/elmo/2"
for row in file:
    split = row.split(";", 1)
    if len(split) > 1:
        text = split[1].replace("\n", "")
            texts.append(text[:50])
    if i == 300:
        break
    if i % 10 == 0:
        elmo = hub.Module(ELMO, trainable=False)
                 executable = elmo(
                 texts,
                 signature="default",
                 as_dict=True)["elmo"]

    vectors = execute(executable)
    texts = []
    i += 1

然而,即使使用这个小示例,在大约300句语句(甚至不保存向量)之后,程序也会消耗高达12 of的RAM。这是一个已知的问题(我发现的其他问题表明了类似的问题,但没有那么极端),还是我犯了一个错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-07 11:15:50

我认为,这是针对没有急切模式的TensorFlow 1.x (否则,hub.Module的使用可能会遇到更大的问题)。

在该编程模型中,首先需要用TensorFlow图表示计算,然后对每一批数据重复执行该图。

  • hub.Module()构造模块,并将其应用于将输入张量映射到输出张量的过程中,都是图形生成的一部分,应该只发生一次。
  • 输入数据的循环应该只是调用session.run()来输入输入和从固定图中获取输出数据。

幸运的是,已经有一个实用程序函数可以为您完成所有这些工作:

代码语言:javascript
复制
import numpy as np
import tensorflow_hub as hub

# For demo use only. Extend to your actual I/O needs as you see fit.
inputs = (x for x in ["hello world", "quick brown fox"])

with hub.eval_function_for_module("https://tfhub.dev/google/elmo/2") as f:
  for pystr in inputs:
    batch_in = np.array([pystr])
    batch_out = f(batch_in)
    print(pystr, "--->", batch_out[0])

就原始TensorFlow而言,这对您所做的大概是这样的:

代码语言:javascript
复制
module = Module(ELMO_OR_WHATEVER)
tensor_in = tf.placeholder(tf.string, shape=[None])  # As befits `module`.
tensor_out = module(tensor_in)

# This kind of session handles init ops for you.
with tf.train.SingularMonitoredSession() as sess:
  for pystr in inputs:
    batch_in = np.array([pystr])
    batch_out = sess.run(tensor_out, feed_dict={tensor_in: batch_in}
    print(pystr, "--->", batch_out[0])

如果您的需求对于with hub.eval_function_for_module ...来说太复杂了,您可以构建这个更明确的示例。

注意如何在循环中既不构造也不调用hub.Module。

PS:厌倦了担心构建图表还是运行会话?那么TF2和急切的执行是为您准备的。查看classification.ipynb

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56488857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档