如何保证训练阶段不会出现OOM?

2024-01-12

标题中的问题已经完成。 “如何保证训练阶段不会出现OOM?”

只是一些旁注,根据我的经验,有两种 OOM 情况。一种是模型和小批量所需的内存大于您拥有的内存。在这种情况下,训练阶段将永远不会开始。解决这个问题的解决方案是使用较小的批量大小。尽管如果我能够计算出我的硬件可以为某些特定模型管理的最大批量大小,那就太好了。但即使我第一次尝试找不到最大的批量大小,我总能通过一些尝试和错误找到它(因为该过程立即失败)。

我面临的 OOM 的第二种情况是训练过程开始时,并且持续了一段时间。甚至可能是几个纪元。但随后由于某种未知的原因,它面临 OOM。对我来说,这种情况令人沮丧。因为它随时可能发生,而且您永远不知道正在进行的培训是否会完成。到目前为止,我已经损失了几天的训练时间,而我认为一切都进展顺利。

我认为一些澄清是适当的。首先,我说的是带有 GPU 的个人计算机。其次,GPU是专用于计算的,而不是用于显示的。如果我错了,请纠正我,但我相信这意味着训练过程在不同时间点需要不同的内存大小。怎么可能呢?再说一次,我如何确保我的训练阶段不会面临 OOM?

以这次运行为例:

3150/4073 [======================>.......] - ETA: 53:39 - loss: 0.3323
2019-10-13 21:41:13.096320: W tensorflow/core/common_runtime/bfc_allocator.cc:314] Allocator (GPU_0_bfc) ran out of memory trying to allocate 60.81MiB (rounded to 63766528).  Current allocation summary follows.

经过三个小时的训练后,TensorFlow 要求的内存超出了我的硬件所能提供的内存。我的问题是,为什么在此时而不是在进程开始时增加内存分配?

[UPDATE]

鉴于 Eager 模式的已知问题,我将对我的案例进行一些说明。我没有以急切模式编码。这是我的训练代码的样子:

strategy = tf.distribute.OneDeviceStrategy(device="/gpu:0")
training_dataset = tf.data.Dataset.from_tensor_slices(...)
validation_dataset = tf.data.Dataset.from_tensor_slices(...)

with strategy.scope():
    model = create_model()

    model.compile(optimizer='adam', loss='categorical_crossentropy')

    pocket = EarlyStopping(monitor='val_loss', min_delta=0.001,
                           patience=5, verbose=1,
                           restore_best_weights = True)

    history = model.fit(training_dataset.shuffle(buffer_size=1000).batch(30),
                        epochs=3,
                        callbacks=[pocket],
                        validation_data=validation_dataset.shuffle(buffer_size=1000).batch(30),
                        workers=3, use_multiprocessing=True)

如果您在循环中重复训练,就会发生已知的内存泄漏 [1]。解决方案是调用tf.keras.backend.clear_session()并且可能gc.collect()时不时地循环。

不过,TF 1.15 和 2.0 中的行为似乎有所不同,这可能不足以修复它。我发现tf.keras.backend.clear_session()在我的 CPU 训练循环中,会重置逐渐的内存泄漏,而不会影响训练。

[1] https://github.com/tensorflow/tensorflow/issues/30324 https://github.com/tensorflow/tensorflow/issues/30324

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何保证训练阶段不会出现OOM? 的相关文章

  • Keras:多类 NLP 任务中 model.evaluate 与 model.predict 的准确性差异

    我正在使用以下代码在 keras 中为 NLP 任务训练一个简单模型 训练集 测试集和验证集的变量名称是不言自明的 该数据集有 19 个类 因此网络的最后一层有 19 个输出 标签也是 one hot 编码的 nb classes 19 m
  • 张量流中的复杂卷积

    我正在尝试运行一个简单的卷积 但包含复数 r np random random 1 10 10 10 i np random random 1 10 10 10 x tf complex r i conv layer tf layers c
  • libsvm 收缩启发法

    我在 C SVC 模式下使用 libsvm 和 2 次多项式内核 并且需要训练多个 SVM 在训练期间 我训练的一些 SVM 会收到以下一个或什至两个警告 WARNING using h 0 may be faster WARNING re
  • Keras model.predict 函数给出输入形状错误

    我已经在 Tensorflow 中实现了通用句子编码器 现在我正在尝试预测句子的类概率 我也将字符串转换为数组 Code if model model type universal classifier basic class probs
  • 使用预训练的 word2vec 初始化 Seq2seq 嵌入

    我对使用预训练的 word2vec 初始化tensorflow seq2seq 实现感兴趣 我已经看过代码了 嵌入似乎已初始化 with tf variable scope scope or embedding attention deco
  • 在张量流中向卷积神经网络提供可变大小的输入

    我正在尝试使用 feed dict 参数将不同大小的 2d numpy 数组列表传递给卷积神经网络 x tf placeholder tf float32 batch size None None None y tf placeholder
  • Ray:如何在一个 GPU 上运行多个 Actor?

    我只有一个 GPU 我想在该 GPU 上运行许多 Actor 这是我使用的方法ray 下列的https ray readthedocs io en latest actors html https ray readthedocs io en
  • 在 Keras 模型中删除然后插入新的中间层

    给定一个预定义的 Keras 模型 我尝试首先加载预先训练的权重 然后删除一到三个模型内部 非最后几层 层 然后用另一层替换它 我似乎找不到任何有关的文档keras io https keras io 即将做这样的事情或从预定义的模型中删除
  • 为什么我的结果仍然无法重现?

    我想要为 CNN 获得可重复的结果 我使用带有 GPU 的 Keras 和 Google Colab 除了建议插入某些代码片段 这应该允许再现性 之外 我还在层中添加了种子 This is the first code snipped to
  • sklearn LogisticRegressionCV 是否使用最终模型的所有数据

    我想知道sklearn中LogisticRegressionCV的最终模型 即决策边界 是如何计算的 假设我有一些 Xdata 和 ylabels Xdata shape of this is n samples n features yl
  • 使用 scikit-learn 进行二次采样 + 分类

    我正在使用 Scikit learn 进行二元分类任务 并且我有 0 级 有 200 个观察值 第 1 类 有 50 个观察值 而且因为我有不平衡的数据 我想抽取多数类的随机子样本 其中观察数量与少数类相同 并且希望使用新获得的数据集作为分
  • Keras:如何保存模型或权重?

    如果这个问题看起来很简单 我很抱歉 但是阅读 Keras 保存和恢复帮助页面 https www tensorflow org beta tutorials keras save and restore models https www t
  • 在 keras 中保存和加载权重

    我试图从我训练过的模型中保存和加载权重 我用来保存模型的代码是 TensorBoard log dir output model fit generator image a b gen batch size steps per epoch
  • 精度类型

    使用 keras 库获得的精度如下 model compile optimizer sgd loss mse metrics tf keras metrics Precision sklearn 计算出的哪种精度与 keras 计算出的精度
  • AttributeError:模块“tensorflow.python.summary.summary”没有属性“FileWriter”

    我收到此错误 尽管我到处都看过file writer tf summary FileWriter path to logs sess graph 被提到为正确的实施this https github com tensorflow tenso
  • MultiHeadAttention Attention_mask [Keras、Tensorflow] 示例

    我正在努力掩盖 MultiHeadAttention 层的输入 我正在使用 Keras 文档中的 Transformer Block 进行自我关注 到目前为止 我在网上找不到任何示例代码 如果有人能给我一个代码片段 我将不胜感激 变压器块来
  • 在keras自定义损失中使用层输出

    我正在 Keras 中开发自定义损失函数 我需要第一层输出 我怎样才能取回它 def custom loss y true y pred cross K mean K binary crossentropy y true y pred ax
  • 使用 Apache Commons lineIterator 时出现 OutOfMemory 错误

    我正在尝试使用 Apache Commons 逐行迭代 1 2GB 文件FileUtils lineIterator 然而 一旦LineIterator calls hasNext 我得到一个java lang OutOfMemoryErr
  • Java - 因内存不足错误而关闭

    关于如何最好地处理这个问题 我听到了非常矛盾的事情 并且陷入了以下困境 OOME 会导致一个线程崩溃 但不会导致整个应用程序崩溃 我需要关闭整个应用程序 但不能 因为线程没有剩余内存 我一直认为最佳实践是让它们离开 这样 JVM 就会死掉
  • 将 Keras 集成到 SKLearn 管道?

    我有一个 sklearn 管道 对异构数据类型 布尔 分类 数字 文本 执行特征工程 并想尝试使用神经网络作为我的学习算法来拟合模型 我遇到了输入数据形状的一些问题 我想知道我想做的事情是否可能 或者我是否应该尝试不同的方法 我尝试了几种不

随机推荐

  • MKPolylineRenderer 上的两条彩色/自定义线

    我正在画 x 条线MKMapView 数据是从网络服务下载的 对于每条需要绘制的线 我正在创建一个MKPolyline 将其添加到overlayArray 某些叠加层有多个折线 最后通过以下方式将该叠加层添加到地图中 self mapVie
  • .Value = "" 和 .ClearContents 之间有什么区别?

    如果我运行以下代码 Sub Test 1 Cells 1 1 ClearContents Cells 2 1 Value End Sub 当我使用公式检查 Cells 1 1 和 Cells 2 1 时ISBLANK 两个结果都返回TRUE
  • 指定的解决方案配置“最新|任何 CPU”无效

    我在 Jenkins 中运行的 MSBuild 脚本遇到此错误 C
  • 将 HTML 导出到 Excel 的单元格背景颜色

    我正在尝试将 HTML 表导出到 Excel 但我无法通过 CSS 设置单元格的背景颜色 我尝试过 Response Write 但这对我的输出没有影响 单元格颜色是否有一些 mso css 属性 尝试使用类似的东西
  • 在 Android 中编写许多 HTTP 请求的良好设计模式

    在我的应用程序中 我有很多 GET POST PUT 请求 现在 我有一个单例类来保存我下载的数据 并且有许多扩展 AsyncTask 的内部类 在我的单例类中 我还有一些这样的接口 Handlers for notifying liste
  • IMagick 检查图像亮度

    我需要能够在图像内自动写入一些文本 根据图像亮度 脚本必须用白色或黑色书写 那么如何使用 Imagick 检查图像的亮度 暗度呢 你可以这样做 Load the image imagick new Imagick image jpg con
  • Django/Python:了解 super 在函数中的使用方式

    我刚刚开始思考什么super以及它是如何在 Django 中基于视图的类中实现的 我试图了解 super 在以下代码中是如何工作的 有人可以尝试为我一点一点地分解它吗 from django views generic detail imp
  • Bash 忽略特定命令的错误

    我正在使用以下选项 set o pipefail set e 在 bash 脚本中 出现错误时停止执行 我有大约 100 行脚本正在执行 我不想检查脚本中每一行的返回代码 但对于一个特定的命令 我想忽略该错误 我怎样才能做到这一点 解决方案
  • 从 SearchView 更改片段提交又名级联到后台堆栈

    我目前正在使用SearchView对象 以便为我的应用程序提供建议输入的功能 然而 这个小部件在提交时使用intent filter开始您的搜索 当我的应用程序在手机上运行时 这非常棒 因为我想做的是启动搜索结果Activity显示响应 H
  • Devise - 如果帐户未确认,则重定向到页面

    如果用户的帐户尚未得到确认 我会尝试重定向用户 所以这涉及到两部分代码 首次创建帐户后重定向用户 如果他们在确认帐户之前尝试登录 请重定向他们 我需要第二个方面的帮助 我首先能够通过放入after inactive sign up path
  • Maven 编译器插件

    我知道默认的 Maven 编译器插件绑定到 compile 测试编译 生命周期 一般在不指定附加配置的情况下 我们不必 在我们的 POM 中明确定义它 但我仍然看到经验丰富的开发人员将诸如 这在他们的 POM 中 例如
  • 如何禁用主干历史记录但仍允许基于哈希的路由?

    假设我执行以下操作 单击主页 上的链接并转到 posts 1 触发事件并前往主干路由 posts 1 1 edit 我点击返回 我需要这样做 以便用户最终回到主页 而不是回到 posts 1 所以我需要允许骨干哈希路由工作但不修改历史记录
  • gcc 抑制警告“太小,无法容纳所有值”

    我需要使用范围枚举 以便我可以将它们作为特定类型传递给我们的序列化程序 我已经为枚举成员给出了明确的整数值Enum1 我已将与上面的描述相匹配的两个作用域枚举放入位字段中 enum class Enum1 value1 0x0 value2
  • Recyclerview 按字母顺序滚动条

    我需要实现一个类似于三星音乐应用程序的recyclerview字母滚动条 由于信誉低 我无法发布图像 我已阅读有关此的所有帖子 但我不想要气泡卷轴 我将所有字母表都放在垂直 LinearLayout 中 我想知道如何滚动到特定项目 你可以用
  • 如何在 JavaScript 中使用 x,y 坐标模拟点击?

    是否可以使用给定的坐标来模拟网页中 JavaScript 的点击 您可以派遣一个click事件 尽管这与真正的点击不同 例如 它不能用于欺骗跨域 iframe 文档 使其认为它已被单击 所有现代浏览器都支持document elementF
  • 在Python中按索引从列表中删除元素的简洁方法

    我有一个字符列表和索引列表 myList a b c d toRemove 0 2 我想通过一次操作得到这个 myList b d 我可以做到这一点 但有没有办法做得更快 toRemove reverse for i in toRemove
  • Java FileWriter 和 BufferedWriter 的区别

    它们之间有什么区别 我刚刚学习 Java ATM 但似乎我可以两种方式写入文件 我没有在这里复制 try catch 块 FileWriter file new FileWriter foo txt file write foobar fi
  • 张量流:在多个检查点运行模型评估

    在我当前的项目中 我训练一个模型并每 100 个迭代步骤保存检查点 检查点文件全部保存到同一目录 model ckpt 100 model ckpt 200 model ckpt 300 等 之后 我想根据所有已保存检查点 而不仅仅是最新检
  • WPF 数据网格样式

    有谁知道 有如何将 WPF DataGrid 布局更改为卡片视图或其他任何东西的示例 而不仅仅是行堆栈 结果看起来像这样 替代文本 http iwebthereforeiam com files ScreenShot gif http iw
  • 如何保证训练阶段不会出现OOM?

    标题中的问题已经完成 如何保证训练阶段不会出现OOM 只是一些旁注 根据我的经验 有两种 OOM 情况 一种是模型和小批量所需的内存大于您拥有的内存 在这种情况下 训练阶段将永远不会开始 解决这个问题的解决方案是使用较小的批量大小 尽管如果