Colabで機械学習するならDagsHubを使わない手はない
はじめに
最近は、Pythonをプログラム・機械学習する環境も、様々増えてきています。
ローカルでPythonを使うケースも多く、今年だけでもuvやmarimoなど、便利な環境が多くて助かっています。
一方で、仕事柄、色々な環境で作業することが多いと、どうしてもSaaSのサービスがありがたかったりします。
SaaSのPython環境といえば、Colabですね。
私にとっては、Python学び始めたころ≒Colab使い始めたころなので、もうそろそろ10年近い付き合いです。
10年で、GPUやらTerminalやら無料でできることへの制約も強くなりましたが、それでもColabはとても便利です。
ただ、Colabだとやりづらいこともあります。
その1つが、実験管理ではないでしょうか。
MLflowなどいい環境が出来ていますが、ローカルサーバーでブラウザ立ち上げてとかが必要になる関係で、
こんな素敵な記事もあったのですが、やはりサーバーの立ち上げが少々面倒くさい。
Google ColabでLightGBM+MLFlow使ってみた
そんな時に知ったのが、下記の記事のDagsHubでした。(アイコンが犬なので、暫くDogsHubだと思っていました。。。)
DagsHubに入門する
概要
DagsHubとは
DagsHubの詳しい説明は、上記の記事がとても分かり易いので、そちらを見ていただければと思いますが、
自分でサーバーを立ち上げなくても、オンライン上で機械学習の実験管理ができてしまうものと理解しています。
探せば、似たようなサービスはあるのかもしれませんが、UIの使い勝手や料金(1人で使う分には無料)な点も気に入って、
他は探していません。
基本は、上記の記事のように、ローカルでgit連携して、DVCやMLflowを使えるようにするものっぽいのですが、
DagsHub integration with Google Colab
のように、Colab上でもしっかりと使えます。
DagsHub準備
まずは、ローカルで使うのと同様に準備しましょう。
DagsHubのサイト(トップページのデザインがすごい)から、ユーザー登録・ログインします。
GitHubのアカウントで入っちゃうのが一番楽だと思いますが、そこはお好みで。
そうすると、DagsHub内に「my-first-repo」というリポジトリができるので、それを使って試行します。
ローカルでの使い方は、上記の記事で十分分かり易く説明されているので割愛します。
とりあえず、1度ローカルで
1点だけ留意点として、GitHubやGoogleのアカウントで入っちゃうと、パスワードが設定されていません。
連携には必須なので、右上のアイコンから、Your Organizations > Tokensで、「Manage Personal Access Tokens」から
Tokenを作っておきましょう。(パスワードでもいいですが、Tokenが推奨らしいです)
ColabからDagsHubにつなぐ
では、ここから本題のColabでDagsHubにつなぐ手順です。
機械学習は何の捻りもなく、タイタニックのロジスティック回帰分析をやっています。
データは、Colabのローカルに手動で格納しています。
!pip install dagshub "mlflow>=2.12,<3.0" -q
MLFolowをインストールするのですが、バージョンが3.xだと上手くいかないので、2.x系を入れています。
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.compose import make_column_transformer
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import mlflow
from datetime import datetime
from google.colab import userdata
import os
# Exprtimentsの名前
run_name = f"train_{datetime.now():%Y%m%d_%H%M%S}"
# DAGS HUBのユーザー名とトークンは、Colabのシークレットから取得
dagshub_user = userdata.get('DagsHub_User')
dagshub_token = userdata.get('DagsHub_Tokens')
os.environ["MLFLOW_TRACKING_USERNAME"] = dagshub_user
os.environ["MLFLOW_TRACKING_PASSWORD"] = dagshub_token
# DagsHubのMLflowトラッキングURIを設定
mlflow.set_tracking_uri(f"https://dagshub.com/{dagshub_user}/my-first-repo.mlflow")
mlflow.set_experiment("my_experiment")
ColabのシークレットにDagsHub_Userと、DagsHub_Tokensを入れて呼び出しています。
「my-first-repo」のところは、本来は変数化すべきですね。今回は、初期のリポジトリ名そのままです。
df = pd.read_csv("/content/train.csv")
y = df["Survived"]
X = df[["Pclass","Sex","Age","SibSp","Parch","Fare","Embarked"]]
pre = make_column_transformer(
(SimpleImputer(strategy="median"), ["Age","SibSp","Parch","Fare","Pclass"]),
(make_pipeline(SimpleImputer(strategy="most_frequent"),
OneHotEncoder(handle_unknown="ignore")), ["Sex","Embarked"])
)
# モデルの訓練
params = {
"max_iter": 1000,
}
model = make_pipeline(pre, LogisticRegression(**params))
# 訓練データとテストデータに分割
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=42)
model.fit(X_train, y_train)
# モデルの評価
y_pred = model.predict(X_valid)
accuracy = accuracy_score(y_valid, y_pred)
metrics = {
"accuracy": accuracy,
}
機械学習部分は、何もしていないレベルなのでスルーしてください。
唯一、実験管理であれば当たり前ですが、paramsやmetricsのように管理したいものをdict化しています。
# mlflowロギング
with mlflow.start_run(run_name=run_name) as run:
mlflow.log_params(params)
mlflow.log_metrics(metrics)
# 従来のアーティファクト保存
mlflow.sklearn.log_model(model, artifact_path="model")
最後に、mlflowのロギングをする。
これだけで、DagsHubに結果が書き込まれます。※「Go to MLflow UI」を押すと、MLflowの画面でも見られます。

中身はこんな感じです。

情報が少ないのは、paramsやmetricsが少ないからですね。
NameやLabelsで、分析手法や対応内容を管理するのもありでしょう。
これで、個人的には、ほぼMLflowでやりたい管理ができているという印象でした。
おわりに
Colabで機械学習するのに、分析結果の比較が面倒というのは、個人的にあるあるでした。
とはいえ、SaaSでどこでも使える便利さはColabの特徴なので、それは活かしたいなと。
DagsHub連携であれば、通常ローカルでMLflow使うのに比べて、ほとんど追加が必要なく、かなりシンプルに実装できました。
今後の機械学習が捗りそうです。
また、使っていて気になる点など出てきたら、書き足していきたいと思います。
Discussion