はじめに
はじめまして!Orbitics株式会社データサイエンス部の渡邉です!
データサイエンスの世界では、AIモデル開発の効率化と品質向上は常に重要な課題です。特に、設定管理はAIモデルの再利用性やメンテナンス性を大きく左右します。
この記事では、OrbiticsがAIモデル開発の効率化を進める中で得られた知見を共有します。
具体的には、AIモデル開発における設定管理の重要性に焦点を当て、TOMLファイルとPythonのdataclassを組み合わせることで、いかに設定項目をコードから切り離し、開発の効率と保守性を向上させるかについて、具体的な実装例を交えながら詳しく解説していきます。
背景
設定とモデル開発機能の分離の重要性
プログラミングにおける設定管理は、コードの可読性と保守性を高める上で非常に重要です。
設定をコードに変数として直書きするのではなく、設定ファイルとして分離することで、デプロイ後の変更や異なる環境への適応が容易になります。
AIモデル開発においても設定項目をコードから分離することで、開発者が設定項目ファイルの編集と説明変数・目的変数のSQLクエリファイルを用意するだけで複数のAIモデル開発にソースコードを再利用できるようになります。
この記事では、TOMLファイルとPythonのdataclassを使って、コードから設定項目をきれいに分離する方法を紹介します。
TOMLとdataclassの組み合わせがなぜ良いのか
TOMLとは?
TOML (Tom's Obvious, Minimal Language) は、設定ファイルを記述するために設計された、読みやすくミニマルな設定ファイル形式です。INIファイルに似ていますが、より厳格な構造を持ち、ネストされた構造を表現できます。
Pythonのdataclassとは?
Python 3.7で導入されたdataclass
は、主にデータを保持するためのクラスを簡単に作成できるデコレータです。設定項目に型ヒントを付けることができます。
組み合わせのメリット
-
明確な構造: TOMLの明確な構造と
dataclass
の型ヒントにより、設定の意図とデータ構造が非常に分かりやすくなります。 -
堅牢性:
dataclass
で型を定義することで、設定ファイルからの読み込み時に型変換エラーを防ぎやすくなります。 - 保守性: 設定項目がコードから分離されるため、設定の変更が容易になり、コードの再デプロイなしで設定を更新できます。
-
可読性: TOMLは人間にとって読みやすく、
dataclass
もまたPythonicで直感的に理解できます。
実装例
それでは、irisデータセットを使った多値分類AIモデルの学習を題材に具体的な実装例を見ていきましょう。
フォルダ構成が以下の3ファイル[config.toml
,config.py
,train_iris.py
]を用意していきます。
./
┣config
┃ ┗config.toml
┣src
┃ ┗config.py
┗train_iris.py
1. TOMLファイルの準備
まず、設定を記述するTOMLファイル(config.toml
)を作成します。
# 乱数シード
random_state = 42
# テストデータの割合
test_size = 0.2
# lightgbmのパラメータ
[lgbm_params]
boosting_type = "gbdt"
objective = "multiclass"
metric = "multi_logloss"
num_class = 3
n_jobs = 4
seed = 123
learning_rate = 0.02
bagging_freq = 1
bagging_fraction = 0.8
feature_fraction = 0.8
verbosity = 0
2. dataclassesによるConfigクラスの定義
次に、Pythonファイル(config.py
)を作成し、TOMLファイルの設定に対応するdataclasses
を定義します。
TOMLファイルを読み込み、それをdataclasses
のインスタンスにマッピングする処理をクラスメソッドとして記述します。
ここでは、tomllib
ライブラリを使用します。tomllib
はPython 3.11から標準ライブラリとして含まれています。
また、dataclass
の機能である__post_init__
メソッドにより、クラス属性の型チェックや数値チェック機能も開発者側で定義できます。
from dataclasses import dataclass
import tomllib
from pathlib import Path
from typing import Self,Any
@dataclass
class Config:
test_size: float
random_state: int
lgbm_params: dict[str,Any]
def __post_init__(self):
"""
インスタンス作成直後に実行されるメソッド
"""
assert type(self.test_size) is float
assert type(self.random_state) is int
assert self.test_size>0 and self.test_size<1
@classmethod
def from_file(cls,conf_path:Path) -> Self:
"""
Configクラスをconfigファイルから読み込むためのメソッド
"""
with open(conf_path, mode="r", encoding="UTF-8") as f:
conf_str = f.read()
conf_dict = tomllib.loads(conf_str)
return cls(**conf_dict)
3. Configクラスの活用
ここまで作成したtomlファイルとconfig.pyファイルから設定項目を読みとり、irisデータセットを使った多値分類AIモデルの学習をするPythonファイル(train_iris.py
)を作成します。
config.toml
の内容をConfigクラスのインスタンスとして読み取り、インスタンスの属性値をもとに学習・テストデータの分離,lightgbmモデルのパラメータ設定をしています。
import os
import numpy as np
from pathlib import Path
from src.config import Config
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from lightgbm import LGBMModel
os.chdir(Path(__file__).parent)
# あらかじめ指定したパスからconfig.tomlファイルを読み取り、
# Configインスタンスを作成
conf_path=Path("./config/config.toml")
conf = Config.from_file(conf_path)
# 今回の例ではirisデータセットを利用
X_df,y_series = load_iris(return_X_y=True,as_frame=True)
# configに記載した値で学習データとテストデータに分割
train_X,test_X,train_y,test_y = train_test_split(
X_df,
y_series,
test_size=conf.test_size,
random_state=conf.random_state)
# configに記載した値でhold out用lightgbmのモデルを初期化して学習
model = LGBMModel(**conf.lgbm_params)
model.fit(train_X,train_y)
# 評価指標の算出
test_score = model.predict(test_X)
test_pred = np.argmax(test_score,axis=1)
print(f"accuracy:{accuracy_score(test_y,test_pred):.2f}")
まとめ
この記事では、TOMLファイルとPythonのdataclassesを組み合わせて、コードから設定項目を効率的かつ明確に分離する方法を紹介しました。
- TOMLは人間が読みやすい設定ファイル形式を提供します。
- dataclassはPythonicな方法で型安全な設定構造を定義できます。
- これらの組み合わせにより、設定の管理が容易になり、アプリケーションの可読性と保守性が向上します。
本記事ではirisデータセットでのAIモデルの学習という簡易な事例でしたが、データセット作成クエリの実行,学習済モデルの保存,予測スコアのDB格納,ログの管理などコードの機能が増加するにつれて、コードと設定項目を分離することによる恩恵が大きくなると思われます。本記事の内容が皆様のご参考となれば幸いです。