DockerとKaskadaを使用したAI/MLのフルスタック再現性

Dockerは、開発環境とアプリケーションスタックのセットアップとデプロイを最適化するために、何百万人もの開発者によって使用されています。 人工知能(AI)と機械学習(ML)が多くのアプリケーションの主要コンポーネントになりつつあるため、Dockerの主な利点は、より手間のかかる作業を行い、開発サイクルを加速させることです。 

ガートナー は、「企業がビジネスで利用可能な大量のデータを利用するため、2027年までに、ビジネスで開発された新しいソフトウェアアプリケーションの90%以上がMLモデルまたはサービスを含むようになる」と予測しています。

パートナーである DataStaxが執筆したこの記事では、Kaskada、 オープンソース、Dockerが開発者のAI/MLの取り組みを最適化するのにどのように役立つかを概説します。

明るい青の背景に六角形の様式化された脳とドッカーとカスカダのロゴ

概要

データサイエンティストまたは機械学習の実践者として、あなたの仕事はすべて実験に関するものです。 データが伝えるストーリーについての直感から始めますが、多くの場合、誤った開始と失敗した実験の後にのみ答えが見つかります。 イテレーションと試しが早ければ早いほど、答えに早くたどり着くことができます。 多くの場合、1 つの問題を解決して得られた分析情報は、他の関連する問題にも適用できます。 実験は、同僚の以前の作業に基づいて構築できる場合、はるかに迅速に結果につながる可能性があります。

しかし、この種のコラボレーションには障害があります。 適切なツールがなければ、データサイエンティストはコードの依存関係の管理、バージョンの競合の解決、複雑なインストールプロセスの繰り返しに時間を浪費します。 同僚の仕事に基づいて構築することは、互換性のない環境、つまり恐ろしい「それは私のために働く」症候群のために難しい場合があります。

Docker と Kaskada は、目前の問題のために特別に設計された宣言型言語とサポート ツールのエコシステムという、さまざまな問題に対する同様のソリューションを提供します (図 1)。

再現可能な開発環境を構築するための手順を定義する dockerfile の表現を示す図。
図1: ドッカーファイルはビルドステップを定義します。

Dockerの場合、Dockerfile形式は、再現可能な開発環境と、コンテナ(Docker Hub、DockerDesktop 、 Kubernetes など)を操作するためのツールのエコシステムを構築するために必要な 正確な手順を記述します。Docker を使用すると、データ サイエンティストはコードと依存関係を任意のマシンでコンテナーとして実行できるイメージにパッケージ化できるため、複雑なインストール プロセスが不要になり、同僚がまったく同じ開発環境で作業できるようになります。

Kaskadaを使用すると、データサイエンティストは特徴量をコードとして計算して共有し、ローカルでのモデルのトレーニングから本番環境でのリアルタイム機能の維持まで、MLライフサイクル全体でそれらを使用できます。 Spark などの標準ツールでは、リアルタイム ML モデルのトレーニングに必要な時間的コンテキストを再構築することが難しいため、これらのデータセットの生成に必要な計算は複雑でコストがかかることがよくあります。

Kaskadaは、特徴量(特に時間に関する推論を必要とする特徴量)を計算する方法を提供し、特徴定義をコードとして共有することで、この問題を解決します。 このアプローチにより、データ サイエンティストは、特徴エンジニアリングで相互に、また機械学習エンジニアと協力し、プロジェクト間でコードを再利用できます。 再現性の向上により、モデルを本番環境に導入するためのサイクルタイムが大幅に短縮され、モデルの精度が向上し、最終的に機械学習の結果が向上します。

チュートリアルの例

Docker と Kaskada が機械学習のライフサイクルをどのように改善するかを、簡単な例で見ていきましょう。 モバイルゲームのリアルタイムモデルを構築しようとしていて、ユーザーがアップグレードにお金を払うかどうかなど、結果を予測したいとします。

実験環境のセットアップ

まず、Jupyter と Kaskada がプリインストールされている Docker コンテナーを起動します。

docker run --rm -p 8888:8888 kaskadaio/jupyter
open <jupyter URL from logs> 

この手順により、作業する再現可能な開発環境がすぐに得られますが、この環境をカスタマイズすることもできます。 このイメージを "基本イメージ" として使用して新しい Dockerfile を作成することで、追加の開発ツールを追加できます。

# Dockerfile
FROM kaskadaio/jupyter

COPY requirements.txt
RUN pip install -r requirements.txt

この例では、Jupyter と Kaskada から開始し、要件ファイルをコピーして、そこにすべての依存関係をインストールしました。 これで、データ サイエンス ワークベンチとして使用し、組織全体で共有できる新しい Docker イメージが作成されました。 この Dockerfile を使用する組織内の誰でも、Dockerfile をビルドして実行することで、使用しているのと同じ環境を再現できます。

docker build -t experimentation_env .
docker run --rm -p 8888:8888 experimentation_env

Docker の威力は、環境を説明するファイルを作成し、このファイルを他のユーザーと共有できるようになったという事実に由来します。

モデルのトレーニング

新しい Jupyter ノートブック内で、問題の解決策を探るプロセス、つまり購入行動を予測するプロセスを開始できます。 まず、テーブルを作成して、架空のゲームによって生成されるさまざまなタイプのイベントを整理します。

% pip install kaskada
% load_ext fenlmagic

session = LocalBuilder().build()

table.create_table(
table_name = "GamePlay",
time_column_name = "timestamp",
entity_key_column_name = "user_id",
)
table.create_table(
table_name = "Purchase",
time_column_name = "timestamp",
entity_key_column_name = "user_id",
)

table.load(
table_name = "GamePlay", 
file = "historical_game_play_events.parquet",
)
table.load(
table_name = "Purchase", 
file = "historical_purchase_events.parquet",
)

Kaskadaはローカルでのインストールと使用が簡単です。 インストールが完了したら、テーブルの作成とテーブルへのイベント データのロードを開始できます。 Kaskadaのベクトル化エンジンは、高性能のローカル実行用に構築されており、多くの場合、分散コンピューティングクラスターの管理を複雑にすることなく、ローカルでデータの実験を開始できます。

Kaskadaのクエリ言語は、データサイエンティストが生のイベントデータから直接特徴やトレーニングの例を簡単に構築できるように設計されています。 1 つのクエリで複雑な ETL パイプラインと事前集計パイプラインを置き換えることができ、Kaskda 独自の時間操作により、過去の重要な時点のトレーニング例を構築するためのネイティブ タイム トラベルのロックが解除されます。

%% fenl --var training

# Create views derived from the source tables
let GameVictory = GamePlay | when(GamePlay.won)
let GameDefeat = GamePlay | when(not GamePlay.won)

# Compute some features as inputs to our model
let features = {
  loss_duration: sum(GameVictory.duration),
  purchase_count: count(Purchase),
}

# Observe our features at the time of a player's second victory
let example = features
  | when(count(GameDefeat, window=since(GameVictory)) == 2)
  | shift_by(hours(1))

# Compute a target value
# In this case comparing purchase count at prediction and label time
let target = count(Purchase) > example.purchase_count

# Combine feature and target values computed at the different times
in extend(example, {target})

次の例では、最初にイベントにフィルタリングを適用し、単純なフィーチャを構築し、モデルを使用して予測を行う時点でイベントを観察してから、1 時間後に計算された予測する値とフィーチャを結合します。 Kaskada では、生のイベントから始まり、ML トレーニングデータセットで終わる、これらすべてのオペレーションを「ゼロから」記述できます。

from sklearn.linear_model import LogisticRegression
from sklearn import preprocessing

x = training.dataframe[['loss_duration']]
y = training.dataframe['target']

scaler = preprocessing.StandardScaler().fit(X)
X_scaled = scaler.transform(X)

model = LogisticRegression(max_iter=1000)
model.fit(X_scaled, y)

Kaskada のクエリ言語を使用すると、生のイベントからトレーニング データセットへのエンドツーエンドの変換を簡単に記述できます。

結論

Docker と Kaskada により、データ サイエンティストや ML エンジニアは、リアルタイムの ML の問題を迅速かつ再現性よく解決できます。 Docker を使用すると、開発環境を簡単に管理できるため、コードがすべてのマシンで同じように実行されます。 Kaskadaを使用すると、特徴エンジニアリングで同僚と共同作業し、プロジェクト間でクエリをコードとして再利用できます。 独立して作業している場合でも、チームの一員として作業している場合でも、これらのツールは、これまで以上に迅速かつ効率的に回答を得るのに役立ちます。

Docker Hub で Kaskada の公式イメージを使い始めましょう。