LoginSignup
2
1

More than 1 year has passed since last update.

Databricksにおける機械学習モデルの管理

Last updated at Posted at 2021-10-20

Manage models | Databricks on AWS [2021/10/14時点]の翻訳です。

DatabricksはMLflowモデルの完全なライフサイクル管理を支援するために、ホストされたMLflowモデルレジストリを提供します。モデルレジストリは、時系列のモデルリネージュ(ある時点でどのMLflowエクスペリメントとランがモデルを生成したいのか)、モデルのバージョン管理、ステージ遷移(例えば、ステージングからプロダクション、アーカイブへ)、モデルのイベント発生時のメール通知といった機能を提供します。モデルに対する説明文やコメントを追加することもできます。

本書では、機械学習ワークフローの一部としてのモデルレジストリの使い方と、モデルレジストリUIとモデルレジストリAPI両方の使用法を説明します。

モデルレジストリのコンセプト概要については、MLflow guideをご覧ください。

要件

モデルレジストリのUIを使用するには以下のランタイムが必要です。

  • Databricks Runtime 6.4以降、かつ mlflow>=1.7.0 がインストールされている
  • Databricks Runtime 6.4 ML、かつ mlflow>=1.7.0 がインストールされている
  • Databricks Runtime 6.5 ML以降

モデルレジストリのAPIを使用するには以下のランタイムが必要です。

  • Databricks Runtime 6.5以降
  • Databricks Runtime 6.5 ML以降
  • Databricks Runtime 6.4以前、かつ mlflow>=1.7.0 がインストールされている
  • Databricks Runtime 6.4 ML以前、かつ mlflow>=1.7.0 がインストールされている

モデルの作成、登録

UIを用いたモデルの作成、登録

モデルレジストリにモデルを登録するには2つの方法があります。MLflowで記録された既存モデルを登録するか、新規の空のモデルを作成、登録し、事前に記録されたモデルを割り当てることができます。

ノートブックから記録済みの既存モデルを登録する

  1. ワークスペースにおいて、登録したいモデルを含むMLflowランを特定します。
    1. ノートブックツールバーのExperimentアイコンをクリックします。
    2. Experiment Runsサイドバーで、ランの日付の隣にあるアイコンをクリックします。MLflowランページが表示されます。このページでは、パラメーター、メトリクス、タグ、アーティファクトのリストを含むランの詳細が表示されます。
  2. Artifactセクションで、xxx-modelという名前のディレクトリをクリックします。     
  3. 一番右にあるRegister Modelをクリックします。
  4. ダイアログで、Modelボックスをクリックし、以下のいずれかを実行します。
    • ドロップダウンメニューからCreate New Modelをクリックします。Model Nameフィールドが表示されるので、scikit-learn-power-forecastingと言ったモデルの名前を入力します。
    • ドロップダウンメニューから既存のモデルを選択します。
  5. Registerをクリックします。

    • Create New Modelを選択した際には、scikit-learn-power-forecastingというモデルが登録され、MLflowモデルレジストリによって管理されるセキュアな場所にモデルがコピーされ、新規バージョンのモデルが作成されます。
    • 既存のモデルを選択した場合には、選択されたモデルの新規バージョンを作成します。

    しばらくすると、Register Modelボタンは、新規モデルバージョンへのリンクに変化します。

  6. モデルレジストリUIで新規モデルバージョンを開くにはリンクをクリックします。あるいは、サイドバーのModelsをクリックすることでモデルレジストリにあるモデルを検索することができます。

新規登録モデルを作成し、記録済みモデルを割り当てる

空の新規モデルを作成するために、Registered modelsページのCreate Modelボタンを使用し、記録されたモデルを割り当てることもできます。以下の手順を踏んでください。

  1. Registered modelsページで、Create Modelをクリックします。モデルの名前を入力し、Createをクリックします。
  2. ノートブックから記録済みの既存モデルを登録するのステップ1からステップ3を実行します。
  3. Register Modelダイアログで、ステップ1で作成したモデルの名前を選択し、Registerをクリックします。これによって、指定された名前のモデルが作成され、MLflowモデルレジストリによって管理されるセキュアな場所にモデルがコピーされ、モデルバージョンVersion 1が作成されます。

    しばらくすると、MLflow Run UIはRegister Modelボタンを新たに登録されたモデルバージョンのリンクで置き換えます。これにより、Experiment RunsページのRegister ModelダイアログのModelドロップダウンリストからモデルを選択できるようになります。また、Create ModelVersionのようなAPIコマンドでモデル名を指定することで新規バージョンを登録することもできます。

APIを用いたモデルの登録

プログラムからモデルレジストリにモデルを登録する方法は3つあります。全ての方法において、MLflowが管理するセキュアな場所にモデルがコピーされます。

  • MLflowエクスペリメントにおいて、指定された名前でモデルを記録、登録するには、mlflow.<model-flavor>.log_model(...)メソッドを使用します。指定された登録モデルが存在しない場合には、このメソッドは新規モデルを登録し、バージョン1を作成し、ModelVersion MLflowオブジェクトを返却します。指定された名前の登録モデルが存在しる場合には、このメソッドは新規バージョンを作成し、バージョンオブジェクトを返却します。
Python
with mlflow.start_run(run_name=<run-name>) as run:
  ...
  mlflow.<model-flavor>.log_model(<model-flavor>=<model>,
    artifact_path="<model-path>",
    registered_model_name="<model-name>"
  )
  • エクスペリメントの全てのランが完了し、どのモデルをレジストリに登録するのが最も適しているのかを決断した後で、特定の名前でモデルを登録するには、mlflow.register_model()メソッドを使用します。このメソッドにおいては、mlruns:URI引数に対してランのIDが必要となります。指定された登録モデルが存在しない場合には、このメソッドは新規モデルを登録し、バージョン1を作成し、ModelVersion MLflowオブジェクトを返却します。指定された名前の登録モデルが存在しる場合には、このメソッドは新規バージョンを作成し、バージョンオブジェクトを返却します。
Python
result=mlflow.register_model("runs:<model-path>", "<model-name>")
  • 特定の名前で新たに登録済みモデルを作成するには、MLflow Client APIのcreate_registered_model()メソッドを使用します。指定されたモデルが存在する際には、このメソッドはMLflowExceptionをスローします。
Python
client = MlflowClient()
result = client.create_registered_model("<model-name>")

モデルのアクセス権管理

モデルレジストリに登録されているモデルへのアクセスコントロールについて学ぶには、MLflowモデルのアクセス権を参照ください。

モデルのステージ遷移

モデルのバージョンには以下のステージがあります: NoneStagingProductionArchivedです。Stagingのステージは、モデルのテスト、検証段階を意味し、Productionのステージは、モデルのテストやレビュープロセスが完了し、ライブのスコアリングのためのアプリケーションとしてデプロイされたことを意味します。Archivedされたモデルバージョンはアクティブではない状態と考えられ、当該モデルの削除を検討することになります。異なるバージョンのモデルは異なるステージになることが可能です。

適切なアクセス権を持つユーザーが、モデルバージョンのステージを遷移させることができます。特定のステージにモデルを遷移できるアクセス権を持っているのであれば、直接遷移を行うことができます。アクセス権がない場合には、モデルバージョンを遷移できる権限を持つユーザーに、ステージ遷移をリクエストすることができ、権限を持つユーザーが承認、リジェクト、キャンセルを行うことができます。

UIを用いたモデルステージの遷移

モデルのステージを遷移するには以下の手順を踏んでください。

  1. モデルバージョンページにおいて利用可能なモデルステージとオプションの一覧を表示するには、Stage: <Stage>ボタンをクリックし、別のステージへの遷移をリクエストします。
  2. オプションでコメントを入力しOKをクリックします。

モデルバージョンをプロダクションステージに遷移

テスト、検証の後で、Productionステージに遷移、あるいは遷移をリクエストすることができます。

モデルレジストリでは、それぞれのステージに1つ以上のバージョンのモデルを割り当てることができます。1つのバージョンのみをProductionに割り当てたい場合には、Transition existing Production model versions to Archivedをチェックすることで、現状Productionステージにある全てのバージョンのモデルをアーカイブにすることできます。

モデルバージョンのステージ遷移リクエストの承認、リジェクト、キャンセル

ステージ遷移権限を持たないユーザーは、ステージ遷移をリクエストすることができます。モデルバージョンページのPending Requestsにリクエストが表示されます。

ステージ遷移リクエストを承認、リジェクト、キャンセルするにはApproveRejectCancelリンクをクリックします。

遷移リクエストを申請した本人は、申請をキャンセルすることができます。

モデルバージョンのアクティビティの参照

モデルバージョンに対するステージ遷移のリクエスト、承認、ペンディング状態を見るには、Activitiesセクションに移動します。監査、検査目的でモデルのライフサイクルのリネージュを提供するアクティビティのレコードが表示されます。

APIを用いたモデルステージの遷移

適切なアクセス権を持つユーザーは、モデルバージョンを新たなステージに遷移することができます。

モデルバージョンのステージを新たなステージに更新するには、MLflow Client APIのtransition_model_version_stage()メソッドを使用します。

Python
  client = MlflowClient()
  client.transition_model_version_stage(
    name="<model-name>",
    version=<model-version>,
    stage="<stage>",
    description="<description>"
  )

<stage>に指定できる値は、"Staging"|"staging""Archived"|"archived"、"Production"|"production""None"|"none"`です。

モデルを用いた推論

プレビュー
本機能はパブリックプレビューです。

モデルをモデルレジストリに登録した後で、モデルをバッチ推論で使用するノートブックを自動で生成したり、リアルタイムサービングで使用するエンドポイントを作成することができます。

登録モデルページ、あるいはモデルバージョンページのの右上にあるボタンをクリックします。バッチ推論、リアルタイム推論のためのモデル推論の設定ダイアログが表示されます。

バッチ推論の設定

以下の手順に従ってバッチ推論ノートブックを作成した際、あなたのユーザーフォルダーのBatch-Inferenceフォルダー配下にモデル名称でノートブックが保存されます。必要に応じてノートブックを編集することができます。

  1. Batch inferenceタブをクリックします。
  2. Model versionドロップダウンから、使用するモデルバージョンを選択します。ドロップダウンの最初の2つのアイテムは、(存在する場合には)モデルの現行のProductionとStagingバージョンのものとなります。これらのオプションの1つを選択すると、ノートブックは自動で実行時にProduction、Stagingのバージョンを使用します。モデルを開発する過程でノートブックを更新する必要はありません。
  3. Input tableの隣のBrowseボタンをクリックします。入力データを選択するダイアログが表示されます。必要に応じて、Computeドロップダウンでクラスターを変更します。
  4. モデルの入力データを格納するデータベースとテーブルを選択し、Selectをクリックします。生成されるノートブックは自動でこのデータをインポートし、モデルに送信します。モデルに入力する前にデータ変換が必要がある場合には、生成されたノートブックを編集することができます。
  5. 予測結果はdbfs:/FileStore/batch-inferenceディレクトリ内のフォルダーに保存されます。デフォルトでは、モデル名と同じフォルダーに予測結果が保存されます。生成されたノートブックのそれぞれのランは、このディレクトリにモデル名にタイムスタンプを追加した形で予測結果を新規ファイルに保存します。後続のノートブックのランの結果でファイルを上書きするように、タイムスタンプを含めないように選択することができます。手順は生成されるノートブックに記載されています。

    Output table locationフィールドに新規フォルダー名を入力するか、フォルダーアイコンをクリックしてディレクトリをブラウズしてフォルダーを選択することで、予測結果を保存する場所を変更することができます。

リアルタイム推論の設定

  1. モデル推論設定ダイアログでReal-timeタブをクリックします。
  2. モデルに対するサービングが有効化されていない場合には、Enable servingをクリックします。登録モデルページが表示され、StatusにはPendingが表示されます。数分後にStatusはReadyになります。

    サービングがすでに有効化されている場合には、Servingタブを表示するためにView existing real-time inferenceをクリックします。

フィードバックの提供

この機能はプレビューであり、皆様からのフィードバックは大歓迎です。フィードバックを送信するには、Configure model inferenceダイアログのProvide Feedbackをクリックします。

通知設定

指定した登録モデル、モデルバージョンのアクティビティに関してメールによる通知を受け取れるように、モデルレジストリを設定することができます。

Registered Modelページにおいて、Notify me aboutメニューに3つのオプションが表示されます。

  • All new activity: 当該モデルの全てのバージョンのモデルに関する全てのアクティビティに関してメールによる通知を行います。登録モデルを作成した際、この設定がデフォルトとなります。
  • Activity on versions I follow: フォローしているバージョンのモデルに対してのみ通知が行われます。この選択により、フォローするモデルバージョン全てに関する通知を受け取ることができます。特定のモデルバージョンの通知をオフにすることはできません。
  • Mute notifications: この登録モデルに関するアクティビティの通知を受け取りません。

以下のイベントによってメール通知が行われます。

  • 新規モデルバージョンの作成
  • ステージ遷移のリクエスト
  • ステージ遷移
  • 新規コメント

以下のいずれかを実行した際に、自動でモデル通知にサブスクライブすることになります。

  • モデルバージョンに対するコメント
  • モデルバージョンのステージ遷移
  • モデルステージ遷移のリクエスト

モデルバージョンをフォローしているかどうかを確認するには、モデルバージョンページのFollow Statusフィールドを参照するか、登録モデルページのモデルバージョンテーブルを参照します。

全てのメール通知をオフに

User SettingメニューのモデルレジストリのSettingタブで全てのメール通知をオフにすることができます。

  1. Databricksワークスペースの左下にあるSettingをクリック。
  2. User Settingsをクリック。
  3. Model Registry Settingsタブに移動。
  4. Turn on model registry email notificationsの選択を解除。

管理者はAdmin Consoleで組織全体のメール通知をオフにすることができます。

メール送信の最大数

モデルレジストリがそれぞれのユーザーに対してアクティビティごとに1日当たり送信するメールの数には制限があります。例えば、登録モデルに対して新規モデルバージョンが作成されたことを告げるメールを20通受け取った場合、モデルレジストリは1日の送信上限に到達したことを知らせるメールを送信し、次の日までそのイベントを知らせるメールを送信しません。

メール送信数の上限を引き上げるには、Databricks担当にお問い合わせください。

モデル、モデルバージョンに対する注釈

モデルやモデルバージョンに注釈をつけることで情報を提供することができます。例えば、問題の概要、使用した方法論、アルゴリズムに関する説明を追加することができます。

UIを用いたモデル、モデルバージョンへの注釈

2つの方法でモデルに注釈を追加することができます。説明文、あるいはコメントです。説明文はモデルとモデルバージョンで利用できます。コメントはモデルバージョンでのみ利用できます。説明文はモデルに関する情報を提供するためのものです。コメントはモデルバージョンのアクティビティに対する議論を保存する手段です。

モデル、モデルバージョンへの説明の追加、更新

  1. 登録モデルページやモデルバージョンページで、Descriptionアイコンをクリックします。編集ウィンドウが表示されます。
  2. 編集ウィンドウで説明文を入力、編集します。
  3. Saveをクリックします。

    モデルバージョンの説明文を入力した際、説明文は登録モデルページのテーブルのDescriptionカラムに表示されます。カラムには最大32文字のテキスト、あるいは1行のテキストの短い方が表示されます。

モデルバージョンへのコメント

  1. モデルバージョンページをスクロールダウンし、Activitiesの隣の下向き矢印をクリックします。
  2. 編集ウィンドウにコメントを入力し、Add Commentをクリックします。

APIを用いたモデルの注釈

モデルバージョンの説明文を更新するには、MLflow Client APIのupdate_model_version()メソッドを使用します。

Python
client = MlflowClient()
client.update_model_version(
  name="<model-name>",
  version=<model-version>,
  description="<description>"
)

モデルの名称変更(APIのみ)

登録モデルの名前を変更するには、MLflow Client APIのrename_registered_model()メソッドを使用します。

Python
client=MlflowClient()
client.rename_registered_model("<model-name>", "<new-model-name>")

注意
バージョンが存在しない場合、あるいは全てのバージョンがNone、Archivedステージの場合にのみ登録モデルの名前を変更できます。

モデルの検索

全ての登録モデルは、MLflowモデルレジストリに存在します。UIあるいはAPIでモデルを検索することができます。

UIによるモデルの検索

サイドバーのModelsアイコンをクリックして、全ての登録モデルを表示します。

特定のモデルを検索するには、検索ボックスにモデルの名前を入力します。

タグを用いてモデルをフィルタリングすることができます。Filterをクリックし、tags.<key>=<value>の書式でタグを入力します。複数タグでフィルタリングするにはANDオペレーターを使用します。

APIによるモデルの検索

全ての登録モデルのリストを取得するには、MLflow Client APIのlist_model_versions()メソッドを使用します。

Python
from pprint import pprint

client = MlflowClient()
for rm in client.list_registered_models():
  pprint(dict(rm), indent=4)

出力は以下のようになります。

{   'creation_timestamp': 1582671933216,
    'description': None,
    'last_updated_timestamp': 1582671960712,
    'latest_versions': [<ModelVersion: creation_timestamp=1582671933246, current_stage='Production', description='A random forest model containing 100 decision trees trained in scikit-learn', last_updated_timestamp=1582671960712, name='sk-learn-random-forest-reg-model', run_id='ae2cc01346de45f79a44a320aab1797b', source='./mlruns/0/ae2cc01346de45f79a44a320aab1797b/artifacts/sklearn-model', status='READY', status_message=None, user_id=None, version=1>,
    <ModelVersion: creation_timestamp=1582671960628, current_stage='None', description=None, last_updated_timestamp=1582671960628, name='sk-learn-random-forest-reg-model', run_id='d994f18d09c64c148e62a785052e6723', source='./mlruns/0/d994f18d09c64c148e62a785052e6723/artifacts/sklearn-model', status='READY', status_message=None, user_id=None, version=2>],
    'name': 'sk-learn-random-forest-reg-model'}

MLflow Client APIのsearch_model_versions()を用いることで、特定のモデル名で検索を行い、バージョンの詳細一覧を取得することができます。

Python
from pprint import pprint

client=MlflowClient()
[pprint(mv) for mv in client.search_model_versions("name=<model-name>")]

出力は以下のようになります。

{   'creation_timestamp': 1582671933246,
    'current_stage': 'Production',
    'description': 'A random forest model containing 100 decision trees '
                   'trained in scikit-learn',
    'last_updated_timestamp': 1582671960712,
    'name': 'sk-learn-random-forest-reg-model',
    'run_id': 'ae2cc01346de45f79a44a320aab1797b',
    'source': './mlruns/0/ae2cc01346de45f79a44a320aab1797b/artifacts/sklearn-model',
    'status': 'READY',
    'status_message': None,
    'user_id': None,
    'version': 1 }

{   'creation_timestamp': 1582671960628,
    'current_stage': 'None',
    'description': None,
    'last_updated_timestamp': 1582671960628,
    'name': 'sk-learn-random-forest-reg-model',
    'run_id': 'd994f18d09c64c148e62a785052e6723',
    'source': './mlruns/0/d994f18d09c64c148e62a785052e6723/artifacts/sklearn-model',
    'status': 'READY',
    'status_message': None,
    'user_id': None,
    'version': 2 }

モデル、モデルバージョンの削除

UIあるいはAPIからモデルを削除することができます。

UIによるモデルバージョン、モデルの削除

警告!
この操作を取り消すことはできません。レジストリからモデルバージョンを削除するのではなく、モデルバージョンをArchivedステージに遷移させることができます。モデルを削除した際、モデルレジストリに格納されている全てのモデルのアーティファクト、登録モデルに関係する全てのメタデータが削除されます。

注意
None、Archivedステージのモデル、モデルバージョンのみを削除できます。登録モデルにStaging、Productionステージのモデルバージョンがある場合には、モデルを削除する前にNone、Archivedステージに遷移させる必要があります。

モデルバージョンを削除するには、以下の手順を踏みます。

  1. サイドバーのModelsをクリック
  2. モデル名をクリック
  3. モデルバージョンをクリック
  4. 画面の右上にあるをクリックし、ドロップダウンメニューからDeleteを選択

モデルを削除するには、以下の手順を踏みます。

  1. サイドバーのModelsをクリック
  2. モデル名をクリック
  3. 画面の右上にあるをクリックし、ドロップダウンメニューからDeleteを選択

APIによるモデルバージョン、モデルの削除

警告!
この操作を取り消すことはできません。レジストリからモデルバージョンを削除するのではなく、モデルバージョンをArchivedステージに遷移させることができます。モデルを削除した際、モデルレジストリに格納されている全てのモデルのアーティファクト、登録モデルに関係する全てのメタデータが削除されます。

注意
None、Archivedステージのモデル、モデルバージョンのみを削除できます。登録モデルにStaging、Productionステージのモデルバージョンがある場合には、モデルを削除する前にNone、Archivedステージに遷移させる必要があります。

モデルバージョンの削除

モデルバージョンを削除するには、MLflow Client APIのdelete_model_version()メソッドを使用します。

Python
# Delete versions 1,2, and 3 of the model
client = MlflowClient()
versions=[1, 2, 3]
for version in versions:
  client.delete_model_version(name="<model-name>", version=version)

モデルの削除

モデルを削除するには、MLflow Client APIのdelete_registered_model()メソッドを使用します。

Python
client = MlflowClient()
client.delete_registered_model(name="<model-name>")

ワークスペースをまたがるモデル共有

Databricksでは、複数のワークスペースでのモデル共有をサポートしています。例えば、ご自身のワークスペースでモデルを開発、記録し、集中管理されたモデルレジストリにモデルを登録することができます。これは、複数のチームがモデルにアクセスする際に有用です。複数のワークスペースを作成し、環境にまたがってモデルを管理することができます。

サンプル

このサンプルでは、機械学習アプリケーションを構築する際にどのようにモデルレジストリを活用するのかを説明しています。。

Databricks 無料トライアル

Databricks 無料トライアル

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1