gpt4 book ai didi

python - 使用 Tensorflow-Hub 中的 ELMo 时内存消耗大幅增加

转载 作者:行者123 更新时间:2023-12-01 07:45:25 24 4
gpt4 key购买 nike

我目前正在尝试比较数百万个文档的相似度。对于 CPU 上的第一次测试,我将它们减少到每个字符大约 50 个,并尝试一次为其中 10 个字符获取 ELMo 嵌入,如下所示:

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 个句子之后(甚至没有保存向量),程序也会消耗高达 12GB 的 RAM。这是一个已知问题(我发现的其他问题表明了类似的问题,但不是那么极端)还是我犯了一个错误?

最佳答案

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

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

  • 使用 hub.Module() 构建模块并将其应用于将输入张量映射到输出张量都是图构建的一部分,并且应该只发生一次。

  • 输入数据的循环应该仅调用 session.run() 来提供输入并从固定图中获取输出数据。

幸运的是,已经有一个实用函数可以为您完成这一切:

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 而言,这对您的作用大致如下:

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:厌倦了担心构建图表与运行 session ?那么 TF2 和 Eager Execution 正适合您。查看https://colab.research.google.com/github/tensorflow/hub/blob/master/examples/colab/tf2_text_classification.ipynb

关于python - 使用 Tensorflow-Hub 中的 ELMo 时内存消耗大幅增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56488857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com