【问题标题】:Submit a Keras training job to Google cloud向 Google 云提交 Keras 培训作业
【发布时间】:2020-01-21 11:45:08
【问题描述】:

我正在尝试遵循本教程: https://medium.com/@natu.neeraj/training-a-keras-model-on-google-cloud-ml-cb831341c196

在 Google Cloud Platform 上上传和训练 Keras 模型,但我无法让它工作。

现在我已经从 GitHub 下载了这个包,我已经创建了一个带有 AI-Platform 和一个存储桶的云环境。

我正在将文件(具有建议的文件夹结构)上传到我的 Cloud Storage 存储桶(基本上是我存储的根目录),然后在云终端中尝试以下命令:

gcloud ai-platform jobs submit training JOB1 
 --module-name=trainer.cnn_with_keras 
 --package-path=./trainer 
 --job-dir=gs://mykerasstorage      
 --region=europe-north1         
 --config=gs://mykerasstorage/trainer/cloudml-gpu.yaml

但我得到错误,首先 cloudml-gpu.yaml 文件找不到,它说“没有这样的文件夹或文件”,然后试图删除它,我得到错误,因为它说 --init--.py 文件丢失,但它不是,即使它是空的(当我从教程 GitHub 下载时它是空的)。我猜我没有以正确的方式上传它。

关于我应该如何做到这一点的任何建议?教程本身确实没有这方面的信息。

我在另一个指南中读到可以让 gcloud 打包并直接上传作业,但我不确定如何执行此操作或在哪里编写命令,在我的终端中使用 gcloud 命令?还是在浏览器的 Cloud Shell 中?以及如何定义我的 python 文件所在的路径?

应该提到我正在使用 Mac,并且对使用 Keras 和 Python 非常陌生。

【问题讨论】:

    标签: tensorflow keras gcloud gcp-ai-platform-training


    【解决方案1】:

    我成功地按照你提到的教程进行了一些修改。

    我会提到所有的步骤,尽管你已经完成了一半。

    首先为作业创建一个云存储桶:

    gsutil mb -l europe-north1 gs://keras-cloud-tutorial
    

    要回答您应该在哪里编写这些命令的问题,取决于您想要存储将从 GitHub 下载的文件的位置。在您发布的教程中,作者使用自己的计算机运行命令,这就是他使用gcloud init 初始化 gcloud 命令的原因。但是,如果您在那里下载所需的文件,您也可以从 Cloud Shell 提交作业。 我们需要来自repository 的唯一文件是trainer 文件夹和setup.py 文件。因此,如果我们将它们放在名为 keras-cloud-tutorial 的文件夹中,我们将拥有以下文件结构:

    keras-cloud-tutorial/
    ├── setup.py
    └── trainer
        ├── __init__.py
        ├── cloudml-gpu.yaml
        └── cnn_with_keras.py
    

    现在,ImportError: No module named eager 错误的一个可能原因是您可能更改了 cloudml-gpu.yaml 文件中的 runtimeVersion。正如我们所读到的hereeager 是在 Tensorflow 1.5 中引入的。如果您指定了早期版本,则预计会遇到此错误。所以cloudml-gpu.yaml的结构应该是这样的:

    trainingInput:
      scaleTier: CUSTOM
      # standard_gpu provides 1 GPU. Change to complex_model_m_gpu for 4 GPUs
      masterType: standard_gpu
      runtimeVersion: "1.5"
    

    注意:“standard_gpu”是legacy machine type

    另外,setup.py 文件应如下所示:

    from setuptools import setup, find_packages
    
    setup(name='trainer',
          version='0.1',
          packages=find_packages(),
          description='Example on how to run keras on gcloud ml-engine',
          author='Username',
          author_email='user@gmail.com',
          install_requires=[
              'keras==2.1.5',
              'h5py'
          ],
          zip_safe=False)
    

    注意: 如您所见,我已指定我想要keras 的版本2.1.5。这是因为如果我不这样做,将使用与早于2.0 的 Tensorflow 版本存在兼容性问题的最新版本。

    如果一切都设置好了,您可以通过在文件夹keras-cloud-tutorial 中运行以下命令来提交作业:

    gcloud ai-platform jobs submit training test_job --module-name=trainer.cnn_with_keras --package-path=./trainer --job-dir=gs://keras-cloud-tutorial --region=europe-west1 --config=trainer/cloudml-gpu.yaml
    

    注意:我使用了gcloud ai-platform 而不是gcloud ml-engine 命令,尽管两者都可以。不过,在未来的某个时候,gcloud ml-engine 将被弃用。

    注意:在选择提交作业的地区时要小心。某些区域不支持 GPU,如果选择会抛出错误。例如,如果在我的命令中将region 参数设置为europe-north1 而不是europe-west1,我将收到以下错误:

    错误:(gcloud.ai-platform.jobs.submit.training)RESOURCE_EXHAUSTED: 项目配额失败。 1 K80 的请求 加速器超过允许的最大值 0 K80, 0 P100, 0 P4, 0 T4, 0 TPU_V2、0 TPU_V3、0 V100。如需详细了解 Cloud ML Engine 配额, 见https://cloud.google.com/ml-engine/quotas。 - '@type':type.googleapis.com/google.rpc.QuotaFailure 违规: - 描述:对 1 个 K80 加速器的请求超过了允许的最大值 0 K80、0 P100、0 P4、0 T4、0 TPU_V2、0 TPU_V3、0 V100。 主题:

    您可以阅读更多关于herehere 的每个区域的功能。

    编辑:

    完成训练作业后,您指定的存储桶中应该有 3 个文件夹:logs/model/packages/。模型保存在model/ 文件夹和.h5 文件中。请记住,如果您为目标设置了特定文件夹,则应在末尾包含“/”。例如,您应该设置gs://my-bucket/output/ 而不是gs://mybucket/output。如果您执行后者,您最终会得到文件夹outputoutputlogsoutputmodel。在output 里面应该有packages。作业页面链接应指向output 文件夹,因此请务必检查存储桶的其余部分!

    此外,在 AI-Platform 作业页面中,您应该能够看到有关 CPUGPUNetwork 利用率的信息:

    另外,我想澄清一些事情,因为我看到您发布了一些相关问题作为答案:

    您的本地环境,无论是您的个人 Mac 还是 Cloud Shell,都与实际的培训工作无关。您不需要在本地安装任何特定的包或框架。您只需要安装 Google Cloud SDK(当然已经安装了 Cloud Shell)即可运行相应的gcloudgsutil 命令。您可以阅读更多关于 AI 平台上的训练作业如何工作的详细信息 here

    希望我的回答对你有帮助。

    【讨论】:

    • 谢谢你!我现在确实尝试使用您建议的参数运行,现在它可以工作了!伟大的。唯一的问题是,现在我找不到应该保存的训练模型。作业状态有一个指向模型位置(我指定的文件夹)的链接,但是当我单击它或查看文件夹时,那里没有文件?或者我存储桶中的其他任何地方。
    • 您是否尝试通过单击控制台中的“刷新”按钮来刷新存储桶?您指定的存储桶中应该有 3 个文件夹:logs/model/packages/。如果您为目标设置了特定文件夹,则应在末尾包含“/”。例如,您应该设置gs://my-bucket/output/ 而不是gs://mybucket/output。如果您执行后者,您最终会得到文件夹outputoutputlogsoutputmodel。在output 里面应该有packages。作业页面链接应指向output 文件夹,因此请务必检查存储桶的其余部分!
    • 找到了 :) 另一个问题,我认为现在它只在 CPU 上运行,因为我只能看到作业的 CPU 统计数据,而 GPU 什么也看不到。我如何控制它是在谷歌云的 GPU 还是 CPU 上训练?
    • @Tessmus 您应该能够在 AI-Platform 作业页面的 GPU 选项卡中查看 GPU 利用率信息。我已经用屏幕截图编辑了我的答案,您可以在哪里找到它以及上一条评论中提供的信息。
    • 非常感谢您!查看 GPU 选项卡时,什么都没有,只有 CPU 标签上,所以它似乎在 CPU 上运行,尽管 cloudml-gpu.yaml 中有这个标志“masterType:standard_gpu”。在谷歌云上训练的时间几乎和我在本地 macbook 上的时间一样长,所以我认为它绝对不能在 GPU 上运行。除了 cloudml-gpu.yaml 之外,还有其他地方可以指定它在 GPU 上运行吗?在当前运行中,我确实使用了欧洲北部地区,但没有收到任何错误消息。
    【解决方案2】:

    我现在通过不上传文件而只是在我的本地终端上从云端运行上传命令来让它工作到一半......但是在运行过程中出现错误,以“作业失败”结尾

    似乎它试图从名为 “from tensorflow.python.eager import context”的 TensorFlow 后端导入一些内容,但出现 ImportError: No module named eager

    我已经尝试过 "pip install tf-nightly",这是在另一个地方建议的,但它说我没有权限或者我失去了与云 shell 的连接(正是当我尝试运行命令)。

    我还尝试在本地创建一个虚拟环境以匹配 gcloud(使用 Conda)上的虚拟环境,并使用 Conda 使用 Python=3.5、Tensorflow=1.14.0 创建了一个环境Keras=2.2.5,gcloud 应该支持。

    python 程序在本地的这个环境中运行良好,但是当我尝试在 gcloud 上运行作业时,我仍然得到 (ImportError: No module named eager)。

    我在提交作业时设置了 --python-version 3.5 标志,但是当我在 google cloud shell 中编写命令“Python -V”时,它显示 Python=2.7。这可能是问题吗?我还没有找到使用云 shell 提示更新 python 版本的方法,但它说谷歌云应该支持 python 3.5。如果这仍然是问题,关于如何在谷歌云上升级 python 版本有什么建议吗?

    也可以手动在谷歌云网络界面中找到一个新工作,这样做,我得到一个不同的错误消息:错误:找不到满足要求 cnn_with_keras.py 的版本(来自版本: none)没有找到 cnn_with_keras.py 的匹配分布cnn_with_keras.py 是本教程中我的 Python 代码,在本地运行良好。

    真的不知道下一步该做什么。任何建议或提示都会非常有帮助!

    【讨论】:

      【解决方案3】:

      GPU 的问题现在解决了,很简单,我的谷歌云帐户禁用了 GPU 设置,需要升级。

      【讨论】:

      • 很高兴听到问题已解决。实际上,您需要有一个付费帐户才能使用 GPU,而且新项目应用了必须更改的全局 GPU 配额。但是,在您的情况下,这应该会引发配额警告/错误。为了社区的利益,请接受您的正确答案,如果它帮助您解决问题,请点赞我的答案。
      • 啊,当然!我在这里很新,所以现在不了解这些功能,希望我现在设法投票并宣布解决方案。非常感谢您的帮助!我目前在我的项目中还有另一个问题,关于在谷歌云上加载预训练的 keras 模型:stackoverflow.com/questions/59927900/…
      猜你喜欢
      • 2017-07-25
      • 1970-01-01
      • 2017-03-09
      • 2017-12-31
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多