tensorflow `tf.compat.v1.train.MonitoredTrainingSession`无法从s3恢复`checkpoint_dir`变量,

nle07wnf  于 5个月前  发布在  其他
关注(0)|答案(8)|浏览(48)

问题类型

Bug

你是否在TensorFlow Nightly版本中复现了这个bug?

源代码

二进制文件

TensorFlow版本

tf 2.7.0

自定义代码

OS平台和发行版

Linux Ubuntu 18.04

移动设备

  • 无响应*

Python版本

3.7.9

Bazel版本

  • 无响应*

GCC/编译器版本

  • 无响应*

CUDA/cuDNN版本

11.2

GPU型号和内存

  • 无响应*

当前行为?

[目录]
我们的项目使用tf.compat.v1.train.MonitoredTrainingSession创建一个训练会话。通常,我们需要从S3恢复一个预训练的模型。

1. 在我的项目中遇到的错误

在切换到TensorFlow 1之前,我们使用了TensorFlow 1.15.1,并将S3路径传递给checkpoint_dir,如下所示:

import tensorflow as tf
.....
checkpoint_dir = "s3://xxx/xx/"
tf.compat.v1.train.MonitoredTrainingSession(...., checkpoint_dir=checkpoint_dir, ...)

checkpoint_dir 包含恢复变量所需的一切,包括检查点、graph.pbtxt等。一切都运行正常。
在切换到TensorFlow 2.7.0后,我们意识到TensorFlow中引入了模块化文件系统。因此,我们安装了与TensorFlow 2.7.0兼容的TensorFlow-io版本0.23.0,代码变为:

import tensorflow as tf
import tensorflow_io as tfio
.....
checkpoint_dir = "s3://xxx/xx/"
tf.compat.v1.train.MonitoredTrainingSession(...., checkpoint_dir=checkpoint_dir, ...)

然而,它不再起作用,报告了一个错误:

.....
2023-08-02 16:02:40.147093: W tensorflow/core/framework/op_kernel.cc:1745] OP_REQUIRES failed at save_restore_v2_ops.cc:207 : DATA_LOSS: truncated block read
Traceback (most recent call last):
  File "/root/miniconda3/lib/python3.7/site-packages/tensorflow/python/client/session.py", line 1380, in _do_call
    return fn(*args)
  File "/root/miniconda3/lib/python3.7/site-packages/tensorflow/python/client/session.py", line 1364, in _run_fn
    target_list, run_metadata)
  File "/root/miniconda3/lib/python3.7/site-packages/tensorflow/python/client/session.py", line 1458, in _call_tf_sessionrun
    run_metadata)
tensorflow.python.framework.errors_impl.DataLossError: 2 root error(s) found.
  (0) DATA_LOSS: truncated block read
         [[{{node save/RestoreV2}}]]
         [[save/RestoreV2/_1]]
  (1) DATA_LOSS: truncated block read
         [[{{node save/RestoreV2}}]]
0 successful operations.
0 derived errors ignored.
.....

2. 使用简单代码重现问题

为了排除问题可能是由于我项目中的模型复杂性引起的可能,我使用了一个非常简单的代码来重现它。

2.1 步骤1:训练模型

首先,我使用以下代码训练一个非常简单的模型并将其保存在本地目录中:

import tensorflow as tf

tf.compat.v1.disable_eager_execution()
x = tf.compat.v1.placeholder(tf.float32, shape=(None, 1), name="x")
y = tf.compat.v1.placeholder(tf.float32, shape=(None, 1), name="y")

W = tf.Variable(tf.zeros([1, 1]), name="W")
b = tf.Variable(tf.zeros([1]), name="b")

y_pred = tf.matmul(x, W) + b
loss = tf.reduce_mean(tf.square(y - y_pred))

optimizer = tf.compat.v1.train.GradientDescentOptimizer(0.01)

global_step = tf.compat.v1.train.get_or_create_global_step()
train_op = optimizer.minimize(loss, global_step=global_step)

x_train = [[1], [2], [3], [4]]
y_train = [[0], [-1], [-2], [-3]]

config = tf.compat.v1.ConfigProto()
config.gpu_options.allow_growth = True
hooks = [tf.compat.v1.train.StopAtStepHook(last_step=500)]

checkpoint_dir = './checkpoints'

with tf.compat.v1.train.MonitoredTrainingSession(checkpoint_dir=checkpoint_dir,
                                                 config=config,
                                                 hooks=hooks) as sess:
    while not sess.should_stop():
        sess.run(train_op, feed_dict={x: x_train, y: y_train})

2.2 步骤2:将模型上传到S3

然后,我使用S3工具将 ./checkpoints 中的所有材料上传到远程S3路径:

s3cmd put ./checkpoints/ s3://xxxx/xxx/checkpoints/

2.3 步骤3:从S3恢复模型(错误)

最后,我使用以下代码恢复模型训练,并报告了一个错误:

import tensorflow as tf
import tensorflow_io as tfio

tf.compat.v1.disable_eager_execution()

x = tf.compat.v1.placeholder(tf.float32, shape=(None, 1), name="x")
y = tf.compat.v1.placeholder(tf.float32, shape=(None, 1), name="y")

W = tf.Variable(tf.zeros([1, 1]), name="W")
b = tf.Variable(tf.zeros([1]), name="b")

y_pred = tf.matmul(x, W) + b
loss = tf.reduce_mean(tf.square(y - y_pred))

optimizer = tf.compat.v1.train.GradientDescentOptimizer(0.01)

global_step = tf.compat.v1.train.get_or_create_global_step()

train_op = optimizer.minimize(loss, global_step=global_step)

x_train = [[1], [2], [3], [4]]
y_train = [[0], [-1], [-2], [-3]]

config = tf.compat.v1.ConfigProto()
config.gpu_options.allow_growth = True

checkpoint_dir = 's3://xxxx/xxx/checkpoints/'

hooks = [tf.compat.v1.train.StopAtStepHook(last_step=2000)]
with tf.compat.v1.train.MonitoredTrainingSession(checkpoint_dir=checkpoint_dir, config=config, hooks=hooks) as sess:
    while not sess.should_stop():
        sess.run(train_op, feed_dict={x: x_train, y: y_train})
of1yzvn4

of1yzvn41#

@bingo163,

tf.compat.v1.train.MonitoredTrainingSession API是为TensorFlow v1设计的。继续阅读以了解如何将此API迁移到原生的TensorFlow v2等效项。有关如何迁移其余代码的说明,请参阅TensorFlow v1 to TensorFlow v2 migration guide

另外,是否有使用tf.compat.v1.train.MonitoredTrainingSession API和TensorFlow v2.7的特定原因?我请求升级到最新稳定版本2.13。谢谢!

lqfhib0f

lqfhib0f2#

@bingo163,tf.compat.v1.train.MonitoredTrainingSession API是为TensorFlow v1设计的。继续阅读以了解如何从此API迁移到原生的TensorFlow v2等效项。有关如何迁移其余代码的说明,请参阅TensorFlow v1 to TensorFlow v2 migration guide
另外,是否有使用tf.compat.v1.train.MonitoredTrainingSession API和TensorFlow v2.7的特殊原因?我请求升级到最新稳定版本2.13。谢谢!
@tilakrayal
感谢快速回复。
我们的项目仍在使用tf.compat.v1.train.MonitoredTrainingSession API和TF 2.7版本,原因是更改API使用或升级TF版本将涉及许多方面的重新验证,包括模型收敛。因此,我们希望在尽可能不更改API使用和升级TF版本的情况下找到此错误的原因。
此外,根据您的建议,我已经将测试代码环境的TF版本和tensorflow-io版本升级到了2.13.0和0.33.0,但仍然出现了相同的错误。

dm7nw8vv

dm7nw8vv3#

我也使用了tf.compat.v1.train.Saver API(如下所示)从s3恢复变量,但报告了相同的错误。

xlpyo6sf

xlpyo6sf4#

@tilakrayal 有任何建议吗?

kmpatx3s

kmpatx3s5#

@sachinprasadhs 有任何建议吗?

pjngdqdw

pjngdqdw6#

感谢您报告此问题,我们将内部跟踪此问题以找到根本原因。同时,请您检查文档 here 中的新保存格式,以防您想将项目迁移到最新版本(强烈建议)。

du7egjpx

du7egjpx7#

感谢您报告此问题,我们将内部跟踪此问题以找到根本原因。
同时,请您检查文档 here 中的新保存格式,以防您想将项目迁移到最新版本(强烈建议)。
谢谢,期待您的回复。

ha5z0ras

ha5z0ras8#

感谢您报告此问题,我们将内部跟踪此问题以找到根本原因。
同时,请您检查文档 here 中的新保存格式,以防您想将项目迁移到最新版本(强烈建议)。
@sachinprasadhs 有更新吗?

相关问题