5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

もしあなたがタイタニックに乗ったら...死ぬ。

Last updated at Posted at 2020-02-16

できたもの

zwmew-57a83.gif

なにやってるのか

  1. モデルを作成
  2. GCPにモデルをデプロイ
  3. GCP上で予測

※ タイタニックの「年齢」「性別」を学習データとしています。
※ XGBoostで生存できるかの2クラス分類モデルを作っています。
※ GCPのAI-Platformにモデルをデプロイし予測します。

GoogleColab

notebookにしましたので、もし
※ 2020/02/16 時点での情報及び動作確認となります。

手順

notebookとほぼ同じ内容を記載しています。
Colabを開くのがめんどくさい方はこちらを御覧頂ければと思います。


GCP アカウント登録

【画像で説明】Google Cloud Platform (GCP)の無料トライアルでアカウント登録


Google Cloud SDK のインストール

Google Cloud SDK のインストール ~ 初期化


SDK認証

gcloudコマンドをつかってGCPをいじるためGoogleアカウントで認証します。

$ gcloud auth login

プロジェクト作成

ID はカブり禁止です。

$ PROJECT_ID=anata-no-pj-id
$ PROJECT_NAME=anata-no-pj-name

$ gcloud projects create $PROJECT_ID \
--name $PROJECT_NAME

請求先アカウントの設定

設定しておかないとバケットにアクセスする際などで403エラーになります。

以下のポップアップが出なければ、請求先アカウント設定済みなのでスキップしてOKです。


プロジェクトをアクティブに

コマンド操作の対象プロジェクトに設定する。

$ gcloud config set project $PROJECT_ID

確認

! gcloud config list

# [component_manager]
# disable_update_check = True
# [compute]
# gce_metadata_read_timeout_sec = 0
# [core]
# account = anata-no-address@gmail.com
# project = anata-no-pj-id
# 
# Your active configuration is: [default]
  • project = anata-no-project-id

となっていればOK


リージョン、ゾーン、インタープリタを設定

REGION=us-central1
ZONE=us-central1-a

$ gcloud config set compute/region $REGION
$ gcloud config set compute/zone $ZONE
$ gcloud config set ml_engine/local_python $(which python3)

AI Platform のオンライン予測が使えるリージョンは以下、、

  • us-central1
  • us-east1
  • us-east4
  • asia-northeast1
  • europe-west1

インタープリタはローカルトレーニングの際にpython3系を使うように指定。


確認

$ gcloud config list

# [component_manager]
# disable_update_check = True
# [compute]
# gce_metadata_read_timeout_sec = 0
# region = us-central1
# zone = us-central1-a
# [core]
# account = anata-no-address@gmail.com
# project = anata-no-pj-id
# [ml_engine]
# local_python = /usr/bin/python3
# 
# Your active configuration is: [default]
  • region = us-central1
  • zone = us-central1-a
  • local_python = /usr/bin/python3

となっていればOK


トレーニング用のコード一式をクローン

$ git clone https://github.com/komiyakomiyakomiya/titanic_prediction_on_gcp.git

modelを保存するディレクトリを作成

notebook
import os

os.makedirs('./titanic_prediction_on_gcp/working/models/', exist_ok=True)

ローカルでトレーニング & モデルを保存

トレーニング済モデルが ./titanic_prediction_on_gcp/working/models/model.pkl として保存されます。

$ gcloud ai-platform local train \
--package-path titanic_prediction_on_gcp/working/ \
--module-name working.predict_xgb

バケットの作成

保存したモデルをアップロードするため、GCSにバケットを作ります。
※ 請求先アカウントを設定していないと403エラーになります。

BUCKET_NAME=anata-no-bkt-name

$ gsutil mb -l $REGION gs://$BUCKET_NAME

確認

$ gsutil ls -la

# gs://anata-no-bkt-name/

保存したモデルをGCSへアップロード

$ gsutil cp ./titanic_prediction_on_gcp/working/models/model.pkl gs://$BUCKET_NAME/models/model.pkl

確認

$ gsutil ls gs://$BUCKET_NAME/models/

# gs://anata-no-bkt-name/models/model.pkl

APIを有効化

AI-Platform APIを使うためには以下の2つを有効化。

  • ml.googleapis.com
  • compute.googleapis.com
$ gcloud services enable ml.googleapis.com
$ gcloud services enable compute.googleapis.com

確認

$ gcloud services list --enabled

# NAME                              TITLE
# bigquery.googleapis.com           BigQuery API
# bigquerystorage.googleapis.com    BigQuery Storage API
# cloudapis.googleapis.com          Google Cloud APIs
# clouddebugger.googleapis.com      Stackdriver Debugger API
# cloudtrace.googleapis.com         Stackdriver Trace API
# compute.googleapis.com            Compute Engine API
# datastore.googleapis.com          Cloud Datastore API
# logging.googleapis.com            Stackdriver Logging API
# ml.googleapis.com                 AI Platform Training & Prediction API
# monitoring.googleapis.com         Stackdriver Monitoring API
# oslogin.googleapis.com            Cloud OS Login API
# servicemanagement.googleapis.com  Service Management API
# serviceusage.googleapis.com       Service Usage API
# sql-component.googleapis.com      Cloud SQL
# storage-api.googleapis.com        Google Cloud Storage JSON API
# storage-component.googleapis.com  Cloud Storage
  • compute.googleapis.com Compute Engine API
  • ml.googleapis.com AI Platform Training & Prediction API

があればOK


モデルリソース / バージョンリソースの作成

モデルリソースとバージョンリソースを作成し、アップロードしたmodel.pklと紐付けます。

モデルリソース

MODEL_NAME=model_xgb
MODEL_VERSION=v1

$ gcloud ai-platform models create $MODEL_NAME \
--regions $REGION

バージョンリソース

! gcloud ai-platform versions create $MODEL_VERSION \
--model $MODEL_NAME \
--origin gs://$BUCKET_NAME/models/ \
--runtime-version 1.14 \
--framework xgboost \
--python-version 3.5

インプットデータの確認

あらかじめ用意していたデータで予測をしてみます。
まずは中身を確認。

! cat titanic_prediction_on_gcp/input/titanic/predict.json

# [36.0, 0] <- 36歳, 男性

[年齢, 性別]という形式で、性別は男性:0, 女性:1とします。


AI-Platformで予測

! gcloud ai-platform predict \
--model model_xgb \
--version $MODEL_VERSION \
--json-instances titanic_prediction_on_gcp/input/titanic/predict.json

[0.44441232085227966] こんな予測値が返ってくればOK。


サービスアカウントの作成

次はpythonからAI-Platformにアクセスし、予測を取得します。
サービスアカウントキーが必要になるので、まずはサービスアカウントを作成。

SA_NAME=anata-no-sa-name
SA_DISPLAY_NAME=anata-no-sa-display-name

$ gcloud iam service-accounts create $SA_NAME \
--display-name $SA_DISPLAY_NAME \

サービスアカウントに権限を付与

$ gcloud projects add-iam-policy-binding $PROJECT_ID \
--member serviceAccount:anata-no-sa-name@anata-no-pj-id.iam.gserviceaccount.com \
--role roles/iam.serviceAccountKeyAdmin

$ gcloud projects add-iam-policy-binding $PROJECT_ID \
--member serviceAccount:anata-no-sa-name@anata-no-pj-id.iam.gserviceaccount.com \
--role roles/ml.admin

サービスアカウントキーの生成

$ gcloud iam service-accounts keys create titanic_prediction_on_gcp/service_account_keys/key.json \
--iam-account anata-no-sa-name@anata-no-pj-id.iam.gserviceaccount.com

key.jsonのパスを環境変数として読み込む

.envファイルを生成し環境変数とパスを記述

$ echo GOOGLE_APPLICATION_CREDENTIALS=/content/titanic_prediction_on_gcp/service_account_keys/key.json > /content/titanic_prediction_on_gcp/.env

確認

$ cat ./titanic_prediction_on_gcp/.env

# GOOGLE_APPLICATION_CREDENTIALS=/content/titanic_prediction_on_gcp/service_account_keys/key.json

## python-dotenvをインストール Colabに入っていないので
$ pip install python-dotenv

予測を取得するための関数を定義

notebook
import googleapiclient.discovery
from dotenv import load_dotenv

# 環境変数設定
load_dotenv('/content/titanic_prediction_on_gcp/.env')


def main(input_data):
    input_data = [input_data]

    PROJECT_ID = 'anata-no-pj-id'
    VERSION_NAME = 'v1'
    MODEL_NAME = 'model_xgb'

    service = googleapiclient.discovery.build('ml', 'v1')
    name = 'projects/{}/models/{}'.format(PROJECT_ID, MODEL_NAME)
    name += '/versions/{}'.format(VERSION_NAME)

    response = service.projects().predict(
        name=name,
        body={'instances': input_data}
    ).execute()

    if 'error' in response:
        print(response['error'])
    else:
        pred = response['predictions'][0]

    return pred

年齢と性別のドロップダウンメニューを作成

notebook
import ipywidgets as widgets
from ipywidgets import HBox, VBox


age = [i for i in range(101)]
sex = ['男性', '女性']

dropdown_age = widgets.Dropdown(options=age, description='年齢: ')
dropdown_sex = widgets.Dropdown(options=sex, description='性別: ')
variables = VBox(children=[dropdown_age, dropdown_sex])

VBox(children=[variables])

予測

notebook
import numpy as np
from IPython.display import Image
from IPython.display import display_png


input_age = float(dropdown_age.value)
input_sex = 0 if dropdown_sex.value == '男性' else 1
test_input = [input_age, input_sex]

pred = main(test_input)
# print(pred)
pred_binary = np.where(pred > 0.5, 1, 0)
# print(pred_binary)

print('\nあなたがタイタニックに乗ると...')

if pred_binary == 1:
    display_png(Image('/content/titanic_prediction_on_gcp/images/alive.png'))
else:
    display_png(Image('/content/titanic_prediction_on_gcp/images/dead.png'))

公式リファレンス

まとめ

最後まで読んで頂きありがとうございました。
36歳のおじさんである私は死ぬようなので、タイタニックに乗る際には細心の注意をはらおうと思います。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?