Help us understand the problem. What is going on with this article?

Python3 + responder + scikit-learnをGoogle App Engineスタンダード環境で実行する

前ふり

  • Python2でつくったAPIサーバーをGAEで実行しようとすると、スタンダード環境ではscikit-learnがセキュリティで引っかかって実行できなかった
  • じゃあPython3で実行するかなと思ったら、予想以上に面倒だったのでまとめてみた

準備

前提

  • gcloud SDKは設定済み

環境

  • 以前の記事を参考にPython2とPython3環境を準備する
  • Python3環境にする
  • gcloud SDKはPython2でしか実行できないのでpython2のPATHを通す
(env) $ which python2
/usr/local/bin/python2
(env) $ export CLOUDSDK_PYTHON="/usr/local/bin/python2"

ローカルで実行する

Flaskで実行する

(env) $ dev_appserver.py app.yaml

responderで実行する

  • サンプルはFlaskなのでresponderで実行するようにこちらの記事を参考に変えていく
app.yaml
 runtime: python37

 entrypoint: gunicorn --bind 0.0.0.0:$PORT -c gunicorn_conf.py main:app

 handlers:
 - url: /.*
   script: auto
   secure: always
gunicorn_conf.py
worker_class = 'uvicorn.workers.UvicornWorker'
main.py
import responder

app = responder.API()


@app.route("/")
async def index(request, response):
    response.text = "Hello World!"
requirements.txt
responder
gunicorn
uvicorn
  • 実行する
(env) $ dev_appserver.py app.yaml

GCPで実行する

デプロイ

(env) $ gcloud config set project <プロジェクトID>
(env) $ gcloud app deploy
  • (env) $ gcloud app browse で確認すると 502 Bad Gateway の表示…
  • GCPコンソールからログを確認する
"/opt/python3.7/lib/python3.7/os.py", line 221, in makedirs mkdir(name, mode) OSError: [Errno 30] Read-only file system: '/srv/static'
  • 静的ファイル用ディレクトリをつくろうとしてパーミッションエラーになってるぽい
  • もともとローカルに statictemplates というディレクトリはあるけれど、そのままだとデプロイされないもよう
  • というわけで、それぞれのディレクトリに空のファイルを作成する
(env) $ cd static
(env) $ touch index.html
(env) $ cd ../templates
(env) $ touch index.html
(env) $ cd ..
  • 再度デプロイする
(env) $ gcloud app deploy
  • (env) $ gcloud app browseHello World! の表示を確認する

scikit-learnを追加する

requirements.txt
responder
gunicorn
uvicorn
sklearn
main.py
import responder
from sklearn.datasets import load_iris

app = responder.API()

@app.route("/")
async def index(request, response):
    data = load_iris()
    response.text = str(data['DESCR'])

  • 再度デプロイする
(env) $ gcloud app deploy
  • (env) $ gcloud app browse Irisデータセットの説明表示を確認する
.. _iris_dataset:

Iris plants dataset
--------------------

**Data Set Characteristics:**

    :Number of Instances: 150 (50 in each of three classes)
    :Number of Attributes: 4 numeric, predictive attributes and the class
    :Attribute Information:
        - sepal length in cm
        - sepal width in cm
        - petal length in cm
        - petal width in cm
        - class:
                - Iris-Setosa
                - Iris-Versicolour
                - Iris-Virginica

    :Summary Statistics:
...
  • めでたしめでたし:smile:
  • 全ソースコードはGithubにアップ
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away