рдХреИрд╕реЗ рд╣рдо 70% рд╕реЗ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдмрдврд╝рд╛рддреЗ рд╣реБрдП рддрдиреНрдпрддрд╛ рдкреНрд░рд╡рд╛рд╣ рдмрдврд╝рд╛

рдЙрджреНрдпреЛрдЧ рдФрд░ рдЕрдиреБрд╕рдВрдзрд╛рди рджреЛрдиреЛрдВ рдореЗрдВ рд▓реЛрдХрдкреНрд░рд┐рдп рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ (рдПрдордПрд▓) рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдордВрдЪ рдмрди рдЧрдпрд╛ рд╣реИред рдПрдордПрд▓ рдореЙрдбрд▓ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рд░рдЦрд░рдЦрд╛рд╡ рдХреЗ рд▓рд┐рдП рдХрдИ рдореБрдлреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдЙрдкрдХрд░рдг рдФрд░ рд░реВрдкрд░реЗрдЦрд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИрдВред 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 рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рддрд╛ рд╣реИ:

 #!/usr/bin/env python from __future__ import print_function import argparse import numpy as np import time tt = time.time() import cv2 import tensorflow as tf from grpc.beta import implementations from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2 parser = argparse.ArgumentParser(description='incetion grpc client flags.') parser.add_argument('--host', default='0.0.0.0', help='inception serving host') parser.add_argument('--port', default='9000', help='inception serving port') parser.add_argument('--image', default='', help='path to JPEG image file') FLAGS = parser.parse_args() def main(): # create prediction service client stub channel = implementations.insecure_channel(FLAGS.host, int(FLAGS.port)) stub = prediction_service_pb2.beta_create_PredictionService_stub(channel) # create request request = predict_pb2.PredictRequest() request.model_spec.name = 'resnet' request.model_spec.signature_name = 'serving_default' # read image into numpy array img = cv2.imread(FLAGS.image).astype(np.float32) # convert to tensor proto and make request # shape is in NHWC (num_samples x height x width x channels) format tensor = tf.contrib.util.make_tensor_proto(img, shape=[1]+list(img.shape)) request.inputs['input'].CopyFrom(tensor) resp = stub.Predict(request, 30.0) print('total time: {}s'.format(time.time() - tt)) if __name__ == '__main__': main() 

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 рд╕рд░реНрд╡рд┐рдВрдЧ рдмрд╛рдЗрдирд░реА рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдПрдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдмрд╛рдЗрдирд░реА рдмрдирд╛рдПрдБ


рдЯреЗрдиреНрд╕рд░рдлрд╝реНрд▓реЛ рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣реЛрд╕реНрдЯ рд╕реЗ рд╕реАрдкреАрдпреВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╕рднреА рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде рд╕реНрд░реЛрдд рд╕реЗ рдЯреЗрдиреНрд╕рд░рдлрд╝реНрд▓реЛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ рдЬрд╣рд╛рдВ рдмрд╛рдЗрдирд░реА рдХрд╛рдо рдХрд░реЗрдЧреАред рдХреЛрдбрд╛рдВрддрд░рдг рдХрд░рддреЗ рд╕рдордп, рд╡рд┐рд╢реЗрд╖ рдЭрдВрдбреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд╕реАрдкреАрдпреВ рдЕрдиреБрджреЗрд╢ рд╕реЗрдЯ рдХреА рд╕рдХреНрд░рд┐рдпрддрд╛ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ:

рдирд┐рд░реНрджреЗрд╢ рд╕реЗрдЯрдЭрдВрдбреЗ
AVX- рдЧреЛрдж = рдорд╡рдХреНрд╖
AVX2- рдЕрдкрдирд╛рдиреЗ = -рдорд╛рд╡рдПрдХреНрд╕ реи
FMA- рджрддреНрддрдХ = -рдордореНрдорд╛
рдПрд╕рдПрд╕рдИ 4.1- рдХреНрд░реЙрдк = -msse4.1
рдПрд╕рдПрд╕рдИ 4.2- рдЕрдкрдирд╛рдиреЗ = -msse4.2
рд╕рднреА рдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ- рдХреНрд░реЙрдк = -рдорд░рдЪ = рджреЗрд╢реА

рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдПрдХ рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ рдХреА рдХреНрд▓реЛрдирд┐рдВрдЧред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рез.резрей рд╣реИ (рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд╕рдордп рдЕрдВрддрд┐рдо):

 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 ред рдЭрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдЯреЗрдВрд╕реЛрд░рдлрд╝реНрд▓реЛ рд╕рд░реНрд╡рд┐рдВрдЧ рдФрд░ рдбреЙрдХрд░ рд╕рд╣рд╛рдпрддрд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдмрд╛рдЬреЗрд▓ рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦреЗрдВ ред

рдореМрдЬреВрджрд╛ рдПрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдЫрд╡рд┐ рдмрдирд╛рдПрдВ:

 #!/bin/bash USER=$1 TAG=$2 TF_SERVING_VERSION_GIT_BRANCH="r1.13" git clone --branch="${TF_SERVING_VERSION_GIT_BRANCH}" https://github.com/tensorflow/serving TF_SERVING_BUILD_OPTIONS="--copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-msse4.1 --copt=-msse4.2" cd serving && \ docker build --pull -t $USER/tensorflow-serving-devel:$TAG \ --build-arg TF_SERVING_VERSION_GIT_BRANCH="${TF_SERVING_VERSION_GIT_BRANCH}" \ --build-arg TF_SERVING_BUILD_OPTIONS="${TF_SERVING_BUILD_OPTIONS}" \ -f tensorflow_serving/tools/docker/Dockerfile.devel . cd serving && \ docker build -t $USER/tensorflow-serving:$TAG \ --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel:$TAG \ -f tensorflow_serving/tools/docker/Dockerfile . 

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 ... # ensure NHWC shape and build tensor proto tensor_shape = [1]+list(img.shape) dims = [tensor_shape_pb2.TensorShapeProto.Dim(size=dim) for dim in tensor_shape] tensor_shape = tensor_shape_pb2.TensorShapeProto(dim=dims) tensor = tensor_pb2.TensorProto( dtype=types_pb2.DT_FLOAT, tensor_shape=tensor_shape, float_val=list(img.reshape(-1))) request.inputs['inputs'].CopyFrom(tensor) 

рдкреВрд░реНрдг рдкрд╛рдпрдерди рд▓рд┐рдкрд┐ рдпрд╣рд╛рдБ рд╣реИ ред рдПрдХ рдЕрджреНрдпрддрди рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдЪрд▓рд╛рдПрдВ рдЬреЛ рдЕрдиреБрдХреВрд▓рд┐рдд 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 рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕рдмрд╕реЗ рдмрдбрд╝реА рд▓рд╛рдн (рдХрдо рд╡рд┐рд▓рдВрдмрддрд╛, рдЙрдЪреНрдЪ рдереНрд░реВрдкреБрдЯ) рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧрдд (рдореМрджреНрд░рд┐рдХ, рдкрд░рд┐рдЪрд╛рд▓рди, рддрдХрдиреАрдХреА) рдХреЗ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд╕рд╛рде рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

Source: https://habr.com/ru/post/hi445928/


All Articles