Введение в нейронный сетевой интеллект

В рамках своей магистерской работы во Фраунгофера я работаю с несколькими фреймворками AutoML. Уже есть несколько статей о последних фреймворках, но ничего не говорится о NNI (N etwork I ntelligence) от Microsoft. Поскольку я считаю этот инструмент полезным и использую его в своей повседневной работе, я дам базовое введение в NNI. В этой статье я сосредоточусь на оптимизации гиперпараметров - очень актуальной теме для многих разработчиков и новичков. Мы можем быстро и легко проектировать, обучать и оценивать нейронные сети благодаря таким библиотекам, как Tensorflow или Keras. Несмотря на простоту этой технологической цепочки, остается один из ключевых вопросов:

Какие гиперпараметры следует выбрать для максимальной производительности модели?

Даже такие компании, как Waymo или DeepMind подвергаются оптимизации гиперпараметров и разрабатывают современные алгоритмы. Поиск оптимальных гиперпараметров - утомительный процесс, требующий много времени и вычислительных мощностей. AutoML - Automated Machine Learning - это область исследований автоматизированного машинного обучения, включающая автоматизированные методы. Помимо проприетарных фреймворков AutoML, таких как Google Cloud AutoML или Amazon SageMaker, доступны решения с открытым исходным кодом, такие как NNI на Github. NNI разработан Microsoft и предлагает алгоритмы (Grid Search, Random Search, Evolution, Hyperband, BOHB, TPE, ENAS и др.) Для поиска нейронной архитектуры (NAS) и оптимизации гиперпараметров ( HPO). Мы ориентируемся на HPO. Основным преимуществом NNI перед другими текущими структурами AutoML является то, что он поддерживает несколько современных алгоритмов и что нам нужно изменять существующий код Python только минимально. В целях простоты в этой статье не рассматриваются детали различных алгоритмов поиска.

В MacOS, Windows и Linux NNI можно установить, в идеале через виртуальную среду. Инструмент (мы устанавливаем версию для разработчиков на Ubuntu) доступен для загрузки со страницы Github и может быть установлен согласно следующей инструкции:

git clone https://github.com/Microsoft/nni.git
python3.6 -m venv venv_nni_dev
source venv_nni_dev/bin/activate
cd nni
pip install tensorflow-gpu
pip install keras
make install-dependencies
make build
make dev-install
cd ..

NNI можно контролировать через консоль и контролировать через веб-интерфейс. Вы можете запустить NNI локально или удаленно. В локальном режиме выполнение выполняется на текущем ПК, тогда как в удаленном режиме выполнение обычно выполняется на сервере с быстрыми графическими процессорами. Поддерживаются следующие фреймворки: Pytorch, Keras, Tensorflow, MXNet, Caffe2, Theano и другие. Требуются три файла:

  • Файл Python для нейронной сети
  • Файл пространства поиска
  • Файл конфигурации

Нейронная сеть определяется в файле Python. Этот файл позже вызывается инструментом NNI с различными параметрами из нашего пространства поиска. Следовательно, файл Python получает доступ к переданным параметрам и использует их соответствующим образом. Одна функция содержит нейронную сеть, другие функции отвечают за подготовку данных. Конфигурации для выполнения теста хранятся в файле конфигурации. Например:

  • Платформа обучения (локальная или удаленная)
  • Тюнер (алгоритм поиска)
  • Параметры алгоритма поиска
  • Путь к файлу Python
  • Путь к файлу пространства поиска
  • Максимальное количество всех попыток
  • Максимальное время исполнения
  • CPU или GPU

В этой статье я рассмотрю простейший пример - MNIST с Keras. В этом примере для области поиска указаны отдельные значения. На этой странице представлена ​​дополнительная информация. Например, с помощью алгоритмов можно искать целые домены значений. Пространство поиска определено ниже (nni / examples / trials / mnist-keras / search_space.json):

{
 “optimizer”:{“_type”:”choice”,”_value”:[“Adam”, “SGD”]},
 “learning_rate”:{“_type”:”choice”,”_value”:[0.0001, 0.001, 0.002,   0.005, 0.01]}
}

В этом сценарии одновременно выполняется ровно одно испытание. Эксперимент завершается после 10 попыток или 1 часа выполнения. В качестве алгоритма поиска выбран TPE. Испытания выполняются на локальном компьютере с центральным процессором. Кроме того, указываются файл пространства поиска и файл Python с нейронной сетью. В зависимости от алгоритма поиска требуются дополнительные параметры, с которыми вы можете ознакомиться на этой странице. В приведенном ниже коде показан файл конфигурации (nni / examples / trials / mnist-keras / config.yml):

authorName: default
experimentName: example_mnist-keras
trialConcurrency: 1
maxExecDuration: 1h
maxTrialNum: 10
#choice: local, remote, pai
trainingServicePlatform: local
searchSpacePath: search_space.json
#choice: true, false
useAnnotation: false
tuner:
 #choice: TPE, Random, Anneal, Evolution, BatchTuner, MetisTuner
 #SMAC (SMAC should be installed through nnictl)
 builtinTunerName: TPE
 classArgs:
 #choice: maximize, minimize
 optimize_mode: maximize
trial:
 command: python3 mnist-keras.py
 codeDir: .
 gpuNum: 0

Заполнители параметров поиска используются для нейронной сети следующим образом (nni / examples / trials / mnist-keras / minst-keras.py):

Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape),
Conv2D(64, (3, 3), activation='relu'),
if hyper_params['optimizer'] == 'Adam':
    optimizer =    keras.optimizers.Adam(lr=hyper_params['learning_rate'])

После выполнения вышеуказанных пунктов эксперимент начинается с

nnictl create --config nni/examples/trials/mnist-keras/config.yml

NNI по умолчанию выбирает порт 8080. Если он уже занят, можно указать альтернативный порт с помощью

--port=<port>

NNI должен отобразить следующее сообщение:

Процесс поиска можно легко отслеживать и контролировать через веб-интерфейс по указанной ссылке. Веб-интерфейс состоит из двух страниц. На стартовой странице указана вся важная информация об эксперименте (время начала, количество попыток, ход выполнения, файл конфигурации и т. Д.). Во второй вкладке дается подробный обзор. Здесь, например, отображаются все эксперименты с их настройкой и достигнутыми показателями. Выполненные испытания перечислены в табличной форме и могут быть экспортированы в виде файлов JSON (Просмотр - ›Параметры эксперимента). Вы можете отсортировать испытания по метрике, времени выполнения или статусу. Под

nni/experiments/<experiment_id>/trials/

NNI создает папку с файлами журнала для каждой попытки эксперимента. Снимок экрана во время эксперимента показан ниже:

NNI все еще находится в разработке, поэтому я рекомендую версию для разработчиков со страницы Github. Подробную документацию с множеством примеров можно найти на официальной странице Github. Я очень надеюсь, что эта статья помогла вам разобраться в структуре NNI. В следующих статьях я расскажу о других возможностях NNI.

Спасибо за чтение.

Еще полезные ссылки на NNI на Github: