Tengo un archivo pickle Sklearn de 350 MB que quiero cargar al iniciar la aplicación Flask.
Uso _pickle porque se menciona en la documentación que tiene un tiempo de carga más rápido:
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) El pickle se carga en 5 a 12 segundos localmente, pero en la instancia de Google App Engine F4 (1 GB de RAM), el trabajador gunicorn agota.
Registro de 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) Intenté aumentar el tiempo de espera del trabajador agregando el indicador -t en el archivo app.yaml de la siguiente manera y aún no funciona:
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: 500Incluso intenté usar eventlet y no funcionó:
gunicorn -t 120 -b :$PORT app:app --worker-class eventlet --workers 3El proceso de carga de un archivo de datos pickle de 350 MB está tardando demasiado y App Engine cree que tu instancia ha fallado. El tiempo de inicio de su contenedor es de más de tres minutos.
Tienes un problema que no se puede resolver fácilmente. El tamaño máximo de archivo es de 32 MB (64 MB para aplicaciones Go). Está descargando el archivo a la memoria, pero su instancia está tardando demasiado en descargarlo.
Solución: usaría un servicio diferente, como Cloud Run, donde puede incrustar su archivo de datos de pickle en la imagen del contenedor para que no se requieran descargas.
Pruebe con el punto de entrypoint: gunicorn -t 0 -b :$PORT app:app funcionó para mí.