Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ ΡΠ°ΡΡΠΊΠ°ΠΆΡ ΠΊΠ°ΠΊ Π·Π° 30 ΠΌΠΈΠ½ΡΡ Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΡΠ΅Π΄Ρ Π΄Π»Ρ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ, ΡΠΎΠ·Π΄Π°ΡΡ Π½Π΅ΠΉΡΠΎΠ½Π½ΡΡ ΡΠ΅ΡΡ Π΄Π»Ρ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ a ΠΏΠΎΡΠΎΠΌ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΡ ΠΆΠ΅ ΡΠ΅ΡΡ Π½Π° Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ΅ (GPU).
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π½Π΅ΠΉΡΠΎΠ½Π½Π°Ρ ΡΠ΅ΡΡ.
Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ, Π° ΡΠ°ΠΊΠΆΠ΅ Π΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ΅ ΠΈΠ»ΠΈ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠ΅ Π²ΠΎΠΏΠ»ΠΎΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡΡΡΠΎΠ΅Π½Π½Π°Ρ ΠΏΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π±ΠΈΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΡ Π½Π΅ΠΉΡΠΎΠ½Π½ΡΡ ΡΠ΅ΡΠ΅ΠΉ β ΡΠ΅ΡΠ΅ΠΉ Π½Π΅ΡΠ²Π½ΡΡ ΠΊΠ»Π΅ΡΠΎΠΊ ΠΆΠΈΠ²ΠΎΠ³ΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΌΠ°. ΠΡΠΎ ΠΏΠΎΠ½ΡΡΠΈΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ ΠΏΡΠΈ ΠΈΠ·ΡΡΠ΅Π½ΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΠΏΡΠΎΡΠ΅ΠΊΠ°ΡΡΠΈΡ Π² ΠΌΠΎΠ·Π³Π΅, ΠΈ ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΈ ΠΏΡΠΎΡΠ΅ΡΡΡ.
ΠΠ΅ΠΉΡΠΎΠ½Π½ΡΠ΅ ΡΠ΅ΡΠΈ Π½Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡΡΡΡ Π² ΠΏΡΠΈΠ²ΡΡΠ½ΠΎΠΌ ΡΠΌΡΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π°, ΠΎΠ½ΠΈ ΠΎΠ±ΡΡΠ°ΡΡΡΡ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ β ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π³Π»Π°Π²Π½ΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ² Π½Π΅ΠΉΡΠΎΠ½Π½ΡΡ ΡΠ΅ΡΠ΅ΠΉ ΠΏΠ΅ΡΠ΅Π΄ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΡΠΌΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°ΠΌΠΈ. Π’Π΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ² ΡΠ²ΡΠ·Π΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρ Π½Π΅ΠΉΡΠΎΠ½Π°ΠΌΠΈ. Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ Π½Π΅ΠΉΡΠΎΠ½Π½Π°Ρ ΡΠ΅ΡΡ ΡΠΏΠΎΡΠΎΠ±Π½Π° Π²ΡΡΠ²Π»ΡΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π²Ρ ΠΎΠ΄Π½ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΈ Π²ΡΡ ΠΎΠ΄Π½ΡΠΌΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ, Π½Π΅ΠΉΡΠΎΠ½Π½Π°Ρ ΡΠ΅ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠ°ΡΡΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ², Π΄ΠΈΡΠΊΡΠΈΠΌΠΈΠ½Π°Π½ΡΠ½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°, ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΊΠ»Π°ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΏΡΠΎΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ².
ΠΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅
Π‘Π½Π°ΡΠ°Π»Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ Ρ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. ΠΠ°ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌ ΡΠ΅ΡΠ²Π΅Ρ Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ Π½Π° Π½Π΅ΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ Linux. ΠΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠΈΡΡΠ΅ΠΌ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΌΠΎΡΠ½ΠΎΠ΅ ΠΈ ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ Π΄ΠΎΡΠΎΠ³ΠΎΠ΅. Π’Π΅ΠΌ, Ρ ΠΊΠΎΠ³ΠΎ Π½Π΅Ρ ΠΏΠΎΠ΄ ΡΡΠΊΠΎΠΉ Ρ
ΠΎΡΠΎΡΠ΅ΠΉ ΠΌΠ°ΡΠΈΠ½Ρ, ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Π»Π°ΡΠ½ΡΡ
ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠ². ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π² Π°ΡΠ΅Π½Π΄Ρ Π±ΡΡΡΡΠΎ ΠΈ ΠΏΠ»Π°ΡΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π·Π° Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ.
Π ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ
, Π³Π΄Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π΅ΠΉΡΠΎΠ½Π½ΡΡ
ΡΠ΅ΡΠ΅ΠΉ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΡΠΎΡΡΠΈΠΉΡΠΊΠΈΡ
ΠΎΠ±Π»Π°ΡΠ½ΡΡ
ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠ². ΠΠΎΠΌΠΏΠ°Π½ΠΈΡ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ Π² Π°ΡΠ΅Π½Π΄Ρ ΠΎΠ±Π»Π°ΡΠ½ΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ Ρ ΠΌΠΎΡΠ½ΡΠΌΠΈ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°ΠΌΠΈ (GPU) Tesla V100 ΠΎΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ NVIDIA. ΠΡΠ»ΠΈ ΠΊΠΎΡΠΎΡΠΊΠΎ: ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ° Ρ GPU ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π² Π΄Π΅ΡΡΡΠΊΠΈ ΡΠ°Π· Π±ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ (Π±ΡΡΡΡΡΠΌ) ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΌ ΠΏΠΎ ΡΡΠΎΠΈΠΌΠΎΡΡΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π³Π΄Π΅ Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ CPU (Π²ΡΠ΅ΠΌ Ρ
ΠΎΡΠΎΡΠΎ Π·Π½Π°ΠΊΠΎΠΌΡΠΉ ΡΠ΅Π½ΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ). ΠΡΠΎ Π΄ΠΎΡΡΠΈΠ³Π°Π΅ΡΡΡ Π·Π° ΡΡΠ΅Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ GPU, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΡΡΡΠ΅Π΅ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Ρ ΡΠ°ΡΡΠ΅ΡΠ°ΠΌΠΈ.
ΠΠ»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ Π΄Π°Π»Π΅Π΅, ΠΌΡ ΠΏΡΠΈΠΎΠ±ΡΠ΅Π»ΠΈ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄Π½Π΅ΠΉ ΡΠ°ΠΊΠΎΠΉ ΡΠ΅ΡΠ²Π΅Ρ:
- SSD Π΄ΠΈΡΠΊ 150 ΠΠ
- ΠΠΠ£ 32 ΠΠ
- ΠΡΠΎΡΠ΅ΡΡΠΎΡ Tesla V100 16 Gb Ρ 4-ΠΌΡ ΡΠ΄ΡΠ°ΠΌΠΈ
ΠΠ° ΠΌΠ°ΡΠΈΠ½Ρ Π½Π°ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ Ubuntu 18.04.
Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅
Π’Π΅ΠΏΠ΅ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π°ΡΠ° ΡΡΠ°ΡΡΡ Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π΄Π»Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΡ , Π±ΡΠ΄Ρ ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π² Π½Π΅ΠΉ ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈΠ³ΠΎΠ΄ΡΡΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠΌ.
ΠΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΡΡΠ΅Π΄Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΡ ΡΡΡΠΎΠΊΡ. ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΈΠ· ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ°Π±ΠΎΡΠ΅ΠΉ ΠΠ‘ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Windows. Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΠΊΠΎΠ½ΡΠΎΠ»Ρ Π² ΡΡΠΎΠΉ ΠΠ‘ ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΆΠ΅Π»Π°ΡΡ Π»ΡΡΡΠ΅Π³ΠΎ. ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ
ssh root@server-ip-or-hostname
ΠΠΌΠ΅ΡΡΠΎ server-ip-or-hostname ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΠ΅ IP Π°Π΄ΡΠ΅Ρ ΠΈΠ»ΠΈ DNS ΠΈΠΌΡ Π²Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΠ°Π»Π΅Π΅ Π²Π²ΠΎΠ΄ΠΈΠΌ ΠΏΠ°ΡΠΎΠ»Ρ ΠΈ ΠΏΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-74-generic x86_64)
ΠΡΠ½ΠΎΠ²Π½ΡΠΌ ΡΠ·ΡΠΊΠΎΠΌ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ML ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ Python. Π Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΎΠΉ Π΄Π»Ρ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ Linux ΡΠ²Π»ΡΠ΅ΡΡΡ
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π΅Π΅ Π½Π° Π½Π°Ρ ΡΠ΅ΡΠ²Π΅Ρ.
ΠΠ°ΡΠΈΠ½Π°Π΅ΠΌ Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²:
sudo apt-get update
Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ curl (ΡΠ»ΡΠΆΠ΅Π±Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ):
sudo apt-get install curl
Π‘ΠΊΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π²Π΅ΡΡΠΈΡ Anaconda Distribution:
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!
ΠΠ»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ML ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΡΠ΅ΠΉΡΠ°Ρ ΡΠΎΠ·Π΄Π°Π½ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΎΠ², ΠΌΡ ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ Ρ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΌΠΈ:
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΡΠΊΠΎΡΠΎΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΆΠ΅ Π³ΠΎΡΠΎΠ²ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π·Π°Π΄Π°Ρ.
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π±ΡΠ΄Π΅ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ PyTorch. Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π΅Π³ΠΎ:
conda install pytorch torchvision cudatoolkit=10.1 -c pytorch
Π’Π΅ΠΏΠ΅ΡΡ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ Jupyter Notebook β ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΉ Ρ ML ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΎΠ² ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ. ΠΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΈΡΠ°ΡΡ ΠΊΠΎΠ΄ ΠΈ ΡΡΠ°Π·Ρ Π²ΠΈΠ΄Π΅ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. Jupyter Notebook Π²Ρ ΠΎΠ΄ΠΈΡ Π² ΡΠΎΡΡΠ°Π² Anaconda ΠΈ ΡΠΆΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π½Π° Π½Π°ΡΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅. ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡ ΠΊ Π½Π΅ΠΌΡ ΠΈΠ· Π½Π°ΡΠ΅ΠΉ Π½Π°ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅.
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΌΡ ΡΠ½Π°ΡΠ°Π»Π° Π·Π°ΠΏΡΡΡΠΈΠΌ Jupyter Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΡΠΊΠ°Π·Π°Π² ΠΏΠΎΡΡ 8080:
jupyter notebook --no-browser --port=8080 --allow-root
ΠΠ°Π»Π΅Π΅ ΠΎΡΠΊΡΡΠ² Π² Π½Π°ΡΠ΅ΠΉ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ Cmder Π΅ΡΠ΅ ΠΎΠ΄Π½Ρ Π²ΠΊΠ»Π°Π΄ΠΊΡ (Π²Π΅ΡΡ Π½Π΅Π΅ ΠΌΠ΅Π½Ρ β New console dialog) ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠΌΡΡ ΠΏΠΎ ΠΏΠΎΡΡΡ 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
ΠΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΡΡΠ»ΠΊΠΎΠΉ Π΄Π»Ρ localhost:8080. Π‘ΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ ΠΏΠΎΠ»Π½ΡΠΉ ΠΏΡΡΡ ΠΈ Π²ΡΡΠ°Π²ΡΡΠ΅ Π² Π°Π΄ΡΠ΅ΡΠ½ΡΡ ΡΡΡΠΎΠΊΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π±ΡΠ°ΡΠ·Π΅ΡΠ° Π²Π°ΡΠ΅Π³ΠΎ ΠΠ. ΠΡΠΊΡΠΎΠ΅ΡΡΡ Jupyter Notebook.
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΡΠΉ Π½ΠΎΡΡΠ±ΡΠΊ: New β Notebook β Python 3.
ΠΡΠΎΠ²Π΅ΡΠΈΠΌ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΡ ΡΠ°Π±ΠΎΡΡ Π²ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ. ΠΠ²Π΅Π΄Π΅ΠΌ Π² Jupyter ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π° PyTorch ΠΈ Π·Π°ΠΏΡΡΡΠΈΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ (ΠΊΠ½ΠΎΠΏΠΊΠ° Run):
from __future__ import print_function
import torch
x = torch.rand(5, 3)
print(x)
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊΠΈΠΌ:
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ β Π·Π½Π°ΡΠΈΡ ΠΌΡ Π²ΡΠ΅ Π½Π°ΡΡΡΠΎΠΈΠ»ΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΈΡΡΡΠΏΠ°ΡΡ ΠΊ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ Π½Π΅ΠΉΡΠΎΠ½Π½ΠΎΠΉ ΡΠ΅ΡΠΈ!
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½Π΅ΠΉΡΠΎΠ½Π½ΡΡ ΡΠ΅ΡΡ
ΠΡΠ΄Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½Π΅ΠΉΡΠΎΠ½Π½ΡΡ ΡΠ΅ΡΡ Π΄Π»Ρ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ. ΠΠ° ΠΎΡΠ½ΠΎΠ²Ρ Π²ΠΎΠ·ΡΠΌΠ΅ΠΌ Π΄Π°Π½Π½ΠΎΠ΅
ΠΠ»Ρ ΡΡΠ΅Π½ΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ΅ΡΠΈ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΡΠΉ Π½Π°Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ CIFAR10. Π£ Π½Π΅Π³ΠΎ Π΅ΡΡΡ ΠΊΠ»Π°ΡΡΡ: Β«ΡΠ°ΠΌΠΎΠ»Π΅ΡΒ», Β«Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»ΡΒ», Β«ΠΏΡΠΈΡΠ°Β», Β«ΠΊΠΎΡΠΊΠ°Β», Β«ΠΎΠ»Π΅Π½ΡΒ», Β«ΡΠΎΠ±Π°ΠΊΠ°Β», Β«Π»ΡΠ³ΡΡΠΊΠ°Β», Β«Π»ΠΎΡΠ°Π΄ΡΒ», Β«ΠΊΠΎΡΠ°Π±Π»ΡΒ», Β«Π³ΡΡΠ·ΠΎΠ²ΠΈΠΊΒ». ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² CIFAR10 ΠΈΠΌΠ΅ΡΡ ΡΠ°Π·ΠΌΠ΅Ρ 3x32x32, ΡΠΎ Π΅ΡΡΡ 3-ΠΊΠ°Π½Π°Π»ΡΠ½ΡΠ΅ ΡΠ²Π΅ΡΠ½ΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ 32×32 ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ.
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ 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)))
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π΅ΠΉΡΠΎΠ½Π½ΠΎΠΉ ΡΠ΅ΡΠΈ
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ½Π°ΡΠ°Π»Π° ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π΅ΠΉΡΠΎΠ½Π½Π°Ρ ΡΠ΅ΡΡ ΠΏΠΎ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ. ΠΡΠΎ ΠΏΡΠΎΡΡΠ°Ρ ΡΠ΅ΡΡ ΠΏΡΡΠΌΠΎΠΉ ΡΠ²ΡΠ·ΠΈ. ΠΠ½ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π²Ρ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΏΡΠΎΠΏΡΡΠΊΠ°Π΅Ρ ΠΈΡ ΡΠ΅ΡΠ΅Π· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ»ΠΎΠ΅Π² ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄ΡΡΠ³ΠΈΠΌ, Π° Π·Π°ΡΠ΅ΠΌ, Π½Π°ΠΊΠΎΠ½Π΅Ρ, Π²ΡΠ΄Π°Π΅Ρ Π²ΡΡ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅.
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΡΠ΅ΡΡ Π² Π½Π°ΡΠ΅ΠΉ ΡΡΠ΅Π΄Π΅:
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, Π΄Π»Ρ ΠΎΠ±ΡΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ Π½Π° Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°Ρ (GPU). Π‘ ΠΏΠΎΠΌΠΎΡΡΡ CUDA ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΌΠΎΠ³ΡΡ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠΊΠΎΡΠΈΡΡ Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠ². ΠΠ° Π½Π°ΡΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΏΡΠΈΠΎΠ±ΡΠ΅Π»ΠΈ, Π΄Π°Π½Π½Π°Ρ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° ΡΠΆΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π°.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ½Π°ΡΠ°Π»Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ Π½Π°ΡΠ΅ 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 ΠΈ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΠΏΡΠΈΡΠΎΡΡ Π² ΡΠΊΠΎΡΠΎΡΡΠΈ.
ΠΡΠ΄Ρ ΡΠ°Π΄ ΠΎΡΠ²Π΅ΡΠΈΡΡ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ
.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com