2016-08-13 36 views
21

Basit bir TensorFlow modelini dağıtmak ve Flask gibi REST hizmetinde çalıştırmak istiyorum. Github veya burada iyi bir örnek bulamadık.TensorFlow REST Frontend değil, TensorFlow Servisi

diğer mesajlar önerildiği olarak hizmet veren TF kullanıma hazır değilim, buna

+1

soruları yanıtlamayı deneyin. – chro

cevap

5

Bunu yapmanın farklı yolları vardır. Tamamen, tensorflow kullanımı çok esnek değil, ancak nispeten basittir. Bu yaklaşımın olumsuz tarafı, grafiği yeniden oluşturmanız ve modeli geri yüklediğiniz koddaki değişkenleri başlatmanız gerektiğidir. tensorflow skflow/contrib learn'da daha zarif olan bir yol vardır, ancak bu şu anda işlevsel görünmüyor ve dokümantasyon güncel değil.

GET veya here üzerinde GET veya POST parametrelerini REST uygulamalı tensorflow modeline nasıl adlandırdığınızı gösteren kısa bir örneği bir araya getiriyorum. Ben şişe dinlendirici dosyasında veri/model işleme çok kod koyun sevmiyorum

@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

Bu github project bir gösterir ... gRPC, Bazel, C++ kodlama, Protobuf ile benim görevler için overkill Google için mükemmel bir çözümdür ancak Bir model kontrol noktasını geri yükleme ve Flask kullanarak çalışma örneği.

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

Online demo oldukça hızlı görünüyor.

3

:

ana kod POST dayalı bir sözlük götüren bir işlevde daha sonra/veri GET. Genellikle tf model sınıfına ve benzerlerine sahibim. yani böyle bir şey olabilir:

# 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) basit işlev olduğunu, tf oturumda tahmin işlemini çalıştırır:

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

Not; Bir dosyadan modelin kaydedilmesi/geri yüklenmesi son derece uzun bir süreçtir, postalama/yüklendikten sonra Flask'ta sonuç döndürme ile ilgili bir çalışma örneği istemek için, post/get istekleri sunarken