存储在 Google Cloud 上的大量 TF 记录文件

Posted

技术标签:

【中文标题】存储在 Google Cloud 上的大量 TF 记录文件【英文标题】:Huge size of TF records file to store on Google Cloud 【发布时间】:2020-11-22 07:15:29 【问题描述】:

我正在尝试修改一个 tensorflow 项目,使其与 TPU 兼容。

为此,我从this 网站上解释的代码开始。

这里下载 COCO 数据集,首先使用 InceptionV3 模型提取其特征。 我想修改这段代码,使其支持 TPU。

为此,我根据this 链接添加了 TPU 的强制代码。

在 TPU 策略范围内,我使用 keras 库创建了 InceptionV3 模型,并根据现有代码加载了具有 ImageNet 权重的模型。

现在,由于 TPU 需要将数据存储在 Google Cloud 存储中,因此我使用 tf.Example 在 this 链接的帮助下创建了一个 tf 记录文件。

现在,我尝试以多种方式创建此文件,以便它拥有 TPU 将通过 TFRecordDataset 找到的数据。

起初我直接将图像数据和图像路径添加到文件并将其上传到 GCP 存储桶,但在读取此数据时,我意识到此图像数据没有用,因为它不包含所需的形状/大小信息并且在存储之前我没有将其调整到所需的尺寸。这个文件大小变成了 2.5GB,这没问题。 然后我认为让我们只将图像路径保留在云端,所以我创建了另一个只有图像路径的 tf 记录文件,然后我认为这可能不是优化代码,因为 TPU 将不得不单独打开图像将其调整为 299,299 然后馈送进行建模,如果我通过 TFRecordDataset 中的 .map() 函数获得图像数据会更好,所以我再次尝试,这次使用this 链接,通过将 R、G 和 B 以及图像路径存储在 tf 记录文件中.

但是,现在我看到 tf 记录文件的大小异常大,大约 40-45GB,最终我停止了执行,因为我的内存在 Google Colab TPU 上被填满了。

COCO dataset 的原始大小并没有那么大。它几乎像 13GB.. 并且仅使用前 30,000 条记录创建数据集。所以 40GB 看起来很奇怪。

我可以知道这种特征存储方式有什么问题吗?有没有更好的方法将图像数据存储在 TF 记录文件中,然后通过 TFRecordDataset 提取。

【问题讨论】:

【参考方案1】:

我认为作为 T​​FRecords 处理的 COCO 数据集在 GCS 上应该在 24-25 GB 左右。请注意,TFRecord 并不是一种压缩形式,它们将数据表示为 protobuf,因此可以将其最佳加载到 TensorFlow 程序中。

如果您参考:https://cloud.google.com/tpu/docs/coco-setup(对应的脚本可以找到here)将COCO(或子集)转换为TFRecords,您可能会获得更大的成功。

此外,我们使用针对 GPU/TPU here 优化的 TF2/Keras 实现了 COCO 检测模型,您可能会发现这对于优化输入管道很有用。示例教程可以在here 找到。谢谢!

【讨论】:

太好了.. 非常感谢您的回答.. 由于我没有得到任何回复,因此我继续在 GCP 上加载图像,然后在提取有效的功能时阅读它.. 但我仍然更喜欢图像数据直接存储在云端而不是图像本身。一旦完成模型的剩余工作,我一定会浏览链接。 很高兴这对你有用!为了澄清,这是否意味着您的输入管道是这样的?原始图像 -> 加载到 TF -> 预处理?如果,那么您可能会遇到一个瓶颈,即预处理所需的时间比每个批次的 TPU 训练时间长。如果您觉得 TPU 训练比预期慢,以上链接可能会有所帮助! 其实我不是在做这个级别的训练。我只需要从 Inception 模型中提取 30k 图像的图像特征,并且在没有 TPU 的情况下需要将近 3-4 小时。但现在我用 TPU 在几分钟内完成了它。现在下一个代码与使用这些功能和更多输入的实际训练部分相关。

以上是关于存储在 Google Cloud 上的大量 TF 记录文件的主要内容,如果未能解决你的问题,请参考以下文章

将大量文件从 Google Cloud Storage 复制到 Google Colab,无需记录/打印

如何使用 gsutil 将所有文件和子文件夹从当前目录复制/移动到 Google Cloud Storage 存储桶

Cloud Storage 上的 Google App Engine 文件

Google Cloud Dataproc 上的 Pyspark 作业失败

在 Google App Engine 上的数据存储区中更新大量实体

需要帮助从 Google Cloud 下载存储桶