从Google Cloud Python作业中访问Google Storage上的文件

0 人关注

我正在松散地遵循一个 教程 ,在谷歌云AI平台上训练一个TensorFlow估计器。

我想访问一个包含我的训练和评估数据的目录,为此我把我的数据文件像这样递归地复制到谷歌存储。

gsutil cp -r data gs://name-of-my-bucket/data

这样做很好,gsutil ls gs://name-of-my-bucket/data ,正确返回。

gs://name-of-my-bucket/data/test.json
gs://name-of-my-bucket/data/test
gs://name-of-my-bucket/data/train

然而,从Python脚本中调用os.listdir(data_dir) ,对于迄今为止我所尝试的data_dir 的任何值,包括'data/''name-of-my-bucket/data/' ,都会产生一个FileNotFoundError 。为什么呢?

我知道我的Python脚本正在从目录中执行 /root/.local/lib/python3.7/site-packages/trainer//user_dir.

出现问题的Python代码(编辑)

这里是出现错误的那一行之前的代码,直接来自我的Python脚本的__main__ 部分。

PARSER = argparse.ArgumentParser()
PARSER.add_argument('--job-dir', ...)
PARSER.add_argument('--eval-steps', ...)
PARSER.add_argument('--export-format', ...)
ARGS = PARSER.parse_args()
tf.logging.set_verbosity('INFO')
os.environ['TF_CPP_MIN_LOG_LEVEL'] = str(tf.logging.__dict__['INFO'] / 10)
HPARAMS = hparam.HParams(**ARGS.__dict__)

这是出现错误的那行代码(一个独立函数的第一行,在我上面报告的那行代码之后被调用)。

mug_dirs = [f for f in os.listdir(image_dir) if not f.startswith('.')]

日志(编辑)

我的这个工作的日志是一个信息列表(加上5个与TensorFlow有关的弃用警告),然后是来自master-replica-0 任务的一个错误

Traceback (most recent call last): File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main "__main__", mod_spec) File "/usr/lib/python3.7/runpy.py", line 85, in _run_code exec(code, run_globals) File "/root/.local/lib/python3.7/site-packages/trainer/final_task.py", line 114, in <module> train_model(HPARAMS) File "/root/.local/lib/python3.7/site-packages/trainer/final_task.py", line 55, in train_model (train_data, train_labels) = data.create_data_with_labels("data/train/") File "/root/.local/lib/python3.7/site-packages/trainer/data.py", line 13, in create_data_with_labels mug_dirs = [f for f in os.listdir(image_dir) if not f.startswith('.')] FileNotFoundError: [Errno 2] No such file or directory: 'data/train/'

...接着是同一任务的另一个错误(报告我的Python命令的非零退出状态),然后是两个关于清理的信息,最后是service 任务的一个错误

The replica master 0 exited with a non-zero status of 1. Traceback (most recent call last): File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main "__main__", mod_spec) File "/usr/lib/python3.7/runpy.py", line 85, in _run_code exec(code, run_globals) File "/root/.local/lib/python3.7/site-packages/trainer/final_task.py", line 114, in <module> train_model(HPARAMS) File "/root/.local/lib/python3.7/site-packages/trainer/final_task.py", line 55, in train_model (train_data, train_labels) = data.create_data_with_labels("data/train/") File "/root/.local/lib/python3.7/site-packages/trainer/data.py", line 13, in create_data_with_labels mug_dirs = [f for f in os.listdir(image_dir) if not f.startswith('.')] FileNotFoundError: [Errno 2] No such file or directory: 'data/train/' To find out more about why your job exited please check the logs: https://console.cloud.google.com/logs/viewer?project=1047296516162&resource=ml_job%2Fjob_id%2Fml6_run_25&advancedFilter=resource.type%3D%22ml_job%22%0Aresource.labels.job_id%3D%22ml6_run_25%22
    
2 个评论
Hi @Giorgio, 你可能猜到了,这个错误意味着在path给定的目录中找不到指定的文件。我相信看到一些 示例代码 错误信息 会有帮助。请确保你遍历了文件夹以找到正确的文件脚本。请查看此 文档 以了解更多细节。
你好 @sllopis, 谢谢你的建议。我编辑了我的问题,更正了我认为我的脚本被调用的目录( /user_dir ),并添加了一些示例代码和日志。
python
google-cloud-platform
google-cloud-storage
gcp-ai-platform-training
Giorgio
Giorgio
发布于 2020-03-30
2 个回答
Nina Cai
Nina Cai
发布于 2020-04-01
0 人赞同

你可以使用tensorflow API来获取GCP上一个目录中的所有文件。你可以参考他们的文档 :https://www.tensorflow.org/api_docs/python/tf/io/gfile/glob

例如,如果你想获得你的GCP下的所有json文件,你可以使用这个。

import tensorflow as tf
json_files = tf.io.gfile.glob("gs://name-of-my-bucket/data/"+"*.json")
    
sllopis
sllopis
发布于 2020-04-01
已采纳
0 人赞同

云存储对象是一个平面命名空间,不包含在文件夹中。由于用户体验更友好,gsutil和谷歌云存储的用户界面将创建一个分层的文件树的错觉。更多信息可以在 文档 中找到。

现在,如果你试图从云存储上托管的文件对象中读取,你可能想使用以下 文档 ,使用云存储客户端库将对象下载到你的本地目录。另外,你也可以使用 gsutil cp 命令,它将允许你在本地目录和云存储桶之间复制数据,还有其他选项。