Flaskアプリの起動時にロードしたい350MBのSklearnピクルスファイルがあります。
_pickle
ドキュメントにロード時間が速いと記載されているため、使用します。
import _pickle as pickle
start = timeit.default_timer()
with open("pickle/pipeline.pkl", 'rb') as f:
# ~350MB file
pipeline = pickle.load(f)
stop = timeit.default_timer()
print('Time: ', stop - start)
ピクルスはローカルで5〜12秒で読み込まれますが、Google App Engine F4(1GB RAM)インスタンスでは、gunicorn
ワーカーがタイムアウトします。
Google App Engineログ:
A 2019-10-20T20:07:55Z [2019-10-20 20:07:55 +0000] [14] [INFO] Booting worker with pid: 14
A 2019-10-20T20:11:02Z [2019-10-20 20:04:14 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:14)
app.yaml
次のようにファイルに-tフラグを追加してワーカーのタイムアウトを増やしてみましたが、それでも機能しません。
runtime: python
instance_class: F4
env: flex
entrypoint: gunicorn -t 120 -b :$PORT app:app
liveness_check:
initial_delay_sec: 500
readiness_check:
app_start_timeout_sec: 500
イベントレットを使ってみましたが、うまくいきませんでした。
gunicorn -t 120 -b :$PORT app:app --worker-class eventlet --workers 3
350 MBのpickleデータファイルをロードするプロセスに時間がかかりすぎて、AppEngineはインスタンスに障害が発生したと判断します。コンテナの起動時間は3分を超えています。
簡単に解決できない問題があります。最大ファイルサイズは32MB(Goアプリケーションの場合は64 MB)です。ファイルをメモリにダウンロードしていますが、インスタンスのダウンロードに時間がかかりすぎています。
解決策:ダウンロードが不要になるように、ピクルスデータファイルをコンテナイメージに埋め込むことができるCloudRunなどの別のサービスを使用します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加