Knitfab v1.5.0 をリリースしました
皆さまこんにちは。あっという間に気温が下がりましたね。季節の移ろいはもうちょっと緩やかに感じていたいものです。
さて、私たちが開発しております MLOps 基盤ツール ”Knitfab” の最新バージョン v1.5.0 を、11/20 にリリースいたしました。今月も無事新しいリリースをお届けできることを嬉しく思います。
v1.5.0 の変更点は次のとおりです。
Plan 情報に、その隣の Plan の情報を追加しました。
機械学習タスクパイプラインを一望できる新コマンド `knit plan graph` が追加されました。
(破壊的変更) Data が Run のログとして生成されたとき、その `”upstream”` が通常の出力と区別がつかない状態だった問題を解消しました。
(破壊的変更) Plan 情報の JSON のキーの中に、命名規約が一貫していないものがあったので修正しました。
今回は「WebAPI や CLI 出力に含まれる JSON の構造変更」という破壊的変更を含みます。この「破壊的変更」の影響範囲は「v1.4.0 までの Knitfab が生成した JSON を処理するプログラム」です。
これまでのリネージや実験記録は、v1.5.0 にアップデートしてもそのままお使いいただけます。
Plan 情報に、その隣の Plan の情報を追加しました
`knit plan show` や `knit plan find` などで得られる Plan 情報に、その隣の Plan の情報を追加しました。
ここで「Plan A と Plan B が隣である」とは「Plan A に基づいた Run の出力が、Plan B の入力にアサインできる」という関係のことです。このとき、「Plan A は Plan B の上流側の隣にある」「Plan B は Plan A の下流側の隣にある」と捉えます。
この関係を示すために、Plan 情報に新しい要素を追加しました。
{
"planId": ...
...
"inputs": [
{
"path": "/in/1",
"tags": [ ... ],
"upstreams": [ // NEW!
{
"plan": {
"planId": "...",
"image": "...",
"entrypoint": [ ... ],
"args": [ ... ],
"annotations": [ ... ]
},
"mountpoint": { // 上流は通常の出力
"path": "/out/1",
"tags": [ ... ]
}
},
{
"plan": {
"planId": "...",
"image": "...",
"entrypoint": [ ... ],
"args": [ ... ],
"annotations": [ ... ]
},
"log": { // 上流はログ
"tags": [ ... ]
}
},
]
}
],
"outputs": [
{
"path": "/out/1",
"tags": [ ... ],
"downstreams": [ // NEW!
{
"plan": {
"planId": "...",
"image": "...",
"entrypoint": [ ... ],
"args": [ ... ],
"annotations": [ ... ]
},
"mountpoint": {
"path": "/in/2",
"tags": [ ... ]
}
},
]
}
],
...
Plan の `”inputs”` の要素に `”upstreams”` という新しいフィールドを追加しました。
`”upstreams”` に列挙されている各要素は、上流側の隣にある Plan と、隣接関係をつくっている相手方の出力(またはログ)です。「`”upstreams”` の要素にある出力(またはログ)から書き出された Data は、その入力にアサインされる」というわけですね。
`”outputs”` (と、上の例からは省かれていますが `”log”` も)に追加された `”downstreams”` はその逆で、下流側の情報、すなわち「その出力(またはログ)が生成した Data がアサインされる入力」が示されています。
これで、Plan について、その上流側・下流側の隣の Plan をたどっていけるようになりました。
機械学習タスクパイプラインを一望できる新コマンド `knit plan graph` が追加されました
Knitfab においては、機械学習タスクのパイプラインは、先ほど述べた Plan の上流・下流関係にしたがって構築されます。Plan 同士がその入出力の Tag を(Data を介して)参照し合うことで、自動的にタスクの連鎖が進む仕掛けです。
このパイプライン全体を、Plan 同士がつながったグラフ、すなわち「Plan グラフ」として一望するための新しいコマンド `knit plan graph` が追加されました。
次のように使います。
knit plan graph -n all PLAN_ID | dot -T png > plan-graph.png
こうすると、指定した ID の Plan を起点にして、上流側・下流側に隣接するノードを再帰的にたどっていって、その Plan に関わるパイプラインをグラフに示します。
このコマンドを使うと、たとえば次のようなグラフが得られます。
この図は、Plan 同士の上流・下流関係を矢印の向きで示しています。矢じり側が下流です。
細い黄色い枠が Plan 全体の輪郭を表しています。その中の太い黄色い枠内にその Plan の概要が書かれています。Plan ID の背景に色がついているものが、パイプライン探索の起点となった Plan です(つまり、この例は下流側から Plan グラフを調べた例だ、ということですね)。
輪郭上にある緑の点が入出力やログに対応しています。概要から点に向かって伸びている細い矢印に、その入出力のパスがラベルとしてついています。もしそれがログであるなら、パスの代わりに `(log)` というラベルがついています。
Plan の間をつないでいる太い矢印が、まさに Plan 同士の上流・下流関係を示しています。
上掲の例はごくシンプルな Plan グラフですが、`knit plan graph` は、もっと長く、複雑で、分岐・合流を含むような Plan グラフも生成できます。
`knit plan graph` を使うことで、複雑なパイプラインも、その構造をグラフィカルに確認できるようになりました。
(破壊的変更) Data が Run のログとして生成されたとき、その ”upstream” が通常の出力と区別がつかない状態だった問題を解消しました
`knit find data` をして得られる Data の情報について、その JSON の構造を一部変更しました。
変更したのは `”upstream”` フィールドです。このフィールドはその Data の生成元である Run の出力やログを示しています。
この変更で、 `”upstream”` フィールドは次のようになりました。
Data が通常の出力から生成された場合:
{
"knitId": " ... ",
"tags": [ ... ],
"upstream": {
"mountpoint": { // 通常の出力
"path": "/upload",
"tags": []
},
"run": { ... }
},
......
}
Data がログとして生成された場合:
{
"knitId": "70c491c1-dffb-4c6c-82c4-b6fcff87b4c8",
"tags": [ ... ],
"upstream": {
"log": { // ログとしての出力
"tags": [
"project:first-knitfab",
"type:log",
"type:validation"
]
},
"run": { ... }
},
......
}
これまでは、 `”upstream”` 要素中の `”mountpoint”` や `”log”` という要素が存在せず、代わりにその中身がそのまま `”upstream”` 要素に書かれていました。さらに、ログの場合は `”upstream”.”path”`(出力先のファイルパス)として、 `”/log”` という擬似的な値が書かれていました。この状態だと、Data の `”upstream”` を見ただけでは、その Data が本当にログとして書き出されたのか、それとも、単に `/log` というパスを書き出し先とした通常の出力に書き出されたのか、区別がつきませんでした(Run の情報と突き合わせることで一応確認はとれましたが)。
そこで、これからは、上記のように新しい要素 `”mountpoint”` および `”log”` を追加して、その Data が何として生成されたか、ということを Data 単体で把握できるようにしました。ただし、そのため、JSON の構造に後方互換性のない変更を加えることとなりました。
(破壊的変更) Plan 情報の JSON のキーの中に、命名規約が一貫していないものがあったので修正しました
これまで、 `knit plan show` などで得られる Plan 情報のログ情報(`”log”`)に含まれていた、タグ情報を示すフィールド名は `”Tags”` と大文字始まりで書かれていました。
他のフィールド名はすべて小文字始まりの lowerCamelCase で命名されているので、命名規約の一貫性を損なっています。今回の変更では、これを他と同じく小文字始まりの `”tags”` としました。
まとめ
以上、Knitfab v1.5.0 のリリースにおける変更点でした。詳細な内容や更新手順、最新版の CLI などは、GitHub のリリースページからアクセスできます。
今回のリリースは、新しいサブコマンドが追加されたことに加え、JSON 構造の破壊的変更を伴うものです。システム側と CLI とを足並みそろえて更新する必要がありますので、ご注意くださいませ。
新機能の `knit plan graph` と、一貫した Data や Plan の表現が皆さまのお役に立つことを願っています。