Машинное обучение постоянно развивается, поскольку асимметрия информации уменьшается, а сложные модели и алгоритмы становятся проще в реализации и использовании. Библиотеки 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 для этого проекта:
Спасибо!