การกำหนดค่าการให้บริการ Tensorflow

ในคู่มือนี้ เราจะพูดถึงจุดการกำหนดค่าต่างๆ มากมายสำหรับการให้บริการ Tensorflow

ภาพรวม

แม้ว่าการกำหนดค่าส่วนใหญ่จะเกี่ยวข้องกับ Model Server แต่ก็มีหลายวิธีในการระบุลักษณะการทำงานของ Tensorflow Serving:

การกำหนดค่าเซิร์ฟเวอร์โมเดล

วิธีที่ง่ายที่สุดในการให้บริการโมเดลคือการจัดเตรียมแฟล็ก --model_name และ --model_base_path (หรือการตั้งค่าตัวแปรสภาพแวดล้อม MODEL_NAME หากใช้ Docker) อย่างไรก็ตาม หากคุณต้องการให้บริการหลายรุ่น หรือกำหนดค่าตัวเลือก เช่น ความถี่ในการโพลสำหรับเวอร์ชันใหม่ คุณสามารถทำได้โดยการเขียนไฟล์กำหนดค่า Model Server

คุณสามารถจัดเตรียมไฟล์การกำหนดค่านี้โดยใช้แฟล็ก --model_config_file และสั่งให้ Tensorflow Serving สำรวจหาไฟล์การกำหนดค่าเวอร์ชันที่อัปเดตนี้เป็นระยะๆ ในเส้นทางที่ระบุโดยการตั้งค่าแฟล็ก --model_config_file_poll_wait_seconds

ตัวอย่างการใช้นักเทียบท่า:

docker run -t --rm -p 8501:8501 \
    -v "$(pwd)/models/:/models/" tensorflow/serving \
    --model_config_file=/models/models.config \
    --model_config_file_poll_wait_seconds=60

กำลังโหลดการกำหนดค่าเซิร์ฟเวอร์โมเดลใหม่

มีสองวิธีในการรีโหลดการกำหนดค่า Model Server:

  • โดยการตั้งค่าแฟล็ก --model_config_file_poll_wait_seconds เพื่อสั่งให้เซิร์ฟเวอร์ตรวจสอบไฟล์กำหนดค่าใหม่เป็นระยะที่ --model_config_file filepath

  • โดยการออกการเรียก HandleReloadConfigRequest RPC ไปยังเซิร์ฟเวอร์และจัดหาการกำหนดค่า Model Server ใหม่โดยทางโปรแกรม

โปรดทราบว่าในแต่ละครั้งที่เซิร์ฟเวอร์โหลดไฟล์กำหนดค่าใหม่ เซิร์ฟเวอร์จะทำหน้าที่รับรู้เนื้อหาของการกำหนดค่าที่ระบุใหม่ และ เฉพาะ การกำหนดค่าที่ระบุใหม่เท่านั้น ซึ่งหมายความว่า หากมีโมเดล A อยู่ในไฟล์กำหนดค่าแรก ซึ่งถูกแทนที่ด้วยไฟล์ที่มีเฉพาะรุ่น B เซิร์ฟเวอร์จะโหลดโมเดล B และยกเลิกการโหลดโมเดล A

รายละเอียดการกำหนดค่าเซิร์ฟเวอร์โมเดล

ไฟล์คอนฟิกูเรชัน Model Server ที่ระบุต้องเป็น บัฟเฟอร์โปรโตคอล ModelServerConfig

สำหรับการใช้งานทั้งหมดยกเว้นกรณีการใช้งานขั้นสูงสุด คุณจะต้องใช้ตัวเลือก ModelConfigList ซึ่งเป็นรายการบัฟเฟอร์โปรโตคอล ModelConfig นี่เป็นตัวอย่างพื้นฐาน ก่อนที่เราจะเจาะลึกตัวเลือกขั้นสูงด้านล่าง

model_config_list {
  config {
    name: 'my_first_model'
    base_path: '/tmp/my_first_model/'
    model_platform: 'tensorflow'
  }
  config {
    name: 'my_second_model'
    base_path: '/tmp/my_second_model/'
    model_platform: 'tensorflow'
  }
}

การกำหนดค่าหนึ่งรุ่น

ModelConfig แต่ละรายการจะระบุโมเดลหนึ่งรายการที่จะให้บริการ รวมถึงชื่อและเส้นทางที่ Model Server ควรค้นหาเวอร์ชันของโมเดลที่จะให้บริการ ดังที่เห็นในตัวอย่างข้างต้น ตามค่าเริ่มต้น เซิร์ฟเวอร์จะให้บริการเวอร์ชันที่มีหมายเลขเวอร์ชันมากที่สุด ค่าเริ่มต้นนี้สามารถแทนที่ได้โดยการเปลี่ยนฟิลด์ model_version_policy

ให้บริการรุ่นเฉพาะของรุ่น

หากต้องการให้บริการเวอร์ชันเฉพาะของโมเดล แทนที่จะเปลี่ยนไปใช้เวอร์ชันที่มีหมายเลขเวอร์ชันมากที่สุดเสมอ ให้ตั้งค่า model_version_policy เป็น "เฉพาะ" และระบุหมายเลขเวอร์ชันที่คุณต้องการให้บริการ ตัวอย่างเช่น หากต้องการปักหมุดเวอร์ชัน 42 ให้เป็นเวอร์ชันที่ให้บริการ ให้ทำดังนี้

model_version_policy {
  specific {
    versions: 42
  }
}

ตัวเลือกนี้มีประโยชน์สำหรับการย้อนกลับไปเป็นเวอร์ชันที่ทราบดี ในกรณีที่พบปัญหาในเวอร์ชันล่าสุด

ให้บริการโมเดลหลายเวอร์ชัน

หากต้องการให้บริการโมเดลหลายเวอร์ชันพร้อมกัน เช่น หากต้องการเปิดใช้งานคานารีเวอร์ชันใหม่เบื้องต้นพร้อมการแบ่งส่วนข้อมูล ให้ตั้งค่า model_version_policy เป็น "เฉพาะ" และระบุหมายเลขเวอร์ชันหลายรายการ ตัวอย่างเช่น หากต้องการให้บริการเวอร์ชัน 42 และ 43:

model_version_policy {
  specific {
    versions: 42
    versions: 43
  }
}

การกำหนดป้ายกำกับสตริงให้กับเวอร์ชันของโมเดล เพื่อลดความซับซ้อนของ Canary และการย้อนกลับ

บางครั้งการเพิ่มระดับการอ้อมให้กับเวอร์ชันโมเดลก็มีประโยชน์ แทนที่จะแจ้งให้ลูกค้าของคุณทุกคนทราบว่าพวกเขาควรจะสืบค้นเวอร์ชัน 42 คุณสามารถกำหนดนามแฝง เช่น "เสถียร" ให้กับเวอร์ชันใดก็ตามที่เป็นเวอร์ชันที่ไคลเอ็นต์ควรสืบค้นในปัจจุบัน หากคุณต้องการเปลี่ยนเส้นทางการรับส่งข้อมูลบางส่วนไปยังเวอร์ชันโมเดล Canary เบื้องต้น คุณสามารถใช้นามแฝงที่สอง "canary" ได้

คุณสามารถกำหนดค่านามแฝงหรือป้ายกำกับเวอร์ชันโมเดลเหล่านี้ได้ เช่น:

model_version_policy {
  specific {
    versions: 42
    versions: 43
  }
}
version_labels {
  key: 'stable'
  value: 42
}
version_labels {
  key: 'canary'
  value: 43
}

ในตัวอย่างข้างต้น คุณกำลังให้บริการเวอร์ชัน 42 และ 43 และเชื่อมโยงป้ายกำกับ "stable" กับเวอร์ชัน 42 และป้ายกำกับ "canary" กับเวอร์ชัน 43 คุณสามารถให้ลูกค้าของคุณสอบถามโดยตรงไปยังป้ายกำกับ "stable" หรือ "canary" (อาจขึ้นอยู่กับการแฮชรหัสผู้ใช้) โดยใช้ฟิลด์ version_label ของบัฟเฟอร์โปรโตคอล ModelSpec และย้ายป้ายกำกับบนเซิร์ฟเวอร์โดยไม่แจ้งให้ลูกค้าทราบ เมื่อคุณทำ canarying เวอร์ชัน 43 เสร็จแล้ว และพร้อมที่จะเลื่อนระดับให้เป็นเวอร์ชันเสถียร คุณสามารถอัปเดตการกำหนดค่าเป็น:

model_version_policy {
  specific {
    versions: 42
    versions: 43
  }
}
version_labels {
  key: 'stable'
  value: 43
}
version_labels {
  key: 'canary'
  value: 43
}

หากคุณจำเป็นต้องทำการย้อนกลับในภายหลัง คุณสามารถเปลี่ยนกลับไปใช้การกำหนดค่าเก่าที่มีเวอร์ชัน 42 เป็น "เสถียร" ได้ มิฉะนั้น คุณสามารถเดินหน้าต่อไปได้ด้วยการยกเลิกการโหลดเวอร์ชัน 42 และโหลดเวอร์ชันใหม่ 44 เมื่อพร้อม จากนั้นจึงเลื่อนป้ายกำกับ Canary เป็น 44 และอื่นๆ

โปรดทราบว่าสามารถกำหนดป้ายกำกับให้กับเวอร์ชันโมเดลที่โหลด แล้ว และพร้อมสำหรับการให้บริการเท่านั้น เมื่อเวอร์ชันโมเดลพร้อมใช้งานแล้ว เราอาจโหลดการกำหนดค่าโมเดลซ้ำได้ทันทีเพื่อกำหนดป้ายกำกับให้กับเวอร์ชันนั้น ซึ่งสามารถทำได้โดยใช้ HandleReloadConfigRequest RPC หรือหากเซิร์ฟเวอร์ได้รับการตั้งค่าให้สำรวจระบบไฟล์สำหรับไฟล์กำหนดค่าเป็นระยะ ตามที่อธิบาย ไว้ข้างต้น

หากคุณต้องการกำหนดป้ายกำกับให้กับเวอร์ชันที่ยังไม่ได้โหลด (เช่น โดยการระบุทั้งเวอร์ชันของโมเดลและป้ายกำกับ ณ เวลาเริ่มต้น) คุณต้องตั้งค่าแฟล็ก --allow_version_labels_for_unavailable_models เป็นจริง ซึ่งอนุญาตให้ป้ายกำกับใหม่สามารถ กำหนดให้กับเวอร์ชันโมเดลที่ยังไม่ได้โหลด

โปรดทราบว่าสิ่งนี้ใช้ได้กับป้ายกำกับเวอร์ชันใหม่เท่านั้น (เช่น ป้ายกำกับที่ยังไม่ได้กำหนดให้กับเวอร์ชันในปัจจุบัน) ทั้งนี้เพื่อให้แน่ใจว่าในระหว่างการสลับเวอร์ชัน เซิร์ฟเวอร์จะไม่กำหนดป้ายกำกับให้กับเวอร์ชันใหม่ก่อนกำหนด ดังนั้นจึงละทิ้งคำขอทั้งหมดที่กำหนดไว้สำหรับป้ายกำกับนั้นในขณะที่กำลังโหลดเวอร์ชันใหม่

เพื่อให้เป็นไปตามการตรวจสอบความปลอดภัยนี้ หากมีการกำหนดป้ายกำกับเวอร์ชันที่ใช้งานอยู่แล้วอีกครั้ง คุณต้องกำหนดให้กับเวอร์ชันที่โหลดแล้วเท่านั้น ตัวอย่างเช่น หากคุณต้องการย้ายป้ายกำกับจากการชี้ไปที่เวอร์ชัน N ไปยังเวอร์ชัน N+1 คุณอาจส่งการกำหนดค่าที่มีเวอร์ชัน N และ N+1 ก่อน จากนั้นจึงส่งการกำหนดค่าที่มีเวอร์ชัน N+1 ป้ายกำกับ ชี้ไปที่ N+1 และไม่มีเวอร์ชัน N

การใช้งานส่วนที่เหลือ

หากคุณใช้พื้นผิว REST API เพื่อส่งคำขออนุมาน แทนที่จะใช้

/v1/models/<model name>/versions/<version number>

เพียงขอเวอร์ชันโดยใช้ป้ายกำกับโดยจัดโครงสร้างเส้นทางคำขอของคุณเช่นนั้น

/v1/models/<model name>/labels/<version label>

โปรดทราบว่าป้ายกำกับเวอร์ชันจำกัดเฉพาะลำดับอักขระ Word ซึ่งประกอบด้วยอักขระตัวอักษรและตัวเลขและขีดล่าง (เช่น [a-zA-Z0-9_]+ )

การกำหนดค่าการตรวจสอบ

คุณอาจจัดเตรียมคอนฟิกูเรชันการมอนิเตอร์ให้กับเซิร์ฟเวอร์โดยใช้แฟล็ก --monitoring_config_file เพื่อระบุไฟล์ที่มีบัฟเฟอร์โปรโตคอล MonitoringConfig นี่คือตัวอย่าง:

prometheus_config {
  enable: true,
  path: "/monitoring/prometheus/metrics"
}

หากต้องการอ่านเมตริกจาก URL การตรวจสอบข้างต้น คุณต้องเปิดใช้งานเซิร์ฟเวอร์ HTTP ก่อนโดยการตั้งค่าแฟล็ก --rest_api_port จากนั้น คุณสามารถกำหนดค่า Prometheus Server ของคุณให้ดึงตัววัดจาก Model Server ได้โดยส่งค่า --rest_api_port และ path ไปให้

Tensorflow Serving รวบรวมเมตริกทั้งหมดที่ Serving บันทึกไว้ เช่นเดียวกับ Tensorflow หลัก

การกำหนดค่าแบทช์

Model Server มีความสามารถในการแบทช์คำขอในการตั้งค่าที่หลากหลายเพื่อให้ได้รับปริมาณงานที่ดีขึ้น การกำหนดเวลาสำหรับการจัดชุดนี้จะดำเนินการทั่วโลกสำหรับโมเดลและเวอร์ชันของโมเดลทั้งหมดบนเซิร์ฟเวอร์ เพื่อให้มั่นใจว่ามีการใช้ทรัพยากรพื้นฐานให้เกิดประโยชน์สูงสุดเท่าที่จะเป็นไปได้ ไม่ว่าเซิร์ฟเวอร์จะให้บริการโมเดลหรือเวอร์ชันของโมเดลจำนวนเท่าใด ( รายละเอียดเพิ่มเติม ) คุณสามารถเปิดใช้งานลักษณะการทำงานนี้ได้โดยการตั้งค่าแฟล็ก --enable_batching และควบคุมโดยส่งการกำหนดค่าไปยังแฟล็ก --batching_parameters_file

ตัวอย่างไฟล์พารามิเตอร์การแบตช์:

max_batch_size { value: 128 }
batch_timeout_micros { value: 0 }
max_enqueued_batches { value: 1000000 }
num_batch_threads { value: 8 }

โปรดดู คู่มือการจัดชุด สำหรับการสนทนาเชิงลึก และดู หัวข้อพารามิเตอร์ เพื่อทำความเข้าใจวิธีตั้งค่าพารามิเตอร์

ธงเบ็ดเตล็ด

นอกเหนือจากธงที่กล่าวถึงในคู่มือนี้แล้ว เรายังมีรายการธงอื่นๆ ที่น่าสนใจอีกสองสามรายการด้วย สำหรับรายการทั้งหมด โปรดดูที่ ซอร์สโค้ด

  • --port : พอร์ตที่จะฟังสำหรับ gRPC API
  • --rest_api_port : พอร์ตที่จะฟังสำหรับ HTTP/REST API
  • --rest_api_timeout_in_ms : หมดเวลาสำหรับการเรียก HTTP/REST API
  • --file_system_poll_wait_seconds : ช่วงเวลาที่เซิร์ฟเวอร์สำรวจระบบไฟล์สำหรับเวอร์ชันรุ่นใหม่ที่ model_base_path ของแต่ละรุ่นตามลำดับ
  • --enable_model_warmup : เปิดใช้งาน การอุ่นเครื่องโมเดล โดยใช้ PredictionLogs ที่ผู้ใช้จัดเตรียมไว้ในไดเร็กทอรี Assets.extra/
  • --mixed_precision=bfloat16 : เปิดใช้งาน BF16 Automatic Mixed Precision