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

рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкреНрд░рд╢реЛрдзрди рдЗрдХрд╛рдИ (GPU) рдорд╛ рддрдкрд╛рдИрдВрдХреЛ рдкрд╣рд┐рд▓реЛ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХред рд╢реБрд░реБрдЖрддреА рдЧрд╛рдЗрдб
рдпрд╕ рд▓реЗрдЦрдорд╛, рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ 30 рдорд┐рдиреЗрдЯрдорд╛ рдореЗрд╕рд┐рди рд▓рд░реНрдирд┐рдЩ рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╕рд░реА рд╕реЗрдЯрдЕрдк рдЧрд░реНрдиреЗ, рдЫрд╡рд┐ рдкрд╣рд┐рдЪрд╛рдирдХреЛ рд▓рд╛рдЧрд┐ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкреНрд░реЛрд╕реЗрд╕рд░ (GPU) рдорд╛ рдЙрд╣реА рдиреЗрдЯрд╡рд░реНрдХ рдЪрд▓рд╛рдЙрдиреЗ рднрдиреЗрд░ рдмрддрд╛рдЙрдиреЗрдЫреБред

рдкрд╣рд┐рд▓реЗ, рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╣реЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реМрдВред

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

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

рдореЗрд╕рд┐рди рд▓рд░реНрдирд┐рдЩрдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдмрд╛рдЯ, рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдврд╛рдБрдЪрд╛ рдкрд╣рд┐рдЪрд╛рди рд╡рд┐рдзрд┐рд╣рд░реВ, рднреЗрджрднрд╛рд╡ рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдХреНрд▓рд╕реНрдЯрд░рд┐рдЩ рд╡рд┐рдзрд┐рд╣рд░реВ рд░ рдЕрдиреНрдп рд╡рд┐рдзрд┐рд╣рд░реВрдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реЛред

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

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

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

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

  • SSD рдбрд┐рд╕реНрдХ 150 GB
  • рд░реНрдпрд╛рдо 32 рдЬреАрдмреА
  • рдЯреЗрд╕реНрд▓рд╛ V100 16 рдЬреАрдмреА рдкреНрд░реЛрд╕реЗрд╕рд░ 4 рдХреЛрд░ рд╕рдВрдЧ

рд╣рд╛рдореАрд▓реЗ рд╣рд╛рдореНрд░реЛ рдореЗрд╕рд┐рдирдорд╛ Ubuntu 18.04 рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдпреМрдВред

рд╡рд╛рддрд╛рд╡рд░рдг рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрджреИ

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

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

ssh root@server-ip-or-hostname

рд╕рд░реНрднрд░-рдЖрдИрдкреА-рд╡рд╛-рд╣реЛрд╕реНрдЯрдирд╛рдордХреЛ рд╕рдЯреНрдЯрд╛, рддрдкрд╛рдИрдВрдХреЛ рд╕рд░реНрднрд░рдХреЛ IP рдареЗрдЧрд╛рдирд╛ рд╡рд╛ DNS рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдЕрд░реНрдХреЛ, рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдпрджрд┐ рдЬрдбрд╛рди рд╕рдлрд▓ рдЫ рднрдиреЗ, рд╣рд╛рдореАрд▓реЗ рдпрд╕реНрддреИ рд╕рдиреНрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрдкрд░реНрдЫред

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

рдПрдордПрд▓ рдореЛрдбреЗрд▓рд╣рд░реВ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрдиреЗ рдореБрдЦреНрдп рднрд╛рд╖рд╛ рдкрд╛рдЗрдерди рд╣реЛред рд░ рд▓рд┐рдирдХреНрд╕рдорд╛ рдпрд╕рдХреЛ рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдмреИрднрдиреНрджрд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд▓реЗрдЯрдлрд░реНрдо рд╣реЛ Anaconda.

рдпрд╕рд▓рд╛рдИ рд╣рд╛рдореНрд░реЛ рд╕рд░реНрднрд░рдорд╛ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реМрдВред

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

sudo apt-get update

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

sudo apt-get install curl

Anaconda рд╡рд┐рддрд░рдг рдХреЛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдиреБрд╣реЛрд╕реН:

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

рдЕрдм рд╣рд╛рдореАрд▓реЗ Jupyter Notebook, ML рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд▓реЛрдХрдкреНрд░рд┐рдп рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдг рд╕реБрд░реВ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдХреЛрдб рд▓реЗрдЦреНрди рд░ рддреБрд░реБрдиреНрддреИ рдпрд╕рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рдирддрд┐рдЬрд╛рд╣рд░реВ рд╣реЗрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред Jupyter Notebook Anaconda рд╕рдБрдЧ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░рд┐рдПрдХреЛ рдЫ рд░ рдкрд╣рд┐рд▓реЗ рдиреИ рд╣рд╛рдореНрд░реЛ рд╕рд░реНрднрд░рдорд╛ рд╕реНрдерд╛рдкрд┐рдд рдЫред рддрдкрд╛рдИрдВрд▓реЗ рд╣рд╛рдореНрд░реЛ рдбреЗрд╕реНрдХрдЯрдк рдкреНрд░рдгрд╛рд▓реАрдмрд╛рдЯ рдпрд╕рд▓рд╛рдИ рдЬрдбрд╛рди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рдкрд╣рд┐рд▓реЗ рдкреЛрд░реНрдЯ 8080 рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрдиреЗ рд╕рд░реНрднрд░рдорд╛ Jupyter рд╕реБрд░реБ рдЧрд░реНрдиреЗрдЫреМрдВ:

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

рдЕрд░реНрдХреЛ, рд╣рд╛рдореНрд░реЛ Cmder рдХрдиреНрд╕реЛрд▓рдорд╛ рдЕрд░реНрдХреЛ рдЯреНрдпрд╛рдм рдЦреЛрд▓реНрджреИ (рд╢реАрд░реНрд╖ рдореЗрдиреБ - рдирдпрд╛рдБ рдХрдиреНрд╕реЛрд▓ рд╕рдВрд╡рд╛рдж) рд╣рд╛рдореА рдкреЛрд░реНрдЯ 8080 рдорд╛рд░реНрдлрдд SSH рдорд╛рд░реНрдлрдд рд╕рд░реНрднрд░рдорд╛ рдЬрдбрд╛рди рдЧрд░реНрдиреЗрдЫреМрдВ:

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

рдЬрдм рд╣рд╛рдореА рдкрд╣рд┐рд▓реЛ рдЖрджреЗрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрдЫреМрдВ, рд╣рд╛рдореАрд▓рд╛рдИ рд╣рд╛рдореНрд░реЛ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ Jupyter рдЦреЛрд▓реНрди рд▓рд┐рдЩреНрдХрд╣рд░реВ рдкреНрд░рд╕реНрддрд╛рд╡ рдЧрд░рд┐рдиреЗрдЫ:

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 рдХреЛ рд▓рд╛рдЧрд┐ рд▓рд┐рдЩреНрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реМрдВред рдкреВрд░реНрдг рдорд╛рд░реНрдЧ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдпрд╕рд▓рд╛рдИ рддрдкрд╛рдИрдВрдХреЛ рдкреАрд╕реАрдХреЛ рд╕реНрдерд╛рдиреАрдп рдмреНрд░рд╛рдЙрдЬрд░рдХреЛ рдареЗрдЧрд╛рдирд╛ рдкрдЯреНрдЯреАрдорд╛ рдЯрд╛рдБрд╕реНрдиреБрд╣реЛрд╕реНред Jupyter Notebook рдЦреБрд▓реНрдиреЗрдЫред

рдирдпрд╛рдБ рдиреЛрдЯрдмреБрдХ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ: рдирдпрд╛рдБ - рдиреЛрдЯрдмреБрдХ - рдкрд╛рдЗрдерди 3ред

рд╣рд╛рдореАрд▓реЗ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реЗрдХрд╛ рд╕рдмреИ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВрдХреЛ рд╕рд╣реА рд╕рдЮреНрдЪрд╛рд▓рди рдЬрд╛рдБрдЪ рдЧрд░реМрдВред Jupyter рдорд╛ рдЙрджрд╛рд╣рд░рдг PyTorch рдХреЛрдб рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реМрдВ рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рд░рди рдмрдЯрди) рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН:

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

рдкрд░рд┐рдгрд╛рдо рдпрд╕реНрддреЛ рд╣реБрдиреБрдкрд░реНрдЫ:

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

рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдЫ рднрдиреЗ, рд╣рд╛рдореАрд▓реЗ рд╕рдмреИ рдХреБрд░рд╛ рд╕рд╣реА рд░реВрдкрдорд╛ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реЗрдХрд╛ рдЫреМрдВ рд░ рд╣рд╛рдореА рдПрдХ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрди рд╕реБрд░реБ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ!

рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ

рд╣рд╛рдореА рдЫрд╡рд┐ рдкрд╣рд┐рдЪрд╛рдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫреМрдВред рдпрд╕рд▓рд╛рдИ рдЖрдзрд╛рд░рдХреЛ рд░реВрдкрдорд╛ рд▓рд┐рдФрдВ рдЧрд╛рдИрдб.

рд╣рд╛рдореА рдиреЗрдЯрд╡рд░реНрдХрд▓рд╛рдИ рддрд╛рд▓рд┐рдо рджрд┐рди рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдкрдорд╛ рдЙрдкрд▓рдмреНрдз CIFAR10 рдбрд╛рдЯрд╛рд╕реЗрдЯ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВред рдпрд╕рдорд╛ рд╡рд░реНрдЧрд╣рд░реВ рдЫрдиреН: "рд╣рд╡рд╛рдИ рдЬрд╣рд╛рдЬ", "рдХрд╛рд░", "рдЪрд░рд╛", "рдмрд┐рд░рд╛рд▓реЛ", "рдореГрдЧ", "рдХреБрдХреБрд░", "рднреНрдпрд╛рдЧреБрддрд╛", "рдШреЛрдбрд╛", "рдЬрд╣рд╛рдЬ", "рдЯреНрд░рдХ"ред CIFAR10 рдорд╛ рдЫрд╡рд┐рд╣рд░реВ 3x32x32 рдЫрдиреН, рдЕрд░реНрдерд╛рддреН, 3x32 рдкрд┐рдХреНрд╕реЗрд▓рдХреЛ 32-рдЪреНрдпрд╛рдирд▓ рд░рдЩ рдЫрд╡рд┐рд╣рд░реВред

рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкреНрд░рд╢реЛрдзрди рдЗрдХрд╛рдИ (GPU) рдорд╛ рддрдкрд╛рдИрдВрдХреЛ рдкрд╣рд┐рд▓реЛ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХред рд╢реБрд░реБрдЖрддреА рдЧрд╛рдЗрдб
рдХрд╛рдордХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА PyTorch рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИрдПрдХреЛ рдкреНрдпрд╛рдХреЗрдЬ рдЫрд╡рд┐рд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ - torchvisionред

рд╣рд╛рдореА рдирд┐рдореНрди рдЪрд░рдгрд╣рд░реВ рдХреНрд░рдордмрджреНрдз рдЧрд░реНрдиреЗрдЫреМрдВ:

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

рд╣рд╛рдореА Jupyter Notebook рдорд╛ рддрд▓рдХрд╛ рд╕рдмреИ рдХреЛрдбрд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреЗрдЫреМрдВред

CIFAR10 рд▓реЛрдб рд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг

Jupyter рдорд╛ рдирд┐рдореНрди рдХреЛрдб рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН:


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)))

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

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

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

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

рд╣рд╛рдореНрд░реЛ рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рд╕рдорд╛рди рдиреЗрдЯрд╡рд░реНрдХ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ:


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)

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

рд╣рд╛рдореНрд░реЛ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХрд▓рд╛рдИ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реБрд░реБ рдЧрд░реМрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН рдХрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдпреЛ рдХреЛрдб рдЪрд▓рд╛рдПрдкрдЫрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдХрд╛рдо рдкреВрд░рд╛ рдирднрдПрд╕рдореНрдо рдХреЗрд╣реА рд╕рдордп рдкрд░реНрдЦрдиреБ рдкрд░реНрдиреЗрдЫред рдорд▓рд╛рдИ рел рдорд┐рдиреЗрдЯ рд▓рд╛рдЧреНрдпреЛред рдиреЗрдЯрд╡рд░реНрдХрд▓рд╛рдИ рддрд╛рд▓рд┐рдо рджрд┐рди рд╕рдордп рд▓рд╛рдЧреНрдЫред

 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')

рд╣рд╛рдореА рдирд┐рдореНрди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд:

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

рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдореЛрдбреЗрд▓ рдмрдЪрдд рдЧрд░реНрдЫреМрдВ:

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)))

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

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


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)))

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

рдирддрд┐рдЬрд╛рд╣рд░реВ рдзреЗрд░реИ рд░рд╛рдореНрд░реЛ рджреЗрдЦрд┐рдиреНрдЫрдиреН: рдиреЗрдЯрд╡рд░реНрдХрд▓реЗ рд╕рд╣реА рд░реВрдкрдорд╛ рдЪрд╛рд░ рдордзреНрдпреЗ рддреАрди рдЪрд┐рддреНрд░рд╣рд░реВ рдкрд╣рд┐рдЪрд╛рди рдЧрд░реНрдпреЛред

рдиреЗрдЯрд╡рд░реНрдХрд▓реЗ рд╕рдореНрдкреВрд░реНрдг рдбреЗрдЯрд╛рд╕реЗрдЯрдорд╛ рдХрд╕рд░реА рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдЫ рд╣реЗрд░реМрдВред


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))

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

рдиреЗрдЯрд╡рд░реНрдХрд▓рд╛рдИ рдХреЗрд╣рд┐ рдерд╛рд╣рд╛ рдЫ рд░ рдХрд╛рдо рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫред рдпрджрд┐ рдЙрд╣рд╛рдБрд▓реЗ рдЕрдирд┐рдпрдорд┐рдд рд░реВрдкрдорд╛ рдХрдХреНрд╖рд╛рд╣рд░реВ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрдиреБрднрдпреЛ рднрдиреЗ, рд╢реБрджреНрдзрддрд╛ 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]))

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

рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░ рд░ рдЬрд╣рд╛рдЬрд╣рд░реВ рдкрд╣рд┐рдЪрд╛рди рдЧрд░реНрдирдорд╛ рдЙрддреНрддрдо рдЫ: 71% рд╢реБрджреНрдзрддрд╛ред

рддреНрдпрд╕реИрд▓реЗ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рдо рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫред рдЕрдм рдпрд╕рдХреЛ рдХрд╛рдо рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкреНрд░реЛрд╕реЗрд╕рд░ (GPU) рдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ рд░ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реНред

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

рдкрд╣рд┐рд▓реЗ, рдо рдЫреЛрдЯрдХрд░реАрдорд╛ CUDA рдХреЗ рд╣реЛ рднрдиреЗрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЧрд░реНрдиреЗрдЫреБред CUDA (рдХрдореНрдкреНрдпреБрдЯ рдпреБрдирд┐рдлрд╛рдЗрдб рдбрд┐рднрд╛рдЗрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░) рдПрдХ рд╕рдорд╛рдирд╛рдиреНрддрд░ рдХрдореНрдкреНрдпреБрдЯрд┐рдЩ рдкреНрд▓реЗрдЯрдлрд░реНрдо рд╣реЛ рдЬреБрди NVIDIA рд▓реЗ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ рдЗрдХрд╛рдЗрд╣рд░реВ (GPUs) рдорд╛ рд╕рд╛рдорд╛рдиреНрдп рдХрдореНрдкреНрдпреБрдЯрд┐рдЩрдХреЛ рд▓рд╛рдЧрд┐ рд╡рд┐рдХрд╕рд┐рдд рдЧрд░реЗрдХреЛ рд╣реЛред 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) рдорд╛ рддрдкрд╛рдИрдВрдХреЛ рдкрд╣рд┐рд▓реЛ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХред рд╢реБрд░реБрдЖрддреА рдЧрд╛рдЗрдб

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 рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рджреЛрд╣реЛрд░реНрдпреНрдпреМрдВ рд░ рдЧрддрд┐рдорд╛ рд╡реГрджреНрдзрд┐ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНтАНрдпреМрдВред

рдо рдЯрд┐рдкреНрдкрдгреАрд╣рд░реВрдорд╛ рдкреНрд░рд╢реНрдирд╣рд░реВрдХреЛ рдЬрд╡рд╛рдл рджрд┐рди рдЦреБрд╕реА рд╣реБрдиреЗрдЫреБред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди