วัตถุประสงค์
เอกสารนี้ให้ตัวอย่างสำหรับการใช้งานตามวัตถุประสงค์ของ SignatureDefs ใน SavedModel ที่แมปกับ API ของ TensorFlow Serving
ภาพรวม
SignatureDef กำหนดลายเซ็นของการคำนวณที่รองรับในกราฟ TensorFlow SignatureDefs มุ่งหวังที่จะให้การสนับสนุนทั่วไปเพื่อระบุอินพุตและเอาต์พุตของฟังก์ชัน และสามารถระบุได้เมื่อสร้าง SavedModel
พื้นหลัง
TF-Exporter และ SessionBundle ใช้ ลายเซ็น ซึ่งมีแนวคิดคล้ายกัน แต่ต้องการให้ผู้ใช้แยกความแตกต่างระหว่างลายเซ็นที่มีชื่อและลายเซ็นเริ่มต้นเพื่อให้สามารถดึงข้อมูลได้อย่างถูกต้องเมื่อโหลด สำหรับผู้ที่เคยใช้ TF-Exporter/SessionBundle มาก่อน ลาย Signatures
ใน TF-Exporter จะถูกแทนที่ด้วย SignatureDefs
ใน SavedModel
โครงสร้าง SignatureDef
SignatureDef ต้องการข้อกำหนดของ:
-
inputs
เป็นแผนผังของสตริงไปยัง TensorInfo -
outputs
เป็นแมปของสตริงไปยัง TensorInfo -
method_name
(ซึ่งสอดคล้องกับชื่อวิธีการที่รองรับในเครื่องมือ/ระบบการโหลด)
โปรดทราบว่า TensorInfo เองต้องมีข้อกำหนดเฉพาะของชื่อ dtype และรูปร่างของเทนเซอร์ แม้ว่าข้อมูลเทนเซอร์จะมีอยู่ในกราฟอยู่แล้วก็ตาม การกำหนด TensorInfo ไว้อย่างชัดเจนให้เป็นส่วนหนึ่งของ SignatureDef ก็มีประโยชน์ เนื่องจากเครื่องมือจะทำการตรวจสอบความถูกต้องของลายเซ็นได้ ฯลฯ โดยไม่ต้องอ่านคำจำกัดความของกราฟ
ค่าคงที่และยูทิลิตี้ที่เกี่ยวข้อง
เพื่อความสะดวกในการใช้ซ้ำและแบ่งปันระหว่างเครื่องมือและระบบต่างๆ ค่าคงที่ที่ใช้กันทั่วไปที่เกี่ยวข้องกับ SignatureDefs ที่จะได้รับการสนับสนุนใน TensorFlow Serving จึงถูกกำหนดให้เป็นค่าคงที่ โดยเฉพาะ:
นอกจากนี้ SavedModel ยังมี ยูทิลิตี้ เพื่อช่วยสร้างลายเซ็น-def
โครงสร้างตัวอย่าง
TensorFlow Serving มี API ระดับสูงสำหรับการอนุมาน หากต้องการเปิดใช้งาน API เหล่านี้ โมเดลต้องมี SignatureDef อย่างน้อย 1 รายการที่กำหนดโหนด TensorFlow ที่แน่นอนเพื่อใช้สำหรับอินพุตและเอาต์พุต ดูตัวอย่าง SignatureDefs เฉพาะที่ TensorFlow Serving รองรับในแต่ละ API ด้านล่าง
โปรดทราบว่าการให้บริการ TensorFlow ขึ้นอยู่กับคีย์ของ TensorInfo แต่ละรายการ (ในอินพุตและเอาต์พุตของ SignatureDef) รวมถึง method_name ของ SignatureDef เนื้อหาที่แท้จริงของ TensorInfo นั้นเฉพาะเจาะจงกับกราฟของคุณ
ลายเซ็นการจำแนกประเภทDef
Classification SignatureDefs รองรับการเรียกที่มีโครงสร้างไปยัง Classification API ของ TensorFlow Serving สิ่งเหล่านี้กำหนดให้ต้องมีเทนเซอร์ inputs
และมีเทนเซอร์เอาท์พุตทางเลือกสองตัว: classes
และ scores
ซึ่งต้องมีอย่างน้อยหนึ่งคลาส
signature_def: {
key : "my_classification_signature"
value: {
inputs: {
key : "inputs"
value: {
name: "tf_example:0"
dtype: DT_STRING
tensor_shape: ...
}
}
outputs: {
key : "classes"
value: {
name: "index_to_string:0"
dtype: DT_STRING
tensor_shape: ...
}
}
outputs: {
key : "scores"
value: {
name: "TopKV2:0"
dtype: DT_FLOAT
tensor_shape: ...
}
}
method_name: "tensorflow/serving/classify"
}
}
ทำนายลายเซ็นDef
Predict SignatureDefs รองรับการเรียกไปยัง Predict API ของ TensorFlow Serving ลายเซ็นเหล่านี้ช่วยให้คุณสามารถรองรับเทนเซอร์อินพุตและเอาท์พุตจำนวนมากได้อย่างยืดหยุ่น สำหรับตัวอย่างด้านล่าง ลายเซ็น my_prediction_signature
มี images
Tensor อินพุตแบบลอจิคัลตัวเดียวที่แมปกับ Tensor จริงในกราฟของคุณ x:0
คาดการณ์ SignatureDefs ช่วยให้สามารถพกพาข้ามรุ่นได้ ซึ่งหมายความว่าคุณสามารถสลับใน SavedModels ที่แตกต่างกันได้ อาจมีชื่อ Tensor พื้นฐานที่แตกต่างกัน (เช่น แทนที่จะเป็น x:0
บางทีคุณอาจมีโมเดลสำรองใหม่ที่มี Tensor z:0
) ในขณะที่ลูกค้าของคุณสามารถออนไลน์อย่างต่อเนื่องเพื่อสอบถามทั้งเก่าและใหม่ เวอร์ชันของโมเดลนี้โดยไม่มีการเปลี่ยนแปลงฝั่งไคลเอ็นต์
Predict SignatureDefs ยังช่วยให้คุณสามารถเพิ่ม Tensors เพิ่มเติมให้กับเอาต์พุต ซึ่งคุณสามารถสืบค้นได้อย่างชัดเจน สมมติว่านอกเหนือจากคีย์เอาต์พุตด้านล่างของ scores
แล้ว คุณยังต้องการดึงเลเยอร์การรวมกลุ่มเพื่อการแก้ไขจุดบกพร่องหรือเพื่อวัตถุประสงค์อื่นด้วย ในกรณีนั้น คุณเพียงแค่เพิ่ม Tensor เพิ่มเติมด้วยคีย์ เช่น pool
และค่าที่เหมาะสม
signature_def: {
key : "my_prediction_signature"
value: {
inputs: {
key : "images"
value: {
name: "x:0"
dtype: ...
tensor_shape: ...
}
}
outputs: {
key : "scores"
value: {
name: "y:0"
dtype: ...
tensor_shape: ...
}
}
method_name: "tensorflow/serving/predict"
}
}
ลายเซ็นการถดถอยDef
Regression SignatureDefs รองรับการเรียกแบบมีโครงสร้างไปยัง Regression API ของ TensorFlow Serving สิ่งเหล่านี้กำหนดว่าจะต้องมีเทนเซอร์ inputs
หนึ่งรายการและเทนเซอร์ outputs
หนึ่งรายการ
signature_def: {
key : "my_regression_signature"
value: {
inputs: {
key : "inputs"
value: {
name: "x_input_examples_tensor_0"
dtype: ...
tensor_shape: ...
}
}
outputs: {
key : "outputs"
value: {
name: "y_outputs_0"
dtype: DT_FLOAT
tensor_shape: ...
}
}
method_name: "tensorflow/serving/regress"
}
}