【関西Kaggler会 2025#1】DatabricksからKaggler向けにMLflowのセッションを実施させて頂きました

Databricksメンバーで、2025/3/7(金) に大阪で開催された **関西Kaggler会 交流会 in Osaka 2025#1** に参加して来ました！イベントの様子と我々が発表させて頂いた内容についてレポートさせて頂きます。

# 関西Kaggler会って？
Kaggleが大好きな人々が集い、各々の知識や経験を惜しみなく共有してくださるという、なんともありがたいコミュニティです。規模も大きく、connpass上でのメンバー数は500名に迫る勢いです。Kagglerでさえあれば実質的に誰でも参加でき、社会人や学生、そしてKaggle初心者からGrandmasterの称号を持つ方まで含めて様々な層の方が参加しています。
関西の冠が付いており開催地も大阪ですが、実際には日本全国からKaggleを愛する猛者が集まります。今回我々が参加した交流会でも、スポンサーまで含めると関西より関東からの参加者の方が若干多かった程です。

https://kansaikaggler.connpass.com/event/336893/

# 交流会当日の様子
会場は毎回違うようですが、今回は大阪駅からすぐの好立地。世間は通常営業の平日にも関わらず、100人を余裕で超える人数が集まっていました！セッションが始まると、会場内はすごい熱気(室温は快適でしたが気分的に)と真剣な眼差しで溢れていました。

![会場の全体写真](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986340/afe34010-9ff4-404d-9d92-146812fc4a74.png)


こうした雰囲気の中で13:00から18:30まで濃密なセッションが続きます！更に夜は懇親会まであります！まさに1日がかりで楽しめるイベント。セッションは3部構成に分かれており、第1部が初心者に優しい内容、第2部がトップKagglerたちによるディープな内容、そして第3部がスポンサーセッションとなっていました。

# Databricksはスポンサーとして初参加
このような極上のイベントに、Databricksはスポンサーとして今回初参加させて頂きました。Databricksはデータ & AIの基盤として、データサイエンティストをターゲットにしたソリューションも多く提供していますが、どれもKaggleでコンペに本気で取り組んでいる皆様に知ってもらいたいものばかりだったからです。　このような流れから、Databricksのスポンサーセッションでは、OSS開発チームに所属しMLflowのメンテナーとしてしている渡邉、平田と、ソリューションアーキテクトとして活動している阿部の3人で登壇。3人ともKaggle Expertであるという縁と、何よりもKagglerの皆様の中でのMLflowユーザーがもっと増えて欲しい・・・！という思いがあっての人選でした。

# Databricksセッションの内容を公開
今回の関西Kagglerの会での発表はKagglerの方々にMLflowを知っていただくことを目的にしていたため、MLモデルの実験管理の機能を中心にMLflowの基本機能を説明しました。発表にはMLflowのコンセプトと、PytorchモデルをKaggleノートブック上で学習しMLflowでそれを管理する簡単なデモを含めました。

本交流会に参加していない方にも向けて、Databricksセッションでご説明した内容の詳細を以下にまとめました！
今回のデモに使用したノートブックは[こちらのリンク](https://www.kaggle.com/code/tomehirata/mlflow-kaggle-demo/notebook)から閲覧可能になっています。また、MLflowには今回の発表ではカバーしきれていない機能がたくさんありますので是非[MLflowの公式ページ](https://mlflow.org/)から確認してください。

## MLflowとは
[MLflow](https://mlflow.org/)は、機械学習ライフサイクルの包括的な管理を支援するオープンソースツールです。以下のようなKaggleコンペにおける実験管理に便利な機能を持っています。
1. Tracking（トラッキング）:
    - MLflow Trackingは、機械学習プロセス中のパラメータ、コードバージョン、メトリクス、アーティファクトの記録を行うためのAPIおよびUIを提供します。機械学習実験のパラメータ、メトリクス、アーティファクト、データ、環境設定などの詳細を記録し、チームがモデルの進化を時系列で把握できるようにします。Pythonスクリプト、ノートブック、その他の環境でも動作し、結果をサーバーに記録することで、複数人で実行結果を容易に共有できます。
2. Model Registry（モデルレジストリ）:
    - モデル管理を体系的に行うための機能であり、異なるバージョンのモデルを管理し、それぞれの状態を把握しながら、スムーズな本番運用を支援します。モデルのライフサイクル全体を管理するための集中型ストレージ、API、UIを提供し、モデルの系譜管理、バージョニング、エイリアス設定、タグ付け、注釈の追加などが可能です。
3. MLflow Tracing（MLflowトレーシング）:
    -  MLflowは、AIアプリケーションの可観測性を向上させるトレーシング機能を提供します。これにより、アプリケーションの各サービスの実行に関する詳細な情報を記録できます。トレーシングは、リクエストの各中間ステップの入力、出力、およびメタデータを記録することで、バグや予期しない動作の原因を特定しやすくします。
4. Evaluate（評価）:
    - モデルの詳細な分析を目的としたツール群であり、従来の機械学習アルゴリズムから最先端のLLM（大規模言語モデル）まで、客観的なモデル比較を可能にします。

また、実験管理に加え以下のようなMLOpsにおける実験の上流や下流をサポートする機能も提供しており、データエンジニア、データサイエンティスト、MLエンジニア、プロダクトマネージャーをはじめとした様々なユーザーに使われています。

<img src="https://mlflow.org/docs/latest/assets/images/mlflow-overview-9cd40e29151f500aebc27465f671a2f8.png" alt="drawing" width="1000px"/>

## MLflow Pytorch デモ
こちらのデモでは簡単にMLflowを使ってPytorchフレームワークで書かれたNNモデルの実験を管理する方法を紹介します。

### インストール
```bash
# install mlflow and torch lightning
pip install mlflow lightning --quiet
```

そのほかのインストール方法については[こちら](https://mlflow.org/docs/latest/quickstart_drilldown/#quickstart-drilldown-install)を参照ください。

### トラッキングサーバー
トラッキングサーバーはMLflowの提供する実験管理用のUIです。トラッキングサーバーの建て方は様々あり、このデモではDatabricksの無料トライアル機能を使います。そのほかの方法については[こちら](https://mlflow.org/docs/latest/getting-started/tracking-server-overview/index.html)を参照下さい。

```python
from kaggle_secrets import UserSecretsClient
# Save your secrets from "add-ons" -> "secrets" -> "+ Add Secret"
user_secrets = UserSecretsClient()
WORKSPACE_EMAIL = user_secrets.get_secret("WORKSPACE_EMAIL") # your email
WORKSPACE_PAT = user_secrets.get_secret("WORKSPACE_PAT") # your databricks host https://<your workspace host>.cloud.databricks.com/
WORKSPACE_URL = user_secrets.get_secret("WORKSPACE_URL") # your PAT

import os
import mlflow
mlflow.set_tracking_uri('databricks')
mlflow.set_registry_uri('databricks-uc')
os.environ['DATABRICKS_HOST'] = WORKSPACE_URL
os.environ['DATABRICKS_TOKEN'] = WORKSPACE_PAT
# this command lets you login to Databricks workspace
mlflow.login()
```

### 実験の作成
次にDatabricks Workspace上に実験を作成します。
```python
# Create Experiment
mlflow.create_experiment(
    f"/Users/{WORKSPACE_EMAIL}/Pytorch",
    artifact_location="dbfs:/Volumes/workspace/default/pytorch",
)
mlflow.set_experiment(f"/Users/{WORKSPACE_EMAIL}/Pytorch")
```

### モデルの学習・評価
機械学習モデルの学習を行います。このデモではFashionMNISTに対しシンプルなCNNを学習させます。実験のトラッキングにはMLflowのAutologging機能を使用します。Autologging機能をオンにするのに必要なのは`mlflow.pytorch.autolog()`を呼び出すだけです。

```python
import torch
from torch import nn
from torchinfo import summary
from torchvision import datasets
from torch.utils.data import DataLoader, Subset
from torchmetrics import Accuracy
from torchvision import transforms
from torchvision.transforms import ToTensor
from torch.nn import functional as F
import torchmetrics
import lightning as L

import mlflow
from mlflow import MlflowClient

# Set up auto-logging, see https://mlflow.org/docs/latest/deep-learning/pytorch/guide/index.html 
# and https://mlflow.org/docs/latest/python_api/mlflow.pytorch.html#mlflow.pytorch.autolog for more configurations
mlflow.pytorch.autolog()
training_data = datasets.FashionMNIST(
    root="data",
    train=True,
    download=True,
    transform=ToTensor(),
)

test_data = datasets.FashionMNIST(
    root="data",
    train=False,
    download=True,
    transform=ToTensor(),
)

train_dataloader = DataLoader(training_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)

class ImageClassifier(L.LightningModule):
    def __init__(self, hidden_layer_size):
        super().__init__()
        self.model = nn.Sequential(
            nn.Conv2d(1, hidden_layer_size, kernel_size=3),
            nn.ReLU(),
            nn.Conv2d(hidden_layer_size, 16, kernel_size=3),
            nn.ReLU(),
            nn.Flatten(),
            nn.LazyLinear(10),  # 10 classes in total.
        )
        self.accuracy = Accuracy("multiclass", num_classes=10)

    def forward(self, x):
        return self.model(x)

    def training_step(self, batch, batch_nb):
        x, y = batch
        logits = self(x)
        loss = F.cross_entropy(logits, y)
        pred = logits.argmax(dim=1)
        acc = self.accuracy(pred, y)

        # PyTorch `self.log` will be automatically captured by MLflow.
        self.log("train_loss", loss, on_epoch=True)
        self.log("acc", acc, on_epoch=True)
        return loss

    def test_step(self, batch, batch_idx):
        x, y = batch
        y_hat = self(x)
        loss = F.cross_entropy(y_hat, y)
        
        # Compute accuracy
        acc = self.accuracy(y_hat, y)
        
        # Return loss and accuracy
        return {'loss': loss, 'accuracy': acc}

    def configure_optimizers(self):
        return torch.optim.Adam(self.parameters(), lr=0.02)

device = "cuda" if torch.cuda.is_available() else "cpu"

model = ImageClassifier(8)
trainer = L.Trainer(max_epochs=3)

# Train the model.
with mlflow.start_run() as run:
    trainer.fit(model, train_dataloader)
    results = trainer.test(model, test_dataloader)
```

上記のコードを実行後MLflow UIを開くと以下のように実験のメタデータ、モデルのweight、評価スコアなどが記録されています。
<img src="https://i.imgur.com/TtEPuFP.png" alt="drawing" width="1000px"/>
<img src="https://i.imgur.com/Lc2H4gV.png" alt="drawing" width="1000px"/>


# 行ってよかった・・・！
これだけの大勢のKagglerを前にした発表はとても緊張しましたが、参加して本当に良かったです。他のKagglerたちの発表はここでしか聞けない貴重な内容だったこと、参加者の中には普段Xでフォローさせて頂いているインフルエンサーの方々がたくさんいらっしゃったことにも感動しました。セッション会場や懇親会で、Databricksを既に実務で使ってくれている方にもお会いできたのは嬉しかったです。次は新しいKaggleコンペでのメダルを取って、この交流会でコンペについて発表ができるくらいになりたい！