首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tensorflow - auto_shard_policy :考虑关闭自动分片或将Tensorflow切换到数据以分片此数据集

Tensorflow - auto_shard_policy :考虑关闭自动分片或将Tensorflow切换到数据以分片此数据集
EN

Stack Overflow用户
提问于 2020-12-16 19:49:34
回答 1查看 4.8K关注 0票数 9

在keras /tensorflow中训练模型时:

代码片段:

代码语言:javascript
复制
strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy()

我收到以下错误/警告:

代码语言:javascript
复制
Consider either turning off auto-sharding or switching the auto_shard_policy to DATA to shard this dataset. You can do this by creating a new `tf.data.Options()` object then setting `options.experimental_distribute.auto_shard_policy = AutoShardPolicy.DATA` before applying the options object to the dataset via `dataset.with_options(options)`.
    2020-12-16 17:12:20.885741: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:127] None of the MLIR optimization passes are enabled (registered 2)
    2020-12-16 17:12:20.905570: I tensorflow/core/platform/profile_utils/cpu_utils.cc:112] CPU Frequency: 3593105000 Hz
    Epoch 1/40

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2020-12-18 00:16:29

这里的错误消息是tensorflow 2.4.0新收到的。虽然该错误提示了解决方案,但它假定您的数据是tf.data.Dataset类型的对象。以前没有严格的要求以这种形式输入数据(例如numpy数组就可以了),但现在它似乎是分布式策略(例如tf.distribute.MirroredStrategy())的一种要求。在任何情况下,似乎没有一种方法可以避免tensorflow的最新控制台-吐,而不是将数据包装在Dataset对象中。

因此,假设您当前的代码如下所示:

代码语言:javascript
复制
strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy()
with strategy.scope():
    model = ... # awesome model definition

train_x, train_y = np.array(...), np.array(...)
val_x, val_y = np.array(...), np.array(...)

batch_size = 32
model.fit(train_x, train_y, batch_size=batch_size, validation_data=(val_x, val_y))

它需要更改为如下所示:

代码语言:javascript
复制
strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy()
with strategy.scope():
    model = ... # awesome model definition

train_x, train_y = np.array(...), np.array(...)
val_x, val_y = np.array(...), np.array(...)

# Wrap data in Dataset objects.
train_data = tf.data.Dataset.from_tensor_slices((train_x, train_y))
val_data = tf.data.Dataset.from_tensor_slices((val_x, val_y))

# The batch size must now be set on the Dataset objects.
batch_size = 32
train_data = train_data.batch(batch_size)
val_data = val_data.batch(batch_size)

# Disable AutoShard.
options = tf.data.Options()
options.experimental_distribute.auto_shard_policy = tf.data.experimental.AutoShardPolicy.OFF
train_data = train_data.with_options(options)
val_data = val_data.with_options(options)

model.fit(train_data, validation_data=val_data)

请注意,如果您没有在Dataset对象上设置批处理大小,您将得到一个隐含的错误,如下所示:

代码语言:javascript
复制
File "/usr/lib/python3.8/site-packages/tensorflow/python/data/experimental/ops/distribute.py", line 496, in get_static_batch_dim
    return output_shape.dims[0].value
IndexError: list index out of range
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65322700

复制
相关文章

相似问题

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