ElasticsearchのMLとKibanaのSaved Object
Elasticsearchでは機械学習(ML)関連の機能をいくつか提供しています。
- Anomaly Detection(異常検知)
- Data Frame Analytics(データフレーム分析)
- Trained Models (自然言語モデルのアップロードなど。ELSERやE5なども含む。)
基本的にこれらのMLの機能はElasticsearchが(Kibanaとは独立して)提供しています。
ただし、例えばKibana上からAnomaly Detectionジョブを作成すると、そのジョブは作成した時のKibana Spaceに紐づいた状態となります。複数のSpaceがある環境の場合、Spaceを切り替えると元のSpaceで作成したジョブは見えなくなるはずです。
これはKibanaがJobを作成する場合、直接ElasticsearchのML関連のデータを参照するのではなく、KibanaのSaved Objectを介して参照しているためです。このデータ構造については以下の記事でも紹介しました。
Saved Objectの検索
KibanaのSaved Objectは.kibana
というシステムインデックス(エイリアス)に保存されています。私の環境では.kibana_8.11.1_001
が実インデックスとして使われていました。これらのインデックスは、KibanaのSaved Objectを管理するためのもので、通常は直接操作することはありませんが、実際のデータ構造を理解するために、直接検索することは可能です。(現時点では。今後変わる可能性はあります。8系で試していますが、9.0でもまだアクセスできることは確認しました。)
.kibana
インデックスではtypeフィールドにSaved Objectの種類を示す値が格納されています。これを使って、特定のSaved Objectを検索することができます。
ML関連のSaved Objectのtypeは以下のようになっています。
- Anomaly Detection, Data Frame Analytics :
ml-job
- Trained Models :
ml-trained-model
ml-trained-model
のSaved Objectを検索してみましょう。
GET .kibana/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"type": {
"value": "ml-trained-model"
}
}
}
]
}
}
}
以下のような内容が取得できます。
{
"_index": ".kibana_8.11.1_001",
"_id": "ml-trained-model:tohoku-nlp__bert-base-japanese-v3",
"_score": 0,
"_source": {
"ml-trained-model": {
"model_id": "tohoku-nlp__bert-base-japanese-v3",
"job": null
},
"type": "ml-trained-model",
"references": [],
"managed": false,
"namespaces": [
"default"
],
"coreMigrationVersion": "8.8.0",
"typeMigrationVersion": "7.10.0",
"updated_at": "2024-02-27T06:50:32.951Z",
"created_at": "2024-02-27T06:50:32.951Z"
}
}
Spaceの関連付けの更新
KibanaのSaved Objectは、Spaceに関連付けられた状態で保存されます。これを更新するには、Update saved objects in spaces API を使用します。このAPIを使用すると、特定のSaved Objectを指定したSpaceに追加(あるいは削除)することができます。
よくある操作として、アップロードしたモデルを複数のスペースで使いたいというものがあります。KibanaのTrained Modelsの画面上からはできないので、Dev Toolsを利用して以下のようにKibana APIを利用して変更します。
POST kbn:/api/spaces/_update_objects_spaces
{
"objects": [
{
"id": ".elser_model_2_linux-x86_64",
"type": "ml-trained-model"
}
],
"spacesToAdd": [
"default",
"test"
],
"spacesToRemove": []
}
id
にはドキュメントのIDではなく、モデルのid(ml-jobの場合はjob_id
)を直接指定します。
このようにKibanaのAPIを利用することで、Saved ObjectのSpaceの関連付けを変更することができます。これにより、特定のSpaceに関連付けられたSaved Objectを他のSpaceでも利用できるようになります。
まとめ
ElasticsearchのML関連の機能は、KibanaのSaved Objectを介してSpaceに関連付けられています。これを変更するためには、KibanaのUpdate saved objects in spaces API を利用します。
特定のスペースで作成したML関連のオブジェクトを他のスペースで利用したい場合には、この記事を参考にしてください。