рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдпреВрдирд┐рдЯ (GPU) рдкрд░ рдЖрдкрдХрд╛ рдкрд╣рд▓рд╛ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХред рд╢реБрд░реБрдЖрддреА рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ 30 рдорд┐рдирдЯ рдореЗрдВ рдорд╢реАрди рд╕реАрдЦрдиреЗ рдХрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдЫрд╡рд┐ рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдПрдВ рдФрд░ рдлрд┐рд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдпреВрдирд┐рдЯ (GPU) рдкрд░ рд╕рдорд╛рди рдиреЗрдЯрд╡рд░реНрдХ рдЪрд▓рд╛рдПрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЪрд▓реЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреНрдпрд╛ рд╣реИред

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

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

рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкреИрдЯрд░реНрди рдорд╛рдиреНрдпрддрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ, рд╡рд┐рднреЗрджрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИред

рдЙрдкрдХрд░рдг


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

рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдореИрдВ рд░реВрд╕реА рдХреНрд▓рд╛рдЙрдб рдкреНрд░рджрд╛рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдХрдВрдкрдиреА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ NVIDIA рд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЯреЗрд╕реНрд▓рд╛ рд╡реА 100 рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдпреВрдирд┐рдЯ (рдЬреАрдкреАрдпреВ) рдХреЗ рд╕рд╛рде рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рд░рд╛рдпреЗ рдХреЗ рдХреНрд▓рд╛рдЙрдб рд╕рд░реНрд╡рд░ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: рдПрдХ рдЬреАрдкреАрдпреВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рд╛рдЧрдд рдХреЗ рд╕рдорд╛рди рд╕рд░реНрд╡рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рджрд░реНрдЬрдиреЛрдВ рдЧреБрдирд╛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ (рддреЗрдЬ) рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реАрдкреАрдпреВ (рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдХреЗрдВрджреНрд░реАрдп рдкреНрд░реЛрд╕реЗрд╕рд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ GPU рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЧрдгрдирд╛ рдХреЛ рддреЗрдЬреА рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред

рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдХрдИ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд░реНрд╡рд░ рдЦрд░реАрджрд╛:

  • 150 рдЬреАрдмреА рдПрд╕рдПрд╕рдбреА
  • рд░реИрдо 32 рдЬреАрдмреА
  • 4 рдХреЛрд░ рдХреЗ рд╕рд╛рде рдЯреЗрд╕реНрд▓рд╛ рд╡реА 100 16 рдЬреАрдмреА рдкреНрд░реЛрд╕реЗрд╕рд░

рдорд╢реАрди рдкрд░ Ubuntu 18.04 рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗрдЯ рдХрд░реЗрдВ


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

рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рдо рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЬреНрдпрд╛рджрд╛рддрд░ рдпреВрдЬрд░реНрд╕ рд╡рд┐рдВрдбреЛрдЬ рдХреЛ рд╡рд░реНрдХрд┐рдВрдЧ рдУрдПрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ OS рдореЗрдВ рдорд╛рдирдХ рдХрдВрд╕реЛрд▓ рд╡рд╛рдВрдЫрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ Cmder / рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ ред рдорд┐рдиреА рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ Cmder.exe рдЪрд▓рд╛рдПрдВред рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ SSH рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

ssh root@server-ip-or-hostname

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

Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-74-generic x86_64)

рдПрдордПрд▓ рдореЙрдбрд▓ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рднрд╛рд╖рд╛ рдкрд╛рдпрдерди рд╣реИред рдФрд░ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдордВрдЪ рдПрдирд╛рдХреЛрдВрдбрд╛ рд╣реИ ред

рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред

рд╣рдо рд╕реНрдерд╛рдиреАрдп рдкреИрдХреЗрдЬ рдкреНрд░рдмрдВрдзрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

sudo apt-get update

рдХрд░реНрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ (рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрд┐рддрд╛):

sudo apt-get install curl

рдПрдирд╛рдХреЛрдВрдбрд╛ рд╡рд┐рддрд░рдг рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ:

cd /tmp
curl тАУO https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh

рд╣рдо рд╕реНрдерд╛рдкрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

bash Anaconda3-2019.10-Linux-x86_64.sh

рд╕реНрдерд╛рдкрдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рдЖрдкрдХреЛ рд▓рд╛рдЗрд╕реЗрдВрд╕ рд╕рдордЭреМрддреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреА рд╣реЛрдЧреАред рд╕рдлрд▓ рд╕реНрдерд╛рдкрдирд╛ рдкрд░, рдЖрдкрдХреЛ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

Thank you for installing Anaconda3!

рдПрдордПрд▓ рдореЙрдбрд▓ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдм рдХрдИ рд░реВрдкрд░реЗрдЦрд╛рдПрдВ рдмрдирд╛рдИ рдЧрдИ рд╣реИрдВ, рд╣рдо рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ: рдкрд╛рдпреЛрд░реНрдЪ рдФрд░ рдЯреЗрдиреНрд╕рд░рдлреНрд▓реЛ ред

рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рд╡рд┐рдХрд╛рд╕ рдХреА рдЧрддрд┐ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо PyTorch рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЛ:

conda install pytorch torchvision cudatoolkit=10.1 -c pytorch

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

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдкреЛрд░реНрдЯ 8080 рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ Jupyter рдЪрд▓рд╛рддреЗ рд╣реИрдВ:

jupyter notebook --no-browser --port=8080 --allow-root

рдЕрдЧрд▓рд╛, рд╣рдорд╛рд░реЗ Cmder рдХрдВрд╕реЛрд▓ рдореЗрдВ рдПрдХ рдФрд░ рдЯреИрдм рдЦреЛрд▓рдирд╛ (рд╢реАрд░реНрд╖ рдореЗрдиреВ рдиреНрдпреВ рдХрдВрд╕реЛрд▓ рдбрд╛рдпрд▓реЙрдЧ рд╣реИ), рдкреЛрд░реНрдЯ 8080 рдкрд░ SSH рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:

ssh -L 8080:localhost:8080 root@server-ip-or-hostname

рдЬрдм рдЖрдк рдкрд╣рд▓реА рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЬреБрдкрд┐рдЯрд░ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдЬрд╛рдПрдЧреА:

To access the notebook, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/nbserver-18788-open.html
    Or copy and paste one of these URLs:
        http://localhost:8080/?token=cca0bd0b30857821194b9018a5394a4ed2322236f116d311
     or http://127.0.0.1:8080/?token=cca0bd0b30857821194b9018a5394a4ed2322236f116d311

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

рдЖрдЗрдП рдПрдХ рдирдпрд╛ рд▓реИрдкрдЯреЙрдк рдмрдирд╛рдПрдВ: рдирдпрд╛ - рдиреЛрдЯрдмреБрдХ - рдкрд╛рдпрдерди 3.

рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рд╣рдо рдЬреБрдкрд┐рдЯрд░ рдореЗрдВ рдПрдХ PyTorch рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ (рд░рди рдмрдЯрди):

from __future__ import print_function
import torch
x = torch.rand(5, 3)
print(x)

рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:



рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рд╣реИ, рддреЛ рд╣рдо рд╕рднреА рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!

рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдПрдБ


рд╣рдо рдЫрд╡рд┐ рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдПрдВрдЧреЗред рд╣рдо рдЗрд╕ рдЧрд╛рдЗрдб рдХреЛ рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ ред

рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз CIFAR10 рдбреЗрдЯрд╛рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ: "рд╣рд╡рд╛рдИ рдЬрд╣рд╛рдЬ", "рдХрд╛рд░", "рдкрдХреНрд╖реА", "рдмрд┐рд▓реНрд▓реА", "рд╣рд┐рд░рдг", "рдХреБрддреНрддрд╛", "рдореЗрдВрдврдХ", "рдШреЛрдбрд╝рд╛", "рдЬрд╣рд╛рдЬ", "рдЯреНрд░рдХ"ред CIFAR10 рдореЗрдВ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЖрдХрд╛рд░ 3x32x32 рд╣реИ, рдЕрд░реНрдерд╛рдд 3-рдЪреИрдирд▓ рд░рдВрдЧреАрди рдЪрд┐рддреНрд░ 32x32 рдкрд┐рдХреНрд╕реЗрд▓ред


рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рд╣рдо рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЧрдП PyTorch рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ - рдЯрд╛рд░реНрдЪрд╡рд┐рдЬрдиред

рд╣рдо рдХреНрд░рдо рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрджрдо рдЙрдард╛рдПрдВрдЧреЗ:

  • рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВ
  • рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░рд┐рднрд╛рд╖рд╛
  • рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдбреЗрдЯрд╛ рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг
  • рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛
  • GPU рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рджреЛрд╣рд░рд╛рдПрдБ

рдиреАрдЪреЗ рд╕рднреА рдХреЛрдб рд╣рдо Jupyter рдиреЛрдЯрдмреБрдХ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВрдЧреЗред

CIFAR10 рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВ


рдЬреБрдкрд┐рдЯрд░ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рдХреЙрдкреА рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:


import torch
import torchvision
import torchvision.transforms as transforms

transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                         shuffle=False, num_workers=2)

classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

рдЬрд╡рд╛рдм рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./data/cifar-10-python.tar.gz
Extracting ./data/cifar-10-python.tar.gz to ./data
Files already downloaded and verified

рд╣рдо рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ:


import matplotlib.pyplot as plt
import numpy as np

# functions to show an image

def imshow(img):
    img = img / 2 + 0.5     # unnormalize
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg, (1, 2, 0)))
    plt.show()

# get some random training images
dataiter = iter(trainloader)
images, labels = dataiter.next()

# show images
imshow(torchvision.utils.make_grid(images))
# print labels
print(' '.join('%5s' % classes[labels[j]] for j in range(4)))



рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░рд┐рднрд╛рд╖рд╛


рдЖрдЗрдП рд╣рдо рдкрд╣рд▓реЗ рдпрд╣ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЫрд╡рд┐ рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╣ рдПрдХ рд╕рд░рд▓ рдбрд╛рдпрд░реЗрдХреНрдЯ рдХрдиреЗрдХреНрд╢рди рдиреЗрдЯрд╡рд░реНрдХ рд╣реИред рдпрд╣ рдЗрдирдкреБрдЯ рд▓реЗрддрд╛ рд╣реИ, рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдХрдИ рдкрд░рддреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЕрдВрдд рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рджреЗрддрд╛ рд╣реИред



рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдПрдВ:


import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

net = Net()

рд╣рдо рдиреБрдХрд╕рд╛рди рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ


import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдбреЗрдЯрд╛ рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг


рд╣рдо рдЕрдкрдиреЗ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рдж, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдЖрдкрдХреЛ рдХреБрдЫ рд╕рдордп рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ 5 рдорд┐рдирдЯ рд▓рдЧреЗред рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдореЗрдВ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред

 for epoch in range(2):  # loop over the dataset multiple times

    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # get the inputs; data is a list of [inputs, labels]
        inputs, labels = data

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.item()
        if i % 2000 == 1999:    # print every 2000 mini-batches
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0

print('Finished Training')

рд╣рдореЗрдВ рдирд┐рдореНрди рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ: рд╣рдо



рдЕрдкрдиреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдореЙрдбрд▓ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ:

PATH = './cifar_net.pth'
torch.save(net.state_dict(), PATH)

рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛


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

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

dataiter = iter(testloader)
images, labels = dataiter.next()

# print images
imshow(torchvision.utils.make_grid(images))
print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))



рдЕрдм рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдкреВрдЫреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдмрддрд╛рдПрдВ рдХрд┐ рдЗрди рддрд╕реНрд╡реАрд░реЛрдВ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ:


net = Net()
net.load_state_dict(torch.load(PATH))

outputs = net(images)

_, predicted = torch.max(outputs, 1)

print('Predicted: ', ' '.join('%5s' % classes[predicted[j]]
                              for j in range(4)))



рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд▓рдЧрддреЗ рд╣реИрдВ: рдиреЗрдЯрд╡рд░реНрдХ рдиреЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪрд╛рд░ рдЪрд┐рддреНрд░реЛрдВ рдореЗрдВ рд╕реЗ рддреАрди рдХреА рдкрд╣рдЪрд╛рди рдХреАред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдкреВрд░реЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the 10000 test images: %d %%' % (
    100 * correct / total))



рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╡рд╣ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рдЯреАрдХрддрд╛ 10% рд╣реЛрдЧреАред

рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдХрд┐рди рд╡рд░реНрдЧреЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:

class_correct = list(0. for i in range(10))
class_total = list(0. for i in range(10))
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs, 1)
        c = (predicted == labels).squeeze()
        for i in range(4):
            label = labels[i]
            class_correct[label] += c[i].item()
            class_total[label] += 1


for i in range(10):
    print('Accuracy of %5s : %2d %%' % (
        classes[i], 100 * class_correct[i] / class_total[i]))



рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реЛрдВ рдФрд░ рдЬрд╣рд╛рдЬреЛрдВ рдХреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ: 71% рд╕рдЯреАрдХрддрд╛ред

рдЗрд╕рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдЕрдм рдЗрд╕рдХреЗ рдХрд╛рдо рдХреЛ рдЧреНрд░рд╛рдлрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ (GPU) рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдмрджрд▓рд╛рд╡ рд╣реЛрддреЗ рд╣реИрдВред

GPU рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ CUDA рдХреНрдпрд╛ рд╣реИред CUDA (Compute Unified Device Architecture) рдЬреАрдкреАрдпреВ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП NVIDIA рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╣реИред CUDA рдХреЗ рд╕рд╛рде, рдбреЗрд╡рд▓рдкрд░реНрд╕ GPU рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдХрд╛рдлреА рддреЗрдЬреА рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЦрд░реАрджреЗ рдЧрдП рд╕рд░реНрд╡рд░ рдкрд░, рдпрд╣ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд╣рд▓реЗ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реИред

рдЖрдЗрдП рдкрд╣рд▓реЗ рд╣рдорд╛рд░реЗ GPU рдХреЛ рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ cuda рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред

device = torch . device ( "cuda:0" if torch . cuda . is_available () else "cpu" )
# Assuming that we are on a CUDA machine, this should print a CUDA device:
print ( device )



GPU рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рднреЗрдЬреЗрдВ:

net.to(device)

рд╣рдореЗрдВ рд╣рд░ рдХрджрдо рдФрд░ GPU рдкрд░ рдЗрдирдкреБрдЯ рдФрд░ рд▓рдХреНрд╖реНрдп рднреА рднреЗрдЬрдиреЗ рд╣реЛрдВрдЧреЗ:

inputs, labels = data[0].to(device), data[1].to(device)

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА GPU рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдБ:

import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
for epoch in range(2):  # loop over the dataset multiple times

    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # get the inputs; data is a list of [inputs, labels]
    inputs, labels = data[0].to(device), data[1].to(device)

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.item()
        if i % 2000 == 1999:    # print every 2000 mini-batches
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0

print('Finished Training')

рдЗрд╕ рдмрд╛рд░, рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд▓рдЧрднрдЧ 3 рдорд┐рдирдЯ рддрдХ рдЪрд▓рд╛ред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдПрдХ рдирд┐рдпрдорд┐рдд рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдПрдХ рд╣реА рдЪрд░рдг 5 рдорд┐рдирдЯ рддрдХ рдЪрд▓рддрд╛ рд╣реИред рдЕрдВрддрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рдиреЗрдЯрд╡рд░реНрдХ рдЗрддрдирд╛ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИред рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдмрдбрд╝реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, GPU рдФрд░ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рдЧрддрд┐ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдмрдврд╝ рдЬрд╛рдПрдЧрд╛ред

рд╡рд╣ рд╕рдм рдорд╛рд▓реВрдо рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдХреНрдпрд╛ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ:

  • рд╣рдордиреЗ рдЬрд╛рдВрдЪ рдХреА рдХрд┐ GPU рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЙрд╕ рд╕рд░реНрд╡рд░ рдХреЛ рдЪреБрдирд╛ рдЬрд┐рд╕ рдкрд░ рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ;
  • рд╣рдордиреЗ рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ;
  • рд╣рдордиреЗ рдЫрд╡рд┐ рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдпрд╛ рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛;
  • рд╣рдордиреЗ GPU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЛ рджреЛрд╣рд░рд╛рдпрд╛ рдФрд░ рдЧрддрд┐ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХреАред

рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

All Articles