ื”ืจืฉืช ื”ืขืฆื‘ื™ืช ื”ืจืืฉื•ื ื” ืฉืœืš ื‘ื™ื—ื™ื“ืช ืขื™ื‘ื•ื“ ื’ืจืคื™ืช (GPU). ืžื“ืจื™ืš ืœืžืชื—ื™ืœ

ื”ืจืฉืช ื”ืขืฆื‘ื™ืช ื”ืจืืฉื•ื ื” ืฉืœืš ื‘ื™ื—ื™ื“ืช ืขื™ื‘ื•ื“ ื’ืจืคื™ืช (GPU). ืžื“ืจื™ืš ืœืžืชื—ื™ืœ
ื‘ืžืืžืจ ื–ื”, ืืกืคืจ ืœื›ื ื›ื™ืฆื“ ืœื”ื’ื“ื™ืจ ืกื‘ื™ื‘ืช ืœืžื™ื“ืช ืžื›ื•ื ื” ื‘-30 ื“ืงื•ืช, ืœื™ืฆื•ืจ ืจืฉืช ืขืฆื‘ื™ืช ืœื–ื™ื”ื•ื™ ืชืžื•ื ื•ืช ื•ืœืื—ืจ ืžื›ืŸ ืœื”ืคืขื™ืœ ืืช ืื•ืชื” ืจืฉืช ืขืœ ืžืขื‘ื“ ื’ืจืคื™ (GPU).

ืจืืฉื™ืช, ื”ื‘ื” ื ื’ื“ื™ืจ ืžื”ื™ ืจืฉืช ืขืฆื‘ื™ืช.

ื‘ืžืงืจื” ืฉืœื ื•, ื–ื”ื• ืžื•ื“ืœ ืžืชืžื˜ื™, ื›ืžื• ื’ื ื”ืชื’ืœืžื•ืช ื”ืชื•ื›ื ื” ืื• ื”ื—ื•ืžืจื” ืฉืœื•, ื”ื‘ื ื•ื™ ืขืœ ืขืงืจื•ืŸ ื”ืืจื’ื•ืŸ ื•ื”ืชืคืงื•ื“ ืฉืœ ืจืฉืชื•ืช ืขืฆื‘ื™ื•ืช ื‘ื™ื•ืœื•ื’ื™ื•ืช - ืจืฉืชื•ืช ืฉืœ ืชืื™ ืขืฆื‘ ืฉืœ ืื•ืจื’ื ื™ื–ื ื—ื™. ืžื•ืฉื’ ื–ื” ืขืœื” ืชื•ืš ื›ื“ื™ ืœื™ืžื•ื“ ื”ืชื”ืœื™ื›ื™ื ื”ืžืชืจื—ืฉื™ื ื‘ืžื•ื— ื•ื ื™ืกื™ื•ืŸ ืœื™ืฆื•ืจ ืžื•ื“ืœ ืฉืœ ืชื”ืœื™ื›ื™ื ืืœื•.

ืจืฉืชื•ืช ืขืฆื‘ื™ื•ืช ืื™ื ืŸ ืžืชื•ื›ื ืชื•ืช ื‘ืžื•ื‘ืŸ ื”ืจื’ื™ืœ ืฉืœ ื”ืžื™ืœื”, ื”ืŸ ืžืื•ืžื ื•ืช. ื”ื™ื›ื•ืœืช ืœืœืžื•ื“ ื”ื™ื ืื—ื“ ื”ื™ืชืจื•ื ื•ืช ื”ืขื™ืงืจื™ื™ื ืฉืœ ืจืฉืชื•ืช ืขืฆื‘ื™ื•ืช ืขืœ ืคื ื™ ืืœื’ื•ืจื™ืชืžื™ื ืžืกื•ืจืชื™ื™ื. ืžื‘ื—ื™ื ื” ื˜ื›ื ื™ืช, ืœืžื™ื“ื” ืžื•ืจื›ื‘ืช ืžืžืฆื™ืืช ืžืงื“ืžื™ ื”ืงืฉืจื™ื ื‘ื™ืŸ ื ื•ื™ืจื•ื ื™ื. ื‘ืžื”ืœืš ืชื”ืœื™ืš ื”ืื™ืžื•ืŸ, ื”ืจืฉืช ื”ืขืฆื‘ื™ืช ืžืกื•ื’ืœืช ืœื–ื”ื•ืช ืชืœื•ืช ืžื•ืจื›ื‘ืช ื‘ื™ืŸ ื ืชื•ื ื™ ืงืœื˜ ื•ื ืชื•ื ื™ ืคืœื˜, ื•ื›ืŸ ืœื‘ืฆืข ื”ื›ืœืœื”.

ืžื ืงื•ื“ืช ื”ืžื‘ื˜ ืฉืœ ืœืžื™ื“ืช ืžื›ื•ื ื”, ืจืฉืช ืขืฆื‘ื™ืช ื”ื™ื ืžืงืจื” ืžื™ื•ื—ื“ ืฉืœ ืฉื™ื˜ื•ืช ื–ื™ื”ื•ื™ ืชื‘ื ื™ื•ืช, ื ื™ืชื•ื— ืžื‘ื—ื™ืŸ, ืฉื™ื˜ื•ืช ืžืงื‘ืฅ ื•ืฉื™ื˜ื•ืช ืื—ืจื•ืช.

ะžะฑะพั€ัƒะดะพะฒะฐะฝะธะต

ืจืืฉื™ืช, ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ื”ืฆื™ื•ื“. ืื ื—ื ื• ืฆืจื™ื›ื™ื ืฉืจืช ืขื ืžืขืจื›ืช ื”ื”ืคืขืœื” ืœื™ื ื•ืงืก ืžื•ืชืงื ืช ืขืœื™ื•. ื”ืฆื™ื•ื“ ื”ื ื“ืจืฉ ืœื”ืคืขืœืช ืžืขืจื›ื•ืช ืœืžื™ื“ืช ืžื›ื•ื ื” ื”ื•ื ื—ื–ืง ืœืžื“ื™ ื•ื›ืชื•ืฆืื” ืžื›ืš ื™ืงืจ. ืœืžื™ ืฉืื™ืŸ ืžื›ื•ื ื” ื˜ื•ื‘ื” ื‘ื”ื™ืฉื’ ื™ื“, ืื ื™ ืžืžืœื™ืฅ ืœืฉื™ื ืœื‘ ืœื”ืฆืขื•ืช ืฉืœ ืกืคืงื™ ืขื ืŸ. ื ื™ืชืŸ ืœืฉื›ื•ืจ ืืช ื”ืฉืจืช ื”ื ื“ืจืฉ ื‘ืžื”ื™ืจื•ืช ื•ืœืฉืœื ืจืง ืขื‘ื•ืจ ื–ืžืŸ ื”ืฉื™ืžื•ืฉ.

ื‘ืคืจื•ื™ืงื˜ื™ื ืฉื‘ื”ื ื™ืฉ ืฆื•ืจืš ืœื™ืฆื•ืจ ืจืฉืชื•ืช ืขืฆื‘ื™ื•ืช, ืื ื™ ืžืฉืชืžืฉ ื‘ืฉืจืชื™ื ืฉืœ ืื—ื“ ืžืกืคืงื™ ื”ืขื ืŸ ื”ืจื•ืกื™ื™ื. ื”ื—ื‘ืจื” ืžืฆื™ืขื” ืฉืจืชื™ ืขื ืŸ ืœื”ืฉื›ืจื” ื‘ืžื™ื•ื—ื“ ืขื‘ื•ืจ ืœืžื™ื“ืช ืžื›ื•ื ื” ืขื ืžืขื‘ื“ื™ื ื’ืจืคื™ื™ื ื—ื–ืงื™ื ืฉืœ Tesla V100 (GPU) ืžื‘ื™ืช NVIDIA. ื‘ืงื™ืฆื•ืจ: ืฉื™ืžื•ืฉ ื‘ืฉืจืช ืขื GPU ื™ื›ื•ืœ ืœื”ื™ื•ืช ื™ืขื™ืœ (ืžื”ื™ืจ) ืขืฉืจื•ืช ืžื•ื ื™ื ื‘ื”ืฉื•ื•ืื” ืœืฉืจืช ื‘ืขืœื•ืช ื“ื•ืžื” ืฉืžืฉืชืžืฉ ื‘-CPU (ื™ื—ื™ื“ืช ื”ืขื™ื‘ื•ื“ ื”ืžืจื›ื–ื™ืช ื”ื™ื“ื•ืขื”) ืœืฆื•ืจืš ื—ื™ืฉื•ื‘ื™ื. ื–ื” ืžื•ืฉื’ ื”ื•ื“ื•ืช ืœืชื›ื•ื ื•ืช ืฉืœ ืืจื›ื™ื˜ืงื˜ื•ืจืช ื”-GPU, ื”ืžืชืžื•ื“ื“ืช ืขื ื—ื™ืฉื•ื‘ื™ื ืžื”ืจ ื™ื•ืชืจ.

ื›ื“ื™ ืœื™ื™ืฉื ืืช ื”ื“ื•ื’ืžืื•ืช ื”ืžืชื•ืืจื•ืช ืœื”ืœืŸ, ืจื›ืฉื ื• ืืช ื”ืฉืจืช ื”ื‘ื ืœืžืกืคืจ ื™ืžื™ื:

  • ื“ื™ืกืง SSD 150 ื’ื™ื’ื”
  • ื–ื™ื›ืจื•ืŸ RAM 32 GB
  • ืžืขื‘ื“ Tesla V100 16 Gb ืขื 4 ืœื™ื‘ื•ืช

ื”ืชืงื ื• ืืช ืื•ื‘ื•ื ื˜ื• 18.04 ื‘ืžื—ืฉื‘ ืฉืœื ื•.

ื”ืงืžืช ื”ืกื‘ื™ื‘ื”

ืขื›ืฉื™ื• ื‘ื•ืื• ื ืชืงื™ืŸ ืืช ื›ืœ ื”ื“ืจื•ืฉ ืœืขื‘ื•ื“ื” ืขืœ ื”ืฉืจืช. ืžื›ื™ื•ื•ืŸ ืฉื”ืžืืžืจ ืฉืœื ื• ืžื™ื•ืขื“ ื‘ืขื™ืงืจ ืœืžืชื—ื™ืœื™ื, ืื“ื‘ืจ ืขืœ ื›ืžื” ื ืงื•ื“ื•ืช ืฉื™ื”ื™ื• ืฉื™ืžื•ืฉื™ื•ืช ืขื‘ื•ืจื.

ื”ืจื‘ื” ืžื”ืขื‘ื•ื“ื” ื‘ืขืช ื”ื’ื“ืจืช ืกื‘ื™ื‘ื” ื ืขืฉื™ืช ื“ืจืš ืฉื•ืจืช ื”ืคืงื•ื“ื”. ืจื•ื‘ ื”ืžืฉืชืžืฉื™ื ืžืฉืชืžืฉื™ื ื‘-Windows ื›ืžืขืจื›ืช ื”ื”ืคืขืœื” ืฉืœื”ื. ื”ืงื•ื ืกื•ืœื” ื”ืกื˜ื ื“ืจื˜ื™ืช ื‘ืžืขืจื›ืช ื”ื”ืคืขืœื” ื”ื–ื• ืžืฉืื™ืจื” ื”ืจื‘ื” ืžื” ืœืจืฆื•ื™. ืœื›ืŸ, ื ืฉืชืžืฉ ื‘ื›ืœื™ ื ื•ื— Cmder/. ื”ื•ืจื“ ืืช ื’ืจืกืช ื”ืžื™ื ื™ ื•ื”ืคืขืœ ืืช 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. ื•ื”ืคืœื˜ืคื•ืจืžื” ื”ืคื•ืคื•ืœืจื™ืช ื‘ื™ื•ืชืจ ืœืฉื™ืžื•ืฉ ืฉืœื” ื‘ืœื™ื ื•ืงืก ื”ื™ื ื”ืื ืงื•ื ื“ื”.

ื‘ื•ืื• ื ืชืงื™ืŸ ืืช ื–ื” ื‘ืฉืจืช ืฉืœื ื•.

ืื ื• ืžืชื—ื™ืœื™ื ื‘ืขื“ื›ื•ืŸ ืžื ื”ืœ ื”ื—ื‘ื™ืœื•ืช ื”ืžืงื•ืžื™:

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 ะธ ื–ืจื™ืžืช ืžืชื™ื—ื”.

ื”ืฉื™ืžื•ืฉ ื‘ืžืกื’ืจืช ืžืืคืฉืจืช ืœื”ื’ื‘ื™ืจ ืืช ืžื”ื™ืจื•ืช ื”ืคื™ืชื•ื— ื•ืœื”ืฉืชืžืฉ ื‘ื›ืœื™ื ืžื•ื›ื ื™ื ืœืžืฉื™ืžื•ืช ืกื˜ื ื“ืจื˜ื™ื•ืช.

ื‘ื“ื•ื’ืžื” ื–ื• ื ืขื‘ื•ื“ ืขื 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 ื™ื™ืคืชื—.

ื‘ื•ืื• ื ื™ืฆื•ืจ ืžื—ื‘ืจืช ื—ื“ืฉื”: ื—ื“ืฉ - ืžื—ื‘ืจืช - Python 3.

ื‘ื•ืื• ื ื‘ื“ื•ืง ืืช ื”ืคืขื•ืœื” ื”ื ื›ื•ื ื” ืฉืœ ื›ืœ ื”ืจื›ื™ื‘ื™ื ืฉื”ืชืงื ื•. ื‘ื•ืื• ื ื–ื™ืŸ ืืช ืงื•ื“ PyTorch ืœื“ื•ื’ืžื” ืœืชื•ืš Jupyter ื•ื ืคืขื™ืœ ืืช ื”ื‘ื™ืฆื•ืข (ื›ืคืชื•ืจ ื”ืคืขืœื”):

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

ื”ืชื•ืฆืื” ืฆืจื™ื›ื” ืœื”ื™ื•ืช ืžืฉื”ื• ื›ื–ื”:

ื”ืจืฉืช ื”ืขืฆื‘ื™ืช ื”ืจืืฉื•ื ื” ืฉืœืš ื‘ื™ื—ื™ื“ืช ืขื™ื‘ื•ื“ ื’ืจืคื™ืช (GPU). ืžื“ืจื™ืš ืœืžืชื—ื™ืœ

ืื ื™ืฉ ืœืš ืชื•ืฆืื” ื“ื•ืžื”, ืื– ื”ื’ื“ืจื ื• ื”ื›ืœ ื ื›ื•ืŸ ื•ื ื•ื›ืœ ืœื”ืชื—ื™ืœ ืœืคืชื— ืจืฉืช ืขืฆื‘ื™ืช!

ื™ืฆื™ืจืช ืจืฉืช ืขืฆื‘ื™ืช

ื ื™ืฆื•ืจ ืจืฉืช ืขืฆื‘ื™ืช ืœื–ื™ื”ื•ื™ ืชืžื•ื ื”. ื‘ื•ืื• ื ื™ืงื— ืืช ื–ื” ื›ื‘ืกื™ืก ืžึทื ื”ึดื™ื’ื•ึผืช.

ื ืฉืชืžืฉ ื‘ืžืขืจืš ื”ื ืชื•ื ื™ื ื”ื–ืžื™ืŸ ืœืฆื™ื‘ื•ืจ ืฉืœ CIFAR10 ื›ื“ื™ ืœืืžืŸ ืืช ื”ืจืฉืช. ื™ืฉ ืœื• ื›ื™ืชื•ืช: "ืžื˜ื•ืก", "ืžื›ื•ื ื™ืช", "ืฆื™ืคื•ืจ", "ื—ืชื•ืœ", "ืฆื‘ื™", "ื›ืœื‘", "ืฆืคืจื“ืข", "ืกื•ืก", "ืกืคื™ื ื”", "ืžืฉืื™ืช". ื”ืชืžื•ื ื•ืช ื‘-CIFAR10 ื”ืŸ ื‘ื’ื•ื“ืœ 3x32x32, ื›ืœื•ืžืจ, ืชืžื•ื ื•ืช ืฆื‘ืขื•ื ื™ื•ืช ืฉืœ 3 ืขืจื•ืฆื™ื ืฉืœ 32x32 ืคื™ืงืกืœื™ื.

ื”ืจืฉืช ื”ืขืฆื‘ื™ืช ื”ืจืืฉื•ื ื” ืฉืœืš ื‘ื™ื—ื™ื“ืช ืขื™ื‘ื•ื“ ื’ืจืคื™ืช (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 ืขื‘ื•ืจ ืžื—ืฉื•ื‘ ื›ืœืœื™ ืขืœ ื™ื—ื™ื“ื•ืช ืขื™ื‘ื•ื“ ื’ืจืคื™ื•ืช (GPUs). ืขื CUDA, ืžืคืชื—ื™ื ื™ื›ื•ืœื™ื ืœื”ืื™ืฅ ื‘ืื•ืคืŸ ื“ืจืžื˜ื™ ื™ื™ืฉื•ืžื™ ืžื—ืฉื•ื‘ ืขืœ ื™ื“ื™ ืžื™ื ื•ืฃ ื”ื›ื•ื— ืฉืœ GPUs. ื”ืคืœื˜ืคื•ืจืžื” ื”ื–ื• ื›ื‘ืจ ืžื•ืชืงื ืช ื‘ืฉืจืช ืฉืœื ื• ืฉืจื›ืฉื ื•.

ืชื—ื™ืœื” ื ื’ื“ื™ืจ ืืช ื”-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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”