Машинное обучение постоянно развивается, поскольку асимметрия информации уменьшается, а сложные модели и алгоритмы становятся проще в реализации и использовании. Библиотеки Python, такие как scikit-learn, требуют всего нескольких строк кода (исключая предварительную обработку), чтобы соответствовать и делать прогнозы с использованием сложных высокоуровневых методов ансамблевого обучения, таких как Random Forrest. Возникает вопрос, что дает вам преимущество?

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

Следовательно, рост операций машинного обучения (MLOps). Цель этого - облегчить сложные конвейеры и процессы машинного обучения. MLOps - это совершенно новая область, правила и процессы которой создаются каждый день. Я добавлю ссылку на пару статей ниже, где вы сможете больше узнать о MLOps. В этой статье я возьму небольшой пример рабочего процесса машинного обучения и покажу, как мы можем эффективно развернуть его в кластере Kubernetes. Я буду использовать следующее:

  • Кластер Kubernetes (minikube тоже будет работать)
  • Арго
  • AWS S3
  • Докер

Обратите внимание, что эти установки и настройки являются предварительными условиями для этой статьи.

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

1. Код Python

Он будет разделен на 3 сценария, первый сценарий будет обрабатывать данные, а второй и третий сценарии будут обучать модели.

Примечание. Данные должны быть где-то размещены, чтобы контейнер мог получить к ним доступ.

Файл 1: сценарий предварительной обработки

import pandas as pd
from sklearn.model_selection import train_test_split
#any data i have hosted this 
df = pd.read_csv('http://localhost:8000/data/sales.csv')
#for this small example, I will just remove a column as data preproc
df.drop('size', inplace=True)
x = df.drop('sales', axis=1)
y = df['sales']
x_train, x_test, y_train, y_test = train_test_split(df, test_size=0.3)
df.to_csv('x_train.csv')
df.to_csv('x_test.csv')
df.to_csv('y_train.csv')
df.to_csv('y_test.csv')

Файл 2: случайная регрессия Форреста

import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
# reading the preproc data
x_train = pd.read_csv('x_train.csv')
x_test = pd.read_csv('x_test.csv')  
y_train = pd.read_csv('y_train.csv') 
y_test = pd.read_csv('y_test.csv')
# Instantiate model with 1000 decision trees
rf = RandomForestRegressor(n_estimators = 1000, random_state = 42)
# Train the model on training data
rf.fit(x_train, y_train)
# Use the forest's predict method on the test data
predictions = rf.predict(x_test)
# Calculate the MSE
mse = mean_squared_error(y_test, predictions)
# Print out the mean absolute error (mse)
print('Mean Absolute Error:', mse)

Файл 3: Регрессия лассо

from sklearn.linear_model import LassoCV
import pandas as pd
# reading the preproc data
x_train = pd.read_csv('x_train.csv')
x_test = pd.read_csv('x_test.csv')  
y_train = pd.read_csv('y_train.csv') 
y_test = pd.read_csv('y_test.csv')
# initialising and fitting the model
model = LassoCV()
model.fit(x_train, y_train)
# Use the forest's predict method on the test data
predictions = model.predict(x_test)
# Calculate MSE
mse = mean_squared_error(y_test, predictions)
# Print out the mean absolute error (mse)
print('Mean Absolute Error:', mse)

2. Создание изображений

Когда у нас будет готов код, мы можем создать изображения и отправить их в Docker Hub (или любой другой репозиторий изображений). Простой файл докеров может сделать

FROM python3.6
RUN mkdir codes
COPY . codes/
RUN pip3 install -r codes/requirements.txt

Создание и продвижение изображения

docker image build -t ml_pipeline .
docker image push ml_pipline

3. Определение трубопровода мл с помощью Argo.

Вы можете найти краткое руководство по установке и настройке Argo в вашем кластере Kubernetes, используя эту ссылку ниже:



Также не забудьте создать репозиторий артефактов. Я использую AWS S3, но есть много других вариантов:



Арго

Argo предоставляет нам надежный движок рабочего процесса, который позволяет нам реализовывать каждый шаг рабочего процесса как контейнер в Kubernetes. Argo использует файлы YML для определения и записи конвейеров. Однако есть более популярная альтернатива Argo, которая называется Kubeflow. Kubeflow использует движок Argo и предоставляет API Python для определения конвейеров. В этом посте я буду использовать Argo, но в будущем сделаю небольшое руководство по Kubeflow.

Давайте начнем строить наш конвейер, я назову его pipline.yml.

# Our pipeline
# We will make a DAG. That will allow us to do pre proc first 
# and then train models in parallel.
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: ml-pipeline-
spec:
  entrypoint: ml-pipeline
  templates:
  
  # definning the pipeline flow
  - name: ml-pipeline
    dag:
        tasks:
          - name: preprocessing
            template: preproc
          - name: training-rf
            dependencies: [preprocessing]
            template: randomforrest
            arguments:
              artifacts:
              - name: x_train
                from: tasks.preprocessing.outputs.artifacts.x_train
              - name: x_test
                from: tasks.preprocessing.outputs.artifacts.x_test
              - name: y_train
                from: tasks.preprocessing.outputs.artifacts.y_train
              - name: y_test
                from: tasks.preprocessing.outputs.artifacts.y_test                                                
          
          - name: training-lasso
            dependencies: [preprocessing]
            template: lasso
            arguments:
              artifacts:
              - name: x_train
                from: tasks.preprocessing.outputs.artifacts.x_train
              - name: x_test
                from: tasks.preprocessing.outputs.artifacts.x_test
              - name: y_train
                from: tasks.preprocessing.outputs.artifacts.y_train
              - name: y_test
                from: tasks.preprocessing.outputs.artifacts.y_test
# defining the individual steps of our pipeline
    - name: preproc
      container: 
        image: docker.io/manikmal/ml_pipline
        command: [sh, -c]
        args: ["python3 codes/preproc.py"]
      outputs:
        artifacts:
        - name: x_train
          path: x_train.csv
        - name: x_test
          path: x_test.csv
        - name: y_train
          path: y_train.csv
        - name: y_test
          path: y_test.csv
- name: randomforrest
      inputs: 
        artifacts:
        - name: x_train
          path: x_train.csv
        - name: x_test
          path: x_test.csv
        - name: y_train
          path: y_train.csv
        - name: y_test
          path: y_test.csv
      container:
        image: docker.io/manikmal/ml_pipline
        command: [sh, -c]
        args: ["python3 codes/rf.py"]
- name: lasso
      inputs: 
        artifacts:
        - name: x_train
          path: x_train.csv
        - name: x_test
          path: x_test.csv
        - name: y_train
          path: y_train.csv
        - name: y_test
          path: y_test.csv
      container:
        image: docker.io/manikmal/ml_pipline
        command: [sh, -c]
        args: ["python3 codes/lasso.py"]

Это большой файл! Это одна из причин, почему специалисты по данным предпочитают использовать Kubeflow для определения и запуска ML-конвейеров в Kubernetes. Я оставлю свою репо-ссылку для кода, поэтому не беспокойтесь о ее копировании отсюда. Вкратце, приведенный выше файл YML объявляет наш рабочий процесс, определяя порядок необходимых задач, а затем определяя каждую задачу отдельно.

4. Развертывание нашего конвейера машинного обучения в кластере Kubernetes.

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

argo submit pipeline.yml --watch

Функция наблюдения запустит конвейер в действии. После завершения мы можем просто использовать

argo logs <name of the workflow>

И вы получите свой результат!

Мы видим, что мы смогли успешно развернуть рабочий процесс машинного обучения и принести много времени и ресурсов, параллельно выполняя процесс обучения различных моделей. Эти конвейеры позволяют выполнять множество сложных рабочих процессов, и это очень простой пример возможностей. Следовательно, растет потребность в методах MLOps, которые дадут вам преимущество.

Как и обещал, ссылка для изучения MlOps:





Репозиторий Git Hub для этого проекта:



Спасибо!