Машинное обучение на практике – от модели PyTorch до Kubeflow в облаке для BigData
Шрифт:
Многие фреймворки поддерживают визуализацию TeserBodrd. Он представляет собой комплексный Web интерфейс многоуровневой визуализации состояния и процесса обучения и его отладки. Для подключения нужно указать путь к модели "tenserboard –logdir=$PATH_MODEL" и открыть localhost:6006. Управление интерфейсом основано на навигации по графу логических блоков и открытию интересующих блоков, для последующего повторения процесса.
Для экспериментов нам понадобится язык программирования и библиотека. Часто в качестве языка берут простой язык с низким порогом входа, такой как Python. Могут быть также и другие языки общего назначения, такие как JavaScript или специализированные, такие как язык R. Мы возьмём Python. Для того чтобы не ставить язык и библиотеки, воспользуемся бесплатным сервисом colab.research.google.com/notebooks/intro.ipynb, содержащим Jupyter Notebook. Notebook содержит в себе возможность не просто писать код с
Tesla T4: 1GPU 16GB GDDR6 0.35$/час Tesla P4: 1GPU 8GB GDDR5 0.60$/час Tesla V100: 1GPU 16GB HBM2 2.48$/час Tesla P100: 1GPU 16GB HBM2 1.46$/час
Попробуем. Перейдём по ссылке colab.research.google.com и нажмём кнопку "создать блокнот". У нас появится пустой Notebook. Можно ввести выражение:
10**3 / 2 + 3
и нажав на воспроизведение – получим результат 503.0. Можно вывести график параболы, нажав кнопку "+Код" в введя в новую ячейку код:
def F(x): return x*x import numpy as np import matplotlib.pyplot as plt x = np.linspace(–5, 5, 100) y = list(map(F, x)) plt.plot(x, y) plt.ylabel("Y") plt.xlabel("X")
Или выведя ещё и изображение:
import os !wgetimport PIL img = PIL.Image.open("python–logo.png") img
Популярные фреймворки:
* Caffe, Caffe2, CNTK, Kaldi, DL4J, Keras – набор модулей для конструирования;
* TensorFlow, Theano, MXNet – программирование графа;
* Torch и PyTorch – прописать основные параметры, а граф будет построен автоматически.
Рассмотрим работу библиотеки PyTorch (NumPy+CUDA+Autograd) из–за её простоты. Посмотрим на операции с тензорами – многомерными массивами. Подключим библиотеку и объявим два тензора: нажмём +Code, введём код в ячейку и нажмём выполнить:
import torch a = torch.FloatTensor([ [1, 2, 3], [5, 6, 7], [8, 9, 10] ]) b = torch.FloatTensor([ [–1, –2, –3], [–10, –20, –30], [–100, –200, –300] ])
Поэлементные операции, такие как "+", "–", "*", "/" над двумя матрицами одинаковых габаритов производят операции с соответствующими их элементами:
a + b tensor([ [ 0., 0., 0.], [ –5., –14., –23.], [ –92., –191., –290.] ])
Другим вариантом поэлементной операции является применение одной операции ко всем элементом по одиночке, например умножение на –1 или применение функции:
a tensor([ [ 1., 2., 3.], [ 5., 6., 7.], [ 8., 9., 10.] ]) a * –1 tensor([ [ –1., –2., –3.], [ –5., –6., –7.], [ –8., –9., –10.] ]) a.abs tensor([ [ 1., 2., 3.], [ 5., 6., 7.], [ 8., 9., 10.] ])
Также имеются операции свёртки, такие как sum, min, max, которые на входе дают сумму всех элементов, самый маленький или самый большой элемент матрицы:
a.sum tensor(51.) a.min tensor(1.) a.max tensor(10.)
Но нам будут больше интересны постолбцовые операции (операция будет производиться над каждым столбцом):
a.sum(0) tensor([14., 17., 20.]) a.min(0) torch.return_types.min( values=tensor([1., 2., 3.]), indices=tensor([0, 0, 0]) ) a.max(0) torch.return_types.max( values=tensor([ 8., 9., 10.]), indices=tensor([2, 2, 2]) )
Как мы помним, нейронная сеть состоит из слоёв, слои состоят из нейронов, а нейрон содержит на входе связи с весами в виде простых чисел. Вес задаётся обычным числом, тогда входящие связи в нейрон можно описать последовательностью чисел – вектором (одномерным массивом или списком), длина которого и есть количество связей. Так как сеть полносвязная, то все нейроны этого слоя связаны с предыдущим, а, следовательно, демонстрирующие их вектора имеют тоже одинаковую длину, создавая список равных по длине векторов – матрицу. Это удобное и компактное представление слоя, оптимизированное для использования на компьютере. На выходе нейрона имеется функция активации (сигмойда или, ReLU для глубоких и сверхглубоких сетей), которая определяет, выдаст на выходе нейрон значение или нет. Для этого необходимо применить её к каждому нейрону, то есть к каждому столбцу: мы уже видели операцию к столбцам.
Способы ускорения обучения
Пробежимся по истории развития вычислительных систем которая давала вычислительную основу для развития искусственного интеллекта:
* 1642 – механические вычислительные машины, * 1940 – ламповые вычислительные машины, * 1955 – транзисторные вычислительные машины, * 1965 – компьютеры на интегральных
На универсальных процессорах можно выделить три пути обеспечения ускорения вычислений, в частности, ускорения обучения нейронных сетей, – распараллеливание вычислений, увеличение количества операций за единицу времени и увеличение объёма вычислений за операцию. Рассмотрим с самой однозначной и имеющей богатую историю способа повышения производительности – увеличение количества операций за единицу времени. Достигается это за счёт увеличения тактовой частоты процессора. Исторически мы можем проследить её историю на примерах процессоров компании Intel серии Pentium для домашних рабочих станций и игровых персональных компьютеров, которые сделали ставку именно в том числе на неё и сильно продвинулись в этом направлении. Важно заметить, что Intel имела время (история от процессоров Intel Pentium 1 100 Мегагерц до Intel Pentium 4 5600 Мегагерц), средства (эта ниша на была лидером по объёму продаж и были популярны компьютерные игры) и необходимость (имела конкурента AMD, который имел архитектурные преимущества в виде разрядности шины в 64 вместо 32, и в случае смены лидера мог договориться адаптировать программное обеспечение под эту разрядность) для того, чтобы реализовать это направление по максимуму. Процессора Intel Pentium 1 100 Мегагерц работали с охлаждающим модулем, Intel Pentium 2 400 Мегагерц – с радиатором, выше уже требовался, как минимум, вентилятор. Начиная с частоты 3200, пользователи ставили вместо полностью алюминиевого радиатора, сперва алюминиевого с медной подложкой, потом полностью медные, так как теплоёмкость у алюминия 904 Дж/(кг*град), а у менди кратно меньше 381 Дж/(кг*град), что позволяет ему быстрее отдавать тепло дальше. Большие показатели дают другие металлы не слишком мягкие и не слишком легкоплавкие, такие как серебро (250) и золото (130), поэтому пошли не по теплопроводности самого материала, а по забору тепла при плавлении материала в тепловых трубках. Пепловые трубки отходят от подложки и ведут через закреплённые на них пластины, обдуваемые двумя вентиляторами, образуя прямой поток воздуха. Тепловые трубки оказывают хороший результат (100 Вт для 3 штук, 180 Вт для 6 штук), перенос тепла которыми осуществляется за счёт испарения жидкости в них находящийся в испарительной камере у радиатора, но большая площадь меди и большая разность температуры водяного охлаждения предоставило большую популярность, а вот в ноутбуках – наоборот, тепловые трубки очень популярны, а движение возврат конденсата обусловлен капиллярной структурой в самих трубках. А для поддержки больших частот продавались процессоры, которые выбирались из партии экспериментальным путём по возможности стабильно работать на этих частотах, и требовали, зачастую, водяного охлаждения и вынесенным радиатором из их системного блока персонального компьютера. Экстремальные же частоты достигались индивидуально и требовали криогенных установок, иногда в несколько контуров. При всём при этом, с каждым 100 Мегагерц повышение частоты достигалось большими затратами с высокими рисками повреждения процессора и не получало стабильную вычислительную производительность. На 2021 проверяются решение по литографии капилляров для охлаждающей жидкости внутри процессора, что может быть особенно актуально для многослойных процессоров. Приведу процессоры без бюджетных вариантов и серверных версий компании Intel с лидирующей архитектурой x86 в CISC:
1971, 4004: 500—740 кГц 1972, 4040: 500—740 КГц 1972, 8008: 200—800 кГц 1974, 8080: 2—4 МГц 1976, 8085: 3—6 МГц 1978, 8086: 4—16 МГц 1979, 8088: 5—16 МГц 1982, 80188: 6—20 МГц 1982, 80286: 6—20 МГц 1985, 80386: 12—40 МГц 1991, 80486: 16—150 МГц 1993, Pentium: 60—300 МГц 1995, Pentium Pro: 133—200 МГц 1997, Pentium MMX: 166—233 МГц 1997, Pentium II: 233—450 МГц 1999-2003, Pentium III: 0.4—1.4 ГГц 2000-2008, Pentium 4: 1.3—3.8 ГГц 2006-2011, Core 2 Extreme: 2.3—3.2 ГГц 2008-2013, Core i3: 2.4—4.2 ГГц 2008-2020, Core i7: 1.0—4.7 ГГц 2017-2021, Core i9: 2.1—5.3 ГГц
С Pentium III ситуация не так однозначна, так как имеются пересечения по времени и в один год выходят процессоры начального уровня и топового, поэтому детализируем из отрытых источников:
год процессор i7 Base/Boost GHz 2008 Core i7-965 EE 3.2 2009 Core i7-975 EE 3.3 2010 Core i7-980X 3.3 2011 Core i7-990X 3.5 2012 Core i7-3820 3.6 2013 Core i7-4820K 3.7 2014 Core i7-4790K 4.0 / 4.4 2015 Core i7-6700K 4.0 / 4.2 2016 Core i7-7700K 4.2 / 4.5 2017 Core i7-7740X 4.3 / 4.5 2018 Core i7-8086K 4.0 / 5.0 2019 Core i7-9700KF 3.6 2020 Core i7-10700K 3.8 2021 Core i7-11700KF 3.6 год процессор i9 GHz / Boost 2017 Core i9-7900X 3.3 / 4.3 2018 Core i9-9900X 3.5 / 4.5 2019 Core i9-9990XE 4.0 / 5.1 2020 Core i9-11900KF 3.5 / 5.2 2021 Core i9-12900KF 3.5 / 5.3