2016-08-13 34 views
21

Chcę wdrożyć prosty model TensorFlow i uruchomić go w usłudze REST, takiej jak Flask. Nie znalazłem do tej pory dobrego przykładu na github lub tutaj.TensorFlow REST Frontend ale nie TensorFlow Obsługa

nie jestem gotowy do użycia TF służąc jako sugerowane w innych postach, jest to idealne rozwiązanie dla Google, ale to przesada dla moich zadań z gRPC, Bazel, C++ kodowania, Protobuf ...

+1

, aby zawęzić pytanie, po prostu chcąc działającego przykładu zwracania wyników w kolbie po modelu ładowań – chro

Odpowiedz

5

Można to zrobić na różne sposoby. Czysto, użycie tensorflow nie jest zbyt elastyczne, jednak stosunkowo proste. Wadą tego podejścia jest to, że musisz odbudować wykres i zainicjować zmienne w kodzie, w którym przywracasz model. Jest sposób pokazany w tensorflow skflow/contrib learn, który jest bardziej elegancki, jednak obecnie nie wydaje się być funkcjonalny, a dokumentacja jest nieaktualna.

Połączyłem krótki przykład na github here, który pokazuje, jak nazwałbyś parametry GET lub POST do modelu tensorflow wdrożonego w REST.

Kod główny jest następnie w funkcji, która odbywa się w oparciu o słownik POST/GET dane:

@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)) 
3

To pokazuje github project działający przykład przywrócenia punktu kontrolnego modelu i użycia kolby.

@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]) 

Internetowy demo wydaje się dość szybki.

3

Nie lubię włożyć wiele kod z przetwarzaniem danych/modelu w kolbie spokojny pliku. Zazwyczaj mam tf model class i tak dalej oddzielnie. tj mogą być mniej więcej tak:

# 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) jest prosta func, który uruchamia operację predykcji sesji tf:

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

P.S. zapisywanie/przywracanie modelu z pliku jest niezwykle długim procesem, staraj się tego uniknąć podczas wyświetlania post/get