Cargando correctamente el modelo de Keras en Django que soporta multi-tenancy

Intento escribir una api REST en django que usa un modelo de Keras para devolver una predicción. Sin embargo, la función load_model() tarda algún tiempo en cargar el modelo y no quiero que mis usuarios tengan que esperar tanto (cada vez que se inicializa el modelo). ¿Cuál sería la forma correcta de inicializar el modelo para que se cargue una vez y se hagan las predicciones utilizando ese mismo modelo?

En una nota al margen, uno de los métodos que creí posible era inicializar el modelo en settings.py como se muestra a continuación:

settings.py

 json_file=open("model.json","r") loaded_json=json_file.read() json_file.close() model=model_from_json(loaded_json) model.load_weights("model.h5") MODEL=model 

Y luego en mi views.py uso esta variable MODELO como:

vistas.py

 from django.conf import settings model=settings.MODEL def index(): print "Predicting" res=model.predict(numpy.stack([test_img])) print res 

Esto funciona muy bien si solo un usuario está activo a la vez (el modelo se inicializa una vez y todas las predicciones posteriores se realizan utilizando ese modelo). Sin embargo, si varios usuarios están activos a la vez, funciona bien para la llamada que se realizó primero, pero la última llamada genera el error.

 'NoneType' object has no attribute 'shape' Apply node that caused the error: ConvOp{('imshp', (31, 31, 32)),('kshp', (3, 3)),('nkern', 64),('bsize', None),('dx', 1),('dy', 1),('out_mode', 'valid'),('unroll_batch', None),('unroll_kern', None),('unroll_patch', True),('imshp_logical', (31, 31, 32)),('kshp_logical', (3, 3)),('kshp_logical_top_aligned', True)}(InplaceDimShuffle{0,2,3,1}.0, InplaceDimShuffle{3,2,0,1}.0) Toposort index: 13 Inputs types: [TensorType(float32, 4D), TensorType(float32, 4D)] Inputs shapes: [(1L, 31L, 31L, 32L), 'No shapes'] Inputs strides: [(123008L, 124L, 4L, 3844L), 'No strides'] Inputs values: ['not shown', None] Outputs clients: [[Elemwise{Composite{(i0 * ((i1 + i2) + Abs((i1 + i2))))}}[(0, 1)](TensorConstant{(1L, 1L, 1..1L) of 0.5}, ConvOp{('imshp', (31, 31, 32)),('kshp', (3, 3)),('nkern', 64),('bsize', None),('dx', 1),('dy', 1),('out_mode', 'valid'),('unroll_batch', None),('unroll_kern', None),('unroll_patch', True),('imshp_logical', (31, 31, 32)),('kshp_logical', (3, 3)),('kshp_logical_top_aligned', True)}.0, InplaceDimShuffle{x,0,x,x}.0)]] 

¿Cómo debo cargar el modelo correctamente para poder acceder a él simultáneamente?

Gracias por tu tiempo.

Mire aquí, por favor https://github.com/keras-team/keras/issues/2397#issuecomment-254919212

p.ej. en la configuración de Django construye el modelo …

 modelFile = 'path_to_my_model.h5' pipe = joblib.load(modelFile.replace('.h5','.pkl')) model = models.load_model(modelFile) pipe.steps.append(('nn', model)) graph = tensorflow.get_default_graph() 

y luego reutilizarlo así en el método REST de Django:

 import myDjango.settings as sett # ... @csrf_exempt def evaluate(request): """ Do the evaluation. """ if request.method == 'POST': data = JSONParser().parse(request) i = data['inputs'] outputs = MyMlClass.PredictArray( sett.graph, sett.pipe , i, 'model.h5' ) return JsonResponse(outputs, status=201, safe=False) 

Me funciona muy bien (proyecto VisualStudio Django, Python 3.6). La construcción del modelo en el controlador REST no se recomienda y, de hecho, no funcionará; funcionará solo en la primera invocación.