Читать книгу Machine learning – от модели PyTorch до Kubeflow в облаке для BigData - Евгений Сергеевич Штольц - Страница 1
ОглавлениеО книге
Книга состоит из разделов:
* Введение Machine learning.
* Как пишутся сети.
* Создаём первую сеть. Создаём простую нейросеть на PyTorch.
* Улучшаем распознаванию на цветных картиночках. Здесь демонстрируется обучение и работа сети для
цветных картинок, методы повышения качества предсказаний сети.
* Современные архитектуры сетей. Приводятся архитектурные принципы для улучшения своих сетей.
* Использование предобученных сетей. Демонстрируется использование в своих сетях уже обученных слов.
* Масштабирование ML. Приводится примеры подготовки окружения для запуска их в облачной инфраструктуре.
* Получение данных от BigData. Рассказывается как можно из Jupyter подключаться к различным источникам
данных, в том числе BigData, для обучения моделей.
* Подготовка больших данных. В этом разделе описываются BigData технологии, такие как Hadoop и Spark, которые
являются источниками данных для обучения моделей.
* ML в промышленной среде. В этом разделе рассказываются о таких системах, как Kubeflow и MLflow.
Введение Machine learning
Искусственный интеллект область на стыке многих наук. Один из способов его достичь – машинное обучение, когда мы подаём него данных и на их основе происходит обучение нахождению решений и выявление закономерностей и данных, ранее которых не было. Для обучения могут использоваться статистические алгоритмы, например, на языке R, поиск в глубину на языке Prolog или поиск в ширину на Refal, а также подстраивающиеся структуры – нейронные сети. Нейронные сети, в зависимости от задач, скроются по разным принципам, имеют структуру и по разному обучаются. В последнее время наибольший прорыв получили нейронные сети представления данных (Representation learning), занимающиеся выявлении в информации закономерностей, так как саму информацию из-за её размеров они не могут запомнить. Больших эфект дают глубокие нейронные сети, имеющие множество уровней признаков, признаки на последующих уровнях строются на основании признаков с предыдущих уровней, о них и пойдёт речь в этой главе.
Под машинным обучением (Machine learning, ML) понимается адаптация преобразования входных данных в выходные в зависимости от истории решений. Такой класс задач решается или алгоритмическим способом, или с помощью нейронных сетей, о том где какое решение и в какой ситуации лучше применять далее и пойдёт речь. Для примера возьмём прописные числа от нуля до девяти, которые мы будет сопоставлять с печатными. Если прописные точно попадают в контур – то всё просто, нам нужно просто перебрать контура печатных и получить подходящий вариант. Такая задача не относится задачам машинного обучения. Теперь усложним задача – числа у нас не точно попадают под шаблон. Если прописные числа немного не вписываются в контур – мы просто находим какое-то отклонение. И тут возникает сложность при категоризации прописного числа на ноль и девятку, когда размер хвостика отделяет небрежное написание нуля от девятки. Другой момент в катогоризации восьмёрки и девятки. Так, если кончик отгибается – это десятка, а если загибается и прикасается – то восьмёрка. Для решения подобной ситуации нужно разделить цифру на области и в зависимости и присвоить им разные коэффициенты. Так, соединение хвостика нижней части имеет очень высокое значение, нежели форма самих окружностей в классификации на восьмёрки и девятки. Определить помогут статистические данные по заранее данной выборки соответствия фигур восьмёркам и девяткам, где исследователь сможет определить, когда уже можно высчитать нижнее кольцо замкнутым и говорить об соответствии восьмёрке фигуры, а когда нет и говорить о соответствии девятке. Но мы может программным способом разделить цифры на сектора и присвоить им коэффициенты.
Другой сложностью может быть то, что цифра может быть не в наблюдаемой области, а в произвольной, например, в углу. Для анализа самой цифры нам нужно переместить анализирующее окно в то место, где находится цифра. Для простоты пока будем полагать, что габариты анализирующего окна равны габаритам исследуемой цифры. Для решения этой задачи перед сетью ставят анализирующий слой, образующий карту нахождения цифры. Задача этого слоя определить местоположение цифры на картинке. Для простоты возьмём чёрный изображение на белом листе. Нам нужно пройтись анализатором цифры построчно по всему листку и определить местоположения. В качестве индикатора возьмём площадь чёрного цвета на индикаторе. После прохождения по листку бумаги и определения площади мы получим матрицу с цифрами площадей чёрного цвета. Где площадей чёрного цвета больше – в том месте цифра максимально вписалась в индикатор. Преобразование картинки в матрицу площадей называется операцией свёртки, а если это выполняет нейронный слой – свёрточный слой. Нейронные сети, в которых присутствует свёрточный слой (Conv Layers) называются свёрточными нейронными сетями (Convolutional Neural Network, CNN). Такие сети используют при распознавании изображения, ныне их адаптировали для распознования речи. Принцип работы был позаимствован у биологического зрительного нерва.
Если изображение не только находится в производном месте, но и имеются другие изображения, то для определения и потребуется несколько слоёв нейронной сети для выполнения определения, результатом чего будет являться также карта расположения цифры, но принятие решения об её нахождения нужно её идентифицировать. Таким образом, первый слой будет иметь количество нейронов отображающих карты, что по горизонтали и вертикали будет соответствовать ширине и высоте листка минут соответствующую ширину и высоту анализирующего экрана делённую на шаг сдвига анализирующего окна. Размерность второго же слоя в нейронах равна размерности анализируемого окна, чтобы иметь возможность по идентификации цифры. Если мы проведём связи от всех нейронов слоя поиска к слою анализирующего окна, то сеть на выходе мы получим набор снимков влитых вместе. Следующий слой будет иметь размерность количеству анализируемых элементов цифр. К примеру, цифру можно представить в виде не полностью закрашенной восьмёрки, тогда, закрашиваемых сегментов будет семь. Все нейроны свёрточного слоя будут связаны со всеми нейронами слоя анализа сегментов цифры. Задача нейрона этого слоя быть связанным с нейронами предыдущего, ответственными за данный сегмент и выдать результат наличия или отсутствия данного сегмента в цифре. Следующий слой имеет состоит из десяти нейронов, соответствующие цифрам от нуля до девяти. Всего его нейроны связаны с предыдущим слоем и активируются при получении сигналов от них. Так, нейрон, ответвленный за цифру один будет активироваться, если получит информацию, что два крайних правых сектора будут активны и не активны все остальные.
На выходе мы получим активацию того выходного нейрона, который соответствует определённой цифре. Он это делает на основе данных получаемых от нейронов с предыдущего слоя, ответственных за сектора цифры, а именно от каких нейронов пришли сигналы, а от каких нет. Возьмём, что приходящие сигналы от нейронов по связям – это ноль, то есть сектор не закрашен, если единица, то значит сектор закрашен. Тогда, веса у связей от правых секторов – половины, что даст единицу, а у остальных – отрицательные, что не даст получить на выходе единицу если ещё какой-то сектор активирован. На выходе нейрона стоит нормализатор, который решает, за принятие решения. Ему необходимо решить, на основе входных данных и весов, отдавать единицу или ноль. Для этого он перемножает входные данные на веса, складывает их, и по пороговому значению выдаёт единицу или ноль. Этот нормализатор нужен дял того, чтобы после суммирования информации приходящей с нейронов, он передал на следущий слой нейронов логическую информацию, степень важности которой будет определяться весами на принимающем нейроне, а не им. Для этого используются функции, которые преобразуют весь диапан уровней входных сигналов в диапазон от нуля до единицы. Такая функция носит название функций активации и подбирается для всей нейронной сети. Есть множества функций, который всё, что меньше единицы считает нулём. Сами веса не кодируются, а подбираются во время обучения. Обучение бывает с учителем (supervised) и без (ansupervised) и они пригодны для разного класса задач. При обучении без учителя мы даём данные на вход нейронов сети о ожидаем, когда она сама найдёт какие-нибудь закономерности, при этом данные не размечены (не имеют каких-то меток по классификации), что позволит выявить ранее неизвестные особенности, сходства и различия,и классифицирует по ещё ненайденным признакам, но как это будет происходить предсказать сложно. Для большинства задач нам нужно получить классификацию по заданным группам, для чего мы на вход подаём обучающую выборку с размеченными данными содержащие метки об правильном решении ( например, классификации, и стараемся добиться совпадения с этой тестовой выборкой. Также может быть с подкреплением (reinforcement), при котором сеть пытается найти наилучшее решение на основе стимулов, например, при игре добиться превосходства перед соперником, но пока, отложим рассмотрение данной стратегии обучения на потом. При обучении с учителем требуется гораздо меньше попыток подобрать вес, но всё же это от нескольких сотен до десятков тысяч, при этом сама сеть содержит огромное количество связей. Для того, чтобы найти веса, мы подбором и направленным уточнения их подбираем. С каждым проходом мы уменьшаем ошибку, и когда точность нас устроила, мы можем подавать тестовую выборку для валидации качества обечения (сеть могла плохо обучиться или переобучиться), после можно использовать сеть. В нашем примере, это могут быть немного искривлены цифры, но благодаря тому, что мы выделяем области, это не сильно сказывается на точности.
При обучении нейрона с учителем мы на него подаёт обучающие сигналы и получаем на выходе результаты. На каждый сигнал входной и выходной мы получает результат о степени ошибки в предсказании. Когда мы прогнали все обучающие сигналы, мы получили набор (вектор) ошибок, который может быть представлен в виде функции ошибок. Эта функция ошибок зависит от входных параметров (весов) и нам нужно найти веса при который эта функции ошибок становится минимальной. Для определения этих весов применяется алгоритм Градиентного спуска, суть которого заключается в постепенном движении к локальному чинимому, а направление движения определяется производной от этой функции и функции активации. В качестве функции активации обычно выбирают сигмойду для обычных сетей или усечённую ReLU для глубоких сетей. Сигмойда на выходе даёт диапазон от нуля до единицы всегда. Усечённая ReLU всё же позволяет при очень больших числах (очень важно информации) на входе передать больше единицы на выход, там сами повлиять на слои, удущие после непосредственно следующим. К примеру, точка над чёрточкой отделяет букву L от буквы i, а информация одного пикселя влияет на принятия решения на выходе, поэтому важно не потерять этот признак и передать его на последний уровень. Разновидностей функций активации не так много – их ограничивает требования к простоте обучения, когда требуется взять производную. Так сигмойда f после произвольно превращается в f(1-f), что эффективно. С Leaky ReLu (усечённая ReLu c утечкой) ещё проще, так она при x < 0 принимает значение 0, то её проводная на этом участке тоже равна 0, а при x >=0 она принимает 0,01*x, что при производной будет будет 0,01, а при x > 1 принимает 1+0,01*x, что для производной даёт 0,01. Вычисление тут вообще не требуется, поэтому обучение происходит сильно быстрее.
Так как на вход функции активации мы подаём сумму произведений сигналов на их веса, то зачатую, нам нужен другой пороговый уровень, чем от 0,5. Мы можем сместить его на константу, прибавляя её к сумме на входе в функцию активации используя нейрон смещения для её запоминания. Он не имеет входов и выдаёт всегда единицу, а само смещение задаётся весом связи с ним. Но, для многонейронных сетей он не требуется, так как сами веса предыдущим слоями подгоняются такого размера (меньшими или отрицательными), чтобы использовать стандартный пороговый уровень – это даёт стандартизацию, но требует большего количества нейронов.
При обучении нейрона нам известна ошибка самой сети, то есть на входных нейронах. На основе них можно рассчитать ошибку в предыдущем слое и так далее до входных – что носит название метода Обратного распространения ошибки.
Сам же процесс обучения можно разделить на этапы: инициализация, само обучение и предсказание.
Если же у нас цифра может быть различного размера, то применяется pooling слои, которые масштабируют изображение в меньшее сторону. По какому алгоритму будет вычисляться то, что будет записано при объединении зависит от алгоритма, обычно это функция max для алгоритма max pooling или avg (среднеквадратичные значение соседних ячеек матрицы) – average pooling.
У нас уже появилось несколько слоёв. Но, в применяемых на практике нейронных сетях их может быть очень много. Сети с количеством слоёв больше четырёх слоёв принято называют глубокими нейронными сетями (DML, Deep ML). Но, их может быть очень много, так в ResNet их 152 штуки и это далеко не самая глубокая сеть. Но, как вы уже заметили, количество слоёв не берётся, по принципу, чем больше, тем лучше, а прототипируется. Излишнее количество ухудшает качество за счёт затухания, если для этого не применять определённые решения, как проброс данных с последующим суммировнием. Примерами архитектур нейронных сетей могут быть ResNeXt, SENet, DenseNet, Inception-Res Net-V2, Inception-V4, Xception, NASNet, MobileNet V2, Shuffle Net и Squeeze Net. Большинство из этих сетей предназначены для анализа изображений и именно изображения, зачастую, содержат наибольшее количество деталей и на эти сети возлагается наибольшее количество операций, чем и обуславливается их глубина. Одну из подобных архитектур мы рассмотрим при создании сети классификации цифр – LeNet-5, созданную в 1998.
Если же нам нужно не просто распознать цифру или букву, а их последовательность, заложенный в них смысл, на нам нужна связь между ними. Для этого нейронная сеть после анализа первой буквы отравляет отравляет на свой вход вместе со следующей буквой результат анализа текущей. Это можно сравнить с динамической памятью, а сеть реализующую такой принцип называют рекуррентной (RNN). Примерами таких сетей (с обратными связями): сеть Кохонена, сеть Хопфилда, ART- модели. Рекуррентной сети анализирует текст, речь, видео информацию, производит перевод с одного языка на другой, генерируют текстовое описание к изображениям, генерируют речь (WaveNet MoL, Tacotron 2), категоризируют тексты по содержанию (принадлежность к спаму). Основным направлением в котором работают исследователя в попытке улучшить в подобных сетях является определить принцип, по которому сеть будет решать какую, на сколько долго и на сколько сильно будет сеть учитывать предыдущую информацию в будущем. Сети, приминающие специализированные инструменты по сохранению информации получили название LSTM (Long-short term memory).
Не все комбинации удачны, какие то позволяют решать только узкие задачи. С ростом сложности, всё меньший процент возможных арзиктур является удачным, и носят свои названия:
* два входа и один выход – Percetron (P)
* два входа, два нейрона полносвязных с выходом и один выход – Feed Forward (FF) или Redial Basics Network (RBN)
* три входа, два слоя по четыре полносвязнных нейрона и два выхода Deep Feed Forward (DFF)
Как пишутся нейронные сети
До 2015 года с большим отрывом лидировала scikit-learn, которую догонял Caffe, но с выходом TensorFlow он сразу стал лидером. Со временим только набирая отрыв с двухкратного на трёхкратней к 2020 году, когда на GitHub набралось более 140 тысяч проектов, а у ближайшего конкурента чуть более 45 тысяч. На 2020 году по убывающей расположились Keras, scikit-learn, PyTorch (FaceBook), Caffe, MXNet, XGBoost, Fastai, Microsoft CNTK (CogNiive ToolKit), DarkNet и ещё некоторые менее известные библиотеки. Наиболее популярными можно выделить библиотеку Pytorch и TenserFlow. Pytorch хорошо для прототипирования, изучения и испробования новых моделей. TenserFlow популярен в производственной среде, а проблема низко уровневости решается Keras.
* FaceBook Pytorch – хороший вариант для обучения и прототипирования из-за высоко уровневости и поддержке различных
сред, динамический граф, может дать приемущества при обучении. Используется в Twitter, Salesforce.
* Google TenserFlow – имел изначально статический граф решения, ныне поддерживается и динамический. Используется в
Gmail, Google Translate, Uber, Airbnb, Dropbox. Для привлечения использования в облаке Google под него
внедряется аппаратный процессор Google TPU (Google Tensor Processing Unit).
* Keras является высокоуровневой настройков, обеспечивающей больший уровень абстракции для TensorFlow, Theano
или CNTK. Хороший вариант для обучения. К примеру, он
позволяет не указывать размерность слоёв, вычисляя её сам, позволяя разработчику сосредоточиться на слоях
архитектуре. Обычно используется поверх TenserFlow. Код на нём поддерживается Microsoft CNTK.
Так же имеются более специализированные фреймворки:
* Apache MXNet (Amazon) и высокоуровневая надстройка для него Gluon. MXNet – фреймворк с акцентом на
масштабирование, поддерживает интеграцию с Hadoop и Cassandra. Поддерживается
C++, Python, R, Julia, JavaScript, Scala, Go и Perl.
* Microsoft CNTK имеет интеграции с Python, R, C# благодаря, что большая часть кода написана на С++. То, что вся сонова
написана на С++, это не говорит о том, что CNTK будет обучать модель на C++, а TenserFlow на Python (который медленный),
так как TenserFlow строит графи и уже его выполнение осуществляется на C++. Отличает CNTK
от Google TenserFlow и тем, что он изначально был разработан для работы в кластерах Azure с множеством графических
процессоров, но сейчас ситуация выравнивается и TenserFlow поддерживает кластера.
* Caffe2 – фреймворк для мобильных сред.
* Sonnet – надстройка DeepMind поверх TensorFlow для обучения сверх глубоких нейронных сетей.
* DL4J (Deep Learning for Java) – фреймворк с акцентом на Java Enterprise Edition. Высока поддержка BigData на Java: Hadoop и Spark.
Со скростью доступности новых предобученных моделей ситуация разнится и, пока, лидирует Pytorch. По поддерке сред, в частности публичных облаков, лучше у ферймворках, продвигаемых вендарами этих облаков, так лучше поддержка TensorFlow лучше в Google Cloud, MXNet – в AWS, CNTK – в Microsoft Azure, D4LJ – в Android, Core ML – в iOS. По языкам общая поддерка в Python практически у всех, в частности TensorFlow поддерживает JavaScript, C++, Java, Go, C# и Julia.
Многие фреймворки поддерживают визуализацию TeserBodrd. Из себя он представляет комплексный Web интерфейс многоуровневой визуализации состояния и процесса обучения и его отладки. Для подключения нужно указать путь к модели "tenserboard –logdir=$PATH_MODEL" и открыть localhost:6006. Управление интерфейсом основано на навигации по графу логических блоков и отрытию интересущих блоков, для последующего повторения процесса.
Для экспериментов нам понадобится язык программирования и библиотека. Часто в качестве языка бирут простой язык с низким порогом входа, такой как Python. Может быть и другие языки общего назначения, как JavaScript или специализированные, такие как язык R. Я возьму Python. Для того, что бы не ставить язык и библиотеки воспользуемся бесплатным сервисом colab.research.google.com/notebooks/intro.ipynb содержащим Jupiter Notebook. Notebook содержит в себе возможность не просто писать код с комментариями в консольном виде, а оформлять его в виде документа. Испробовать возможности Notebook можно в учебном плейбуке https://colab.research.google.com/notebooks/welcome.ipynb, такие как оформление текста на языке разметки MD с формулами на языке раметки TEX, запуск скриптов на языке Python, вывод результатов их работы в текстовом виде и в виде графиков используя стандартную библиотеку Python: NumPy(НамПай), matplotlib.pyplot. Сам colab предоставляет графическую карту Tesla K80 на 12 часов за раз (на сессию) бесплатно. Она поддерживает различные фреймворки глубокого машинного обучения, в том числе, Keras, TenserFlow и Pytorch.
Попробуем. Перейдём по ссылке 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
!wget https://www.python.org/static/img/python-logo.png
import 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 для глубоких и сверхглубоких сетей), которая определяет, выдаст на выходе нейрон значение или нет. Для этого необходимо применить её к каждому нейрону, то есть к каждому столбцу: мы уже видели операцию к столбцам.
Ускорение обучения
Эти операции используются при свёртках, которые берут на себя более 99% времени и поэтому имеются специализированные средства по их оптимизации. Сами вычисления производятся не на Python, а на C – Python лишь вызывает API низкоуровневых математический библиотек. Так как такие вычисление легко распараллеливаются, то вместо процессоров общего назначения (CPU) применяются процессора предназначенные для параллельной обработки изображений (GPU). Так, если у ПК в процессоре от 2 до 8 ядер, а у сервера от 10 до 20 ядер, то в GPU это сотни или тысячи узкоспециализированных под обработку матриц и векторов. Наиболее популярен стандарт группы драйверов, предоставляющих доступ к GPU NVidia имеет название CUDA (Computed Unified Device Architecture). Для большей оптимизации в процессорах для ML используются специальные инструкции, которые задействуется в специальных библиотеках. Например, процессоры Intel Xeon SCalate в восьмибитными числами и специальными конвейерами, которые активируются при использовании OpenVINO, что даёт прирост в скорости до 3,7 раза для PyTorch. Для ускорения классического ML (классификации) XGboost дащий прирост до 15 раз. Пока нам достаточно маломощного CPU.
Другим типом специализированных процессором является перепрограммируемый процессор. Так в 2018 году Intel представила процессор со встроенным FPGA (field-programmable gate array) модулем, разработанной купленной компанией Altera, в своём Intel Xeon SP-6138P. Другим крупным производителем FPGA является Xilinx, создавшую Altera. Идея программируемых логических блоков (программируемые пользователем вентильные матрицы) не нова и появилась задолго до универсальных процессоров. Смысл заключается не в выполнении программы на универсальном процессоре, который кажды раз выполняет алгоритм для решения поставленной задачи, а в создании логической архитектуры процессора под эту задачу, что существенно быстрее. Для того, чтобы каждый раз не заказывает на производстве разработку и производство индивидуальной микросхемы, используются универсальные платы, в которых программным способом создаётся нужная архитектура. Во время своего создания ана стала заменой микросборок, когда на производстве вручную работники расставляли в чип его элементы. Архатектура достигается разрушением ненужных связей во время "прошивания", которые построены по принципу сетки, в узлах которых располагаются необходимые элементы. Популярным примером является Static RAM, которая используется в BIOS компьютера, прототипирование ASIC перед началом массового их производства или созадния нужного контроллера, например создание в "домашних" условиях контроллера Enthernet. Для программирования архитектру контроллера с нейронной сетью предоставляются FPGA контроллеры теми же Intel и Xilinx по фреймворками Caffe и TensorFlow. Поэкспериментировать можно в облаке Amazon. Перспективным направлением является использование нейронных сетей edge computing, то есть на конечных устройствах, таких как модули беспилотных автомобилей, роботов, датчиков и видеокамерах.
Другим вариантом вычисления является использование облачных специализированных сервисов (ML as Service). Пример, эти сервисы представила большая тройка облачных провайдеров: Microsoft Azure Machine Learcning (Azure ML), AWS Machine Learning и Google Cloud Datalab в 2015 году. Azure ML предлагает визуальный конструктор для создания из блоков и связей нейронных сетей, и исходя из заявления о стратегии по демократизации входа (понижении порога входа) в сферу будет двигаться в этой направлении. Google представляет подход, предлагая среду для запуска у себя в облаке, так и локально в Docker как NoteBook. Интерфейс максимально близок к Colab и Jupyter, и умеет работать с Jupyter Notebook.
Аmazone представляет набор сервисов на трёх уровнях, начиная от IaaS (сервера с графическими процессорами AWS EC2 P3, выводы Elastic Interface, сервера с центральными процессорами EC2 C5, EC2 F1, EDGE AWS Greengrass), через PaaS уровень (Amazone SageMaker позволяет выбрать фреймворк и тому подобное для того, чтобы сосредоточится на разработке) и SaaS (AWS AI предоствляет заранее подготовленные сети для частых случаев использования по мнению Amazon, таких как Amazon Rekognition – узнавание пользователя по фото, Amazon Textract – извлечение текстовых и табличных данных из сканов документов, Amazon Transcribe – распознавание речи, Amazon Translate – перевод текстов, Amazon Polly – озвучивание текста, Amazon Comprehend – анализ текта и извлечение смысла из него, Lex – поддерживание диалога, Amazon Personalize – создание рекомендаций, Amazon Forecast – прогнозирование).