Небольшое руководство о том, как настроить новую небольшую и экономичную платформу прототипирования перед началом любого проекта машинного обучения с использованием Kubernetes и Kubeflow на Google Cloud Platform.

Автор Радване Чебане

Что такое платформа машинного обучения

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

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

А вот и Kubeflow, облачная платформа для машинного обучения. Kubeflow является облачным, он работает поверх Kubenetes, самой популярной платформы контейнеров.

Начало работы с Kubeflow

Требования: кластер Kubernetes

Для того, чтобы установить Kubeflow, вам нужен готовый кластер Kubernetes. Хотя установка Kubernetes выходит за рамки этой статьи, вы можете создать локальный мини-кластер Kubernetes с помощью инструмента Minikube. Я бы предпочел использовать кластер Kubernetes на Google Cloud Platform, так как у меня все еще есть кредит в 300 долларов на GCP. Чтобы начать работу с Google Kubernetes Engine (GKE), вы можете выполнить следующие шаги здесь. В этом руководстве я буду приводить только шаги, необходимые для работы на GCP, но они должны быть такими же и для локального Minikube.

Вам также потребуется установить Kustomize, необходимый Kubeflow для управления развертываниями. Руководство по установке можно найти здесь.

Установка Кубефлоу

Сначала настройте следующие переменные среды для последующего использования:

  1. Установите идентификатор проекта GCP (пропустите, если используете Minikube). В приведенной ниже команде замените <YOUR-PROJECT-ID> на ваш ID проекта:
export PROJECT=<YOUR-PROJECT-ID>
gcloud config set project ${PROJECT}

2. Установите зону для конфигурации GCP (пропустите, если используете Minikube). Выберите зону, которая предлагает необходимые вам ресурсы. См. руководство по Регионам и зонам GCP.

  • Убедитесь, что у вас достаточно региональных ресурсов Compute Engine. По умолчанию для настройки кластера GKE, описанной в этом руководстве, требуется 16 ЦП.
  • Если вам нужен GPU, убедитесь, что ваша зона предлагает GPU.

Например, следующие команды устанавливают зону us-central1-c:

export ZONE=us-central1-c
gcloud config set compute/zone ${ZONE}

3. Задайте для переменной среды DEPLOYMENT_NAME значение kubeflow:

export DEPLOYMENT_NAME=kubeflow

4. Создайте клиент OAuth для Cloud IAP на GCP.

Выполните следующие шаги, чтобы создать клиент OAuth, который понадобится позже при развертывании Kubeflow: https://www.kubeflow.org/docs/gke/deploy/oauth-setup/

и создайте переменные среды из идентификатора клиента OAuth и секрета, которые вы получили ранее:

export CLIENT_ID=<CLIENT_ID from OAuth page>
export CLIENT_SECRET=<CLIENT_SECRET from OAuth page>

Развернуть Kubeflow

Выполните следующие действия, чтобы развернуть Kubeflow:

  1. Создайте учетные данные пользователя. Вам нужно запустить эту команду только один раз:
gcloud auth application-default login

2. Загрузите и распакуйте клиент Kubeflow kfctl со страницы релизов Kubeflow, мы будем использовать версию Kubeflow 0.6.1. Вы также можете добавить kfctl в PATH для более удобного использования.

export PLATFORM=darwin # use 'dawrwin' for mac otherwise linux or windows  
wget https://github.com/kubeflow/kubeflow/releases/download/v0.6.1/kfctl_v0.6.1_$PLATFORM.tar.gz
tar -xvf kfctl_v0.6.1_$PLATFORM.tar.gz 
# Optionnal: Add kfctl to PATH
sudo cp kfctl /usr/bin
sudo chmod a+x /usr/bin/kfctl

3. Создайте кластер Kubeflow

# KFAPP the name of a directory where you want Kubeflow configurations to be stored.
export KFAPP=kubeflow-cluster
kfctl init ${KFAPP} --platform gcp --project ${PROJECT}
cd ${KFAPP}
kfctl generate all -V --zone ${ZONE}
kfctl apply all -V

4. Проверьте ресурсы, развернутые в пространстве имен kubeflow:

kubectl -n kubeflow get  all

Вы также можете посетить пользовательский интерфейс Kubeflow по адресу:

https://kubeflow-cluster.endpoints.<project>.cloud.goog/

Создайте корзину облачного хранилища

Следующим шагом будет создание корзины облачного хранилища для ваших моделей и артефактов. Их необходимо хранить в глобально доступной системе хранения, поэтому облачное хранилище — хороший выбор. Следующая команда создаст корзину в регионе us-central1:

export REGION=us-central1
export BUCKET_NAME=${PROJECT}-${KFAPP}-bucket
gsutil mb -c regional -l ${REGION} gs://${BUCKET_NAME}

Настройте свои ноутбуки

Интеграция Jupyter Notebooks в Kubeflow дает множество преимуществ для корпоративных сред. Эти преимущества включают в себя:

  • Хорошая интеграция с остальной инфраструктурой в отношении аутентификации, контроля доступа и доступа к ресурсам (графические процессоры и т. д.).
  • Включение более удобного совместного использования блокнотов в организации.

Чтобы создать блокнот, сначала создайте Notebook Server из пользовательского интерфейса Kubeflow. Нажмите «+ НОВЫЙ СЕРВЕР», дайте ему имя, выберите нужный ресурс и нажмите «ЗАПУСТИТЬ».

Когда он будет готов, вы можете нажать «Подключиться», чтобы начать использовать Jupyter.

Простой вариант использования: вызов POSOS

Задача POSOS — это академическая задача классификации текстов, разработанная POSOS, французским стартапом, создающим платформу для ответов на вопросы, связанные с лекарствами.

Задача состоит в том, чтобы найти лучшую категорию медицинских вопросов (текст) среди 50 предоставленных категорий.

Данные о тренировках и тестах можно загрузить с веб-сайта ENS: https://challengedata.ens.fr/participants/challenges/17/

Загрузите данные в рабочий каталог вашего сервера Jupyter. Начнем с чтения данных:

xtrain_df = pd.read_csv(“input_train.csv”, sep=”;”)
ytrain_df = pd.read_csv(“output_train.csv”, sep=”;”)
xtest_df = pd.read_csv(“input_test.csv”, sep=”;”)
display(xtrain_df.shape, ytrain_df.shape, xtest_df.shape)

На самом деле, у нас 8028 помеченных вопросов, и нам нужно вывести метки для 2035 вопросов. Загрузили данные унции, давайте построим поезд и проверочный набор:

train_columns = “question”
label_column = “intention”
X_train, X_valid, y_train, y_valid = train_test_split(xtrain_df[train_columns], ytrain_df[label_column], test_size=0.2, random_state=1234)

Для целей этого руководства мы создадим быструю модель, чтобы иметь возможность протестировать платформу Kubeflow. Давайте преобразуем текстовые переменные в числовой вектор с помощью TF-IDF, затем применим наивную байесовскую оценку для классификации вопросов. Мы сгруппируем все эти операции в конвейер scikit-learn:

text_clf = Pipeline([
     ('vect', CountVectorizer()),
     ('tfidf', TfidfTransformer()),
     ('clf', MultinomialNB()),
 ])
text_clf.fit(X_train, y_train)
y_prediction = text_clf.predict(X_valid)
np.mean(y_prediction == y_valid.values)
// 0.3026151930261519

Отлично, это дает уже среднюю точность в 30%.

Давайте попробуем классификатор SVM вместо наивного байесовского:

text_clf = Pipeline([
     ('vect', CountVectorizer()),
     ('tfidf', TfidfTransformer()),
     ('clf', SGDClassifier(loss='hinge', penalty='l2',
                           alpha=1e-3, random_state=1234,
                           max_iter=5, tol=None)),
 ])
text_clf.fit(X_train, y_train)
y_prediction = text_clf.predict(X_valid)
np.mean(y_prediction == y_valid.values)
// 0.6301369863013698

Ничего себе, это дает уже 63% точности. Давайте представим платформу вызова:

y_test = text_clf.predict(xtest_df[train_columns])
y_test_df = xtest_df[["ID"]]
y_test_df["intention"] = y_test
y_test_df.to_csv("posos_svm.csv", index=False)

Эта модель набрала 61,1% в тестовом наборе, что поставило нас на 40-е место из 47. Вы должны быть удивлены, как такая старомодная и простая модель может дать такой приличный результат.

Сохраним модель для последующего использования

dump(clf, 'posos-classifier')

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