2016-06-05 12 views
0

Ich habe eine Flask-Webanwendung auf Azure mit einem Dreamspark-Abonnement erstellt. Es verwendet Bibliotheken wie Numpy, Scipy und Theano.Interner Serverfehler bei Azure Flask Web App

Wenn ich die App mithilfe einer einfachen Theano-Berechnungen bereitstellen, funktioniert es perfekt. Wenn ich jedoch den Code in eine komplexere Theano-Berechnung umwandele, erhalte ich einen internen Serverfehler.

Hier ist ein Beispielcode. Als ich simpleFunction (so etwas wie eine Theano Funktion für eine Summe) nenne es funktioniert, aber wenn complexFunction (so etwas wie eine Bildklassifikation Berechnung) Aufruf erstellt dann einen Fehler Internal Server:

from flask import Flask 
app = Flask(__name__) 
wsgi_app = app.wsgi_app 

from fileContainingTheanoCode import simpleFunction, complexFunction 

@app.route('/') 
def hello(): 
    result = simpleFunction() 
    thisStr = str(result) 
    return """<html> 
        <head> 
         <title>Test website</title> 
        </head> 
        <body> 
         <h1>"""+thisStr+"""</h1> 
        </body> 
       </html>""" 


if __name__ == '__main__': 
    HOST = os.environ.get('SERVER_HOST', 'localhost') 
    try: 
     PORT = int(os.environ.get('SERVER_PORT', '5555')) 
    except ValueError: 
     PORT = 5555 
    app.run(HOST, PORT) 

Aus Gründen der Übersichtlichkeit ist hier der Code für die Datei theanoCode.py (es ist ein Faltungs Neural Network Classifier wird das Lademodul verwendet mnist-Datensatz von Dateien zu lesen):

# Import Libraries---------------------------------------------------------- 
import os 
import sys 
import pickle 
import theano 
import numpy as np 
from theano import tensor as T 
from theano.tensor.nnet.conv import conv2d 
from theano.tensor.signal.downsample import max_pool_2d 
from theano.sandbox.rng_mrg import MRG_RandomStreams as RandomStreams 
srng = RandomStreams() 
import load 

testSize = 10 
trainSize = 2 
#--------------------------------------------------------------------------- 

# Constants----------------------------------------------------------------- 
weightsFile = 'mnist.weights' 
#--------------------------------------------------------------------------- 

# Model--------------------------------------------------------------------- 
# Stuff variable into numpy array with theano float datatype 
def floatX(X): 
    return np.asarray(X, dtype=theano.config.floatX) 


# Initialize weights randomly 
def init_weights(shape): 
    return theano.shared(np.asarray(np.random.randn(*shape) * 0.01, dtype=theano.config.floatX),borrow=True) 


# ReLU - rectify linear function with Theano 
def rectify(X): 
    return T.maximum(X, 0.) 


# Softmax operation 
def softmax(X): 
    e_x = T.exp(X - X.max(axis=1).dimshuffle(0, 'x')) 
    return e_x/e_x.sum(axis=1).dimshuffle(0, 'x') 


# Implements random chance of ignoring a neuron output during training 
def dropout(X, p=0.): 
    if p > 0: 
     retain_prob = 1 - p 
     X *= srng.binomial(X.shape, p=retain_prob, dtype=theano.config.floatX) 
     X /= retain_prob 
    return X 


# Gradient Descent with regularization - parameter reduction 
def RMSprop(cost, params, lr=0.001, rho=0.9, epsilon=1e-6): 
    grads = T.grad(cost=cost, wrt=params) 
    updates = [] 
    for p, g in zip(params, grads): 
     acc = theano.shared(p.get_value() * 0.) 
     acc_new = rho * acc + (1 - rho) * g ** 2 
     gradient_scaling = T.sqrt(acc_new + epsilon) 
     g = g/gradient_scaling 
     updates.append((acc, acc_new)) 
     updates.append((p, p - lr * g)) 
    return updates 


# Constructs the model 
def model(X, w1, w2, w3, w4, p_drop_conv, p_drop_hidden): 
    l1a = rectify(conv2d(X, w1, border_mode='full')) 
    l1 = max_pool_2d(l1a, (2, 2),ignore_border=False) 
    l1 = dropout(l1, p_drop_conv) 

    l2a = rectify(conv2d(l1, w2)) 
    l2 = max_pool_2d(l2a, (2, 2),ignore_border=False) 
    l2 = dropout(l2, p_drop_conv) 

    l3a = rectify(conv2d(l2, w3)) 
    l3b = max_pool_2d(l3a, (2, 2),ignore_border=False) 
    l3 = T.flatten(l3b, outdim=2) 
    l3 = dropout(l3, p_drop_conv) 

    # Fully connected Layer 
    l4 = rectify(T.dot(l3, w4)) 
    l4 = dropout(l4, p_drop_hidden) 

    # Classify the Output 
    pyx = softmax(T.dot(l4, w_o)) 
    return l1, l2, l3, l4, pyx 


# Load the data (tr = training, te = test) 
trX, teX, trY, teY = load.mnist(ntrain=trainSize, ntest=testSize, onehot=True) 


# Reshape training set to be 4-dimensional 
# negative value is to get ordering right (rather than mirror image) 
# Second parameter is color channels 
trX = trX.reshape(-1, 1, 28, 28) 
teX = teX.reshape(-1, 1, 28, 28) 

# Input variables 
X = T.dtensor4() 
Y = T.fmatrix() 


# WEIGHTS 
if os.path.isfile(weightsFile): 
    # Go get saved weights from file 
    [w1, w2, w3, w4, w_o] = pickle.load(open(weightsFile,'rb')) 
else: 
    # Initialize all layer weights 
    # (no. Inputs, no. Outputs, filter height, filter width) 
    # ver isto outra vez, minuto 48 
    w1 = init_weights((32, 1, 3, 3)) # 1 = num canais de cada imagem (cor) 
    w2 = init_weights((64, 32, 3, 3)) 
    w3 = init_weights((128, 64, 3, 3)) 
    w4 = init_weights((128 * 3 * 3, 625)) 
    w_o = init_weights((625, 10)) # from fully connected layer to classifier 


# This sets up the model graph and some vars for noise, which are the internal neurons 
noise_l1, noise_l2, noise_l3, noise_l4, noise_py_x = model(X, w1, w2, w3, w4, 0.2, 0.5) 

# No dropping neurons...so this will be used for prediction 
l1, l2, l3, l4, py_x = model(X, w1, w2, w3, w4, 0., 0.) 

# This makes predictions 
y_x = T.argmax(py_x, axis=1) 

# Compile prediction function - here named complexFunction 
complexFunction = theano.function(inputs=[X], outputs=y_x, allow_input_downcast=True) 

Hier ist die detaillierte Fehlermeldung:

Event: MODULE_SET_RESPONSE_ERROR_STATUS 
ModuleName FastCgiModule 
Notification EXECUTE_REQUEST_HANDLER 
HttpStatus 500 
HttpReason INTERNAL SERVER ERROR 
HttpSubStatus 0 
ErrorCode The operation completed successfully. 
(0x0) 

Und hier ist das Ereignisprotokoll:

</Data></EventData></Event><Event><System><Provider Name="ASP.NET 4.0.30319.0"/><EventID>1325</EventID><Level>3</Level><Task>0</Task><Keywords>Keywords</Keywords><TimeCreated SystemTime="2016-06-05T19:34:20Z"/><EventRecordID>1604538437</EventRecordID><Channel>Application</Channel><Computer>RD000D3A218E0C</Computer><Security/></System><EventData><Data>An unhandled exception occurred and the process was terminated. 

Application ID: /LM/W3SVC/1568611192/ROOT 

Process ID: 647864 

Exception: System.Configuration.ConfigurationErrorsException 

Message: Couldn't find type for class Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35. 

StackTrace: at System.Diagnostics.TraceUtils.GetRuntimeObject(String className, Type baseType, String initializeData) 
    at System.Diagnostics.TypedElement.BaseGetRuntimeObject() 
    at System.Diagnostics.ListenerElement.GetRuntimeObject() 
    at System.Diagnostics.ListenerElementsCollection.GetRuntimeObject() 
    at System.Diagnostics.TraceInternal.get_Listeners() 
    at System.Diagnostics.TraceInternal.WriteLine(String message) 
    at System.Diagnostics.Debug.WriteLine(String message) 
    at Microsoft.Web.Compilation.Snapshots.SnapshotHelper.TakeSnapshotTimerCallback(Object stateInfo) 
    at System.Threading.TimerQueueTimer.CallCallbackInContext(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.TimerQueueTimer.CallCallback() 
    at System.Threading.TimerQueueTimer.Fire() 
    at System.Threading.TimerQueue.FireNextTimers() 
    at System.Threading.TimerQueue.AppDomainTimerCallback()</Data></EventData></Event><Event><System><Provider Name=".NET Runtime"/><EventID>1026</EventID><Level>0</Level><Task>0</Task><Keywords>Keywords</Keywords><TimeCreated SystemTime="2016-06-05T19:34:20Z"/><EventRecordID>1604538453</EventRecordID><Channel>Application</Channel><Computer>RD000D3A218E0C</Computer><Security/></System><EventData><Data>Application: w3wp.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.Configuration.ConfigurationErrorsException 
    at System.Diagnostics.TraceUtils.GetRuntimeObject(System.String, System.Type, System.String) 
    at System.Diagnostics.TypedElement.BaseGetRuntimeObject() 
    at System.Diagnostics.ListenerElement.GetRuntimeObject() 
    at System.Diagnostics.ListenerElementsCollection.GetRuntimeObject() 
    at System.Diagnostics.TraceInternal.get_Listeners() 
    at System.Diagnostics.TraceInternal.WriteLine(System.String) 
    at System.Diagnostics.Debug.WriteLine(System.String) 
    at Microsoft.Web.Compilation.Snapshots.SnapshotHelper.TakeSnapshotTimerCallback(System.Object) 
    at System.Threading.TimerQueueTimer.CallCallbackInContext(System.Object) 
    at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.TimerQueueTimer.CallCallback() 
    at System.Threading.TimerQueueTimer.Fire() 
    at System.Threading.TimerQueue.FireNextTimers() 
    at System.Threading.TimerQueue.AppDomainTimerCallback() 

</Data></EventData></Event></Events> 
+0

Und wo ist der * Code? * Fügen Sie eine [MCVE]. – jonrsharpe

+0

Aktivieren Sie die Protokollierung und veröffentlichen Sie den tatsächlichen Fehler: http://StackOverflow.com/questions/32722143/flask-application-traceback-doesnt-show-up-in-server-log. – davidism

Antwort

0

Es gibt viele Gründe für das Problem verursacht mit Theano, wie Multithreads unter Verwendung von GPUs, Speichergrenzen, etc. Aber nach dem Code und der Fehlerinformation, Ich kann nicht sicher sein, was der Grund ist.

Ich schlage vor, dass Sie versuchen können, sich auf das theano Dokument "Debugging Theano: FAQ and Troubleshooting" und den Artikel "Azure Web App sandbox" zu beziehen, um das wirkliche Problem herauszufinden, das durch was verursacht wird.

Können Sie den Code der complexFunction teilen? Ich denke, es ist sehr hilfreich für die Analyse des Problems, sogar versuchen, es zu reproduzieren, um die Lösung herauszufinden.


aktualisieren:

nach Ihren Code & Ereignisprotokoll, ich glaube, es zwei mögliche Gründe sind, die das Problem verursacht.

  1. Einige Codelogikfehler haben den internen Serverfehler verursacht, aber wenn der Code gut funktioniert, ignorieren Sie diese Möglichkeit.

  2. Falsche Konfiguration für Ihre Webapp wie web.config, überprüfen Sie bitte im Abschnitt web.config, ob es richtig konfiguriert ist.

+0

Speicherbeschränkung ist mein Hauptanliegen, da ich ein Dreamspark-Abonnement verwende und als solches nur Zugriff auf eine 32-Bit-Webanwendung mit 1 GB RAM und 1 GB Speicher habe. Wenn ich die Speicherauslastung jedoch überwache, erreicht es nie 500 MB Arbeitsspeicher zu einem bestimmten Zeitpunkt. Btw, complexFunction Code ist jetzt in Frage – Crowing

+0

@Crowing Ich aktualisierte meine Post, die einige mögliche hilfreiche Informationen enthält. Ich hoffe es hilft. –