[Day 28] Final Project (4/5) — 部署模型到 Google AI Platform

前情提要

昨天我们成功的让 App 在本机端运作,但按下 开始预测! 後却出现了错误:
App crash

这意味着虽然 App 试图使用 ironbird/app.pyironbird/utils.py 内的函式与 GCP 取得联系,但可能存在以下问题:

  • 找不到模型 (错误的 API 呼叫或模型不存在)
  • 因为认证问题而无法使用现有模型。

部署模型到 Google AI Platform

为了修正上述的问题,今天我们要准备完成的东西如下:

  • 训练好的模型 (用於鸟类分类,会上传到 Google Storage)。
  • Google Storage 的值区 (来存放训练好的模型)。
  • 部署到 Google AI Platform 的模型 (会连接到存放於 Google Storage 值区的模型)。
  • 可让我们存取模型的金钥。

那就让我们开始吧:

  1. 训练模型并存为 SavedModel 格式 (这是针对 TensorFlow,若使用 Pytorch 就改为 state_dict 之类的即可),这部分详细请参考 Colab model_training.ipynb 的说明。

  2. 有了 SavedModel 後,我们就可以把它传到 Google Storage,但在此之前必须 建立 Google Storage 值区
    creating-buckets
    取一个喜欢的名字就好,储存位置我是选择 asia-east1 (台湾),但因为 Colab 的主机在美国,所以选择 us- 开头的也可以,这样档案的传输速度会快一点,剩下的选项就按照预设的即可 (详细步骤可以参考上方超连结)。

  3. 有了值区之後就可以把模型复制到上面了,在 Colab 中我们会使用以下指令取得授权:

    # Authentic Colab
    # (Running this will give you a code to authentic your Google Colab instance, keep the verification code secret)
    from google.colab import auth
    auth.authenticate_user()
    

    接着安装 CLI 工具:

    # Install and initialize the gcloud command line tool - https://cloud.google.com/sdk/docs/install
    # (this will give you access to gcloud tools within Colab)
    !curl https://sdk.cloud.google.com | bash 1> /dev/null
    !gcloud init
    

    最後就可以使用 !gsutil cp -r <YOUR_MODEL_PATH> <YOUR_GOOGLE_STORAGE_BUCKET>
    SavedModel 上传到值区。
    执行这一步骤时,会被问很多与设定 gcloud 相关的问题,以下是会被问到的问题与我的回答 (请选择自己的 Google Cloud project):

    # Pick configuration to use:
    #  [1] Re-initialize this configuration [default] with new settings 
    #  [2] Create a new configuration
    # Please enter your numeric choice:  1
    
    # Choose the account you would like to use to perform operations for 
    this configuration:
    #  [1] [email protected]
    #  [2] Log in with a new account
    # Please enter your numeric choice:  1
    
    # Pick cloud project to use: 
    #  [1] civic-capsule-327205
    #  [2] data-button-305900
    #  [3] first-haven-327205
    #  [4] ironman-327706
    #  [5] Create a new project
    # Please enter numeric choice or text value (must exactly match list 
    # item):  4
    

    以下为范例程序码:

    # Copy model to bucket - https://cloud.google.com/storage/docs/uploading-objects#gsutil 
    # Use "-r" for folders (r stands for recursive)
    !gsutil cp -r efficientnet_model_1_10_classes gs://ironbird_2021
    
  4. 将值区内的模型连接到 AI Platform,这部分详细一样参考 官方文件
    create model
    区域我一样选择 asia-east1。

  5. 在 AI Platform 建立模型之後,我们需要建立版本并将其与现有模型连结。
    这步骤首先需要在模型列表内点选刚刚建立的模型,然後再点选 新增版本,以下为参考选项:
    create a model version

    接着需要将这个版本与我们存放在 Google Storage 的模型连结:
    link to Google Storage

    最後资源的部分选择 自动调整资源配置 以及最低的 n1-standard-2, 2 vCPUs, 7.5 GB memory 即可。
    这部分会需要等待一段时间

  6. 接着需要建立服务帐户,这样才能得到模型的存取权,这部分一样参考 官方文件 即可,其中最重要的步骤在於专案存取权的角色要选择 AI 平台开发人员
    Create service account

  7. 有了服务帐户之後,我们可以进入管理金钥的页面点选 新增金钥,并下载成 .JSON 档存放於 ironbird 资料夹内。
    service account keys

    ⚠️ 金钥会授与 GCP 帐号的存取权,所以务必不要分享给别人! (例如把 *.json 加到 .gitignore 以避免传到 Github 上)

  8. 最後需要修改以下变数:

    • app.py 内的 GCP 金钥位址改为你的金钥位址:
      # Google Cloud Services look for these when your app runs
      # Old
      os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "ironman-327706-ba995652161d.json"
      # New
      os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "<PATH_TO_YOUR_KEY>"
      
    • app.py 内的 GCP project 与区域改为你的 GCP project 与区域:
      # Old
      PROJECT = "ironman-327706"
      REGION = "asia-east1" 
      # New
      PROJECT = "<YOUR_GCP_PROJECT_NAME>"
      REGION = "<YOUR_GCP_REGION>"
      
      注意这里的 project 名称要使用专案 ID
      project id
    • utils.py 内的 "model_name" 改为前面建立的模型名称:
      # Old
      classes_and_models = {
          "model_1": {
              "classes": base_classes,
              "model_name": "ironbird_model_1" 
          }
      }
      
      # New
       classes_and_models = {
         "model_1": {
             "classes": base_classes,
             "model_name": "<YOUR_AI_PLATFORM_MODEL_NAME>" 
         }
      }
      
  9. 完成上述所有步骤後,重新执行 开始预测! 应该就能得到结果了:
    success full

以上就是今天的内容啦,明天我们就可以把这个 App 部署到 Google App Engine 上,这样就能在世界的任何角落使用我们的 App 啦~~
/images/emoticon/emoticon27.gif


<<:  Proxmox VE 帐号管理及权限指派

>>:  Day30:附魔

Day 9 情报收集 - Information Gathering (netmask)

今天要介绍netmask,是可以让我们自由转换各种不同表示类型的网路地址以及子网遮罩,在划分子网路的...

Day 1 | 在安装之後

这是第一次参加铁人赛,期待自己可以依照书上的教学将Kotlin学好,并具备开发小型系统的能力。 此次...

推荐! 开发的线上辅助工具

今天在分享几个方便好用的工具。 一个是 Android Asset Studio ,有9种图标的变形...

2021-Day25. Serverless(十 三): AWS - ECS Deploy

第一次後制工作做到怀疑人生 0.0 看一次就发现一次AWS帐号的个资出现在画面上,每看一次就抓到一...

创建App-讨论区界面

踏入讨论区的界面,麻烦的事情开始出现啦,需要在每个主题上插入按键,再插入文字框来显示主题文字,况且跳...