機械学習モデルを導入するには?

機械学習モデル展開カバー

近年、機械学習と人工知能が大きな人気を博している。その背景には、自然言語処理やレコメンダー・システムの進歩がある。

この記事では、機械学習、そのアプリケーション、デプロイオプションを紹介し、シンプルな機械学習モデルをBack4app Containersにデプロイする方法を示します。

機械学習とは何か?

機械学習は人工知能の一分野である。その中核は、統計的アルゴリズムを活用してデータから学習し、新しい未知のデータについて予測を行うことである。

言い換えれば、明示的にプログラムされることなく、コンピューターに学習能力を与えるということだ。

人工知能 vs 機械学習 vs ディープラーニング

機械学習と人工知能はしばしば同じ意味で使われるが、同じではない。

機械学習はアルゴリズムとデータ構造に焦点を当て、人工知能は人間のような思考ができる機械を作ろうとする一般的な試みである。

典型的な機械学習技術は、回帰(住宅価格などの連続値を予測する)と分類(映画のジャンルなどの有限のクラス集合からクラスを予測する)である。

一般的に言って、機械学習は3つのタイプに分けられる:

  • 教師あり学習— アルゴリズムは、ラベル付けされたデータセットを使って学習する。データセットの各例にはラベル(またはいわゆるターゲット変数)が含まれている。アルゴリズムはこれらを使って、未見の例のラベルを予測する。教師あり学習アルゴリズムには、kNN、decision treesなどがある。
  • 教師なし学習— アルゴリズムは明示的なガイダンスなしに学習する。データのパターンを見つけ、それに基づいて予測を行うのはアルゴリズム次第である。アルゴリズムの例はk-meansクラスタリングである。
  • 強化学習— アルゴリズムは試行錯誤を通じて学習する。一般的に報酬型であり、アルゴリズムの目標は報酬を最大化することである。例:遺伝的アルゴリズム。

この記事の実践編では、典型的なモデル構築のプロセスを説明する。教師あり学習を使って分類タスクを解く。

機械学習アプリケーション

実際の機械学習アプリケーションを見てみよう!

推薦システム

レコメンダーシステムは、ユーザーが消費すべきアイテム(映画、商品など)を提案する。これらのシステムには、コンテンツベースと協調ベースがある。

最近では、レコメンドシステムはほとんどすべての企業で使用されています。レコメンドシステムによって、企業はビジネスの成功率を高め、さらなる需要を創造し、ユーザーのエンゲージメントを高め、顧客について学ぶことができます。

例えば、Netflixは映画を推薦するために、Spotifyは曲を推薦するために、YouTubeはあなたの興味に基づいて見るべきビデオを推薦するために、これらを使用している。

自然言語処理(NLP)

自然言語処理(NLP)は、コンピュータが人間の言語を処理し理解することを可能にする。自然言語生成(NLG)は、コンピュータが人間の言語を生成することを可能にする。

このテクノロジーは、チャットボット、言語翻訳ツール、感情分析ツールなどで使われている。ChatGPTは、NLPとNLGを活用した最も有名な例の1つです。

ChatGPTについてもっと知りたいですか?ChatGPTを使ってアプリを作るには?

コンピュータビジョンと画像認識

コンピュータ・ビジョンは、画像や映像を「見て」「理解する」能力をコンピュータに与える。これにより、(リアルタイムの)セグメンテーション、物体や顔の認識、さらには感情の認識までが可能になる。

これは、写真アプリが友人を自動的にタグ付けするために使用する技術である。さらに、不審な行動を検知する監視システムにも使われている。

不正行為の検出

企業は、取引やユーザー行動における疑わしい行為を検出するために機械学習を採用している。これらのシステムは、傾向や異常を研究することで潜在的な詐欺行為を検出し、企業や顧客を詐欺やサイバー犯罪から守ります。

自動運転車

自動車の自律走行は、より複雑な機械学習問題のひとつである。コンピュータ・ビジョン、異常検知、行動予測、進路計画など、さまざまな応用が組み合わされている。

この記事を書いている時点では、完全な自律走行車にはほど遠い。現在の “自動運転 “車は、限定された地理的領域でしかうまく機能しない。

機械学習導入オプション

機械学習モデルをデプロイするには、通常Webアプリケーションから提供する。したがって、機械学習モデルのデプロイオプションは、ウェブアプリケーションのデプロイと実質的に同じです。それらを見てみよう!

オンプレミス

オンプレミスの展開では、サーバーやストレージ・デバイスなどのIT機器を実際の企業敷地内でホスティングし、管理する。

この従来の戦略では、ハードウェアとソフトウェアにかなりの初期投資と、継続的なメンテナンスとサポートが必要になる。

その長所には、より高度なコントロールとセキュリティ、より利用しやすいカスタマイズ性などがある。一方、デメリットはコスト、拡張性、メンテナンスである。

クラウド

対照的に、クラウドの導入は、インターネット経由でインフラとアプリケーションをホストするサードパーティ・サービスを採用している。

このモデルでは、クラウド・サービス・プロバイダーが扱うスケーラブルなリソースやサービスに対して、利用者がその都度料金を支払うことができる。

長所としては、拡張性、使いやすさ、初期費用がかからないことなどが挙げられる。一方、デメリットは、管理レベルの低さ、柔軟性の低さ、ベンダーロックインの可能性である。

クラウドベースのプラットフォームの例としては、以下のようなものがある:

  • Back4app
  • Amazon Web Services (AWS)
  • Google Cloud Platform (GCP)
  • Microsoft Azure

人気の機械学習アルゴリズム

一般的な機械学習アルゴリズムは以下の通りである:

実際の例では、k-最近傍探索を使用する。

機械学習モデルの導入方法

この記事のセクションでは、機械学習モデルを構築し、FastAPIでそれを提供し、それをdocker化し、最後にそれをBack4app Containersにデプロイします。

前提条件

  • 機械学習の基礎知識
  • PythonとFastAPIの使用経験
  • Dockerとコンテナ化技術の基本的な理解
  • ローカルマシンにインストールされたGitとDocker Desktop

プロジェクト概要

機械学習モデルの配備方法を示す前に、機械学習モデルを構築しよう。よく使われるIrisデータセットを使って、単純なkNN分類器を作ります。モデルの目的は、観察が「setosa」なのか「versicolour」なのか「virginica」なのかを、異なる特徴に基づいて予測することです。

その後、モデルをファイルに保存し、FastAPIでロードしてエンドポイント経由で提供する。その後、アプリをDocker化してGitHubにプッシュし、Back4app Containersにデプロイします。

モデル作成

モデルを作成するために、Jupyter Notebooksを使用する。ローカルマシンにJupyterをインストールするか、Google Colabを無料で使うことができる。

まず新しいJupyterノートブックを作成する。

このセクションの各コードブロックはJupyterセルを表しています。メニューから、または “B “キーバインドを使って(コマンドモードで)作成できます。

また、(メニューから、または “ALT + ENTER “で)実行することもお忘れなく。

最初のセルに以下のインポートを追加する:

import numpy as np
import pandas as pd

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score

from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

from joblib import dump

データセットを読み込む

IrisデータセットはデフォルトでScikit-learnに含まれている。load_iris()関数を呼び出し、オブジェクトをフレームに変換するだけです。

新しいセルを作る:

df = load_iris(as_frame=True)["data"]
df["target"] = load_iris(as_frame=True)["target"]

Irisのデータセットをロードすると、ターゲット変数順に並べられる。機械学習モデルは、学習段階でいくつかのタイプの例しか見ないかもしれないので、これはよくない。例えば、”setosa “と “versicolour “だけである。

この問題を避けるには、シャッフルすればいい:

df = df.sample(frac=1, random_state=42)

random_state属性は再現性のために使用されます。好きな数字を使うことができます。

データセットを調べる

モデルを作成する前に、どのようなデータを扱っているのかを調べるのは良いアイデアです。そのためには、head()describe()などのPandasの組み込み関数を使うことができます。

# Displays the first five rows of the dataset
df.head(5)

# Generates descriptive statistics
df.describe()

その上で、データセットを視覚化して、どの特徴が最もよく例を分けるか、そしてどの機械学習アルゴリズムがあなたの問題に役立つかを把握する必要がある。

アイリス・データセットの可視化

上の画像はGuide to Data Visualization with Pythonの記事からお借りしました。データ可視化についてもっと学ぶために、ぜひチェックしてみてください。

画像を見ると、「赤」の点は他の2つの点から直線的に分離可能であることがわかる。一方、「青」と「緑」の点は直線的に分離できない。

分割データセット

続いて、特徴量(予測変数)とターゲット変数を定義しましょう:

features = [
    "sepal length (cm)", "sepal width (cm)", "petal length (cm)", "petal width (cm)"
]
target = "target"

そして、X(特徴量データ)とY(ターゲット変数データ)に抽出し、テスト・トレーニングで分割する:

X = df[features].values
y = df[target].values

dev_X, test_X, dev_y, test_y = train_test_split(X, y, test_size=0.25, random_state=42)

test_size=0.25を使うと、データセットの25%がテストに使われ、75%がトレーニングに使われる。

ビルド・モデル

次に、まずデータをスケールし、次にkNN分類器を使用するパイプラインを作成する:

knn = Pipeline(steps=[
    ("scaler", StandardScaler()),
    ("predictor", KNeighborsClassifier()),
])
knn.fit(dev_X, dev_y)

なぜスケーリングが不可欠なのかについては、こちらの記事をご覧いただきたい。

その後、10重のクロスバリデーションを行い、検証誤差をチェックする:

cross_val_score(knn, dev_X, dev_y, cv=10, scoring="accuracy").mean()

# 0.9363636363636362

テストセットでモデルを評価する:

accuracy_score(test_y, knn.predict(test_X))

# 0.9736842105263158

検証精度とテスト精度はほぼ等しい。これは、我々のモデルがアンダーフィットでもオーバーフィットでもないことを示している。

セーブモデル

最後に、すべてのデータを使ってモデルを再トレーニングし、model.pklファイルに保存します:

knn.fit(X, y)
dump(knn, "model.pkl")

Google Colabを使用していた場合は、model.pkファイルをダウンロードしてください。

サーブモデル

前述したように、FastAPIを使ってモデルを提供します。

新しいFastAPIプロジェクトを作成し、main.pyを以下のように置き換えます:

# main.py

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {
        "name": "back4app-deploy-ml-model",
        "description": "A FastAPI app serving an ML model",
        "version": "1.0.0",
    }

開発サーバーを起動します:

$ uvicorn app.main:app --reload

http://localhost:8000/、次のような反応が返ってくるはずだ:

{
    "name": "back4app-deploy-ml-model",
    "description": "A FastAPI app serving an ML model",
    "version": "1.0.0"
}

負荷モデル

次に、モデルをロードしてmodel_classesを定義しましょう。

まず、前のステップで作成したmodel.pklをプロジェクトのルートにコピーします。次に、モデルをロードし、FastAPIアプリを初期化する直下で、次のようにクラスを定義します:

# ...

model = load("model.pkl")
model_classes = {
    0: "setosa",
    1: "versicolor",
    2: "virginica",
}

# ...

model_classesを使って、ターゲット変数を数値からテキストに変換する。

負荷モデル

次に/predictエンドポイントを作成し、特徴を取り込み、ロードされたモデルを使って予測を行う:

# main.py

# ...

class Observation(BaseModel):
    """
    A Pydantic model for the observation data.
    This is our ML model's input data.
    """
    sepal_length: float
    sepal_width: float
    petal_length: float
    petal_width: float


@app.post("/predict")
async def predict(observation: Observation):
    predictions = model.predict([[
        observation.sepal_length,
        observation.sepal_width,
        observation.petal_length,
        observation.petal_width,
    ]])
    prediction = predictions[0]
    prediction_class = model_classes[prediction]
    return {
        "prediction": int(prediction),
        "prediction_class": prediction_class,
    }

エンドポイントは、数値予測とユーザーフレンドリーなテスト予測を返す。

ファイル上部のインポートもお忘れなく:

from joblib import load
from pydantic import BaseModel

最終的なmain.py次のようになります。

開発サーバーを再起動し、お気に入りのウェブブラウザでhttp://localhost:8000/docsに移動します。FastAPI は、すべてのエンドポイントの対話型ドキュメントを自動的に生成します。

このようなリクエストを送信して、モデルをテストしてください:

FastAPI ドキュメントの例

素晴らしい、ウェブアプリが完全に機能するようになった!

Dockerizeアプリ

このセクションでは、WebアプリケーションをDocker化します。Dockerfileを作成し、.dockerignoreファイルを設定します。

ドッカーファイル

Dockerfileは、Docker Engineがイメージをビルドするための指示を含むファイルです。

これには通常、ファイルの転送、ベース・イメージの定義、作業ディレクトリの設定、カスタム・コマンドの実行などが含まれる。

Dockerfileコマンドは通常、すべて大文字で書かれ、対応する引数が直接続く。

<COMMAND> <arg1> <arg2> ... <arg_n>

# Example
WORKDIR /app

Dockerfileのリファレンスで、すべての手順について詳しく知ることができる。

プロジェクト・ルートにDockerfileを作成する:

# Dockerfile

# Set the base image
FROM python:3.12.2-alpine3.19

# Install the required dependencies (gcc)
RUN apk add build-base

# Set the working directory
WORKDIR /app

# Confingure Python using environmental variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Copy the requirements file into the image and install them
COPY ./requirements.txt .
RUN pip install --no-cache-dir --upgrade pip
RUN pip install --no-cache-dir --upgrade -r ./requirements.txt

# Copy the source code into the image
COPY . .

# Expose the port
EXPOSE 8000

# Start the Uvicorn server
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

.dockerignore

Dockerで作業する場合、可能な限り小さなイメージを作りたいだろう。

イメージサイズを小さくする方法のひとつに、.dockerignoreファイルを利用する方法がある。このファイルは.gitignoreファイルと同様の働きをします。イメージに含める必要のないファイルを省略することができます。

プロジェクトのルートに.dockerignore を作成する:

.git/
.idea/

__pycache__/
venv/

create_model.ipynb

.dockerignoreファイルをあなたのプロジェクトの要件に合わせるようにしてください(別のIDEを使用している場合など)。

ビルド、実行、テスト

イメージをクラウドにプッシュする前に、ローカルでテストすることをお勧めします。

Docker Desktopがインストールされている必要があります。

ターミナルを開き、現在インストールされているイメージを確認する:

$ docker images

次に、Dockerfileを使ってイメージをビルドする:

$ docker build -t iris-webapp:1.0 .

Dockerがイメージをビルドするにはかなりの時間がかかります。これは主に、Scikit-learnがDockerコンテナ用に最適化されていないためです。コーヒーブレイクはご自由にどうぞ。

コマンドが終了したら、イメージを再チェックする。新しくビルドされたイメージがそこにあるはずだ。

最後に、そのイメージを使って新しいコンテナを作成する:

 $ docker run -p 8000:8000 --name iris-webapp iris-webapp:1.0

それだけだ!

これでウェブ・アプリケーションはコンテナ化された。http://localhost:8000/からアクセスでき、以前と同じように動作するはずです。

GitHubにプッシュする

まず、GitHub に移動して新しいリポジトリを作成します。後のステップで必要になるので、リモートの URL を控えておきましょう。

次に、プロジェクトのルートに戻る。

ソースコードをクラウドにプッシュする前に、.gitignoreファイルを作成しましょう。.gitignoreファイルを使用すると、バージョン管理から除外するファイルやディレクトリを指定できます。

このタイプのファイルは、.dockerignoreファイルと同じように動作します。

プロジェクト・ルートに.gitignoreファイルを作成する:

#.dockerignore

.idea/
__pycache__/
venv/

ターミナルを開き、以下のコマンドを実行してGitを初期化する:

$ git init

すべてのファイルをVCSに追加し、コミットする:

$ git add .
$ git commit -m "first commit"

最後に、先ほどのURLを使ってリモートのGitHubオリジンを追加し、ソースコードをプッシュします:

$ git remote add origin <remote_url>
$ git push origin master

の代わりに、前のステップのリモートURLが使用されていることを確認してください。 .

これで完了だ。GitHub リポジトリのページにアクセスすると、すべてのファイルが追加されているのがわかるはずです。

アプリのデプロイ

アプリをBack4app Containersにデプロイするには、まず登録するかログインする必要があります(すでにアカウントを持っている場合)。

Back4appアカウントで認証すると、アプリのダッシュボードが表示されます。新しいアプリを作成するには、”Build new app “をクリックしてください。

Back4app Containers アプリダッシュボード

Back4appでは、Backend as a ServiceとContainers as a Serviceのデプロイが可能だ。今回はコンテナ化されたアプリをデプロイするので、後者のオプションを使おう。

サービスとしてのBack4appコンテナ

次に、GitHubアカウントをBack4appに接続する必要があります。これにより、Back4appはあなたのリポジトリからソースコードを取得できるようになります。全てのリポジトリへのアクセスを許可することも、特定のリポジトリへのアクセスを許可することもできます。

リポジトリがインポートされたら、「選択」をクリックします。

Back4app Containers リポジトリを選択

環境設定は、説明的なアプリケーション名を指定する以外には不要です。

次に「作成」をクリックする。

Back4app Containers 環境を設定する

Back4appは、イメージをビルドし、コンテナレジストリにプッシュし、コンテナをスピンアップするのに数分かかります。デプロイが完了すると、アプリのステータスが “Ready “に変わるはずだ。

アプリにアクセスするには、以下の画像に示されたURLをクリックしてください。

Back4appコンテナ、デプロイ準備完了

機械学習モデルをBack4app Containersにデプロイできました。ウェブアプリはローカルと同じように動作するはずです。アプリをもう一度テストしてください。

概要

この記事では、機械学習の基本、その応用、機械学習モデルの導入方法について学んだ。

これで、独自のシンプルなモデルを作成し、FastAPIで提供し、Back4app Containersにデプロイできるようになります。

最終的なソースコードはback4app-deploy-ml-modelGitHub repoから取得してください。


Leave a reply

Your email address will not be published.