рд╕реНрдХреИрд▓рд╛ + рдПрдордПрдХреНрд╕рдиреЗрдЯ = рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рд╡рд┐рде рдиреНрдпреБрд░реЙрди рдЗрди рдкреНрд░реЛрдбрдХреНрдЯреНрд╕


рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдореИрдиреБрдЕрд▓ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ, рдЬрд┐рдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдк, рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ, "рдмрд╣реБрдд рдХрдард┐рдирд╛рдИ рдХреЗ рдмрд┐рдирд╛" рдФрд░ "рдиреНрдпреВрдирддрдо" рд╕рдордп рд▓рд╛рдЧрдд рдХреЗ рд╕рд╛рде рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ рдЬреЛ рдПрдХ рддрд╕реНрд╡реАрд░ рдореЗрдВ рдХреБрддреНрддреЛрдВ рд╕реЗ рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдлрд┐рд░ рдЗрд╕ рд▓реЗрдЦ рдкрд░ рд╕рдордп рдХреНрдпреЛрдВ рдмрд░реНрдмрд╛рдж рдХрд░реЗрдВ?

рдореБрдЦреНрдп, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрди рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдХрдореА рд╕реАрдорд┐рдд рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╣реИрдВред рдЖрдкрдиреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдпрд╛ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореВрд▓ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдЬреЛ рд▓реЗрдЦрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - рдЗрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛, рд╢рд╛рдпрдж рдпрд╣ рднреА рдХрд╛рдо рдХрд┐рдпрд╛, рдФрд░ рдЖрдЧреЗ рдХреНрдпрд╛? рдЙрддреНрдкрд╛рджрди рд╕рд░реНрд╡рд░ рдкрд░ рдпрд╣ рд╕рд░рд▓ рдХреЛрдб рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ? рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдФрд░ рд░рдЦрд░рдЦрд╛рд╡ рдХреИрд╕реЗ рдХрд░реЗрдВ? рдпрд╣реАрдВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ рдорд╕реНрддреАред рдореБрдЭреЗ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкреВрд░рд╛ рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрд╛ рд╣реИ "рдЦреИрд░, рдПрдордПрд▓ рдЗрдВрдЬреАрдирд┐рдпрд░ рдиреЗ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛" "рдЖрдЦрд┐рд░рдХрд╛рд░ рд╣рдордиреЗ рдЗрд╕реЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд░реЛрд▓ рдЖрдЙрдЯ рдХрд┐рдпрд╛"ред рдФрд░ рдореИрдВрдиреЗ рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдирдИ рдордЬреЗрджрд╛рд░ рдЪреАрдЬреЗрдВ рдХреИрд╕реЗ рд╕рд┐рдЦрд╛рдирд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЦреБрд╢ рдХрд░реЗрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдЦрд╕реНрддрд╛ рдмреИрдВрдХрдиреЛрдЯреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рд╡рд┐рд╖рдп рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ рдЬрд┐рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЬреЛ рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкреВрд░рд╛ рд╡рд┐рд╡рд░рдг рджреЗрдирд╛ рд╣реИред

рдореИрдВ рддреБрд░рдВрдд рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ "рдкрд╛рдпрдерди рдореЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ?": рд╣рдо рдорд▓реНрдЯреАрдереНрд░реЗрдб рдХреЛрдб рдХреЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕реНрдерд┐рд░ рд▓реЗрдЦрди рдХреЗ рдХрд╛рд░рдг рдЙрддреНрдкрд╛рджрди рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рд╕реНрдХрд╛рд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рд╕рд╛рдордЧреНрд░реА


1. рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг
2. рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛
3. рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рддреИрдпрд╛рд░ рдХрд░рдирд╛
4. рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛
5. рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ
6. рд░реАрд╕реНрдЯ рдПрдкреАрдЖрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
7. рдкрд░реАрдХреНрд╖рдг
8. рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдЫрд╡рд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдорд╛рдЗрдХреНрд░реЛрд╕реИрд╕ рд╕рд░реНрд╡рд┐рд╕ рдХреЛ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдирд╛
9. рдПрдХ GPU рдХреЗ рд╕рд╛рде рдПрдХ рдЙрддреНрдкрд╛рджрди рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ microservice рд╢реБрд░реВ
рдирд┐рд╖реНрдХрд░реНрд╖
рд╕рдВрджрд░реНрдн

1. рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг


рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдлрд╝реЛрдЯреЛ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдПрдХ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлрд╝реНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ HTTP POST рдЕрдиреБрд░реЛрдз рдореЗрдВ рдПрдХ рддрд╕реНрд╡реАрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдФрд░ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдЧрд╛ред рдЙрддреНрддрд░ рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдФрд░ рдЙрдирдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдбрд┐рдЧреНрд░реА рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдШреЛрд╖рд┐рдд рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЖрдпрддреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИрдВред

2. рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛


  • рд╕реНрд▓рд╛рдЯ 2.12.7 + рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдиреНрдпреВрдирддрдо рд╕реЗрдЯ, рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП Sbt-рдкреИрдХ 0.12 рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде Sbt 1.2.6ред
  • MXNet 1.3.1 (рд▓реЗрдЦрди рдХреЗ рд╕рдордп рдирд╡реАрдирддрдо рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг), рд╕реНрдХрд▓рд╛ 2.12 рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рддред
  • рдПрдирд╡реАрдбрд┐рдпрд╛ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ред
  • Cuda 9.0 рдФрд░ Cudnn 7 рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИред
  • рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ 8ред
  • рдЕрд╕реЗрдВрдмрд▓реА рдХреА рдЖрд╕рд╛рдиреА, рд╡рд┐рддрд░рдг рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдорд╛рдЗрдХреНрд░реЛ рд╕рд░реНрд╡рд┐рд╕ рдХреА рд╢реБрд░реВрдЖрддред

3. рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рддреИрдпрд╛рд░ рдХрд░рдирд╛


рд╣рдорд╛рд░реЗ microservice рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдбреЙрдХрд░ рдЫрд╡рд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬрд┐рд╕рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдиреНрдпреВрдирддрдо рд╕рдВрдЦреНрдпрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХреА рдЬрд╛рдПрдЧреАред рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдПрд╕рдмреАрдЯреА рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рд╛рдВ, рд╣рдо рд╕реНрдерд╛рдиреАрдп рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕реНрд╡рдпрдВ рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗред рдпрд╣ CI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рд╕рдВрдХреНрд░рдордг рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧрд┐рдЯрд▓реИрдм рд╕реАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред

рдлрд╝реЛрд▓реНрдбрд░ рд╕рдВрд░рдЪрдирд╛:

\ | ----- install | | ----- java8.sh | | ----- mxnet_2_12.sh | | ----- opencv.sh | | ----- sbt.sh | | ----- scala.sh | | ----- timeZone.sh | ----- scala-mxnet-cuda-cudnn | ----- Dockerfile.2.12-1.3.1-9-7-builder | ----- Dockerfile.2.12-1.3.1-9-7-runtime 

Dockerfile.2.12-1.3.1-9-7-рдХреНрд░рдо


рдЗрд╕ рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд╛ рдХреЗ рдЕрдВрддрд┐рдо рд▓реЙрдиреНрдЪ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдкреВрд░реНрд╡рдирд┐рд░реНрдорд┐рдд CUDA 9.0 рдФрд░ CUDNN 7. рдХреЗ рд╕рд╛рде Nvidia рдХреА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЫрд╡рд┐ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред MXNet 1.3.1 рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди CUDA 8.0 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рд╕рдм рдХреБрдЫ 9.0 рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ 9.0 рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдереЛрдбрд╝рд╛ рддреЗрдЬ рднреАред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЗрд╕ рдЫрд╡рд┐ рдореЗрдВ рд╕рдордп рдХреНрд╖реЗрддреНрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ 8, рдПрдордПрдХреНрд╕рдиреЗрдЯ 1.3.1 (рд╣рдо рдЗрд╕реЗ рд╕реНрдХреЗрд▓рд╛ 2.12 рдХреЗ рддрд╣рдд рдмрдирд╛рдПрдВрдЧреЗ), рдУрдкрдирд╕реАрд╡реА 3.4.3 рдФрд░ рд▓рд┐рдирдХреНрд╕-рдпреВрдЯрд┐рд▓рд┐рдЯреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗред

 #        Nvidia  cuda 9.0  cudnn 7 FROM nvidia/cuda:9.0-cudnn7-devel AS builder #    ENV MXNET_VERSION 1.3.1 ENV MXNET_BUILD_OPT "USE_OPENCV=1 USE_BLAS=openblas USE_CUDA=1 USE_CUDA_PATH=/usr/local/cuda USE_CUDNN=1" ENV CUDA_STUBS_DIR "/usr/local/cuda-9.0/targets/x86_64-linux/lib/stubs" ENV OPEN_CV_VERSION 3.4.3 ENV OPEN_CV_INSTALL_PREFIX /usr/local ENV JAVA_HOME /usr/lib/jvm/java-8-oracle/ ENV TIME_ZONE Europe/Moscow #     COPY install /install RUN chmod +x -R /install/* #   RUN apt-get update WORKDIR /install RUN ./timeZone.sh ${TIME_ZONE} RUN ./java8.sh RUN ./mxnet_2_12.sh ${MXNET_VERSION} "${MXNET_BUILD_OPT}" ${CUDA_STUBS_DIR} RUN ./opencv.sh ${OPEN_CV_VERSION} ${OPEN_CV_INSTALL_PREFIX} #     RUN apt-get autoclean -y && \ rm -rf /var/cache/* /install #       FROM nvidia/cuda:9.0-cudnn7-devel COPY --from=builder --chown=root:root / / 

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯрд╛рдЗрдордЬреЛрдиред рдПрд╕рд╢ рдЬрд╛рд╡рд╛ 8. рдПрд╕ рдФрд░ рдУрдкреЗрдирдХреЗрд╡ред рдПрд╕ рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрди рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдЙрдиреНрд╣реЗрдВ рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

timeZone.sh


 #!/bin/sh #         TIME_ZONE=${1} #       apt-get install -y tzdata && \ ln -sf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && \ dpkg-reconfigure -f noninteractive tzdata 

java8.sh


 #!/bin/sh #  Java 8 apt-get install -y software-properties-common && \ add-apt-repository ppa:webupd8team/java -y && \ apt-get update && \ echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 select true" | debconf-set-selections && \ apt-get install -y oracle-java8-installer 

opencv.sh


 #!/bin/sh #   OpenCV     OPEN_CV_VERSION=${1} #        OPEN_CV_INSTALL_PREFIX=${2} OPEN_CV_TAR="http://github.com/opencv/opencv/archive/${OPEN_CV_VERSION}.tar.gz" #  OpenCV apt-get install -y wget build-essential cmake && \ wget -qO- ${OPEN_CV_TAR} | tar xzv -C /tmp && \ mkdir /tmp/opencv-${OPEN_CV_VERSION}/build && \ cd /tmp/opencv-${OPEN_CV_VERSION}/build && \ cmake -DBUILD_JAVA=ON -DCMAKE_INSTALL_PREFIX:PATH=${OPEN_CV_INSTALL_PREFIX} .. && \ make -j$((`nproc`+1)) && \ make install && \ rm -rf /tmp/opencv-${OPEN_CV_VERSION} 

MXNet рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдХрд╛рд▓рд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рд╕рднреА рдЕрд╕реЗрдВрдмрд▓рд┐рдпреЛрдВ рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдВрд╕реНрдХрд░рдг 2.11 рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЙрдЪрд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рд╕реНрдХрд▓рд╛ 2.11 рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рд╡рд┐рдХрд╛рд╕ рдореЗрдВ Scala 2.12.7 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрдХрд▓рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рд╣рдо рд╕рдВрд╕реНрдХрд░рдг 2.11 рдкрд░ рдиреАрдЪреЗ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддреЗред * рдирдП рд╕реНрдХрд╛рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреА рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдХреЗ рдХрд╛рд░рдг, рд╣рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдХреНрдпрд╛ рдХрд░реЗрдВ? рд╕реНрдХрд╛рд▓рд╛ рдХреЗ рд╣рдорд╛рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рд╕реЗ MXNet рдПрдХрддреНрд░ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдордЬрд╝рд╛ рдЖрддрд╛ рд╣реИред рдиреАрдЪреЗ рдореИрдВ Scala 2.12 рдХреЗ рд▓рд┐рдП MXNet 1.3.1 рдмрдирд╛рдиреЗ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреВрдВрдЧрд╛ред * рдФрд░ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВред

mxnet_2_12.sh


 #!/bin/sh #   MXNet     MXNET_VERSION=${1} #     ++  MXNet     MXNET_BUILD_OPT=${2} #       CUDA     CUDA_STUBS_DIR=${3} LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${CUDA_STUBS_DIR}" #       MXNet   apt-get install -y git build-essential libopenblas-dev libopencv-dev maven cmake && \ git clone -b ${MXNET_VERSION} --recursive https://github.com/dmlc/mxnet /tmp/mxnet && \ cd /tmp/mxnet && \ make -j $(nproc) ${MXNET_BUILD_OPT} && \ ln -s ${CUDA_STUBS_DIR}/libcuda.so ${CUDA_STUBS_DIR}/libcuda.so.1 && \ sed -rim 's/([a-zA-Z])_2.11/\1_2.12/g' $(find scala-package -name pom.xml) && \ sed -im 's/SCALA_VERSION_PROFILE := scala-2.11/SCALA_VERSION_PROFILE := scala-2.12/g' Makefile && \ sed -im 's/<module>spark<\/module>/<\!--<module>spark<\/module>-->/g' scala-package/pom.xml && \ make scalapkg ${MXNET_BUILD_OPT} && \ mkdir -p /usr/local/share/mxnet/scala/linux-x86_64-gpu && \ mv /tmp/mxnet/scala-package/assembly/linux-x86_64-gpu/target/mxnet-full_2.12-linux-x86_64-gpu-${MXNET_VERSION}-SNAPSHOT.jar /usr/local/share/mxnet/scala/linux-x86_64-gpu/mxnet-full_2.12-linux-x86_64-gpu-${MXNET_VERSION}-SNAPSHOT.jar && \ rm -rf /tmp/mxnet && rm -rf /root/.m2 

рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рдЗрд╕ рд▓рд╛рдЗрди рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:

 ln -s ${CUDA_STUBS_DIR}/libcuda.so ${CUDA_STUBS_DIR}/libcuda.so.1 && \ 

рдпрджрд┐ рдЖрдк рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ MXNet рдЕрд╕реЗрдВрдмрд▓реА рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреАред рд╕рдВрдХрд▓рдХ рдХреЛ libcuda.so.1 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо libcuda.so рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ libcuda.so.1 рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдЖрдкрдХреЛ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рдЖрдк рдЗрд╕реЗ рдПрдХ рдЙрддреНрдкрд╛рджрди рд╕рд░реНрд╡рд░ рдкрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрдВрдЧреЗред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ CUDA_STUBS_DIR рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╕реЗ CUDA рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдорд╛рд░реНрдЧ LD_LIBRARY_PATH рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдЕрдЧрд░ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛, рддреЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рднреА рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧреАред

рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ, рд╣рдо рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ 2.12 рдХреЗ рд╕рд╛рде Scala 2.11 рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ 2.12 рдХреЗ рд╕рд╛рде рд╣рд░ рдЬрдЧрд╣ 2.11 рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ:

 sed -rim 's/([a-zA-Z])_2.11/\1_2.12/g' $(find scala-package -name pom.xml) && \ sed -im 's/SCALA_VERSION_PROFILE := scala-2.11/SCALA_VERSION_PROFILE := scala-2.12/g' Makefile && \ sed -im 's/<module>spark<\/module>/<\!--<module>spark<\/module>-->/g' scala-package/pom.xml && \ make scalapkg ${MXNET_BUILD_OPT} && \ 

рдФрд░ рдлрд┐рд░ рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЗрдХрдЯреНрдард╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдЧрд▓рд╛, рдЕрд╕реЗрдВрдмрд▓реА рдЪрд▓рд╛рдПрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрдХрдЯреНрдареЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдПрдХ рд╕рд╛рдЭрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдорд╛рд╡реЗрди рдкрдВрдк рдХрд┐рдП рдЧрдП рдХрдЪрд░реЗ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ (рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рд▓рдЧрднрдЧ 3-4 рдЬреАрдмреА рдмрдврд╝ рдЬрд╛рдПрдЧреА, рдЬреЛ рдЖрдкрдХреЗ DevOps рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреА рд╣реИ) рдирд░реНрд╡рд╕)ред

рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдореВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рдЫрд╡рд┐ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ (рджреЗрдЦреЗрдВред рдлрд╝реЛрд▓реНрдбрд░ рд╕рдВрд░рдЪрдирд╛):

 your@pc$ docker build -f Dockerfile.2.12-1.3.1-9-7-runtime -t entony/scala-mxnet-cuda-cudnn:2.12-1.3.1-9-7-runtime . 

рдореБрдЭреЗ рдХреЗрд╡рд▓ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЕрдВрдд рдореЗрдВ рдбреЙрдЯ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓реА рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЕрдм рдмрд┐рд▓реНрдб рдЗрдореЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред

Dockerfile.2.12-1.3.1-9-7 рдирд┐рд░реНрдорд╛рддрд╛


 #         runtime-,    FROM entony/scala-mxnet-cuda-cudnn:2.12-1.3.1-9-7-runtime #    ENV SCALA_VERSION 2.12.7 ENV SBT_VERSION 1.2.6 #     COPY install /install RUN chmod +x -R /install/* #       RUN apt-get update && \ cd /install && \ ./scala.sh ${SCALA_VERSION} && \ ./sbt.sh ${SBT_VERSION} #   RUN rm -rf /install 

рдпрд╣ рд╕рд░рд▓ рд╣реИ, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХрд╛рд▓рд╛ рдФрд░ рдПрд╕рдмреАрдЯреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд▓реЙрдиреНрдЪ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдЫрд╡рд┐ рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рдЕрд▓рдЧ рдЫрд╡рд┐ рдмрдирд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред Scala.sh рдФрд░ sbt.sh рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реИрдВ рдФрд░ рдореИрдВ рдЙрди рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреВрдВрдЧрд╛ред

scala.sh


 #!/bin/sh #   Scala     SCALA_VERSION=${1} SCALA_DEB="http://www.scala-lang.org/files/archive/scala-${SCALA_VERSION}.deb" #  Scala apt-get install -y wget && \ wget -q ${SCALA_DEB} -O /tmp/scala.deb && dpkg -i /tmp/scala.deb && \ scala -version && \ rm /tmp/scala.deb 

sbt.sh


 #!/bin/sh #   Sbt     SBT_VERSION=${1} SBT_DEB="http://dl.bintray.com/sbt/debian/sbt-${SBT_VERSION}.deb" #  Sbt apt-get install -y wget && \ wget -q ${SBT_DEB} -O /tmp/sbt.deb && dpkg -i /tmp/sbt.deb && \ sbt sbtVersion && \ rm /tmp/sbt.deb 

рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдореВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рдЫрд╡рд┐ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ (рджреЗрдЦреЗрдВред рдлрд╝реЛрд▓реНрдбрд░ рд╕рдВрд░рдЪрдирд╛):

 your@pc$ docker build -f Dockerfile.2.12-1.3.1-9-7-builder -t entony/scala-mxnet-cuda-cudnn:2.12-1.3.1-9-7-builder . 

рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрди рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдВрдХ рд╣реИрдВред

4. рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛


рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдХреА рддреИрдпрд╛рд░реА рдкреВрд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рд╣рдорд╛рд░реЗ microservice рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реЛрдЧреА:

 \ | ----- dependencies | | ----- mxnet-full_2.12-linux-x86_64-gpu-1.3.1-SNAPSHOT.jar | ----- models | | ----- resnet50_ssd_model-0000.params | | ----- resnet50_ssd_model-symbol.json | | ----- synset.txt | ----- project | | ----- build.properties | | ----- plugins.sbt | ----- src | | ----- main | | | ----- resources | | | | ----- cat_and_dog.jpg | | | ----- scala | | | | ----- simple.predictor | | | | ----- Config | | | | ----- Model | | | | ----- Server | | | | ----- Run | | ----- test | | | ----- scala | | | | ----- simple.predictor | | | | ----- ServerTest | ----- build.sbt | ----- Dockerfile 

рдпрд╣ рдПрдХ рд╕реНрдХрд╛рд▓рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдорд╛рдирдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рдореЙрдбрд▓ рдХреЗ рдЕрдкрд╡рд╛рдж рд╣реИрдВред
рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реНрдХрд╛рд▓рд╛ рдХреЗ рд▓рд┐рдП рдПрдордПрдХреНрд╕рдиреЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕реЗ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  • рдПрдордПрдХреНрд╕рдиреЗрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЙрд╕ рдорд╢реАрди рдкрд░ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдЖрдк рд╡рд┐рдХрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдирд╣реАрдВ рд╣реИ; рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдореИрдХ рдУрдПрд╕ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛);
  • рдпрд╛ рдЙрд╕ рдбреЙрдХрд░реА рдЫрд╡рд┐ рд╕реЗ рдмрд╛рд╣рд░ рдЦреАрдВрдЪреЛ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рдерд╛ред рдпрджрд┐ рдЖрдк рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдПрдордПрдХреНрд╕рдиреЗрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ mxnet_2.12.sh рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдкрдХреА рдорджрдж рдХрд░реЗрдЧреАред

рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдбреЙрдХрд░ рдЫрд╡рд┐ рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:

 #   your@pc$ mkdir dependencies #  Docker-    your@pc$ docker run -it --rm -v $(pwd)/dependencies:/tmp/dependencies entony/scala-mxnet-cuda-cudnn:2.12-1.3.1-9-7-runtime #          ab38e73d93@root$ cp /usr/local/share/mxnet/scala/linux-x86_64-gpu/mxnet-full_2.12-linux-x86_64-gpu-1.3.1-SNAPSHOT.jar /tmp/dependencies/mxnet-full_2.12-linux-x86_64-gpu-1.3.1-SNAPSHOT.jar ab38e73d93@root$ exit #  , ! your@pc$ ls dependencies/ mxnet-full_2.12-linux-x86_64-gpu-1.3.1-SNAPSHOT.jar -SNAPSHOT.jar #   your@pc$ mkdir dependencies #  Docker-    your@pc$ docker run -it --rm -v $(pwd)/dependencies:/tmp/dependencies entony/scala-mxnet-cuda-cudnn:2.12-1.3.1-9-7-runtime #          ab38e73d93@root$ cp /usr/local/share/mxnet/scala/linux-x86_64-gpu/mxnet-full_2.12-linux-x86_64-gpu-1.3.1-SNAPSHOT.jar /tmp/dependencies/mxnet-full_2.12-linux-x86_64-gpu-1.3.1-SNAPSHOT.jar ab38e73d93@root$ exit #  , ! your@pc$ ls dependencies/ mxnet-full_2.12-linux-x86_64-gpu-1.3.1-SNAPSHOT.jar 

рдореЙрдбрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 #   your@pc$ mkdir models #     your@pc$ wget https://s3.amazonaws.com/model-server/models/resnet50_ssd/resnet50_ssd_model-symbol.json -P models your@pc$ wget https://s3.amazonaws.com/model-server/models/resnet50_ssd/resnet50_ssd_model-0000.params -P models your@pc$ wget https://s3.amazonaws.com/model-server/models/resnet50_ssd/synset.txt -P models 

рдЖрдЧреЗ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реБрдЪрд┐ рдХреЗ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВред

рдкрд░рд┐рдпреЛрдЬрдирд╛ / build.properties


 #   Sbt,   sbt.version = 1.2.6 

рдкреНрд░реЛрдЬреЗрдХреНрдЯ / plugins.sbt


 //    sbt-pack addSbtPlugin("org.xerial.sbt" % "sbt-pack" % "0.12") 

src / main / Resources / cat_and_dog.jpg


рдРрд╕реА рдЕрджреНрднреБрдд рддрд╕реНрд╡реАрд░, рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░рд╛ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдПрдХ рдмрд┐рд▓реНрд▓реА рдФрд░ рдПрдХ рдХреБрддреНрддреЗ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реЛрдЧрд╛ред


build.sbt


 enablePlugins(PackPlugin) name := "simple-predictor" version := "0.1" scalaVersion := "2.12.7" unmanagedBase := baseDirectory.value / "dependencies" //  (   ) libraryDependencies ++= Seq( "org.json4s" %% "json4s-native" % "3.6.1", "org.scalatest" %% "scalatest" % "3.0.5" % Test, "org.scalaj" %% "scalaj-http" % "2.4.1" % Test ) //       packMain := Map("simple-predictor" -> "simple.predictor.Runs") //    bat-,      ,   Linux packGenerateWindowsBatFile := false //    JVM packJvmOpts := Map("simple-predictor" -> Seq( "-Xms3g", "-Xmx5g")) 

simple.predictor.Config


рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдорд╛рди рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 package simple.predictor import org.apache.mxnet.Context import scala.util.Try object Config { //    REST API val host: String = env("REST_HOST") getOrElse "0.0.0.0" //    REST API val port: Int = env("REST_PORT") flatMap (p => Try(p.toInt).toOption) getOrElse 8080 // URL,     POST-   val entryPoint: String = env("REST_ENTRY_POINT") getOrElse "/predict" //  ,       val threshold: Float = env("PROBABILITY_MORE") flatMap (p => Try(p.toFloat).toOption) getOrElse 0.5f //        val modelPrefix: String = env("MODEL_PREFIX") getOrElse "models/resnet50_ssd_model" //    (    ...-0000.params) val modemEpoch: Int = env("MODEL_EPOCH") flatMap (p => Try(p.toInt).toOption) getOrElse 0 //   ,     ,    512 val modemEdge: Int = env("MODEL_EDGE") flatMap (p => Try(p.toInt).toOption) getOrElse 512 //  ,   CPU ( ).  production  GPU val context: Context = env("MODEL_CONTEXT_GPU") flatMap { isGpu => Try(if (isGpu.toBoolean) Context.gpu() else Context.cpu()).toOption } getOrElse Context.cpu() private def env(name: String) = Option(System.getenv(name)) } 

simple.predictor.Run


рд░рди рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИред

 package simple.predictor import java.net.InetSocketAddress //     import simple.predictor.Config._ object Run extends App { //     REST- val model = new Model(modelPrefix, modemEpoch, modemEdge, threshold, context) val server = new Server(new InetSocketAddress(host, port), entryPoint, model) //   Ctrl + C    Runtime.getRuntime.addShutdownHook(new Thread(() => server.stop())) //      try server.start() catch { case ex: Exception => ex.printStackTrace() } } 

5. рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ


рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ simple.predictor.Model рд╡рд░реНрдЧ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

simple.predictor.Model


 package simple.predictor import java.awt.image.BufferedImage import org.apache.mxnet._ import org.apache.mxnet.infer.ObjectDetector import simple.predictor.Model.Prediction class Model(prefix: String, epoch: Int, imageEdge: Int, threshold: Float, context: Context) { //       val initShape = Shape(1, 3, imageEdge, imageEdge) val initData = DataDesc(name = "data", initShape, DType.Float32, Layout.NCHW) //           val model = new ObjectDetector(prefix, IndexedSeq(initData), context, Option(epoch)) //         ,       JSON private def toPrediction(originWidth: Int, originHeight: Int)(predict: (String, Array[Float])): Prediction = { val (objectClass, Array(probability, kx, ky, kw, kh)) = predict //        val x = (originWidth * kx).toInt val y = (originHeight * ky).toInt val w = (originWidth * kw).toInt val h = (originHeight * kh).toInt val width = if ((x + w) < originWidth) w else originWidth - x val height = if (y + h < originHeight) h else originHeight - y Prediction(objectClass, probability, x, y, width, height) } //     ,         ,     threshold def predict(image: BufferedImage): Seq[Prediction] = model.imageObjectDetect(image).head map toPrediction(image.getWidth, image.getHeight) filter (_.probability > threshold) } object Model { //   case class Prediction(objectClass: String, probability: Float, x: Int, y: Int, width: Int, height: Int) } 

рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдпрд╣ 1 x 3 x 512 x 512 рдХреЗ рдЖрдпрд╛рдо рдХреЗ рд╕рд╛рде NDArray рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЬрд╣рд╛рдБ 1 NDARray рдореЗрдВ рдирд┐рд╣рд┐рдд рдЫрд╡рд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, 3 рд░рдВрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ 512 x 512 рд╣реИ - рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ ( imageEdge = 12 рдХрд╛ рдорд╛рди simple.predict.Config рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реЗрдЯ рд╣реИ, рдпрд╣ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЫрд╡рд┐ рдХрд╛ рд╕рд╛рдЗрдб рдЖрдХрд╛рд░ рд╣реИ)ред рдпрд╣ рд╕рд╛рд░рд╛ рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдг ObjectDetector рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЦрдВрдб рдХреА ред

рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫрд╡рд┐ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдгрд╛рдо Seq[Seq[(String, Array[Float])]] ред рдкрд╣рд▓реЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддрд╛ рд╣реИ (рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдлрд┐рд░ рдЕрдЧрд▓реЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рджреЛ рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ:

  1. рд╡рд░реНрдЧ рдирд╛рдо ("рдмрд┐рд▓реНрд▓реА", "рдХреБрддреНрддрд╛", ...),
  2. рдкрд╛рдБрдЪ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА: рдкрд╣рд▓реА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рджреВрд╕рд░реА x рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЧреБрдгрд╛рдВрдХ рд╣реИ, рддреАрд╕рд░реА y рд╕рдордиреНрд╡рдп рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЧреБрдгрд╛рдВрдХ рд╣реИ, рдЪреМрдерд╛ рдЖрдпрдд рдЪреМрдбрд╝рд╛рдИ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЧреБрдгрд╛рдВрдХ рд╣реИ, рдФрд░ рдкрд╛рдБрдЪрд╡рд╛рдБ рдЖрдпрдд рдХреА рдКрдБрдЪрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрдгрд╛рдВрдХ рд╣реИред

рдЖрдпрдд рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдЖрдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдЧреБрдгрд╛рдВрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЫрд╡рд┐ рдХреА рдореВрд▓ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдореИрдВ NDArray рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдЦреБрдж рдХреЛ рдереЛрдбрд╝рд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реВрдВред рдпрд╣ рдПрдХ рдмрд╣реБрдЖрдпрд╛рдореА рд╕рд░рдгреА рд╣реИ рдЬрд┐рд╕реЗ MXNet рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╕рдВрджрд░реНрдн (CPU рдпрд╛ GPU) рдореЗрдВ рдмрдирд╛рддрд╛ рд╣реИред NDArray рдмрдирд╛рддреЗ рд╕рдордп, C ++ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирддрд╛ рд╣реИ, рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдСрдкрд░реЗрд╢рди рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдЕрдЧрд░ рдпрд╣ GPU рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рд▓рдЧрднрдЧ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рд╣реИ), рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдРрд╕реА рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк (рдХрдо рд╕реЗ рдХрдо рд╕рдВрд╕реНрдХрд░рдг рдПрдордПрдХреНрд╕рдиреЗрдЯ 1.3.1 рдореЗрдВ) рдЖрдкрдХреЛ NDArray рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдореЗрдореЛрд░реА рд╕реЗ рдЕрдирд▓реЛрдб рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред рдЕрдиреНрдпрдерд╛, рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдФрд░ рдХрд╛рдлреА рддреЗрдЬ рдореЗрдореЛрд░реА рд░рд┐рд╕рд╛рд╡ рд╣реЛрдЧрд╛, рдЬреЛ рдореЙрдирд┐рдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬреЗрд╡реАрдПрдо рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк GPU рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореЗрдореЛрд░реА рдХреА рд╕рдорд╕реНрдпрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдореЗрдВ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдореЗрдореЛрд░реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдореЛрд░реА рд╕реЗ рдЬрд▓реНрджреА рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдореЗрдореЛрд░реА рд▓реАрдХ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░реЗрдВ?

рдЙрдкрд░реНрдпреБрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд▓рд╛рдЗрди model.imageObjectDetect(image).head map toPrediction(image.getWidth, image.getHeight) filter (_.probability > threshold) , imageObjectDetect рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫрд╡рд┐ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ BufferedImage рдЗрдирдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред NDArray рд╕реЗ рд╕рднреА рд░реВрдкрд╛рдВрддрд░рдг рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдХрд┐рдП NDArray рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдбреАрд▓реЙрдХреНрд▓реЗрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░реА рдУрд░, NDArray рдХреЛ NDArray рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ NDArray рдХрд╛ рдХрд╛рд░реНрдп 512 x 512 рдХреЗ NDArray рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЫрд╡рд┐ рдХреЛ NDArray рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, OpenCV рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рдереЛрдбрд╝рд╛ рд▓рдВрдмрд╛ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ NDArray рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ OpenCV рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореЗрдореЛрд░реА рдХреЛ рд╕реНрд╡рдпрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдмрд╕ dispose рдХреА dispose рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА dispose , рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдк рд╕реНрдХрд╛рд▓рд╛ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ MXNet рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рднреВрд▓ рдЧрдПред

MXNet рдХреЗ рдкрд╛рд╕ NDArray рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, JVM рдкреИрд░рд╛рдореАрдЯрд░ Dmxnet.traceLeakedObjects=true рд╕рд╛рде рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдПрдБред рдпрджрд┐ рдПрдордПрдХреНрд╕рдиреЗрдЯ рдПрдХ рдПрдирдбреАрдПрдЖрд░рдИрдЖрд░ рдиреЛрдЯрд┐рд╕ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдореГрддрд┐ рдореЗрдВ рд▓рдЯрдХрд╛ рд╣реБрдЖ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдорд┐рд▓реЗрдЧрд╛ рдЬреЛ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ рдХрд┐ рдХрд┐рд╕ рд▓рд╛рдЗрди рдХрд╛ рдХреЛрдб рдЧрд▓рдд NDArray ред

рдореЗрд░реА рд╕рд▓рд╛рд╣: NDArray рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░реЗрдВ, рдзреНрдпрд╛рди рд╕реЗ рдореЗрдореЛрд░реА рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд▓рд┐рдЦреЗрдВ, рдкрд╣рд▓реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдХрд┐ рддрдВрддреНрд░рд┐рдХрд╛ рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рдПрдордПрд▓ рдЗрдВрдЬреАрдирд┐рдпрд░ рдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛, рдЕрдиреНрдпрдерд╛ рдкрд░рд┐рдгрд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдВрдЧреЗред ObjectDetector рдореЗрдВ рдПрдХ objectDetectWithNDArray рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЖрдк NDArray рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ org.apache.mxnet.module.Module рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рдиреАрдЪреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред

 import org.apache.mxnet._ import org.apache.mxnet.io.NDArrayIter //      val model: Module = { val model = Module.loadCheckpoint(modelPrefix, modelEpoch, contexts = contexts) model.bind( forTraining = false, inputsNeedGrad = false, forceRebind = false, dataShape = DataDesc(name = "data", Shape(1, 3, 512, 512), DType.Float32, Layout.NCHW)) model.initParams() model } // NDArray  1  3  512  512 val image: NDArray = ??? //  dataBatch      val iterator = new NDArrayIter(IndexedSeq(image)) val dataBatch = iterator.next() image.dispose() //   val result: Seq[Array[Float]] = model.predict(dataBatch) map { ndArray => val array = ndArray.toArray ndArray.dispose() array } dataBatch.dispose() 

6. рд░реАрд╕реНрдЯ рдПрдкреАрдЖрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


REST API рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП simple.predictor.Server рд╡рд░реНрдЧ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд╕рд░реНрд╡рд░ рдЬрд╛рд╡рд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдЬрд╛рд╡рд╛ рд╕рд░реНрд╡рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред

simple.predictor.Server


 package simple.predictor import java.net.InetSocketAddress import com.sun.net.httpserver.{HttpExchange, HttpServer} import javax.imageio.ImageIO import org.json4s.DefaultFormats import org.json4s.native.Serialization class Server(address: InetSocketAddress, entryPoint: String, model: Model) { //   HTTP-,     java private val server = HttpServer.create(address, 0) //      URL server.createContext(entryPoint, (http: HttpExchange) => { //   HTTP-     val header = http.getRequestHeaders val (httpCode, json) = if (header.containsKey("Content-Type") && header.getFirst("Content-Type") == "image/jpeg") { //          ,      200 val image = ImageIO.read(http.getRequestBody) val predictionSeq = model.predict(image) (200, Map("prediction" -> predictionSeq)) } else (400, Map("error" -> "Invalid content")) //       400 //    JSON    val responseJson = Serialization.write(json)(DefaultFormats) val httpOs = http.getResponseBody http.getResponseHeaders.set("Content-Type", "application/json") http.sendResponseHeaders(httpCode, responseJson.length) httpOs.write(responseJson.getBytes) httpOs.close() }) def start(): Unit = server.start() def stop(): Unit = server.stop(0) } 

7. рдкрд░реАрдХреНрд╖рдг


рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЪрд┐рддреНрд░ рднреЗрдЬреЗрдВ src / main / Resources / cat_and_dog.jpgред рд╣рдо рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд JSON рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВрдЧреЗ, рдЪрд┐рддреНрд░ рдореЗрдВ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдХрд┐рддрдиреА рдФрд░ рдХрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдорд┐рд▓рд╛рдПрдВ, рдФрд░ рдЪрд┐рддреНрд░ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рд░реНрдХрд▓ рдХрд░реЗрдВред

simple.predictor.ServerTest


 package simple.predictor import java.awt.{BasicStroke, Color, Font} import java.awt.image.BufferedImage import java.io.{ByteArrayOutputStream, File} import java.net.InetSocketAddress import javax.imageio.ImageIO import org.scalatest.{FlatSpec, Matchers} import scalaj.http.Http import org.json4s.{DefaultFormats, Formats} import org.json4s.native.JsonMethods.parse import simple.predictor.Config._ import simple.predictor.Model.Prediction import scala.concurrent.Future import scala.concurrent.ExecutionContext.Implicits.global class ServerTest extends FlatSpec with Matchers { implicit val formats: Formats = DefaultFormats "Service" should "find a cat and a dog on photo" in { //      val model = new Model(modelPrefix, modemEpoch, modemEdge, threshold, context) val server = new Server(new InetSocketAddress(host, port), entryPoint, model) //      Future(server.start()) Thread.sleep(5000) //         val image = ImageIO.read(getClass.getResourceAsStream("/cat_and_dog.jpg")) val byteOS = new ByteArrayOutputStream() ImageIO.write(image, "jpg", byteOS) val data = byteOS.toByteArray //      ,     200 val response = Http(s"http://$host:$port$entryPoint").header("Content-Type", "image/jpeg").postData(data).asString response.code shouldEqual 200 //  JSON-, ,       val prediction = parse(response.body) \\ "prediction" prediction.children.size shouldEqual 2 //     , ,     ,    val objectClassList = (prediction \\ "objectClass").children map (_.extract[String]) objectClassList.head shouldEqual "cat" objectClassList.tail.head shouldEqual "dog" //   ,   val bBoxCoordinates = prediction.children.map(_.extract[Prediction]) //   ,     val imageWithBoundaryBoxes = new BufferedImage(image.getWidth, image.getHeight, image.getType) val graph = imageWithBoundaryBoxes.createGraphics() graph.drawImage(image, 0, 0, null) graph.setColor(Color.RED) graph.setStroke(new BasicStroke(5)) graph.setFont(new Font(Font.SANS_SERIF, Font.TRUETYPE_FONT, 30)) bBoxCoordinates foreach { case Prediction(obj, prob, x, y, width, height) => graph.drawRect(x, y, width, height) graph.drawString(s"$obj, prob: $prob", x + 15, y + 30) } graph.dispose() //         ImageIO.write(imageWithBoundaryBoxes, "jpg", new File("./test.jpg")) } } 

, .



8.


, . Docker , .

Dockerfile


 #       Sbt FROM entony/scala-mxnet-cuda-cudnn:2.12-1.3.1-9-7-builder AS builder #       RUN mkdir /tmp/source /tmp/source/dependencies COPY project /tmp/source/project COPY src /tmp/source/src COPY build.sbt /tmp/source/build.sbt #     MXNet,       RUN ln -s /usr/local/share/mxnet/scala/linux-x86_64-gpu/mxnet-full_2.12-linux-x86_64-gpu-1.3.1-SNAPSHOT.jar /tmp/source/dependencies/mxnet-full_2.12-linux-x86_64-gpu-1.3.1-SNAPSHOT.jar && \ cd /tmp/source/ && sbt pack #      FROM entony/scala-mxnet-cuda-cudnn:2.12-1.3.1-9-7-runtime #   LD   Cuda   Java ENV LD_LIBRARY_PATH /usr/local/cuda-9.0/targets/x86_64-linux/lib/stubs:/usr/local/share/OpenCV/java #            /opt/app/models ENV MODEL_PREFIX "/opt/app/models/resnet50_ssd_model" #            RUN mkdir -p /opt/app COPY --from=builder --chown=root:root /tmp/source/target/pack /opt/app COPY models /opt/app/models #      ENTRYPOINT /opt/app/bin/simple-predictor 



 # ,    ,   Dockerfile your@pc$ docker build -f Dockerfile -t entony/simple-predictor:1.0.0 . #   docker hub your@pc$ docker push entony/simple-predictor:1.0.0 

9. production- GPU


, docker hub, Nvidia, 8080 Docker, Cuda 9.0 Cudnn 7.

 #     Docker hub your@server-with-gpu$ docker pull entony/simple-predictor:1.0.0 #     your@server-with-gpu$ docker run -d \ -p 8080:8080 \ -e MODEL_CONTEXT_GPU=true \ -e MXNET_CUDNN_AUTOTUNE_DEFAULT=0 \ --name 'simple_predictor' \ --device /dev/nvidia0:/dev/nvidia0 \ --device /dev/nvidiactl:/dev/nvidiactl \ --device /dev/nvidia-uvm:/dev/nvidia-uvm \ -v /usr/lib/x86_64-linux-gnu/libcuda.so.1:/usr/local/cuda-9.0/targets/x86_64-linux/lib/stubs/libcuda.so.1:ro \ -v /usr/lib/nvidia-396/libnvidia-fatbinaryloader.so.396.54:/usr/local/cuda-9.0/targets/x86_64-linux/lib/stubs/libnvidia-fatbinaryloader.so.396.54:ro \ entony/simple-predictor:1.0.0 

Docker- --device Cuda- -v .

MODEL_CONTEXT_GPU GPU-, MXNET_CUDNN_AUTOTUNE_DEFAULT ( , , , ).

:

 #  your@server-with-gpu$ curl -X POST -H 'Content-Type: image/jpeg' --data-binary '@src/main/resources/cat_and_dog.jpg' http://0.0.0.0:8080/predict #  { "prediction":[ { "objectClass":"cat", "probability":0.9959417, "x":72,"y":439, "width":950, "height":987 }, { "objectClass":"dog", "probability":0.81277525, "x":966, "y":100, "width":870, "height":1326 } ] } 

рдирд┐рд╖реНрдХрд░реНрд╖


MXNet , - . , , , production.

, , MXNet , Python production Scala, Java ++.

, .

, . . рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд╕рдВрджрд░реНрдн


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


All Articles