рдЙрджреНрдпреЛрдЧ рдФрд░ рдЕрдиреБрд╕рдВрдзрд╛рди рджреЛрдиреЛрдВ рдореЗрдВ рд▓реЛрдХрдкреНрд░рд┐рдп рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ (рдПрдордПрд▓) рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдордВрдЪ рдмрди рдЧрдпрд╛ рд╣реИред рдПрдордПрд▓ рдореЙрдбрд▓ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рд░рдЦрд░рдЦрд╛рд╡ рдХреЗ рд▓рд┐рдП рдХрдИ рдореБрдлреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдЙрдкрдХрд░рдг рдФрд░ рд░реВрдкрд░реЗрдЦрд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИрдВред Tensorflow рд╕рд░реНрд╡рд┐рдВрдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдПрдХ рд╡рд┐рддрд░рд┐рдд рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдПрдордПрд▓ рдореЙрдбрд▓ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
рд╣рдорд╛рд░реА Mux рд╕реЗрд╡рд╛ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рдХрдИ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдЯреЗрдиреНрд╕рд░рдлрд╝реНрд▓реЛ рд╕рд░реНрд╡рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╡реАрдбрд┐рдпреЛ рдЯрд╛рдЗрдЯрд▓ рдореЗрдВ рдЯреЗрдиреНрд╕рд░рдлрд╝реНрд▓реЛ рд╕рд░реНрд╡рд┐рдВрдЧ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИред рдЖрдЬ рд╣рдо рдЙрди рддрд░реАрдХреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рджреЛрдиреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдХреЗ рд╡рд┐рд▓рдВрдмрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдореЙрдбрд▓ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдЖрдорддреМрд░ рдкрд░ "рдСрдирд▓рд╛рдЗрди" рд╕рдВрдЪрд╛рд▓рди (рдПрдХ рдЖрд╡реЗрджрди рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрде рдкрд░) рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рдЕрдиреБрдХреВрд▓рди рдХреЗ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рд╕рдмрд╕реЗ рдХрдо рд╕рдВрднрд╡ рджреЗрд░реА рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмрдбрд╝реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╣реИред
Tensorflow рдХреА рд╕реЗрд╡рд╛ рдХреНрдпрд╛ рд╣реИ?
Tensorflow рд╕рд░реНрд╡рд┐рдВрдЧ рдПрдордПрд▓ рдореЙрдбрд▓ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдЪреАрд▓рд╛ рд╕рд░реНрд╡рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдЬрдм рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ рд╕рд░реНрд╡рд┐рдВрдЧ рдХреЛ рдЗрд╕реЗ рдПрдХ рд╕рдВрдЧрдд (рд╕рд░реНрд╡рд┐рд╕реЗрдмрд▓) рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рд╕рд░реНрд╡реЗрдмрд▓ рдПрдХ рдХреЗрдВрджреНрд░реАрдп рдЕрдореВрд░реНрддрддрд╛ рд╣реИ рдЬреЛ рдЯреЗрдВрд╕рд░рдлреНрд▓реЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдореЙрдбрд▓ рдХреЛ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рд╕рд░реНрд╡ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, Servable рд╡реЗ рдореВрд▓рднреВрдд рд╡рд╕реНрддреБрдПрдБ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреНрд░рд╛рд╣рдХ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред рд╕рд░реНрд╡ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЖрдХрд╛рд░ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ: рдЫреЛрдЯреЗ рдореЙрдбрд▓ рдХрдо рдЬрдЧрд╣ рд▓реЗрддреЗ рд╣реИрдВ, рдХрдо рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рддреЗрдЬреА рд╕реЗ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рд┐рдбрд┐рдХреНрдЯ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореЙрдбрд▓ рдХреЛ SavedModel рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

Tensorflow Serving рдПрдХ GRPC / HTTP рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдШрдЯрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ рдЬреЛ рдХрдИ ML рдореЙрдбрд▓ (рдпрд╛ рдХрдИ рд╕рдВрд╕реНрдХрд░рдг) рдкрд░реЛрд╕рддрд╛ рд╣реИ, рдирд┐рдЧрд░рд╛рдиреА рдШрдЯрдХ рдФрд░ рдПрдХ рдХрд╕реНрдЯрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдбреЙрдХрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рдЯреЗрдВрд╕рд░рдлреНрд▓реЛ
рдЖрдЗрдП рдорд╛рдирдХ Tensorflow Serving рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (CPU рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд┐рдирд╛) рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╡рд┐рд▓рдВрдмрддрд╛ рдХреЗ рдореВрд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, TensorFlow Docker рд╣рдм рд╕реЗ рдирд╡реАрдирддрдо рдЫрд╡рд┐ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ:
docker pull tensorflow/serving:latest
рдЗрд╕ рдЕрдиреБрдЪреНрдЫреЗрдж рдореЗрдВ, рд╕рднреА рдХрдВрдЯреЗрдирд░ рдЪрд╛рд░ рдХреЛрд░, 15 рдЬреАрдмреА, рдЙрдмрдВрдЯреВ 16.04 рдХреЗ рд╕рд╛рде рдПрдХ рдореЗрдЬрдмрд╛рди рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред
SavedModel рдХреЛ Tensorflow Model рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ
рдЬрдм рдПрдХ рдореЙрдбрд▓ рдХреЛ рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЪрд░ рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБ (рдбрд┐рд╕реНрдХ рдкрд░ рдлрд╝рд╛рдЗрд▓реЗрдВ) рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рд╕реАрдзреЗ рдореЙрдбрд▓ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдпрд╛ рдЬрдореЗ рд╣реБрдП рдЬрдореЗ рд╣реБрдП рдЧреНрд░рд╛рдл рдкреНрд░рд╛рд░реВрдк (рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓) рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
Tensorflow Serving рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЬрдореЗ рд╣реБрдП рдЧреНрд░рд╛рдл рдХреЛ SavedModel рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
Tensorflow рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ SavedModel рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдореЙрдбрд▓ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред
Tensorflow рдкреНрд░рдпреЛрдЧ, рдЕрдиреБрд╕рдВрдзрд╛рди, рдпрд╛ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдФрд░ рдЕрдиреБрд╕рдВрдзрд╛рди рдореЙрдбрд▓ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо 1000 рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдПрдХ рдЗрдореЗрдЬрдиреЗрдЯ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдЧрд╣рд░реЗ рдЕрд╡рд╢рд┐рд╖реНрдЯ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ (ResNet) рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдкрд╣рд▓реЗ рд╕реЗ ResNet-50 v2
рдореЙрдбрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ SavedModel рдореЗрдВ Channels_last (NHWC)
рд╡рд┐рдХрд▓реНрдк : рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рд╕реАрдкреАрдпреВ рдкрд░ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
RestNet рдореЙрдбрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдирд┐рдореНрди рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ:
models/ 1/ saved_model.pb variables/ variables.data-00000-of-00001 variables.index
Tensorflow рд╕рд░реНрд╡рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдХреНрд░рдордмрджреНрдз рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛
1/
рд╕рдВрд╕реНрдХрд░рдг 1 рдореЙрдбрд▓ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдореЙрдбрд▓ рд╡реЗрдЯ (рдЪрд░) рдХреЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЗ рд╕рд╛рде
saved_model.pb
рдореЙрдбрд▓ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред
рдмрдЪрдд рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг SavedModel
рдирд┐рдореНрди рдЖрджреЗрд╢ Denser рдХрдВрдЯреЗрдирд░ рдореЗрдВ Tensorflow Serving рдореЙрдбрд▓ рд╕рд░реНрд╡рд░ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИред SavedModel рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрдВрдЯреЗрдирд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдореЙрдбрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдорд╛рдЙрдВрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
docker run -d -p 9000:8500 \ -v $(pwd)/models:/models/resnet -e MODEL_NAME=resnet \ -t tensorflow/serving:latest
рдХрдВрдЯреЗрдирд░ рд▓реЙрдЧ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдореЙрдбрд▓рд░рд╡рд░ рдЬреАрдЖрд░рдкреАрд╕реА рдФрд░ рдПрдЪрдЯреАрдЯреАрдкреА рдХреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдкрд░
resnet
рдореЙрдбрд▓ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ рдФрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ:
... I tensorflow_serving/core/loader_harness.cc:86] Successfully loaded servable version {name: resnet version: 1} I tensorflow_serving/model_servers/server.cc:286] Running gRPC ModelServer at 0.0.0.0:8500 ... I tensorflow_serving/model_servers/server.cc:302] Exporting HTTP/REST API at:localhost:8501 ...
рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдЧреНрд░рд╛рд╣рдХ
Tensorflow Serving
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдлрд╝рд░реНрд╕ (protobufs) рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдПрдкреАрдЖрдИ рд╕реНрдХреАрдорд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЬреАрдЖрд░рдкреАрд╕реА рдЧреНрд░рд╛рд╣рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╛рдпрдерди рдкреИрдХреЗрдЬ
tensorflow_serving.apis
рд░реВрдк рдореЗрдВ рдкреИрдХ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдФрд░ рдкрд╛рдпрдерди рдкреИрдХреЗрдЬ
tensorflow
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЧреНрд░рд╛рд╣рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
virtualenv .env && source .env/bin/activate && \ pip install numpy grpcio opencv-python tensorflow tensorflow-serving-api
ResNet-50 v2
рдореЙрдбрд▓ рдПрдХ рд╕реНрд╡рд░реВрдкрд┐рдд рдЪреИрдирд▓_рдмреНрд▓рд╛рд╕реНрдЯ (NHWC) рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ
ResNet-50 v2
рдЗрдирдкреБрдЯ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрдирдкреБрдЯ рдЫрд╡рд┐ opencv-python рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрдврд╝реА рдЬрд╛рддреА рд╣реИ рдФрд░ рдлреНрд▓реЛрдЯ 32 рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕рд░рдгреА (рдКрдВрдЪрд╛рдИ ├Ч рдЪреМрдбрд╝рд╛рдИ ├Ч рдЪреИрдирд▓) рдореЗрдВ рд▓реЛрдб рд╣реЛрддреА рд╣реИред рдиреАрдЪреЗ рджреА рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реНрдЯрдм рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ JPEG рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕рд░рдгреА рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ gRPC рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП tanor_proto рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рддрд╛ рд╣реИ:
JPEG рдЗрдирдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдЧреНрд░рд╛рд╣рдХ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛:
python tf_serving_client.py --image=images/pupper.jpg total time: 2.56152906418s
рдкрд░рд┐рдгрд╛рдореА рдЯреЗрдВрд╕рд░ рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рдФрд░ рд╕рдВрдХреЗрддреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рд╣реЛрддрд╛ рд╣реИред
outputs { key: "classes" value { dtype: DT_INT64 tensor_shape { dim { size: 1 } } int64_val: 238 } } outputs { key: "probabilities" ...
рдПрдХрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреА рджреЗрд░реА рд╕реНрд╡реАрдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ: рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рдХреА рд╡реНрдпрд╛рдкрдХ рд░реЗрдВрдЬ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЯреЗрдВрд╕реЛрд░рдлрд╝реНрд▓реЛ рд╕реЗрд╡рд╛ рдмрд╛рдЗрдирд░реА рд╣реИред рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдорд╛рдирдХ рдЯреЗрдирд╕рд░реНрдлрд╝реНрд▓реЛ рд╕рд░реНрд╡рд┐рдВрдЧ рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓реЙрдЧ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпрд╛рдБ рджреЗрдЦреАрдВ:
I external/org_tensorflow/tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
рдпрд╣ рдПрдХ CPU рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ TensorFlow рд╕рд░реНрд╡рд┐рдВрдЧ рдмрд╛рдЗрдирд░реА рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдПрдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдмрд╛рдЗрдирд░реА рдмрдирд╛рдПрдБ
рдЯреЗрдиреНрд╕рд░рдлрд╝реНрд▓реЛ
рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣реЛрд╕реНрдЯ рд╕реЗ рд╕реАрдкреАрдпреВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╕рднреА рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде рд╕реНрд░реЛрдд рд╕реЗ рдЯреЗрдиреНрд╕рд░рдлрд╝реНрд▓реЛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ рдЬрд╣рд╛рдВ рдмрд╛рдЗрдирд░реА рдХрд╛рдо рдХрд░реЗрдЧреАред рдХреЛрдбрд╛рдВрддрд░рдг рдХрд░рддреЗ рд╕рдордп, рд╡рд┐рд╢реЗрд╖ рдЭрдВрдбреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд╕реАрдкреАрдпреВ рдЕрдиреБрджреЗрд╢ рд╕реЗрдЯ рдХреА рд╕рдХреНрд░рд┐рдпрддрд╛ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ:
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдПрдХ рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ рдХреА рдХреНрд▓реЛрдирд┐рдВрдЧред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рез.резрей рд╣реИ (рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд╕рдордп рдЕрдВрддрд┐рдо):
USER=$1 TAG=$2 TF_SERVING_VERSION_GIT_BRANCH="r1.13" git clone --branch="$TF_SERVING_VERSION_GIT_BRANCH" https://github.com/tensorflow/serving
Tensorflow рджреЗрд╡ рдЫрд╡рд┐ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╕рд▓ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ CPU рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ:
TF_SERVING_BUILD_OPTIONS="--copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-msse4.1 --copt=-msse4.2"
рдпрджрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдореЗрдореЛрд░реА рдирд╣реАрдВ рд╣реИ, рддреЛ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВ
--local_resources=2048,.5,1.0
ред рдЭрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП,
рдЯреЗрдВрд╕реЛрд░рдлрд╝реНрд▓реЛ рд╕рд░реНрд╡рд┐рдВрдЧ рдФрд░ рдбреЙрдХрд░ рд╕рд╣рд╛рдпрддрд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде
рдмрд╛рдЬреЗрд▓ рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦреЗрдВ ред
рдореМрдЬреВрджрд╛ рдПрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдЫрд╡рд┐ рдмрдирд╛рдПрдВ:
ModelServer рдХреЛ рд╕рдорд╕рд╛рдордпрд┐рдХ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
TensorFlow рдЭрдВрдбреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдк рд╕рдорд╛рдирд╛рдВрддрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рджреЛ рдереНрд░реЗрдб рдкреВрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ:
intra_op_parallelism_threads
- рдПрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбреНрд╕ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ;
- рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдЙрдк-рд╕рдВрдЪрд╛рд▓рди рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рдХреГрддрд┐ рдореЗрдВ рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛрддреЗ рд╣реИрдВред
inter_op_parallelism_threads
- рд╕реНрд╡рддрдВрддреНрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбреНрд╕ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ;
- Tensorflow рдЧреНрд░рд╛рдлрд╝ рд╕рдВрдЪрд╛рд▓рди, рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рджреЛрдиреЛрдВ рдкреИрд░рд╛рдореАрдЯрд░
0
рд╕реЗрдЯ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рд╕реНрд╡рдпрдВ рдЙрдкрдпреБрдХреНрдд рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЕрд░реНрде рд╣реИ рдкреНрд░рддрд┐ рдХреЛрд░ рдПрдХ рдзрд╛рдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдорд▓реНрдЯреА-рдХреЛрд░ рдХреЙрдиреНрд╕рд┐рдХреНрд╡реЗрдВрд╕реА рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдлрд┐рд░ рд╕рд░реНрд╡рд┐рд╕рд┐рдВрдЧ рдХрдВрдЯреЗрдирд░ рдХреЛ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддрд░рд╣ рд╕реЗ рдЪрд▓рд╛рдПрдВ, рдЗрд╕ рдмрд╛рд░ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдбреЙрдХрдЯрд░ рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдЯреЗрдиреНрд╕рд░рдлрд╝реНрд▓реЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдлрд╝реНрд▓реИрдЧ рдХреЗ рд╕рд╛рде:
docker run -d -p 9000:8500 \ -v $(pwd)/models:/models/resnet -e MODEL_NAME=resnet \ -t $USER/tensorflow-serving:$TAG \ --tensorflow_intra_op_parallelism=4 \ --tensorflow_inter_op_parallelism=4
рдХрдВрдЯреЗрдирд░ рд▓реЙрдЧ рдХреЛ рдЕрдм рдПрдХ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕реАрдкреАрдпреВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рджрд┐рдЦрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдПрдХ рд╣реА рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдЕрдиреБрд░реЛрдз рдкрд░ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛, рджреЗрд░реА рд▓рдЧрднрдЧ 35.8% рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ:
python tf_serving_client.py --image=images/pupper.jpg total time: 1.64234706879s
рдЧреНрд░рд╛рд╣рдХ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдореЗрдВ рдЧрддрд┐ рдмрдврд╝рд╛рдПрдВ
рдХреНрдпрд╛ рдЕрдм рднреА рддреЗрдЬреА рд╕рдВрднрд╡ рд╣реИ? рд╣рдордиреЗ рдЕрдкрдиреЗ рд╕реАрдкреАрдпреВ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди 1 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рдХреА рджреЗрд░реА рдЕрднреА рднреА рдмрд╣реБрдд рдмрдбрд╝реА рд▓рдЧрддреА рд╣реИред
рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐
tensorflow_serving
рдФрд░
tensorflow
tensorflow_serving
рд▓реЛрдб рдХрд░рдирд╛ рджреЗрд░реА рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдпреЛрдЧрджрд╛рди рджреЗрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЙрд▓
tf.contrib.util.make_tensor_proto
рдПрдХ рд╡рд┐рднрд╛рдЬрди рджреВрд╕рд░рд╛ рднреА рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдЖрдк рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ: "рдХреНрдпрд╛ рд╣рдореЗрдВ TensorFlow рдкрд╛рдпрдерди рдкреИрдХреЗрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Tensorflow рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ?" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ,
tensorflow_serving
рдФрд░
tensorflow
рдкреИрдХреЗрдЬ
рдХреА рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ
рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЯреЗрдиреНрд╕рд░рдлрд╝реНрд▓реЛ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдПрдкреАрдЖрдИ рдХреЛ рдкреНрд░реЛрдЯреЛ-рдмрдлрд╝рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рджреЛ рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдЗрд╕реА
tensorflow
рдФрд░
tensorflow_serving
рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ - рдФрд░ рдлрд┐рд░ рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рд╕рдВрдкреВрд░реНрдг (рднрд╛рд░реА) рдЯреЗрдиреНрд╕рдлрд╝реНрд▓реЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ,
tensorflow
рдФрд░
tensorflow_serving
рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛
tensorflow
рдФрд░
grpcio-tools
рдкреИрдХреЗрдЬ рдЬреЛрдбрд╝реЗрдВред
pip uninstall tensorflow tensorflow-serving-api && \ pip install grpcio-tools==1.0.0
tensorflow/tensorflow
рдФрд░
tensorflow/serving
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░реЗрдВ рдФрд░
tensorflow/serving
рд▓рд┐рдП рдирд┐рдореНрди рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ:
tensorflow/serving/ tensorflow_serving/apis/model.proto tensorflow_serving/apis/predict.proto tensorflow_serving/apis/prediction_service.proto tensorflow/tensorflow/ tensorflow/core/framework/resource_handle.proto tensorflow/core/framework/tensor_shape.proto tensorflow/core/framework/tensor.proto tensorflow/core/framework/types.proto
рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдП рдЧрдП рдореВрд▓ рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдЗрди
protos/
рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ
protos/
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ:
protos/ tensorflow_serving/ apis/ *.proto tensorflow/ core/ framework/ *.proto
рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА RPC рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
prediction_service.proto рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕реЗрд╡рд╛ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрдиреНрдп RPC рдХреА рдиреЗрд╕реНрдЯреЗрдб рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдпрд╣рд╛рдБ рдПрдХ рд╕рд░рд▓реАрдХреГрдд
prediction_service.
рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
Grpcio.tools.protoc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рдпрдерди рдЬреАрдЖрд░рдкреАрд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдПрдВ:
PROTOC_OUT=protos/ PROTOS=$(find . | grep "\.proto$") for p in $PROTOS; do python -m grpc.tools.protoc -I . --python_out=$PROTOC_OUT --grpc_python_out=$PROTOC_OUT $p done
рдЕрдм рдкреВрд░реЗ
tensorflow_serving
рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2
... рдФрд░
protos/tensorflow_serving/apis
рд╕реЗ рдЙрддреНрдкрдиреНрди
protos/tensorflow_serving/apis
рд╕рд╛рде рдмрджрд▓реЗрдВ:
from protos.tensorflow_serving.apis import predict_pb2 from protos.tensorflow_serving.apis import prediction_service_pb2
Tensorflow рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╣реЗрд▓реНрдкрд░ рдлрдВрдХреНрд╢рди
make_tensor_proto
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ TensorProto рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЕрдЬрдЧрд░ / рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
import tensorflow as tf ... tensor = tf.contrib.util.make_tensor_proto(features) request.inputs['inputs'].CopyFrom(tensor)
рдкреНрд░реЛрдЯреЛрдмрдлрд╝рд░реНрд╕ рдЖрдпрд╛рдд рдХрд░реЗрдВ рдФрд░ TensorProto рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ:
from protos.tensorflow.core.framework import tensor_pb2 from protos.tensorflow.core.framework import tensor_shape_pb2 from protos.tensorflow.core.framework import types_pb2 ...
рдкреВрд░реНрдг рдкрд╛рдпрдерди рд▓рд┐рдкрд┐
рдпрд╣рд╛рдБ рд╣реИ ред рдПрдХ рдЕрджреНрдпрддрди рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдЪрд▓рд╛рдПрдВ рдЬреЛ рдЕрдиреБрдХреВрд▓рд┐рдд Tensorflow рд╕рд░реНрд╡рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ:
python tf_inception_grpc_client.py --image=images/pupper.jpg total time: 0.58314920859s
рдирд┐рдореНрди рдЖрд░реЗрдЦ рдорд╛рдирдХ рдХреЗ рдореБрдХрд╛рдмрд▓реЗ 10 рд╕реЗ рдЕрдзрд┐рдХ рд░рди рдХреЗ рдЯреЗрдирд╕рдлрд╝реНрд▓реЛ рд╕реЗрд╡рд╛ рдХреЗ рдЕрдиреБрдХреВрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ:

рдФрд╕рдд рд╡рд┐рд▓рдВрдм рд▓рдЧрднрдЧ 3.38 рдЧреБрдирд╛ рдХрдо рд╣реБрдЖред
рдмреИрдВрдбрд╡рд┐рдбреНрде рдЕрдиреБрдХреВрд▓рди
рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ рд╕рд░реНрд╡рд┐рдВрдЧ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреИрдВрдбрд╡рд┐рдбреНрде рдЕрдиреБрдХреВрд▓рди рдЖрдорддреМрд░ рдкрд░ "рд╕реНрдЯреИрдВрдб-рдЕрд▓реЛрди" рдмреИрдЪ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рддрдВрдЧ рд╡рд┐рд▓рдВрдмрддрд╛ рд╕реАрдорд╛рдПрдВ рдПрдХ рд╕рдЦреНрдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИрдВред
рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдмреИрдЪ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг
рдЬреИрд╕рд╛ рдХрд┐
рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдмреИрдЪ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдореВрд▓ рд░реВрдк рд╕реЗ рдЯреЗрдиреНрд╕рд░рдлрд╝реНрд▓реЛ рд╕рд░реНрд╡рд┐рдВрдЧ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╣реИред
рд▓реЗрдЯреЗрдВрд╕реА рдФрд░ рдереНрд░реВрдкреБрдЯ рдХреЗ рдмреАрдЪ рдХреЗ рдЯреНрд░реЗрдб-рдСрдл рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдмреИрдЪ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ рдЖрдкрдХреЛ рдЕрдзрд┐рдХрддрдо рдереНрд░реВрдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддреНрд╡рд░рдХ рд╕рдХреНрд╖рдо рд╣реИрдВред
рдкреИрдХреЗрдЬрд┐рдВрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
--enable_batching
рдФрд░
--batching_parameters_file
рд╕реЗрдЯ рдХрд░реЗрдВред рдкреИрд░рд╛рдореАрдЯрд░
SessionBundleConfig рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВред рд╕реАрдкреАрдпреВ рдкрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП, рдЙрдкрд▓рдмреНрдз рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП
num_batch_threads
рд╕реЗрдЯ рдХрд░реЗрдВред GPU рдХреЗ рд▓рд┐рдП,
рдпрд╣рд╛рдВ рдЙрдкрдпреБрдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рджреЗрдЦреЗрдВред
рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдкреВрд░реЗ рдкреИрдХреЗрдЬ рдХреЛ рднрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдПрдХ рдмрдбрд╝реЗ рдЕрдиреБрд░реЛрдз (рдЯреЗрдВрд╕рд░) рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╕рдВрдпреБрдХреНрдд рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдЯреЗрдиреНрд╕рд░рдлрд╝реНрд▓реЛ рд╕рддреНрд░ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, CPU / GPU рд╕рдорд╛рдирддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред
Tensorflow рдмреИрдЪ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ:
- рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкреИрдХреЗрдЯ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
- рдореЙрдбрд▓ рдЧреНрд░рд╛рдл рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рд╕реАрдкреАрдпреВ / рдЬреАрдкреАрдпреВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рддреЗрдЬрд╝ рдмреИрдЪ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг
- рдПрдХрд▓ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдИ рдореЙрдбрд▓реЛрдВ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛
- рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ "рдСрдлрд╝рд▓рд╛рдЗрди" рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдмреИрдЪ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ
рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдмреИрдЪ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг
рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдмреИрдЪ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдореВрд╣ рдХрдИ рдЖрд╡рдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред
рдЪреВрдВрдХрд┐ рд░реЗрд╕рдиреЗрдЯ рдореЙрдбрд▓ NHWC рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЗрдирдкреБрдЯ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдкрд╣рд▓рд╛ рдЖрдпрд╛рдо рдЗрдирдкреБрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ), рд╣рдо рдХрдИ рдЗрдирдкреБрдЯ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдПрдХ рдЖрд░рдкреАрд╕реА рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
... batch = [] for jpeg in os.listdir(FLAGS.images_path): path = os.path.join(FLAGS.images_path, jpeg) img = cv2.imread(path).astype(np.float32) batch.append(img) ... batch_np = np.array(batch).astype(np.float32) dims = [tensor_shape_pb2.TensorShapeProto.Dim(size=dim) for dim in batch_np.shape] t_shape = tensor_shape_pb2.TensorShapeProto(dim=dims) tensor = tensor_pb2.TensorProto( dtype=types_pb2.DT_FLOAT, tensor_shape=t_shape, float_val=list(batched_np.reshape(-1))) request.inputs['inputs'].CopyFrom(tensor)
рдПрди рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдПрдХ рдкреИрдХреЗрдЯ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдЯреЗрдВрд╕рд░ рдореЗрдВ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдкрд░рд┐рдгрд╛рдо рд╣реЛрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрди = 2:
outputs { key: "classes" value { dtype: DT_INT64 tensor_shape { dim { size: 2 } } int64_val: 238 int64_val: 121 } } ...
рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддреНрд╡рд░рдг
GPU рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред
рд╕реАрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ GPU рдкрд░ рд╕рдорд╛рдирд╛рдВрддрд░реАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЧрд╣рди рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдВрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рдирд╛рдВрддрд░реАрдХрд░рдг рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдЕрдХреНрд╕рд░ рдЖрдк рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЛ рдПрдХ рдЬреАрдкреАрдпреВ рддрдХ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЙрдкрдХрд░рдг рдХрд╛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЪрдпрди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЧрд╣рди рддрдХрдиреАрдХреА рдФрд░ рдЖрд░реНрдерд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред "рд╕реНрд╡рд╛рдпрддреНрдд" рдирд┐рд╖реНрдХрд░реНрд╖ (рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╡реЙрд▓реНрдпреВрдо) рдХреЗ рдмреИрдЪ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рдорд╛рдирд╛рдВрддрд░рдХрд░рдг рдЕрдзрд┐рдХ рдореВрд▓реНрдпрд╡рд╛рди рд╣реИред
GPU рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕рдмрд╕реЗ рдмрдбрд╝реА рд▓рд╛рдн (рдХрдо рд╡рд┐рд▓рдВрдмрддрд╛, рдЙрдЪреНрдЪ рдереНрд░реВрдкреБрдЯ) рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧрдд (рдореМрджреНрд░рд┐рдХ, рдкрд░рд┐рдЪрд╛рд▓рди, рддрдХрдиреАрдХреА) рдХреЗ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд╕рд╛рде рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред