Руководства по Google ML

Обучение модели на платформе искусственного интеллекта Google

Как обучить модель на Python с помощью сервисов Google Cloud

Добро пожаловать в первую статью из этой серии о том, как выполнять машинное обучение на платформе Google Cloud Platform!

Посмотрим на AI Platform. Это подмножество инструментов, строго связанных с машинным обучением, среди которых:

  • Обучение платформе AI, для обучения / настройки моделей в облаке.
  • Прогнозирование платформы AI для размещения обученных моделей в облаке.
  • AI Pipelines, чтобы создать пошаговый процесс с использованием Kubernetes и образов Docker.

и многие другие.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ. Я никоим образом не связан с Google. Я просто решил
написать эти статьи, чтобы поделиться знаниями, которые я приобрел с помощью этих инструментов в своей
повседневной работе.

В этой первой статье я сосредоточусь на Обучение платформе AI, продукте для выполнения
учебных заданий в облаке с настраиваемым кодом и настраиваемыми машинами. Я думаю, что основные преимущества использования платформы AI для обучения ваших моделей:

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

В этом руководстве мы напишем реальное приложение Python с определением обучения, запустим локальный тест и выполним задание обучения на Облачная платформа.

Для учебника вам понадобится

Шаг 1. Сохраните данные в Google Storage

После того, как вы скачали набор данных на свой локальный компьютер, перейдите в Консоль Google Storage вашего проекта GCP. Создайте новый сегмент (я назвал его bank-marketing-model) и загрузите в него набор данных. Теперь ваше ведро должно выглядеть так:

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

gsutil mb gs://bank-marketing-model
gsutil cp ./bank-additional-full.csv gs://bank-marketing-model
  • gsutil mb создает ведро
  • gsutil cp копирует файл с локального пути в корзину GCS

Шаг 2: напишите приложение для обучения Python

Если вы читаете это, скорее всего, вы уже знаете, как написать сквозную программу Python для обучения модели машинного обучения. В любом случае, поскольку мы планируем обучать модель в облаке, есть несколько шагов, которые чем-то отличаются от обычного Kaggle-ish кода.

Первое, что нужно иметь в виду, вы можете использовать только scikit-learn, XGBoost или
Tensorflow
для обучения своей модели (Pytorch находится в стадии бета-тестирования, и есть способ использовать собственный Python среды, но мы увидим это в другой статье).

Итак, основы приложения Python:

  • скачать набор данных из хранилища
subprocess.call([
    'gsutil', 'cp',
    # Storage path
    os.path.join('gs://', STORAGE_BUCKET, DATA_PATH),
    # Local path
    os.path.join(LOCAL_PATH, 'dataset.csv')
])
df = pd.read_csv(os.path.join(LOCAL_PATH, 'dataset.csv'), sep=';')
  • выполнить некоторую подготовку данных (разделенный тест на поезд, отсутствие вменения,…) и создать конвейер
train, test = train_test_split(df, test_size=args.test_size,
                               random_state=42)
...
pipeline = Pipeline([
    # The ColumnTransformer divide the preprocessing process between
    # categorical and numerical data
    ('data_prep',
     ColumnTransformer([
        ('num_prep', StandardScaler(), num_features),
        ('cat_prep', OneHotEncoder(), cat_features)
     ])),
    # ML model
    ('model',
     RandomForestClassifier(
         random_state=42,
         n_jobs=args.n_jobs,
         n_estimators=args.n_estimators,
         max_depth=args.max_depth,
         max_features=args.max_features if args.max_features is not
                                              None else 'sqrt',
         min_samples_split=args.min_samples_split,
         class_weight='balanced',
         max_samples=args.max_samples
     ))
])
  • обучить модель
pipeline.fit(train, y_train)
  • получить некоторые показатели производительности
results = pd.DataFrame(
    {'accuracy': [accuracy_score(y_train, pred_train),
                  accuracy_score(y_test, pred_test)],
     'precision': [precision_score(y_train, pred_train, pos_label='yes'),
                   precision_score(y_test, pred_test, pos_label='yes')],
     'recall': [recall_score(y_train, pred_train, pos_label='yes'),
                recall_score(y_test, pred_test, pos_label='yes')],
     'f1': [f1_score(y_train, pred_train, pos_label='yes'),
            f1_score(y_test, pred_test, pos_label='yes')]},
    index=['train', 'test']
)
  • сохранить обученную модель и результаты в хранилище
subprocess.call([
    'gsutil', 'cp',
    # Local path of the model
    os.path.join(LOCAL_PATH, 'model.joblib'),
    os.path.join(args.storage_path, 'model.joblib')
])
subprocess.call([
    'gsutil', 'cp',
    # Local path of results
    os.path.join(LOCAL_PATH, 'results.csv'),
    os.path.join(args.storage_path, 'results.csv')
])

Вы можете найти весь код на Github.

Примечание: в верхней части кода есть несколько параметров, которые вы можете настроить.

Шаг 3: протестируйте код локально

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

Во-первых, чтобы обучить модель локально с помощью платформы AI, мы можем написать команду, которая «меняет» эту логику: gcloud ai-platform (с платформой AI) local (локально) train (обучать модель). Мы добавляем кучу параметров, некоторые из которых относятся к процессу обучения, другие определены в нашем пользовательском приложении Python.

После перехода в основной каталог с каталогом src полная команда выглядит следующим образом:

gcloud ai-platform local train \
    --module-name=src.train \
    --package-path=./src \
    -- \
    --storage-path=gs://bank-marketing-model/test \
    --n-estimators=25

Давайте посмотрим на параметры:

  • module-name - это имя модуля Python для запуска в форме directory.python_file
  • package-path - это путь к каталогу модуля
  • —- сообщает, что мы начали отправлять специальные параметры

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

Имейте в виду, что даже если это локальный тестовый запуск, он создаст все артефакты и сохранит их в вашем хранилище. Если все пройдет без ошибок, мы можем перейти к собственно обучению в облаке!

Шаг 4: тренируйтесь на платформе AI

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

Как было сказано ранее, код bash очень похож, но мы должны вызвать другую группу команд. Вместо local train мы используем jobs submit training:

gcloud ai-platform jobs submit training $JOB_NAME \
    --module-name=src.train \
    --package-path=./src \
    --staging-bucket=gs://bank-marketing-model \
    --region=$REGION \
    --scale-tier=CUSTOM \
    --master-machine-type=n1-standard-8 \
    --python-version=3.7 \
    --runtime-version=2.2 \
    -- \
    --storage-path=gs://bank-marketing-model/$JOB_NAME \
    --n-estimators=500 \
    --n-jobs=8

Еще раз взглянем на новые параметры:

  • module-name и package-path такие же, как и раньше
  • staging-bucket указывает на корзину Google Storage, в которой хранятся обучающие артефакты.
  • region - регион Google Cloud (здесь полный список). Поскольку машины, экземпляры которых создаются для этих заданий, расположены по всему миру, вы можете указать, где создавать экземпляры машины. Если вы не знаете, как установить этот параметр, просто установите ближайший регион от того места, где вы находитесь!
  • scale-tier укажите, какой тип тренажера использовать для обучения. Это параметр высокого уровня
    , вы можете установить для него конфигурацию по умолчанию (например, BASIC или STANDARD_1) или установить для него значение CUSTOM и использовать параметр master-machine-type для использования низкоуровневого определения машины. В нашем примере мы используем стандартный компьютер с 8 ядрами. Мы также можем указать highmem (для увеличения памяти) или highcpu (для большего количества виртуального процессора) вместо standard`. Полный список scale-tiers и доступных машин находится здесь.
  • Параметры python-version и runtime-version определяют основу пакетов, установленных на машине. Для каждой среды выполнения (здесь полный список) у нас есть одна или несколько версий Python, которые мы можем использовать, и список уже установленных пакетов Python.

БОНУСНЫЙ СОВЕТ: если вы хотите установить пакет, который недоступен в списке
среды выполнения, добавьте команду «pip» в верхней части приложения, например

subprocess.call ([«пункт», «установить», имя_пакета])

  • Для наших пользовательских параметров мы устанавливаем большее количество оценщиков и указываем, что нужно запускать 8 заданий параллельно.

N.B. $JOB_NAME в приведенном выше коде не является допустимым именем, но это ссылка на определенную ранее переменную bash. Очень важно каждый раз указывать
другое имя задания. Например, как вы видите в скрипте cloud_train
, мы можем указать

JOB_NAME=bank_marketing_$(date +%Y%m%d_%H%M%S)

поэтому суффикс будет меняться каждый раз в зависимости от дня и времени.

Если вы впервые используете этот инструмент, он, вероятно, попросит вас включить определенный Google API (например, ml.googleapis.com): примите, чтобы включить его, и продолжайте. Если все в порядке, команда должна вернуть что-то вроде этого

и в вашей консоли Google AI Platform Jobs вы должны увидеть запущенное новое задание.

Теперь вы можете контролировать работу по обучению двумя способами:

  • с предложенной командой gcloud ai-platform jobs stream-logs $JOB_NAME
  • нажав Просмотреть журналы на консоли заданий

Ура! Работа закончилась правильно. Давайте посмотрим на нашу корзину хранилища:

У нас есть объект model.joblib, файл results.csv с характеристиками модели и папка, автоматически созданная заданием для хранения приложения Python.

Давайте посмотрим на характеристики модели ... Мы можем скачать файл с результатами или ввести команду

gsutil cat gs://your-bucket/your/path/to/results.csv

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

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

  Measure    |  Train   |   Test   
 ------------|----------|---------- 
  Accuracy   |  81.53%  |  81.01%  
  Precision  |  37.00%  |  36.40%  
  Recall     |  91.42%  |  90.05%  
  F1         |  52.68%  |  51.85%

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

Спасибо за чтение, надеюсь, вы найдете это полезным!