Небольшое руководство о том, как настроить новую небольшую и экономичную платформу прототипирования перед началом любого проекта машинного обучения с использованием 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 для управления развертываниями. Руководство по установке можно найти здесь.
Установка Кубефлоу
Сначала настройте следующие переменные среды для последующего использования:
- Установите идентификатор проекта 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:
- Создайте учетные данные пользователя. Вам нужно запустить эту команду только один раз:
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.gztar -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, прежде чем создавать какие-либо модели. Мы также изучим глубокое обучение и встраивания, чтобы еще больше повысить точность, следите за обновлениями.