首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用对GPU来说太大的NN体系结构?

如何使用对GPU来说太大的NN体系结构?
EN

Data Science用户
提问于 2018-11-15 08:39:27
回答 2查看 1.5K关注 0票数 4

最初在堆栈溢出上发布。

我想要实现一个模型,实际上是两个神经网络叠加在一起。然而,这两个架构的大小太大,不能同时适用于GPU。

我的想法如下:

  • 加载第一个模型并运行1批
  • 从GPU卸载第一个模型,加载第二个模型
  • 从第一个模型的输出中运行第二个模型
  • 从GPU卸载第二个模型
  • 每批重复一次

我其实不需要训练第一个模特,因为它是预先训练的。但我需要训练第二个模特。

能做这样的事情吗?我的方法正确吗?我应该意识到哪些陷阱?性能呢?

编辑

我已经尝试过先计算整个数据集的第一个模型的输出,然后使用它作为第二个数据集的输入。但是,第一个数据集的输出非常大,而且我没有存储整个预处理数据集的可用空间。这就是为什么我想每一批都这么做。

编辑2

在@Gal Avineri给出了一个非常好的答案之后,只需再精确一次:我希望只使用一个GPU实现我的体系结构。

EN

回答 2

Data Science用户

回答已采纳

发布于 2018-11-15 19:59:23

我建议一种类似@ignatius提供的方法。

由于您不需要培训第一个模型和第二个模型,所以您可以这样做:

  1. 对整个数据集使用第一个模型,并将提取的结果保存在内存中。
  2. 使用前一步的结果来训练第二个模型。

这样,您将只需要加载一个模型在给定的时间。

此外,这将使第二种模式的培训更快。

编辑1

( op已经指定他没有足够的内存来处理推理结果)

在这种情况下,我可以建议在第一个模型的推理和第二个模型的训练之间并行化。

这可以通过预加脂来实现。

让我们将原始数据集表示为data1,并将第一个模型的相应推断结果表示为data2。

我们还将第一个模型表示为M1,第二个模型表示为M2。

因此,您可以执行以下操作:

  1. 将M1加载到cpu,将M2加载到gpu。
  2. 从data1中抽取一个批处理,并使用M1为M2准备一批data2。
  3. 使用gpu对从上一步接收的批处理进行M2培训。
  4. 在执行步骤3时,通过执行步骤2准备下一批data2。

这样,当M2被训练成一个批处理时,下一个批正在准备。这称为预取下一批。

这将使M2的训练和data2的制作并行化。

我前面描述的方法使用tensorflow "Data“api有一个非常简单的实现方法。

下面是一个代码示例:

代码语言:javascript
复制
import numpy as np
from tensorflow.keras import backend as K
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
from tensorflow.data import Dataset

with K.device('cpu0'):
    input = Input((10,))
    x = Dense(100)(input)
    m1 = Model(input_shape=input, outputs=x)

with K.device('gpu0'):
    input = Input((100,))
    x = Dense(5)(input)
    m2 = Model(input_shape=input, outputs=x)


features = np.random.rand(10, 2000)
labels = np.random.randint(2, size=2000)
dataset = Dataset.from_tensor_slices((features, labels))


def preprocess_sample(features, label):
    inference = m2.predict(features, batch_size=1)
    return inference, label


dataset = dataset.shuffle(2000).repeat().map(preprocess_sample).batch(32)
dataset = dataset.prefetch(1)

m2.fit(dataset, epochs=100, steps_per_epoch=2000//32)
票数 3
EN

Data Science用户

发布于 2018-11-15 21:28:46

我以前在有线电视新闻网( CNN )的大型架构中见过这个问题。如果第一个网络不会改变,那么使用该网络对所有数据进行预测,并使用输出作为第二个网络的培训数据。您可以将其保存为单独的数据集并重用它。

编辑-我刚刚注意到Gal Avineri发布了同样的答案。

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

https://datascience.stackexchange.com/questions/41252

复制
相关文章

相似问题

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