ΠΠΎ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ°, ΡΠ΅ Π²ΠΈ ΠΊΠ°ΠΆΠ°ΠΌ ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΡΡΠ΅Π΄ΠΈΠ½Π° Π·Π° ΠΌΠ°ΡΠΈΠ½ΡΠΊΠΎ ΡΡΠ΅ΡΠ΅ Π·Π° 30 ΠΌΠΈΠ½ΡΡΠΈ, Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠ° ΠΌΡΠ΅ΠΆΠ° Π·Π° ΠΏΡΠ΅ΠΏΠΎΠ·Π½Π°Π²Π°ΡΠ΅ ΡΠ»ΠΈΠΊΠΈ ΠΈ ΠΏΠΎΡΠΎΠ° Π΄Π° ΡΠ° ΡΡΠ°ΡΡΡΠ²Π°ΡΠ΅ ΠΈΡΡΠ°ΡΠ° ΠΌΡΠ΅ΠΆΠ° Π½Π° Π³ΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡ (GPU).
ΠΡΠ²ΠΎ, Π΄Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΠΌΠ΅ ΡΡΠΎ Π΅ Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠ° ΠΌΡΠ΅ΠΆΠ°.
ΠΠΎ Π½Π°ΡΠΈΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΠΎΠ²Π° Π΅ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠΊΠΈ ΠΌΠΎΠ΄Π΅Π», ΠΊΠ°ΠΊΠΎ ΠΈ Π½Π΅Π³ΠΎΠ²ΠΎ ΡΠΎΡΡΠ²Π΅ΡΡΠΊΠΎ ΠΈΠ»ΠΈ Ρ Π°ΡΠ΄Π²Π΅ΡΡΠΊΠΎ ΠΎΡΠ΅Π»ΠΎΡΠ²ΠΎΡΡΠ²Π°ΡΠ΅, ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ΠΎ Π²ΡΠ· ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΡ Π½Π° ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡΠ° ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°ΡΠ΅ Π½Π° Π±ΠΈΠΎΠ»ΠΎΡΠΊΠΈΡΠ΅ Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠΈ ΠΌΡΠ΅ΠΆΠΈ - ΠΌΡΠ΅ΠΆΠΈ Π½Π° Π½Π΅ΡΠ²Π½ΠΈ ΠΊΠ»Π΅ΡΠΊΠΈ Π½Π° ΠΆΠΈΠ² ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΠΌ. ΠΠ²ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡ ΡΠ΅ ΠΏΠΎΡΠ°Π²ΠΈ Π΄ΠΎΠ΄Π΅ΠΊΠ° Π³ΠΈ ΠΏΡΠΎΡΡΡΠ²Π°ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π°Π°Ρ Π²ΠΎ ΠΌΠΎΠ·ΠΎΠΊΠΎΡ ΠΈ ΡΠ΅ ΠΎΠ±ΠΈΠ΄ΡΠ²Π°ΡΠ΅ Π΄Π° Π³ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ° ΠΎΠ²ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΈ.
ΠΠ΅Π²ΡΠΎΠ½ΡΠΊΠΈΡΠ΅ ΠΌΡΠ΅ΠΆΠΈ Π½Π΅ ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½ΠΈ Π²ΠΎ Π²ΠΎΠΎΠ±ΠΈΡΠ°Π΅Π½Π°ΡΠ° ΡΠΌΠΈΡΠ»Π° Π½Π° Π·Π±ΠΎΡΠΎΡ, ΡΠΈΠ΅ ΡΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈ. Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠ° Π·Π° ΡΡΠ΅ΡΠ΅ Π΅ Π΅Π΄Π½Π° ΠΎΠ΄ Π³Π»Π°Π²Π½ΠΈΡΠ΅ ΠΏΡΠ΅Π΄Π½ΠΎΡΡΠΈ Π½Π° Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠΈΡΠ΅ ΠΌΡΠ΅ΠΆΠΈ Π²ΠΎ ΠΎΠ΄Π½ΠΎΡ Π½Π° ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ. Π’Π΅Ρ Π½ΠΈΡΠΊΠΈ, ΡΡΠ΅ΡΠ΅ΡΠΎ ΡΠ΅ ΡΠΎΡΡΠΎΠΈ ΠΎΠ΄ ΠΏΡΠΎΠ½Π°ΠΎΡΠ°ΡΠ΅ Π½Π° ΠΊΠΎΠ΅ΡΠΈΡΠΈΠ΅Π½ΡΠΈΡΠ΅ Π½Π° Π²ΡΡΠΊΠΈ ΠΏΠΎΠΌΠ΅ΡΡ Π½Π΅Π²ΡΠΎΠ½ΠΈΡΠ΅. ΠΠ° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ΠΎΠ±ΡΠΊΠ°, Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠ°ΡΠ° ΠΌΡΠ΅ΠΆΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΡΠ²Π° ΡΠ»ΠΎΠΆΠ΅Π½ΠΈ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈ ΠΏΠΎΠΌΠ΅ΡΡ Π²Π»Π΅Π·Π½ΠΈΡΠ΅ ΠΈ ΠΈΠ·Π»Π΅Π·Π½ΠΈΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΠΊΠ°ΠΊΠΎ ΠΈ Π΄Π° ΠΈΠ·Π²ΡΡΠΈ Π³Π΅Π½Π΅ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΠ°.
ΠΠ΄ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ΠΌΠ°ΡΠΈΠ½ΡΠΊΠΎΡΠΎ ΡΡΠ΅ΡΠ΅, Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠ°ΡΠ° ΠΌΡΠ΅ΠΆΠ° Π΅ ΠΏΠΎΡΠ΅Π±Π΅Π½ ΡΠ»ΡΡΠ°Ρ Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΏΡΠ΅ΠΏΠΎΠ·Π½Π°Π²Π°ΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½ΠΈ, Π΄ΠΈΡΠΊΡΠΈΠΌΠΈΠ½Π°Π½ΡΠ½Π° Π°Π½Π°Π»ΠΈΠ·Π°, ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π½Π° ΠΊΠ»Π°ΡΡΠ΅ΡΠΈΡΠ°ΡΠ΅ ΠΈ Π΄ΡΡΠ³ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ.
ΠΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅
ΠΡΠ²ΠΎ, Π΄Π° ΡΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΎΠΏΡΠ΅ΠΌΠ°ΡΠ°. ΠΠΎΡΡΠ΅Π±Π΅Π½ Π½ΠΈ Π΅ ΡΠ΅ΡΠ²Π΅Ρ ΡΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π΅Π½ ΡΠΈΡΡΠ΅ΠΌ Linux Π½Π° Π½Π΅Π³ΠΎ. ΠΠΏΡΠ΅ΠΌΠ°ΡΠ° ΠΏΠΎΡΡΠ΅Π±Π½Π° Π·Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠΈΡΠ΅ Π·Π° ΠΌΠ°ΡΠΈΠ½ΡΠΊΠΎ ΡΡΠ΅ΡΠ΅ Π΅ ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎ ΠΌΠΎΡΠ½Π° ΠΈ, ΠΊΠ°ΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ°, ΡΠΊΠ°ΠΏΠ°. ΠΠ° ΠΎΠ½ΠΈΠ΅ ΠΊΠΎΠΈ Π½Π΅ΠΌΠ°Π°Ρ Π΄ΠΎΠ±ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° ΠΏΡΠΈ ΡΠ°ΠΊΠ°, ΠΏΡΠ΅ΠΏΠΎΡΠ°ΡΡΠ²Π°ΠΌ Π΄Π° ΠΎΠ±ΡΠ½Π°Ρ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ½ΡΠ΄ΠΈΡΠ΅ Π½Π° Π΄Π°Π²Π°ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΠΎΠ±Π»Π°ΠΊ. ΠΠΎΠΆΠ΅ΡΠ΅ Π±ΡΠ·ΠΎ Π΄Π° Π³ΠΎ ΠΈΠ·Π½Π°ΡΠΌΠΈΡΠ΅ Π±Π°ΡΠ°Π½ΠΈΠΎΡ ΡΠ΅ΡΠ²Π΅Ρ ΠΈ Π΄Π° ΠΏΠ»Π°ΡΠ°ΡΠ΅ ΡΠ°ΠΌΠΎ Π·Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅.
ΠΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΊΠ°Π΄Π΅ ΡΡΠΎ Π΅ Π½Π΅ΠΎΠΏΡ
ΠΎΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄Π°Ρ Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠΈ ΠΌΡΠ΅ΠΆΠΈ, Π³ΠΈ ΠΊΠΎΡΠΈΡΡΠ°ΠΌ ΡΠ΅ΡΠ²Π΅ΡΠΈΡΠ΅ Π½Π° Π΅Π΄Π΅Π½ ΠΎΠ΄ ΡΡΡΠΊΠΈΡΠ΅ ΠΏΡΠΎΠ²Π°ΡΠ΄Π΅ΡΠΈ Π½Π° ΠΎΠ±Π»Π°ΠΊ. ΠΠΎΠΌΠΏΠ°Π½ΠΈΡΠ°ΡΠ° Π½ΡΠ΄ΠΈ ΠΎΠ±Π»Π°ΠΊ ΡΠ΅ΡΠ²Π΅ΡΠΈ Π·Π° ΠΈΠ·Π½Π°ΡΠΌΡΠ²Π°ΡΠ΅ ΡΠΏΠ΅ΡΠΈΡΠ°Π»Π½ΠΎ Π·Π° ΠΌΠ°ΡΠΈΠ½ΡΠΊΠΎ ΡΡΠ΅ΡΠ΅ ΡΠΎ ΠΌΠΎΡΠ½ΠΈ Tesla V100 Π³ΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ (GPU) ΠΎΠ΄ NVIDIA. ΠΠ°ΠΊΡΠ°ΡΠΊΠΎ: ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ΡΠΎ ΡΠ΅ΡΠ²Π΅Ρ ΡΠΎ Π³ΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ Π΄Π΅ΡΠ΅ΡΠΈΡΠΈ ΠΏΠ°ΡΠΈ ΠΏΠΎΠ΅ΡΠΈΠΊΠ°ΡΠ½ΠΎ (Π±ΡΠ·ΠΎ) Π²ΠΎ ΡΠΏΠΎΡΠ΅Π΄Π±Π° ΡΠΎ ΡΠ΅ΡΠ²Π΅Ρ ΡΠΎ ΡΠ»ΠΈΡΠ½Π° ΡΠ΅Π½Π° ΡΡΠΎ ΠΊΠΎΡΠΈΡΡΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡ (Π΄ΠΎΠ±ΡΠΎ ΠΏΠΎΠ·Π½Π°ΡΠ° ΡΠ΅Π½ΡΡΠ°Π»Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΡΠΊΠ° Π΅Π΄ΠΈΠ½ΠΈΡΠ°) Π·Π° ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠΈ. ΠΠ²Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½ΡΠ²Π° ΠΏΠΎΡΠ°Π΄ΠΈ ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈΡΠ΅ Π½Π° Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° Π½Π° Π³ΡΠ°ΡΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠΎΡ, ΠΊΠΎΡΠ° ΠΏΠΎΠ±ΡΠ·ΠΎ ΡΠ΅ ΡΠΏΡΠ°Π²ΡΠ²Π° ΡΠΎ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠΈΡΠ΅.
ΠΠ° Π΄Π° Π³ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΈΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈ ΠΏΠΎΠ΄ΠΎΠ»Ρ, Π³ΠΎ ΠΊΡΠΏΠΈΠ²ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΠΎΠ² ΡΠ΅ΡΠ²Π΅Ρ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π΄Π΅Π½Π°:
- SSD Π΄ΠΈΡΠΊ 150 GB
- RAM ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ° 32 GB
- Tesla V100 16 Gb ΠΏΡΠΎΡΠ΅ΡΠΎΡ ΡΠΎ 4 ΡΠ°Π΄ΡΠ°
ΠΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π²ΠΌΠ΅ Ubuntu 18.04 Π½Π° Π½Π°ΡΠ°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°.
ΠΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π½Π° ΠΎΠΊΠΎΠ»ΠΈΠ½Π°ΡΠ°
Π‘Π΅Π³Π° Π°ΡΠ΄Π΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΡΓ¨ ΡΡΠΎ Π΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ Π·Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΎΡ. ΠΠΈΠ΄Π΅ΡΡΠΈ Π½Π°ΡΠ°ΡΠ° ΡΡΠ°ΡΠΈΡΠ° Π΅ ΠΏΡΠ²Π΅Π½ΡΡΠ²Π΅Π½ΠΎ Π·Π° ΠΏΠΎΡΠ΅ΡΠ½ΠΈΡΠΈ, ΡΠ΅ Π·Π±ΠΎΡΡΠ²Π°ΠΌ Π·Π° Π½Π΅ΠΊΠΎΠΈ ΡΠΎΡΠΊΠΈ ΡΡΠΎ ΡΠ΅ ΠΈΠΌ Π±ΠΈΠ΄Π°Ρ ΠΊΠΎΡΠΈΡΠ½ΠΈ.
ΠΠΎΠ»Π΅ΠΌ Π΄Π΅Π» ΠΎΠ΄ ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΠΏΡΠΈ ΠΏΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΎΠΊΠΎΠ»ΠΈΠ½Π°ΡΠ° ΡΠ΅ Π²ΡΡΠΈ ΠΏΡΠ΅ΠΊΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½Π°ΡΠ° Π»ΠΈΠ½ΠΈΡΠ°. ΠΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΎΠ΄ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ Windows ΠΊΠ°ΠΊΠΎ ΡΠ°Π±ΠΎΡΠ΅Π½ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π΅Π½ ΡΠΈΡΡΠ΅ΠΌ. Π‘ΡΠ°Π½Π΄Π°ΡΠ΄Π½Π°ΡΠ° ΠΊΠΎΠ½Π·ΠΎΠ»Π° Π²ΠΎ ΠΎΠ²ΠΎΡ ΠΠ‘ ΠΎΡΡΠ°Π²Π° ΠΌΠ½ΠΎΠ³Ρ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ°ΠΊΡΠ²Π°. ΠΠ°ΡΠΎΠ°, ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΏΡΠΈΠ³ΠΎΠ΄Π½Π° Π°Π»Π°ΡΠΊΠ°
ssh root@server-ip-or-hostname
ΠΠ°ΠΌΠ΅ΡΡΠΎ ΠΈΠΌΠ΅ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ-ip-ΠΈΠ»ΠΈ-Π΄ΠΎΠΌΠ°ΡΠΈΠ½, Π½Π°Π²Π΅Π΄Π΅ΡΠ΅ ΡΠ° 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 ΠΊΠΎΠ½Π·ΠΎΠ»Π° (Π³ΠΎΡΠ½ΠΎΡΠΎ ΠΌΠ΅Π½ΠΈ - ΠΠΈΡΠ°Π»ΠΎΠ³ Π·Π° Π½ΠΎΠ²Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°) ΡΠ΅ ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π΅ΠΌΠ΅ ΠΏΡΠ΅ΠΊΡ ΠΏΠΎΡΡΠ°ΡΠ° 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.
ΠΡΠ΄Π΅ Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ Π½ΠΎΠ²Π° ΡΠ΅ΡΡΠ°ΡΠΊΠ°: ΠΠΎΠ²ΠΎ - ΠΠ΅Π»Π΅ΠΆΠ½ΠΈΠΊ - ΠΠ°ΡΡΠΎΠ½ 3.
ΠΡΠ΄Π΅ Π΄Π° ΡΠ° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π½Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ° Π½Π° ΡΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΡΡΠΎ Π³ΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π²ΠΌΠ΅. ΠΡΠ΄Π΅ Π΄Π° Π³ΠΎ Π²Π½Π΅ΡΠ΅ΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡ PyTorch ΠΊΠΎΠ΄ Π²ΠΎ Jupyter ΠΈ Π΄Π° Π³ΠΎ ΠΈΠ·Π²ΡΡΠΈΠΌΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ (ΠΊΠΎΠΏΡΠ΅ Run):
from __future__ import print_function
import torch
x = torch.rand(5, 3)
print(x)
Π Π΅Π·ΡΠ»ΡΠ°ΡΠΎΡ ΡΡΠ΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π΅ Π½Π΅ΡΡΠΎ Π²Π°ΠΊΠ°:
ΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ΡΠ»ΠΈΡΠ΅Π½ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ, ΡΠΎΠ³Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π²ΠΌΠ΅ ΡΓ¨ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌΠ΅ Π΄Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΠΌΠ΅ Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠ° ΠΌΡΠ΅ΠΆΠ°!
Π‘ΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠ° ΠΌΡΠ΅ΠΆΠ°
ΠΠ΅ ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠ° ΠΌΡΠ΅ΠΆΠ° Π·Π° ΠΏΡΠ΅ΠΏΠΎΠ·Π½Π°Π²Π°ΡΠ΅ ΡΠ»ΠΈΠΊΠΈ. ΠΠ° Π³ΠΎ Π·Π΅ΠΌΠ΅ΠΌΠ΅ ΠΎΠ²Π° ΠΊΠ°ΠΊΠΎ ΠΎΡΠ½ΠΎΠ²Π°
ΠΠ° Π΄Π° ΡΠ° ΠΎΠ±ΡΡΠΈΠΌΠ΅ ΠΌΡΠ΅ΠΆΠ°ΡΠ°, ΡΠ΅ ΡΠ° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΡΠ°Π²Π½ΠΎ Π΄ΠΎΡΡΠ°ΠΏΠ½Π°ΡΠ° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ CIFAR10. ΠΠΌΠ° ΠΊΠ»Π°ΡΠΈ: βΠ°Π²ΠΈΠΎΠ½β, βΠ°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»β, βΠΏΡΠΈΡΠ°β, βΠΌΠ°ΡΠΊΠ°β, βΠ΅Π»Π΅Π½β, βΠΊΡΡΠ΅β, βΠΆΠ°Π±Π°β, βΠΊΠΎΡβ, βΠ±ΡΠΎΠ΄β, βΠΊΠ°ΠΌΠΈΠΎΠ½β. Π‘Π»ΠΈΠΊΠΈΡΠ΅ Π²ΠΎ CIFAR10 ΡΠ΅ 3x32x32, ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ 3-ΠΊΠ°Π½Π°Π»Π½ΠΈ ΡΠ»ΠΈΠΊΠΈ Π²ΠΎ Π±ΠΎΡΠ° ΠΎΠ΄ 32x32 ΠΏΠΈΠΊΡΠ΅Π»ΠΈ.
ΠΠ° ΡΠ°Π±ΠΎΡΠ°, ΡΠ΅ Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΎΡ ΡΠΎΠ·Π΄Π°Π΄Π΅Π½ ΠΎΠ΄ PyTorch Π·Π° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ ΡΠ»ΠΈΠΊΠΈ - torchvision.
ΠΠ΅ Π³ΠΈ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΠ΅ΠΊΠΎΡΠΈ ΠΏΠΎ ΡΠ΅Π΄ΠΎΡΠ»Π΅Π΄:
- ΠΡΠΈΡΡΠ²Π°ΡΠ΅ ΠΈ Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° Π·Π±ΠΈΡΠΊΠΈΡΠ΅ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° ΠΎΠ±ΡΠΊΠ° ΠΈ ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅
- ΠΠ΅ΡΠΈΠ½ΠΈΡΠΈΡΠ° Π½Π° Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠ° ΠΌΡΠ΅ΠΆΠ°
- ΠΡΠ΅ΠΆΠ½Π° ΠΎΠ±ΡΠΊΠ° Π·Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° ΠΎΠ±ΡΠΊΠ°
- ΠΡΠ΅ΠΆΠ½ΠΎ ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ ΠΎΠ΄ ΡΠ΅ΡΡΠΎΡ
- ΠΡΠ΄Π΅ Π΄Π° ΠΏΠΎΠ²ΡΠΎΡΠΈΠΌΠ΅ ΠΎΠ±ΡΠΊΠ° ΠΈ ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡ
ΠΠ΅ Π³ΠΎ ΠΈΠ·Π²ΡΡΠΈΠΌΠ΅ ΡΠ΅Π»ΠΈΠΎΡ ΠΊΠΎΠ΄ ΠΏΠΎΠ΄ΠΎΠ»Ρ Π²ΠΎ 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) ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅ ΡΡΠΎ ΡΠ΅ ΠΌΠ΅Π½ΡΠ²Π°.
ΠΠ±ΡΠΊΠ° Π½Π° Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠ° ΠΌΡΠ΅ΠΆΠ° Π½Π° Π³ΡΠ°ΡΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠΎΡ
ΠΡΠ²ΠΎ Π½Π°ΠΊΡΠ°ΡΠΊΠΎ ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ½Π°ΠΌ ΡΡΠΎ Π΅ CUDA. CUDA (Compute Unified Device Architecture) Π΅ ΠΏΠ°ΡΠ°Π»Π΅Π»Π½Π° ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΡΠΊΠ° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° ΡΠ°Π·Π²ΠΈΠ΅Π½Π° ΠΎΠ΄ NVIDIA Π·Π° ΠΎΠΏΡΡΠΎ ΠΏΡΠ΅ΡΠΌΠ΅ΡΡΠ²Π°ΡΠ΅ Π½Π° Π³ΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΡΠΊΠΈ Π΅Π΄ΠΈΠ½ΠΈΡΠΈ (GPU). Π‘ΠΎ CUDA, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ°Ρ Π΄ΡΠ°ΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΄Π° Π³ΠΈ Π·Π°Π±ΡΠ·Π°Π°Ρ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΡΠΊΠΈΡΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎ ΠΈΡΠΊΠΎΡΠΈΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΌΠΎΡΡΠ° Π½Π° Π³ΡΠ°ΡΠΈΡΠΊΠΈΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ. ΠΠ²Π°Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° Π΅ Π²Π΅ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π° Π½Π° Π½Π°ΡΠΈΠΎΡ ΡΠ΅ΡΠ²Π΅Ρ ΡΡΠΎ Π³ΠΎ ΠΊΡΠΏΠΈΠ²ΠΌΠ΅.
ΠΡΠ΄Π΅ ΠΏΡΠ²ΠΎ Π΄Π° Π³ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΠΌΠ΅ Π½Π°ΡΠΈΠΎΡ Π³ΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡ ΠΊΠ°ΠΊΠΎ ΠΏΡΠ²ΠΈΠΎΡ Π²ΠΈΠ΄Π»ΠΈΠ² 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 )
ΠΡΠΏΡΠ°ΡΠ°ΡΠ΅ Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π΄ΠΎ Π³ΡΠ°ΡΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠΎΡ:
net.to(device)
ΠΡΡΠΎ ΡΠ°ΠΊΠ°, ΡΠ΅ ΠΌΠΎΡΠ° Π΄Π° ΠΈΡΠΏΡΠ°ΡΠ°ΠΌΠ΅ Π²Π»Π΅Π·ΠΎΠ²ΠΈ ΠΈ ΡΠ΅Π»ΠΈ Π½Π° ΡΠ΅ΠΊΠΎΡ ΡΠ΅ΠΊΠΎΡ Π΄ΠΎ Π³ΡΠ°ΡΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠΎΡ:
inputs, labels = data[0].to(device), data[1].to(device)
ΠΡΠ΄Π΅ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π΄Π° ΡΠ° ΠΎΠ±ΡΡΠΈΠΌΠ΅ ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π½Π° Π³ΡΠ°ΡΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠΎΡ:
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 ΠΌΠΈΠ½ΡΡΠΈ. Π Π°Π·Π»ΠΈΠΊΠ°ΡΠ° Π½Π΅ Π΅ Π·Π½Π°ΡΠ°ΡΠ½Π°, ΠΎΠ²Π° ΡΠ΅ ΡΠ»ΡΡΡΠ²Π° Π·Π°ΡΠΎΠ° ΡΡΠΎ Π½Π°ΡΠ°ΡΠ° ΠΌΡΠ΅ΠΆΠ° Π½Π΅ Π΅ ΡΠΎΠ»ΠΊΡ Π³ΠΎΠ»Π΅ΠΌΠ°. ΠΠΎΠ³Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ Π³ΠΎΠ»Π΅ΠΌΠΈ Π½ΠΈΠ·ΠΈ Π·Π° ΠΎΠ±ΡΠΊΠ°, ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ Π±ΡΠ·ΠΈΠ½Π°ΡΠ° Π½Π° Π³ΡΠ°ΡΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠΎΡ ΠΈ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π°Π»Π½ΠΈΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠΎΡ ΡΠ΅ ΡΠ΅ Π·Π³ΠΎΠ»Π΅ΠΌΠΈ.
Π‘Π΅ ΡΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° ΡΠΎΠ° Π΅ ΡΓ¨. Π¨ΡΠΎ ΡΡΠΏΠ΅Π°Π²ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠ΅:
- Π Π°Π·Π³Π»Π΅Π΄Π°Π²ΠΌΠ΅ ΡΡΠΎ Π΅ Π³ΡΠ°ΡΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠΎΡ ΠΈ Π³ΠΎ ΠΈΠ·Π±ΡΠ°Π²ΠΌΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠΎΡ Π½Π° ΠΊΠΎΡ Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½;
- ΠΠΎΡΡΠ°Π²ΠΈΠ²ΠΌΠ΅ ΡΠΎΡΡΠ²Π΅ΡΡΠΊΠΎ ΠΎΠΏΠΊΡΡΠΆΡΠ²Π°ΡΠ΅ Π·Π° ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠ° ΠΌΡΠ΅ΠΆΠ°;
- Π‘ΠΎΠ·Π΄Π°Π΄ΠΎΠ²ΠΌΠ΅ Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠ° ΠΌΡΠ΅ΠΆΠ° Π·Π° ΠΏΡΠ΅ΠΏΠΎΠ·Π½Π°Π²Π°ΡΠ΅ ΡΠ»ΠΈΠΊΠΈ ΠΈ ΡΠ° ΠΎΠ±ΡΡΠΈΠ²ΠΌΠ΅;
- ΠΠ° ΠΏΠΎΠ²ΡΠΎΡΠΈΠ²ΠΌΠ΅ ΠΌΡΠ΅ΠΆΠ½Π°ΡΠ° ΠΎΠ±ΡΠΊΠ° ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡ ΠΈ Π΄ΠΎΠ±ΠΈΠ²ΠΌΠ΅ Π·Π³ΠΎΠ»Π΅ΠΌΡΠ²Π°ΡΠ΅ Π½Π° Π±ΡΠ·ΠΈΠ½Π°ΡΠ°.
Π‘ΠΎ Π·Π°Π΄ΠΎΠ²ΠΎΠ»ΡΡΠ²ΠΎ ΡΠ΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ°ΠΌ Π½Π° ΠΏΡΠ°ΡΠ°ΡΠ° Π²ΠΎ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅.
ΠΠ·Π²ΠΎΡ: www.habr.com