機械学習モデルを導入するには?
近年、機械学習と人工知能が大きな人気を博している。その背景には、自然言語処理やレコメンダー・システムの進歩がある。
この記事では、機械学習、そのアプリケーション、デプロイオプションを紹介し、シンプルな機械学習モデルをBack4app Containersにデプロイする方法を示します。
機械学習とは何か?
機械学習は人工知能の一分野である。その中核は、統計的アルゴリズムを活用してデータから学習し、新しい未知のデータについて予測を行うことである。
言い換えれば、明示的にプログラムされることなく、コンピューターに学習能力を与えるということだ。
機械学習と人工知能はしばしば同じ意味で使われるが、同じではない。
機械学習はアルゴリズムとデータ構造に焦点を当て、人工知能は人間のような思考ができる機械を作ろうとする一般的な試みである。
典型的な機械学習技術は、回帰(住宅価格などの連続値を予測する)と分類(映画のジャンルなどの有限のクラス集合からクラスを予測する)である。
一般的に言って、機械学習は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-Nearest Neighbours (kNN)
- Decision Trees & Random Forests
- Support Vector Machines (SVM)
- Linear Regression
- Naive Bayes
- K-means
実際の例では、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 は、すべてのエンドポイントの対話型ドキュメントを自動的に生成します。
このようなリクエストを送信して、モデルをテストしてください:
素晴らしい、ウェブアプリが完全に機能するようになった!
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では、Backend as a ServiceとContainers as a Serviceのデプロイが可能だ。今回はコンテナ化されたアプリをデプロイするので、後者のオプションを使おう。
次に、GitHubアカウントをBack4appに接続する必要があります。これにより、Back4appはあなたのリポジトリからソースコードを取得できるようになります。全てのリポジトリへのアクセスを許可することも、特定のリポジトリへのアクセスを許可することもできます。
リポジトリがインポートされたら、「選択」をクリックします。
環境設定は、説明的なアプリケーション名を指定する以外には不要です。
次に「作成」をクリックする。
Back4appは、イメージをビルドし、コンテナレジストリにプッシュし、コンテナをスピンアップするのに数分かかります。デプロイが完了すると、アプリのステータスが “Ready “に変わるはずだ。
アプリにアクセスするには、以下の画像に示されたURLをクリックしてください。
機械学習モデルをBack4app Containersにデプロイできました。ウェブアプリはローカルと同じように動作するはずです。アプリをもう一度テストしてください。
概要
この記事では、機械学習の基本、その応用、機械学習モデルの導入方法について学んだ。
これで、独自のシンプルなモデルを作成し、FastAPIで提供し、Back4app Containersにデプロイできるようになります。
最終的なソースコードはback4app-deploy-ml-modelGitHub repoから取得してください。