tutorial start interference python flask tensorflow tensorflow-serving

python - start - tensorflow serving



TensorFlow REST Frontend pero no TensorFlow Sirviendo (3)

Este proyecto github muestra un ejemplo práctico de restaurar un punto de control modelo y usar Flask.

@app.route(''/api/mnist'', methods=[''POST'']) def mnist(): input = ((255 - np.array(request.json, dtype=np.uint8)) / 255.0).reshape(1, 784) output1 = simple(input) output2 = convolutional(input) return jsonify(results=[output1, output2])

La demo línea parece bastante rápida.

Quiero implementar un modelo simple de TensorFlow y ejecutarlo en un servicio REST como Flask. No encontré hasta ahora buen ejemplo en github o aquí.

No estoy listo para usar TF Serving como se sugirió en otras publicaciones, es la solución perfecta para Google pero es excesiva para mis tareas con gRPC, bazel, codificación C ++, protobuf ...


Hay maneras diferentes de hacer esto. Puramente, usar tensorflow no es muy flexible, sin embargo es relativamente sencillo. La desventaja de este enfoque es que debe reconstruir el gráfico e inicializar las variables en el código donde restaura el modelo. Hay una manera mostrada en tensorflow skflow / contrib learn que es más elegante, sin embargo, esto no parece ser funcional en este momento y la documentación no está actualizada.

here puse un pequeño ejemplo en github que muestra cómo se nombrarían los parámetros GET o POST en un modelo de flujo tensorial REST desplegado en un matraz.

El código principal está entonces en una función que toma un diccionario basado en los datos POST / GET:

@app.route(''/model'', methods=[''GET'', ''POST'']) @parse_postget def apply_model(d): tf.reset_default_graph() with tf.Session() as session: n = 1 x = tf.placeholder(tf.float32, [n], name=''x'') y = tf.placeholder(tf.float32, [n], name=''y'') m = tf.Variable([1.0], name=''m'') b = tf.Variable([1.0], name=''b'') y = tf.add(tf.mul(m, x), b) # fit y_i = m * x_i + b y_act = tf.placeholder(tf.float32, [n], name=''y_'') error = tf.sqrt((y - y_act) * (y - y_act)) train_step = tf.train.AdamOptimizer(0.05).minimize(error) feed_dict = {x: np.array([float(d[''x_in''])]), y_act: np.array([float(d[''y_star''])])} saver = tf.train.Saver() saver.restore(session, ''linear.chk'') y_i, _, _ = session.run([y, m, b], feed_dict) return jsonify(output=float(y_i))


No me gusta poner mucho código con el procesamiento de datos / modelos en el archivo de descanso del matraz. Usualmente tengo clase de modelo tf y demás por separado. es decir , podría ser algo como esto:

# model init, loading data cifar10_recognizer = Cifar10_Recognizer() cifar10_recognizer.load(''data/c10_model.ckpt'') @app.route(''/tf/api/v1/SomePath'', methods=[''GET'', ''POST'']) def upload(): X = [] if request.method == ''POST'': if ''photo'' in request.files: # place for uploading process workaround, obtaining input for tf X = generate_X_c10(f) if len(X) != 0: # designing desired result here answer = np.squeeze(cifar10_recognizer.predict(X)) top3 = (-answer).argsort()[:3] res = ([cifar10_labels[i] for i in top3], [answer[i] for i in top3]) # you can simply print this to console # return ''Prediction answer: {}''.format(res) # or generate some html with result return fk.render_template(''demos/c10_show_result.html'', name=file, result=res) if request.method == ''GET'': # in html I have simple form to upload img file return fk.render_template(''demos/c10_classifier.html'')

cifar10_recognizer.predict (X) es func simple, que ejecuta la operación de predicción en la sesión tf:

def predict(self, image): logits = self.sess.run(self.model, feed_dict={self.input: image}) return logits

ps guardar / restaurar el modelo desde un archivo es un proceso extremadamente largo, trate de evitar esto mientras sirve solicitudes de publicación / recepción