В наши дни многие проекты ML и MLOps строятся в области OSS. Kedro и gradio являются частью проекта MLOps. Эти проекты не только упрощают создание моделей машинного обучения, они делают их воспроизводимыми и упрощают проверку концепции.
Сегодня я создаю проект, используя оба из них. В этом посте я хочу показать процесс создания пайплайнов для построения модели машинного обучения с помощью Kedro и Tensorflow. И после этого поработайте с градиентом, чтобы убедиться, что обученная модель работает с реальными данными.

Кстати, что такое Кедро?

Если вы не были знакомы с Кедро, посмотрите введение здесь. На странице написано так.

Kedro — это платформа Python с открытым исходным кодом для создания воспроизводимого, поддерживаемого и модульного кода для обработки данных. Он заимствует концепции из разработки программного обеспечения и применяет их к коду машинного обучения; прикладные концепции включают модульность, разделение задач и управление версиями.

Kedro помогает разработчикам создавать модели машинного обучения, создавая конвейеры предварительной обработки данных и моделирования. А запись процесса и шагов по пайплайнам обеспечит воспроизводимость и ремонтопригодность.

И QuantumBlack, который является организатором этого проекта, написал пост о концепции, так что вы обязательно должны его проверить!



Создайте модель Tensorflow с помощью Kedro

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

Настройка проекта

Я назвал этот проект kedro_gradio, потому что он объединяет их. Я создал каталог и перешел в него.

$ mkdir kedro_gradio
$ cd kedro_gradio
$ git init

Я использовал pipenv и python 3.8 для этого проекта, так что давайте инициализируем его. И после этого устанавливаю основные пакеты kedro и gradio.

$ pipenv --python 3.8
$ pipenv install kedro kedro-viz gradio
# or if you want to install specific version, execute command below
# pipenv install kedro==0.18.1 kedro-viz==4.6.0 gradio==3.0.12

kedro-viz используется для визуализации конвейера Kedro, чтобы подтвердить, что конвейеры реализованы так, как задумано разработчиками.
После успешного завершения установки давайте перейдем в виртуальную среду Python и подтвердим, что Kedro будет работать.

$ pipenv shell
$ kedro info
2022-06-11 12:07:32,809 - kedro.framework.cli.hooks.manager - INFO - Registered CLI hooks from 1 installed plugin(s): kedro-telemetry-0.2.1
_            _
| | _____  __| |_ __ ___
| |/ / _ \/ _` | '__/ _ \
|   <  __/ (_| | | | (_) |
|_|\_\___|\__,_|_|  \___/
v0.18.1
Kedro is a Python framework for
creating reproducible, maintainable
and modular data science code.
Installed plugins:
kedro_telemetry: 0.2.1 (entry points:cli_hooks)
kedro_viz: 4.6.0 (entry points:global,line_magic)

В Kedro есть функция создания нового четко определенного проекта. Итак, давайте создадим с ним новый проект и назовем проект, репозиторий и так далее. В этом проекте я назвал его «Кедро Градио».

$ kedro new
# You will be asked the project name and repository name, package name, basically after you input the project name, repository and package name create automatically from project name.
project_name: Kedro Gradio
repository_name: kedro-gradio
package_name: kedro_gradio

Прежде чем устанавливать необходимые библиотеки для Kedro, давайте добавим дополнительные библиотеки в src/requirements.txt. Конечно, если вы используете другие библиотеки, такие как pytorch, добавьте их.

# Add below to src/requirements.txt
tensorflow==2.9.1
kedro[tensorflow]==0.18.1
$ pip install -r src/requirements.txt

Стройте трубопроводы и бегите!

А теперь приступим к самому интересному!
Не только в Kedro, но и в большинстве проектов машинного обучения есть процесс подготовки данных и процесс изучения модели. В Kedro каждый процесс определяется как конвейер, поэтому давайте создадим их.

$ kedro pipeline create data_processing
$ kedro pipeline create data_science
# After executing the above commands, under the src directory would like to be below.
src
├── kedro_gradio
│  ├── __init__.py
│  ├── __main__.py
│  ├── pipeline_registry.py
│  ├── pipelines
│  │  ├── __init__.py
│  │  ├── data_processing
│  │  │  ├── __init__.py
│  │  │  ├── nodes.py
│  │  │  ├── pipeline.py
│  │  │  └── README.md
│  │  └── data_science
│  │     ├── __init__.py
│  │     ├── nodes.py
│  │     ├── pipeline.py
│  │     └── README.md
│  └── settings.py
├── requirements.txt
└── setup.py

В Kedro небольшие шаги, такие как нормализация значений, определены в nodes.py.
В процессе обработки данных я реализовал загрузку набора данных MNIST и шаг предварительной обработки, который изменит форму и нормализует.
На первом этапе я реализую простую плотную модель. Итак, я просто преобразую данные изображения (28, 28) в (1, 784).



После определения шагов каждый шаг организован как конвейер. Вы заметите, что, объединяя их в конвейер, всегда соблюдается порядок зависимостей и обеспечивается параллельное выполнение там, где возможно параллельное выполнение, и это большая часть использования Kedro!



Обычно этап нормализации данных проверки и тестирования следует выполнять после нормализации обучающих данных, поскольку масштабирование зависит от обучающих данных. Но в этом случае каждый пиксель просто нормализуется в диапазоне от 0 до 1, поэтому можно выполнять параллельную обработку.

Некоторые читатели могут сказать: «Вы говорите, что это просто нормализовано, тогда почему бы вам не разделить данные после их нормализации?» Что ж, в одном аспекте это, безусловно, правда. Однако этот метод нормализации не всегда верен, и после долгих экспериментов можно найти лучший метод нормализации. В этом случае я подумал, что будет лучше оставить шаг нормализации после разделения набора данных на случай, если нам понадобится обновить конвейер позже.

Затем я определил функции в data_science/nodes.py для построения, обучения и оценки модели и организовал их так же, как и data_processing.





И объедините эти конвейеры в один конвейер pipeline_registry.py.



Если вы хотите подтвердить конвейер, используйте команду kedro viz. Вы можете увидеть следующее изображение в своем браузере.

Чтобы запустить весь процесс, выполните следующую команду.

$ kedro run
# if you want to run parallely, execute following command.
# kedro run --runner=ParallelRunner

В этом проекте я сохранил обученную модель в формате h5. Для этого я просто определил путь к файлу в conf/base/catalog.yml, и после обученного процесса Кедро сохранил обученную модель определенным образом. А также он может контролироваться версиями, поэтому, если вы настроите модель, она не перезапишет модель и не сравнит их легко. Для этого не забудьте установить свойство versioned следующим образом.

trained_model:
  type: tensorflow.TensorFlowModelDataset
  filepath: data/06_models/dnn.h5
  versioned: true  # Set as true

Запуск модели с градиентом

Как я писал выше в этом посте, я собираюсь использовать функцию «блокнот», чтобы убедиться, что она четко распознает мою рукописную цифру.

Кстати, что такое градиент?

Если вы не знакомы с gradio, загляните на официальную страницу здесь. У Gradio есть удобная страница, на которой есть страница быстрого старта и несколько интересных примеров.

Как запустить приложение?

Я создал файл gradio_app.py и определил несколько методов.



Большая часть соединения gradio и Kedro заключается в том, что вы можете импортировать процесс нормализации в скрипт gradio, чтобы входные данные были нормализованы с помощью той же функции, которая используется на этапе предварительной обработки.

После подготовки скрипта gradio выполните следующую команду и откройте URL-адрес, который отображается в консоли, в моем случае это было так, как показано ниже.

$ python gradio_app.py
Running on local URL:  http://127.0.0.1:7860/

Вы увидите такой экран.

Теперь все, что нам нужно сделать, это играть!

Я отправил весь код на Github, так что проверьте, пожалуйста!