พื้นหลัง:
ในแอปพลิเคชันการมองเห็นบน GCP เรากำลังใช้การให้บริการ TF แอปพลิเคชันที่ใช้ TF Serving เขียนเป็นภาษา Go แอปพลิเคชันนี้แปลงรูปภาพเป็น Tensor และส่งไปยัง TF ที่ให้บริการโดยใช้ gRPC
ปัญหา:
ตรรกะการประมวลผลล่วงหน้าใน Golang ไม่ทำงานเช่นเดียวกับใน Python โดยใช้ไลบรารีรูปภาพ Keras (ความแม่นยำของการอนุมานลดลง) สาเหตุส่วนหนึ่งอาจเป็นเพราะมีการใช้ไลบรารี Python ในระหว่างการฝึก
เราพยายามแล้ว
การให้บริการ Tensorflow เป็นวิธีในการแนะนำตัวประมวลผลล่วงหน้าที่สามารถทำงานบนคอนเทนเนอร์ที่ให้บริการได้ ดูเหมือนว่าจะมีฟังก์ชันการทำงานที่จำกัด (ไม่สามารถรวมไลบรารี Keras กับโมเดลได้) เราลองสองตัวเลือกต่อไปนี้
สิ่งที่ได้ผลคือ Keras Preprocessing (Python) บนฝั่งไคลเอ็นต์ดังต่อไปนี้
img = tf.keras.preprocessing.image.load_img(file_name, target_size=(HEIGHT, WIDTH))
img_array = tf.keras.preprocessing.image.img_to_array(img)
… grpc โทรไปที่ TensorflowServing...
เป้าหมายของเราคือการใช้ “serving_input_receiver_fn” และประมวลผลรูปภาพล่วงหน้าในพื้นที่ TFServing ตามที่อธิบายไว้ในโพสต์บนบล็อกนี้: https://medium.com/devseed/technical-walkthrough-packaging-ml-models-for-inference-with-tf-serving-2a50f73ce6f8
แต่โค้ดต่อไปนี้ซึ่งดำเนินการเป็น "serving_input_receiver_fn" ไม่ได้ให้ผลการอนุมานที่ถูกต้อง
image = tf.image.decode_image(image_str_tensor, channels=CHANNELS dtype=tf.uint8)
image = tf.reshape(image, [HEIGHT, WIDTH, CHANNELS])
เป้าหมายของเราคือการเรียกใช้โค้ด Keras ต่อไปนี้ (ในทำนองเดียวกัน) ภายใน ““serving_input_receiver_fn” (สมมติว่าเราสามารถโหลดรูปภาพจากสตรีม “grpc”)
img = tf.keras.preprocessing.image.load_img(file_name, target_size=(HEIGHT, WIDTH))
img_array = tf.keras.preprocessing.image.img_to_array(img)
เป็นไปได้ไหม? นี่เป็นการใช้งานครั้งใหญ่ (70 GPU และ 2300 CPU) ดังนั้นประสิทธิภาพทุกบิตจึงมีความสำคัญ ในกรณีของเรา การประมวลผลภาพล่วงหน้าบนเครื่อง TF-Serving นั้นเหมาะสมที่สุด