Bacalhau — это быстрая, экономичная и безопасная платформа для обработки данных, которая позволяет оптимизировать существующие рабочие процессы без значительных изменений. С Bacalhau вы можете обрабатывать большие объемы данных, использовать возможности незанятых вычислений на периферии и обеспечивать очистку данных и меры безопасности. Bacalhau работает в сети открытых вычислительных ресурсов и поддерживает запуск произвольных контейнеров Docker и образов WebAssembly (wasm) в качестве задач, что делает его идеальным решением для обработки данных и крупномасштабных рабочих нагрузок обработки данных.

В этом руководстве мы рассмотрим этапы создания модели машинного обучения с использованием библиотеки scikit-learn. Напишем скрипт машинного обучения, создадим для него Docker-контейнер, сохраним обучающие данные в IPFS. Наконец, мы обучим модель на Bacalhau и загрузим полученную модель для дальнейшего использования. К концу этого руководства вы будете иметь полное представление о том, как использовать Bacalhau и IPFS для обучения моделей машинного обучения быстрым, экономичным и безопасным способом.

Этот учебник разделен на четыре раздела.

  1. Загрузка данных и их закрепление в IPFS.
  2. Создайте конвейер модели машинного обучения.
  3. Докеризация скрипта машинного обучения. Наконец, в
  4. Запустите Bacalhau на нашем скрипте машинного обучения.

Секция 1

Краткий обзор набора данных. Этот набор данных посвящен послеродовой депрессии у молодых матерей. Некоторые женщины могут испытывать послеродовую депрессию, тяжелую и длительную форму депрессии, которая может развиться после родов, что является не отражением их характера или силы, а просто осложнением родов. При своевременном лечении молодые матери могут справиться со своими симптомами и установить связь со своим ребенком.

Скачать набор данных Послеродовая депрессия

mkdir PostPartum && cd PostPartum

Переместите данные загрузки в каталог PostPartum.

Ресурс Bacalhau по теме Закрепление набора данных в IPFS.

Это довольно просто, я закреплю свой набор данных на Web3.Storage.

Раздел 2

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

touch postpartum.py

файл postpartum.py

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn import preprocessing
import pickle
import glob, os, sys


def main(input_dir, output_dir):
    data = glob.glob(f"{input_dir}/*csv")[0]

    print("Loading Dataset")
    df = pd.read_csv(data, date_parser="Timestamp")
    df["Timestamp"] = pd.to_datetime(df["Timestamp"])

    print("Preprocessing Dataset")
    new_df = preprocessing(df)
    X = new_df.drop("Feeling anxious", axis=1)
    print(X.shape)
    print(X.columns)

    y = new_df.loc[:, "Feeling anxious"]

    print("Training Model")
    rf = RandomForestClassifier()
    rf.fit(X, y)

    print("Saving Model")
    pickle.dump(rf, open(f"{output_dir}/rf.pkl", "wb"))


def preprocessing(df):

    categorical_columns = [
        "Feeling sad or Tearful",
        "Irritable towards baby & partner",
        "Trouble sleeping at night",
        "Problems concentrating or making decision",
        "Overeating or loss of appetite",
        "Feeling anxious",
        "Feeling of guilt",
        "Problems of bonding with baby",
        "Suicide attempt",
    ]

    mapper = {"No": 0, "Yes": 1, "Maybe": 3, "Sometimes": 4}

    df_copy = df.copy()
    # Numericalize all categorical columns
    for x in df_copy[categorical_columns]:
        df_copy[x] = df_copy[x].str.capitalize().str.strip(" ")
        df_copy[x] = df_copy[x].map(mapper)

    # Age column feature engineering
    df_copy["Max Age"] = df_copy["Age"].str[:2].astype("int")
    df_copy["Min Age"] = df_copy["Age"].str[3:].astype("int")
    df_copy["Age"] = (df_copy["Max Age"] + df_copy["Min Age"]) / 2

    df_copy.fillna(0, inplace=True)

    # Remove Unnecessary features
    df_copy = df_copy.drop(["Timestamp", "Max Age", "Min Age"], axis=1)

    return df_copy


if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("Must pass arguments. Format: [command] input_dir output_dir")
        sys.exit()
    main(sys.argv[1], sys.argv[2])

Давайте протестируем postpartum.py

mkdir outputs/
python3 PostPartum.py . outputs/

выходная папка должна иметь файл rf.pkl.

В Bacalhau работа включает в себя концепцию входных и выходных объемов. Подробнее об этом в документации Бакальяу.

Раздел 3

Давайте контейнеризируем наш скрипт с помощью Docker, создадим и отправим в Docker Hub.

Посетите Docker Hub, чтобы создать учетную запись.

Создайте репозиторий и выберите любое имя, в моем случае имя моего репозитория — postpartum.

Давайте создадим наш файл докера, но перед этим нам нужно получить наши требования, то есть библиотеку python, которую мы использовали в скрипте. Мы использовали numpy, pandas и sklearn, все остальные библиотеки встроены в python.

Я использую anaconda локально, поэтому я могу проверить версии моей библиотеки, используя список conda.

conda list | grep -e numpy -e pandas -e scikit-learn

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

touch requirements.txt
numpy==1.21.5 
pandas==1.4.2
scikit-learn==1.1.2

Чтобы создать файл докера

touch Dockerfile
FROM python:3.8-slim

COPY PostPartum.py /app/PostPartum.py

WORKDIR /app

COPY requirements.txt /app

RUN pip3 install -r requirements.txt

ADD PostPartum.py .

CMD ["python3", "PostPartum.py", "/inputs", "/outputs"]

Файл dockerfile указывает базовый образ как python:3.8-slim, файлы, которые необходимо скопировать в образ, и команды, которые необходимо выполнить.

Данные считываются из каталога /inputs и сохраняются в каталоге /outputs. Теперь, когда мы упаковали наши скрипты в докер, давайте отправим их.

docker buildx build --platform linux/amd64 --push -t hakymulla/postpartum:ml . 

где hakymulla/postpartum — имя моего репозитория, а ml — тэг. Это репозиторий, созданный в Docker Hub.

Раздел 4

Теперь мы можем отправить задание в bacalhau, но давайте сначала установим bacalhau cli. Начало работы с Бакальяу

curl -sL https://get.bacalhau.org/install.sh | bash

После успешной установки вы сможете просмотреть версию клиента и сервера.

bacalhau version

Я собираюсь показать два способа отправки задания на bacalhau. Первый — использовать CID наших данных IPFS из раздела 1, а второй — использовать источник данных из kaggle.

Отправить вакансию в bacalhau 1 (Input Volumes)

Мой CID из раздела 1: bafybeiagwhxf5karcivu6mnhq6uaxlnx224vzg7fuvfc3svl3rdzz672w4. Я загрузил файл на web3.storage.

Следующая команда запустит контейнер с данными CID.

bacalhau docker run \
--input-volumes QmWhrRgSA8iHpVSFKUaBe5Azp69VUWp5kudYXp7YCpYmw1:/inputs/ \
hakymulla/postpartum:ml

Вы должны получить что-то вроде экрана выше. 10faecc1–1814–4b0c-bcec-f30e648faa40 — мой идентификатор работы.

Отправить вакансию в bacalhau 2 (ввод URL)

Здесь мы можем использовать источник данных из kaggle, загрузить данные, щелкнуть правой кнопкой мыши данные в вашем менеджере загрузок и «Копировать ссылку для загрузки». На этом шаге мы используем --input-urls, а не --input-volumes.

bacalhau docker run \
--input-urls https://storage.googleapis.com/kagglesdsdata/datasets/2830731/4881865/post%20natal%20data.csv?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=gcp-kaggle-com%40kaggle-161607.iam.gserviceaccount.com%2F20230213%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20230213T090747Z&X-Goog-Expires=259200&X-Goog-SignedHeaders=host&X-Goog-Signature=6ea7673699ed740d9063ecafd753b74349c862156f5ecfff8f9812ae2764d6fab39e8491756f078535ed93e2a61e361130ae2e9dfd6c3e21f393efc62aed43afbec35bcdfe321369b77e6a57cb01a5629134dab55dd13a72ef62d8c81edd76748a71dfc90c7073daed89578d331cee94875f2ee697edaba9153498280ed4e5efea758d18901a74062001915949fa7d156dc7c4ce52effc7116eecffbcce5db1c94425d30a1bc83c00d62b53374188469ec91ab84b0ceb5faa6a81874c8cee68a785d83def90cf4ba1141ed40a4c13253c121cf7c8b7cc02a18f32e8bf8ff858d47c99f1d1f7a3fb502779eef05bbdd3e272e0e248bc532b6a363fe0ea004a814:/inputs/\ 
hakymulla/postpartum:ml

Проверьте статус задания с помощью следующей команды

bacalhau list --id-filter 10faecc1-1814-4b0c-bcec-f30e648faa40

Отладка неудачных заданий

Выход из обученной модели

bacalhau get 10faecc1-1814-4b0c-bcec-f30e648faa40

Следует создать папку задания с выводом, как показано ниже.

Теперь мы можем загрузить нашу модель для предсказания

with open('job-10faecc1/raw/QmPiMDqi2ZDX7JhoTWHY3rk61eKqZhzNdhQEYS52zF8BGJ/outputs/rf.pkl', 'rb') as f:
    model = pickle.load(f)

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

Рекомендации

  1. https://docs.bacalhau.org/
  2. https://www.kaggle.com/code/mpwolke/postpartum-depression/data
  3. https://www.kaggle.com/datasets/parvezalmuqtadir2348/postpartum-depression/code?sort=published