モジュール定義ファイル
モジュール定義ファイルとは
モジュールで提供する処理 (script) や取り扱うデータ構造を規定したファイルであり、モジュールのインタフェイス仕様を宣言する役割を担う。 JSON 形式のファイルで作成し、モジュール内に definition.json という名前で保存しておく。 xData FL は definition.json を取得することで、モジュールが提供する処理を把握し、xData FL が提供するモジュール実行 Web API が呼ばれた際に、そのパラメータを適切に解釈し、要求された処理に必要となるデータの準備や、処理結果の解釈、保存などが行えるようになる。
モジュール定義ファイルの構造
全体的な構造
モジュール定義ファイルは下記の様な構造を持った JSON とする。
{
"name": "<モジュールの名前。javaと同様にFQDNの形式で記述する。これによりモジュールを一意に識別出来るようにする>",
"description": "<モジュールの説明>",
"supports": "<TBD モジュールがサポートする機能を列記する>",
"definitions": {
"<パラメータの型の定義、後述の型定義を参照>": {},
"...": {}
},
"scripts": {
"<スクリプト名(ラベル)。Web APIを呼ぶ際には別途定義するモジュール名と、このスクリプト名を渡すことで実行したい処理を指定する。スクリプト名はモジュール内でユニークである必要がある。モジュールのnameとscriptのnameを組み合わせることで、任意のモジュール群からスクリプトを一意に特定できる>": {
"description": "<スクリプトの説明。人間(もしくはLLM)に読ませるための物>",
"path": "<実行したい処理のservice名。docker-compose.ymlに定義したserviceの名前を記述する>",
"type": "<スクリプトの種別。training (modelとdataを入力してmodelを出力)、prediction (modelとdataを入力してdata(とmodel)を出力、predictionしながらmodelの更新を行うタイプのは別のラベルを振った方がいいかも)、aggregation (複数のmodelを入力してmodelを出力)、model_transformation (modelを入力してmodelを出力)、data_transformation (dataを入力してdataを出力)>",
"input": {
"<1つめの入力データの定義、後述の入出力定義を参照>": {},
"<2つめの入力データの定義、後述の入出力定義を参照>": {}
},
"output": {
"<1つめの出力データの定義、後述の入出力定義を参照>": {},
"<2つめの出力データの定義、後述の入出力定義を参照>": {}
}
}
}
}
型の定義
definitions 内の型宣言の書式
全体の構造のうち、definitions 内の型宣言の部分は下記の書式とする。
{
"<型の名前。definitions内で一意である必要がある>": {
"description": "<型の説明>",
"definition": "<型の構造の定義、書式は後述>"
}
}
型の構造の定義
型の構造の定義は下記の書式で行う。 definitions 内の型宣言中の definition の値や、後述の入出力定義の paramtype の値として利用する。
{
"type": "<型の種別。model (モデル)、model_set (複数のモデルの集合)、data (データ)、others (その他)>",
"form": "<file (ファイル)、directory (ディレクトリ)、STDIN/STDOUT。typeがmodel_setの場合はdirectoryのみ可>",
"files": [
"<ファイルの定義。ディレクトリ内に配置されるファイルを列記>"
],
"format": "<formがdirectory以外の場合に記述。後述のファイルフォーマットの定義を記入>",
"paramtype": "<typeがmodel_setの場合のみ指定。定義ファイル中のdefinitionsで定義されている型の名前の文字列、もしくは、本項の型定義のdefinitionの内側と同じ構造のJSON。いずれの場合もtypeはmodelである必要がある>"
}
型の構造の定義の書式は、type が model、data、others か model_set かと、form が file か directory かで異なる。
1. type が model、data、others で form が directory の場合
{
"type": "<データの種別。model (モデル)、data (データ)、others (その他)>",
"form": "directory",
"files": [
"<ファイルの定義情報>"
]
}
2. type が model、data、others で form が file もしくは STDIN/STDOUT の場合
{
"type": "<データの種別。model (モデル)、data (データ)、others (その他)>",
"form": "<file もしくは STDIN/STDOUT>",
"format": "<後述のファイルフォーマットの定義を記入>"
}
3. type が model_set の場合
{
"type": "model_set",
"form": "directory",
"paramtype": "<typeがmodelになっているパラメータ定義のname、もしくは、パラメータ定義のdefinition部分と同じ構造>"
}
ファイルの定義
型の構造の form が directory の場合は directory 内に配置されるファイルの名前や種別を files 内の配列に列記する必要がある。その書式は下記の通り。
{
"name": "<ファイルの名称(ラベルでありファイル名ではない)>",
"path": "<ファイル名、ディレクトリ内の相対パスとする、ワイルドカードを可とする>",
"form": "<file (ファイル) もしくは directory (ディレクトリ)>",
"files": [
"<formがdirectoryの場合のみ。ディレクトリ内に配置されるファイルを定義>",
"<ファイルの定義のJSON、本項の定義を再帰的に記述>"
],
"format": "<formがfileの場合、後述のファイルフォーマットの定義を記入>"
}
ファイルフォーマットの定義
ファイルの書式等を宣言する。
{
"type": "<ファイルの形式 CSV、JSON、Movie など>",
"structure": "<ファイルの形式、ファイル種別に応じて異なる>"
}
type が CSV の場合の structure の指定方法:
{
"lineseparator": "<行の区切り、デフォルトは CR LF>",
"delimiter": "<カラムの区切り、デフォルトはカンマ>",
"columns": [
{
"name": "<カラムの名前(ラベル)>",
"type": "<カラムの型、string、number、date、geometory など>"
}
]
}
その他のファイルフォーマットについては必要に応じて随時規定する。
モデルの受け渡し方法
型の種別 (type) が model となっている場合は、システムは下記の 2 種類のファイルを取り扱う。いずれもファイルフォーマットの定義の type の指定で区別する。
- モデルのメタデータ。json 形式のファイル。format の type に "json" と書く
- モデル本体。当面は pytorch の state_dict の形式とする。format の type に "state_dict" と書く
入力定義の際には、form が directory の場合、files の中の format.type が json となっていればその path 名のファイルにメタデータを、format.type が "state_dict" となっていればその path 名のファイルにモデルのバイナリデータをファイルとして保存する。
出力定義の際には、同様に json になっているファイルからメタデータを読込んで、state_dict になっているファイルをモデルの本体として取り扱う。
入出力の定義
{
"<入出力データの名前(ラベル)。Web APIを呼ぶ際に各入出力のデータをどの(テーブルから取得|テーブルに保存)するかを指定する。スクリプトの入力/出力のnameはユニークである必要がある>": {
"description": "<入出力データの説明。人間(もしくはLLM)に読ませるための物>",
"path": "<入力/出力用のディレクトリ内の相対パス>",
"paramtype": "<パラメータの型のname (文字列) もしくは上述の型の構造の定義>"
}
}
モジュール定義の記述例
連合学習のモデル集約アルゴリズム FedAvg を実装したモジュールの定義ファイルの例を下記に示す。
このモジュールはモデルの集約処理(複数のモデルを入力として受け取り、集約したモデルを出力する処理)を実装したスクリプトを 1 つ内包している。入力データは一定の条件で取得されたモデル群、出力は単一のモデルを出力する。
{
"name": "module.fed-avg-module.aggregate",
"description": "FedAvg aggregate module",
"supports": "",
"definitions": {
"the_model": {
"description": "集約前と集約後のモデル",
"definition": {
"type": "model",
"form": "directory",
"files": [
{
"name": "model_data",
"path": "model.dat.xdata_meta",
"form": "file",
"format": {
"type": "json",
"structure": ""
}
},
{
"name": "model_file",
"path": "model.dat",
"form": "file",
"format": {
"type": "state_dict",
"structure": ""
}
}
]
}
}
},
"scripts": {
"fed_avg_aggregate": {
"description": "FedAvg aggregate",
"path": "aggregate",
"type": "aggregation",
"input": {
"input_model_set": {
"description": "input models",
"path": "models",
"paramtype": {
"type": "model_set",
"form": "directory",
"paramtype": "the_model"
}
}
},
"output": {
"output_model": {
"description": "output models",
"path": "aggregated_model",
"paramtype": "the_model"
}
}
}
}
}