Overview

ここでは、Knitfab の概要を説明します。

主要機能

自動化されたリネージ管理

Knitfab はすべてのタスクを、そのリネージを追跡しながら自動実行します。

リネージとは,Knitfab上で実施したデータの更新やモデルの変更などについての全記録(履歴)のことです。

リネージの実体は、タスク(後述)の出力(例: 機械学習モデル, 性能メトリクス・ログ)がどうやって・いつ生成されたのかを記録した一連のデータです。

任意のタスクの出力について、それがどのプログラムから出力されたか、その際にプログラムにはどの入力が与えられたかを自動的に記録することで、Knitfab は複数のタスクに渡るリネージの網羅的な追跡・管理を達成します。

タグベースの宣言的ワークフロー

Kntifab は、取り扱うデータとタスクとの間を、データの性質を示すメタデータであるタグを用いて関連付けます。

タグによって「どのタスクにどのデータを入力してよいか」を表現することで、実行可能なタスクを網羅的かつ自動的に洗い出し、Knitfab が適宜自動実行します。また、その出力にもタグをプリセットできるので、その出力を利用する他のタスクを連鎖的に自動実行できます。

コンテナベースのタスク実行

Knitfab では、すべてのタスクを独立したコンテナに隔離して実行します。

このため、他のタスクと衝突する心配はありません。

また、Knitfab ではコンテナイメージ(docker イメージ)化した任意のタスクを実行できるので、実装に用いるプログラミング言語やフレームワークに制約がありません。

技術的には Kubernetes に基づいています。

コンセプト

タスク

Knitfab はタスクを、「なにか入力をとって、なにかを出力する」ものである、と捉えます。たとえば機械学習分野のタスクとしては、モデルの訓練スクリプトや、モデル評価用スクリプトがこれにあたりますが、これに限らず、任意のプログラムをタスクとすることができます。

Knitfab におけるタスクのルールは次のものです。

以上の事項を満たす限り、任意の言語やフレームワークでタスクを実装できます。

データとタグ/Data & Tags

タスクが入出力に用いるディレクトリを、Knitfab ではデータと呼びます。Knitfab のタスクはデータを入力されて、データを出力するもの」です

データの内容は制約がありません。任意のファイルを含むディレクトリをデータとして保持することができます。一度 Knitfab に記録されたデータの内容はイミュータブル(変更不可能)です。このため「過去の実験で使ったデータが変更されて、リネージが再現できなくなる」ということはありません。データを"更新"する場合には、同様のタグが設定された新しいデータとして登録します。

データは、その内容に加えて、タグというキー: バリュー型メタデータを設定できます。このタグはユーザが必要なだけ・自由に設定できて、「そのデータがどういう種類・性質のものか」を示すものです。例えば、

などです。

データの名前(name:...)や説明(description:...)などもタグとして設定するとよいでしょう。

もちろん、これらの他のタグも自由に設定できます。また、データが作成されたあとでも、タグは追加・削除することができます。

プランとタグ/Plan & Tags

プランとは、タスクの定義を与えるものです。すなわち、

といった事項を記述したものです。これによって「どういうタスクをどう実行すべきなのか? 」という定義を与えます。

プラン定義においては、入力に割り当てるデータを直接指定するのではなく、代わりに「どんなタグをもったデータを、その入力に割り当ててよいか」を指定します。入力に割り当てることができるデータは、その入力に指定されているタグをすべてもっているデータです。たとえば、「project:my-project, mode: train, type: dataset, format: csv」というタグが指定されている入力には、my-project のCSV 形式の訓練用データセットである(とタグで示された)データだけが割り当てられます。余計なタグがあっても構いませんが、タグが足りないデータは入力に割り当てられません。

出力にもタグを設定できます。そうすると、Knitfab はその出力に書き出されるデータに対して、自動的にそのタグをセットします。たとえば、訓練スクリプトを実行するプランの出力に「project: my-project, type: model, version: 1.x」というタグがセットされていれば、その出力に書き出されるデータは「my-project のバージョン 1 系 モデルである」ということがわかります。

プランの出力のうちで特殊なものとして、ログがあります。これは、タスクの標準出力・標準エラーの内容を自動的に収集してデータとして残したものです。もちろん、ログも出力の一種なので、出力と同様にタグをつけることができます。

ランとリネージ/Run & Lineages

Knitfab は、保有しているデータとプランに基づいて、自動的にタスクを実行します。この個々の実行が Knitfab のランです。

すべての入力にデータが割り当てられているプランを見つけると、Knitfab はその割り当てられているデータの組み合わせを調べて「まだ実行したことがない入力とデータの組み合わせ」になっているランを生成します。

例えば、「訓練データセット」(とタグ付けられたデータ)と「ハイパーパラメータ」(とタグ付けられたデータ)をそれぞれ入力に取るプランがあったとします。新しいハイパーパラメータがデータとして登録されると、Knitfab は、その新しいハイパーパラメータと既存の各訓練データセットの組み合わせのそれぞれについて、ランを生成して、自動実行します。

ランは、見方を変えると「ある出力データが、どのプログラムに、どういう入力を渡したときに生成されたか」という記録でもあります。ランの連鎖が、Knitfab におけるリネージです。

CLI ツール: knit

Knitfab に対する通常の操作は、すべて CLI コマンド knit を介して行います。

データの登録、取り出し、ランの状況確認、ログ読み取り、プランの定義など、一通りの機能が備わっています。

Knitab で MLOps の課題を解決する

実験と実験管理のヌケモレを防ぐ

Knitfab を使うことで、実験と実験管理のヌケモレがなくなります。

Knitfab は、タグに基づいて「実行可能だが実行されてはいない」ランを探して、自動的に実行します。また、その際に「プログラムの入出力が何だったか」を記録します。

例えば、あらかじめ Knitfab に訓練用データと訓練スクリプトを指定したプランが登録されていれば、あとはハイパーパラメータをどんどん登録するだけで、各ハイパーパラメータの実験がリネージ記録つきで実施されます。

定型タスクを自動化する

新規モデルのリリース判定のような「所定のデータセットに対して、新旧モデルで評価して、性能比較を行う」といったタスクも、新規作成されたモデルにタグをつけて Knitfab に登録するだけで自動実行できます。

Knitfab ではデータとプラン入力はタグによって関連付けられるので、評価用スクリプトが指定されたプランの入力と対応するタグをセットして、新しいモデルを登録すればよいのです。また、モデル以外の実験条件もプランに従って決まるので、常に一定の条件で比較できます。

ランから出力されたデータにも自動的にタグがつくので、そのデータを割り当て可能なプランがあれば、連鎖的にランが生成されます。これを利用して、複雑なワークフローであっても自由に定義・構築することができます。

たとえば、継続的学習のようなタスクでも「定期的に所定のタグをつけてデータセットを登録することで、訓練から評価まで順次実施する」ようなワークフローとして構築できます。

トレーサビリティを担保する

どんなデータであっても、Knitfab 内で生成されたデータであれば、そのリネージを遡って「どうやって生成されたか」を調べることができます。複雑なワークフローの終端側で生成されたデータであっても、必ずリネージは始端(Knitfab にユーザが手作業で登録したデータ)までつながっています。

したがって、Knitfab を使えば、データのトレーサビリティが常に担保できます。

計算機資源を分配する

Knitfab がランを自動的に実行するので、計算機資源は自動的に分配されます。

GPU に対する要求などもプラン定義に含めることができるので、Knitfab 管理者による設定に応じ、プランごとに適切な計算機資源を割り当てることができます。

次のコンテンツ