Π’Π°ΡˆΠ° пСрвая нСйронная ΡΠ΅Ρ‚ΡŒ Π½Π° графичСском процСссорС (GPU). Руководство для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…

Π’Π°ΡˆΠ° пСрвая нСйронная ΡΠ΅Ρ‚ΡŒ Π½Π° графичСском процСссорС (GPU). Руководство для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…
Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я расскаТу ΠΊΠ°ΠΊ Π·Π° 30 ΠΌΠΈΠ½ΡƒΡ‚ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ срСду для машинного обучСния, ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π΅ΠΉΡ€ΠΎΠ½Π½ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ для распознавания ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ a ΠΏΠΎΡ‚ΠΎΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ‚Ρƒ ΠΆΠ΅ ΡΠ΅Ρ‚ΡŒ Π½Π° графичСском процСссорС (GPU).

Для Π½Π°Ρ‡Π°Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ нСйронная ΡΠ΅Ρ‚ΡŒ.

Π’ нашСм случаС это матСматичСская модСль, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΅Ρ‘ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ ΠΈΠ»ΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ΅ Π²ΠΎΠΏΠ»ΠΎΡ‰Π΅Π½ΠΈΠ΅, построСнная ΠΏΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ функционирования биологичСских Π½Π΅ΠΉΡ€ΠΎΠ½Π½Ρ‹Ρ… сСтСй β€” сСтСй Π½Π΅Ρ€Π²Π½Ρ‹Ρ… ΠΊΠ»Π΅Ρ‚ΠΎΠΊ ΠΆΠΈΠ²ΠΎΠ³ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΌΠ°. Π­Ρ‚ΠΎ понятиС Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ ΠΏΡ€ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ процСссов, ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ°ΡŽΡ‰ΠΈΡ… Π² ΠΌΠΎΠ·Π³Π΅, ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти процСссы.

НСйронныС сСти Π½Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠΌ смыслС этого слова, ΠΎΠ½ΠΈ ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‚ΡΡ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ обучСния β€” ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π³Π»Π°Π²Π½Ρ‹Ρ… прСимущСств Π½Π΅ΠΉΡ€ΠΎΠ½Π½Ρ‹Ρ… сСтСй ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌΠΈ. ВСхничСски ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ коэффициСнтов связСй ΠΌΠ΅ΠΆΠ΄Ρƒ Π½Π΅ΠΉΡ€ΠΎΠ½Π°ΠΌΠΈ. Π’ процСссС обучСния нСйронная ΡΠ΅Ρ‚ΡŒ способна Π²Ρ‹ΡΠ²Π»ΡΡ‚ΡŒ слоТныС зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅.

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния машинного обучСния, нСйронная ΡΠ΅Ρ‚ΡŒ прСдставляСт собой частный случай ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² распознавания ΠΎΠ±Ρ€Π°Π·ΠΎΠ², дискриминантного Π°Π½Π°Π»ΠΈΠ·Π°, ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² кластСризации ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

ΠžΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅

Π‘Π½Π°Ρ‡Π°Π»Π° разбСрСмся с ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Нам Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ сСрвСр с установлСнной Π½Π° Π½Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой Linux. ΠžΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ систСм машинного обучСния трСбуСтся достаточно ΠΌΠΎΡ‰Π½ΠΎΠ΅ ΠΈ ΠΊΠ°ΠΊ слСдствиС Π΄ΠΎΡ€ΠΎΠ³ΠΎΠ΅. Π’Π΅ΠΌ, Ρƒ ΠΊΠΎΠ³ΠΎ Π½Π΅Ρ‚ ΠΏΠΎΠ΄ Ρ€ΡƒΠΊΠΎΠΉ Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ². НСобходимый сСрвСр ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² Π°Ρ€Π΅Π½Π΄Ρƒ быстро ΠΈ ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π° врСмя использования.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…, Π³Π΄Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ созданиС Π½Π΅ΠΉΡ€ΠΎΠ½Π½Ρ‹Ρ… сСтСй я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ сСрвСра ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· российских ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ². Компания ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π² Π°Ρ€Π΅Π½Π΄Ρƒ ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Π΅ сСрвСры ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для машинного обучСния с ΠΌΠΎΡ‰Π½Ρ‹ΠΌΠΈ графичСскими процСссорами (GPU) Tesla V100 ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ NVIDIA. Если ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ: использованиС сСрвСра с GPU ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π² дСсятки Ρ€Π°Π· Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ эффСктивным (быстрым) ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΠΎ стоимости сСрвСром Π³Π΄Π΅ для вычислСний ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ CPU (всСм Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΉ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ процСссор). Π­Ρ‚ΠΎ достигаСтся Π·Π° счСт особСнностСй Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ GPU, которая быстрСС справляСтся с расчСтами.

Для выполнСния ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² описанных Π΄Π°Π»Π΅Π΅, ΠΌΡ‹ ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Π»ΠΈ Π½Π° нСсколько Π΄Π½Π΅ΠΉ Ρ‚Π°ΠΊΠΎΠΉ сСрвСр:

  • SSD диск 150 Π“Π‘
  • ΠžΠ—Π£ 32 Π“Π‘
  • ΠŸΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ Tesla V100 16 Gb с 4-мя ядрами

На ΠΌΠ°ΡˆΠΈΠ½Ρƒ Π½Π°ΠΌ установили Ubuntu 18.04.

УстанавливаСм ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅

Π’Π΅ΠΏΠ΅Ρ€ΡŒ установим Π½Π° сСрвСр всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ наша ΡΡ‚Π°Ρ‚ΡŒΡ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…, Π±ΡƒΠ΄Ρƒ Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π² Π½Π΅ΠΉ ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ пригодятся ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠΌ.

ΠžΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΈ настройкС срСды выполняСтся Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² качСствС Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ ОБ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Windows. Бтандартная консоль Π² этой ОБ оставляСт ΠΆΠ΅Π»Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ инструмСнт Cmder/. Π‘ΠΊΠ°Ρ‡ΠΈΠ²Π°Π΅ΠΌ mini Π²Π΅Ρ€ΡΠΈΡŽ ΠΈ запускаСм Cmder.exe. Π”Π°Π»Π΅Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡΡ ΠΊ сСрвСру ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ SSH:

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 являСтся Anaconda.

Установим Π΅Π΅ Π½Π° наш сСрвСр.

НачинаСм с обновлСния локального ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²:

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 ΠΈ Tensorflow.

ИспользованиС Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° позволяСт ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ инструмСнты для стандартных Π·Π°Π΄Π°Ρ‡.

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с 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)

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ:

Π’Π°ΡˆΠ° пСрвая нСйронная ΡΠ΅Ρ‚ΡŒ Π½Π° графичСском процСссорС (GPU). Руководство для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…

Если Ρƒ вас Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ β€” Π·Π½Π°Ρ‡ΠΈΡ‚ ΠΌΡ‹ всС настроили ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π½Π΅ΠΉΡ€ΠΎΠ½Π½ΠΎΠΉ сСти!

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½Π΅ΠΉΡ€ΠΎΠ½Π½ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ

Π‘ΡƒΠ΄Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ΠΉΡ€ΠΎΠ½Π½ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ для распознавания ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π—Π° основу возьмСм Π΄Π°Π½Π½ΠΎΠ΅ руководство.

Для Ρ‚Ρ€Π΅Π½ΠΈΡ€ΠΎΠ²ΠΊΠΈ сСти ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ общСдоступный Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… CIFAR10. Π£ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ классы: «самолСт», Β«Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒΒ», Β«ΠΏΡ‚ΠΈΡ†Π°Β», «кошка», «олСнь», «собака», Β«Π»ΡΠ³ΡƒΡˆΠΊΠ°Β», «лошадь», Β«ΠΊΠΎΡ€Π°Π±Π»ΡŒΒ», Β«Π³Ρ€ΡƒΠ·ΠΎΠ²ΠΈΠΊΒ». Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ Π² CIFAR10 ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ 3x32x32, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ 3-ΠΊΠ°Π½Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ†Π²Π΅Ρ‚Π½Ρ‹Π΅ изобраТСния Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 32×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)

Π’Ρ€Π΅Π½ΠΈΡ€ΠΎΠ²ΠΊΠ° сСти Π½Π° Ρ‚Ρ€Π΅Π½ΠΈΡ€ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

НачинаСм Ρ‚Ρ€Π΅Π½ΠΈΡ€ΠΎΠ²ΠΊΡƒ нашСй Π½Π΅ΠΉΡ€ΠΎΠ½Π½ΠΎΠΉ сСти. ΠžΠ±Ρ€Π°Ρ‰Π°ΡŽ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ послС этого ΠΊΠ°ΠΊ Π²Ρ‹ запуститС Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этот ΠΊΠΎΠ΄, Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π£ мСня это заняло 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')

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Π’Π°ΡˆΠ° пСрвая нСйронная ΡΠ΅Ρ‚ΡŒ Π½Π° графичСском процСссорС (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 (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). Руководство для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…

ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌ ΡΠ΅Ρ‚ΡŒ Π½Π° 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