DatabricksのUnity Catalogを用いた機械学習: ベストプラクティス

[Machine Learning with Unity Catalog on Databricks: Best Practices \| Databricks Blog](https://www.databricks.com/blog/machine-learning-unity-catalog-databricks-best-practices)の翻訳です。

:::note warn
本書は著者が手動で翻訳したものであり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

:::note info
**サマリー**
- Unity Catalogを用いた、データの前処理からモデルのトレーニング、デプロイメントに至るシームレスなMLモデルの構築とデプロイ。
- ロールベースのアクセス制御、グループ向けクラスター、ガバナンス機能を活用することによるセキュアなコラボレーションの強化。
- 効率的なMLワークフローのための専用のグループクラスター、Delta Live Tablesによる計算リソースの最適化。
:::

エンドツーエンドでのAIやMLのプラットフォームの構築には多くの場合、データを分析し、ビジネス部門と学びを共有するために、ストレージ、分析、ビジネスインテリジェンス(BI)ツール、MLモデルの複数の技術的なレイヤーを必要とします。ここでの課題は、異なるチームが関与する様々なツールに対して一貫性があり効果的なガバナンスコントロールを適用することです。

Unity Catalogはデータアクセス、セキュリティ、リネージを管理するために設計されたDatabricksビルトインの集中管理されたメタデータレイヤーです。これは、プラットフォームにおける検索や発見の基盤としても機能します。Unity Catalogは、ロールベースのアクセスコントロール、監査追跡、データマスキングのような堅牢な機能を提供することで、チーム間のコラボレーションを促進し、生産性を阻害することなしにセンシティブな情報の保護を確実なものとします。また、これはMLモデルにおけるエンドツーエンドのライフサイクルをサポートしています。

このガイドでは、機械学習ユースケースや計算リソースの共によるチーム間のコラボレーションにおけるUnity Catalogの活用方法に対する包括的な概要とガイドラインを提供します。

このブログ記事では、DatabricksにおけるUnity Catalogの高度な機能による機械学習のエンドツーエンドのライフサイクルにおけるステップをウォークスルーします。

本書の例では、USにおける日毎のCOVID-19の感染者数のレコードを含むデータセットと追加の地理情報を用います。ここでのゴールは、USにおける向こう7日間でのウィルス感染者数を予測することです。

# DatabricksのMLのキーとなる機能

Databricksは、Unity CatalogにおけるMLのサポートを改善するために複数の機能をリリースしました。

- [Databricks機械学習ランタイム](https://docs.databricks.com/aws/ja/machine-learning/databricks-runtime-ml)(Databricks Runtime ML): 最も一般的なML、DLライブラリを含む構築済みの機械学習、ディープラーニングインフラストラクチャを用いてクラスター作成を自動化します。
- [グループ専用クラスター](https://docs.databricks.com/aws/ja/compute/group-access): 専用アクセスモードを用いてグループに割り当てられるDatabricks機械学習ランタイムが稼働する計算リソースを作成します。
- [デリケートなアクセスモードにおけるきめ細かいアクセスコントロール](https://docs.databricks.com/aws/ja/compute/single-user-fgac): 専用アクセスモードで動作するDatabricks機械学習ランタイムのクラスターで実行されるクエリーに対するきめ細かいアクセスコントロールを可能にします。これは、[マテリアライズドビュー](https://docs.databricks.com/aws/ja/views/materialized)、[ストリーミングテーブル](https://docs.databricks.com/aws/ja/tables/streaming)、[標準的なビュー](https://docs.databricks.com/aws/ja/views)をサポートします。

# 要件

- ワークスペースではUnity Catalogが有効化されている必要があります。ワークスペース管理者は、ワークスペースにおけるUnity Catalogの有効化方法を[マニュアル](https://docs.databricks.com/aws/ja/data-governance/unity-catalog/enable-workspaces)でチェックすることができます。
- Databricksランタイム15.4 LTS ML以上を使う必要があります。
- ワークスペース管理者はプレビューUIを用いてCompute: Dedicated group clustersを有効化する必要があります。[Databricks プレビューの管理](https://docs.databricks.com/aws/ja/admin/workspace-settings/manage-previews)をご覧ください。
- ワークスペースでSecure Egress Gateway (SEG)が有効化されている場合、許可ドメインリストに`pypi.org`を追加する必要があります。[サーバレスエグレスコントロールのネットワークポリシーの管理](https://docs.databricks.com/aws/ja/security/network/serverless-network-security/manage-network-policies)をご覧ください。

# グループのセットアップ

コラボレーションを可能にするには、**アカウント管理者**あるいは**ワークスペース管理者**は、以下の手順でグループをセットアップする必要があります:

1. 右上のユーザーアイコンをクリックし、設定をクリックします。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-1.png?v=1740399227)
1. 「Workspace Admin」セッションにある「Identity and access」をクリックし、グループセクションの「Manage」をクリックします。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-2.png?v=1740399227)
1. 「Add group」をクリックし、
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-3.png?v=1740399227)
1. 「Add new」をクリックします。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-4.png?v=1740399227)
1. グループ名を入力して「Add」をクリックします。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-5.png?v=1740399227)
1. 新たに作成したグループを検索し、Source列が「Account」になっていることを確認します。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-6.png?v=1740399227)
1. 検索結果のグループ名をクリックしてグループの詳細に移動します。
1. 「Members」タブをクリックし、グループに割り当てるメンバーを追加します。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-7.png?v=1740399227)
1. 「Entitlements」タブをクリックし「Workspace access」と「Databricks SQL access」の両方をチェックします。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-8.png?v=1740399227)
1. すべての非管理者アカウントからこのグループを管理できるようにするには、「Permissions」タブで当該アカウントに「Group: Manager」アクセス権を付与することができます。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-9.png?v=1740399227)
1. 注意: グループクラスターを使うためにはユーザーはこのグループのメンバーである**必要があります**。グループマネージャだけでは権限が不足します。

# グループ専用クラスターの有効化

グループ専用クラスターはパブリックプレビューなので、この機能を有効化するには[プレビューUI](https://docs.databricks.com/aws/ja/admin/workspace-settings/manage-previews)を用いてこの機能を有効化する必要があります。

1. Databricksワークスペースのトップバーでユーザー名をクリックします。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-10.png?v=1740399227)
1. メニューからPreviewsを選択します。
1. プレビュー機能を有効化、無効化するにはCompute: Dedicated group clustersのトグルを使用します。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-12.png?v=1740399227)

# グループコンピュートの作成

専用アクセスモードはシングルユーザーアクセスモードの最新バージョンです。専用アクセスを用いることで、計算リソースを単一のユーザーあるいはグループに割り当てることができ、割り当てられたユーザーのみがその計算リソースを使用することができます。

Databricks機械学習ランタイムが稼働するクラスターを作成するには:

1. Databricksワークスペースでクラスターに移動し、コンピューティングを作成をクリックします。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-13.png?v=1740399227)
1. Databricks機械学習ランタイムを選択するには、パフォーマンスセクションで「機械学習」をチェックします。Databricksランタイムでは「15.4 LTS」を選択します。必要なインスタンスタイプとワーカー数を選択します。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-14.png?v=1740399227)
1. ページ下部のAdvancedセクションを展開します。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-15.png?v=1740399227)
1. アクセスモードで手動を選択し、ドロップダウンから専用 (旧: シングルユーザー)を選択します。
1. シングルユーザーまたはグループのフィールドで、このリソースに割り当てたいグループを選択します。
1. 必要に応じて他の設定を行い、作成をクリックします。

クラスターが起動すると、グループに属しているすべてのユーザーは同じクラスターを共有することができます。詳細に関しては、[グループ クラスターを管理するためのベスト プラクティス](https://docs.databricks.com/aws/ja/compute/group-access#best-practices-for-managing-group-clusters)をご覧ください。

# Delta Live Tables(DLT)を通じたデータの前処理

このセクションでは以下を行います:

- 生データを読み込んでボリュームに保存します。
- 取り込みテーブルからレコードを読み込み、クレンジングしたデータを格納する新規テーブルを作成するためにDelta Live Tablesのエクスペクテーションを活用します。
- 派生データセットを作成するDelta Live Tablesのクエリーに対する入力として、クレンジングしたレコードを使用します。

DLTパイプラインをセットアップするためには、以下の権限を必要とする場合があります:

- 親のカタログにおける`USE CATALOG`、`BROWSE`
- ターゲットスキーマにおける`ALL PRIVILEGES`あるいは`USE SCHEMA`、`CREATE MATERIALIZED VIEW`、`CREATE TABLE`権限

1. ボリュームにデータをダウンロードします: この例ではUnity Catalogのボリュームからデータをロードします。

    ```py
    my_catalog = "<catalog-name>"
    my_schema = "<schema-name>"
    my_volume = "<volume-name>"
    
    spark.sql(f"CREATE SCHEMA IF NOT EXISTS {my_catalog}.{my_schema}")
    spark.sql(f"CREATE VOLUME IF NOT EXISTS {my_catalog}.{my_schema}.{my_volume}")
    
    volume_path = f"/Volumes/{my_catalog}/{my_schema}/{my_volume}/"
    download_url = "/databricks-datasets/COVID/covid-19-data/us-counties.csv"
    filename = "us-counties.csv"
    
    dbutils.fs.cp(download_url, volume_path + filename)
    ```

    `<catalog-name>`、`<schema-name>`、`<volume-name>`をUnity Catalogのカタログ、スキーマ、ボリュームの名前で置き換えます。上のコードは、それらのオブジェクトが存在しない場合にはスキーマとボリュームの作成を試みます。Unity Catalogのオブジェクトの作成、書き込みを行うためには適切な権限が必要となります。[要件](https://docs.databricks.com/aws/ja/delta-live-tables/tutorial-pipelines#requirements)をご覧ください。

1. パイプラインを作成します。新規パイプラインを作成するには以下を実施します:
    - サイドバーで、**データエンジニアリング**セクションにある**Delta Live Tables**をクリックします。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-16.png?v=1740399227)
    - **パイプラインを作成**をクリックします。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-17.png?v=1740399227)
    - パイプライン名にはユニークなパイプライン名を入力します。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-18.png?v=1740399227)
    - サーバレスチェックボックスを選択します。
    - 配信先では、テーブルが公開されるUnity Catalogのロケーションを設定し、カタログとスキーマを選択します。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-19.png?v=1740399227)
    - Advancedでは設定を追加し、以下のパラメータ名を用いて、データをダウンロードしたカタログ、スキーマ、ボリュームのパイプラインパラメータを定義します:
        - my_catalog
        - my_schema
        - my_volume
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-20.png?v=1740399227)
    - 作成をクリックします。
    新規パイプラインのためのパイプラインUIが表示されます。ソースコードノートブックが自動的に作成され、パイプラインとして設定されます。

1. マテリアライズドビューとストリーミングテーブルを宣言します。Delta Live Tablesパイプラインのソースコードをインタラクティブに開発、検証するためにDatabricksノートブックを使うことができます。
    - ノートブックを開くには、パイプライン詳細パネルのソースコードフィールドにあるリンクをクリックします。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-21.png?v=1740399227)

    - PythonやSQLを用いてコードを開発します。詳細は、[Python を使用したパイプライン コードの開発](https://docs.databricks.com/aws/ja/delta-live-tables/python-dev)や[SQL を使用したパイプライン コードの開発 ](https://docs.databricks.com/aws/ja/delta-live-tables/sql-dev)をご覧ください。

    ```py
    # Import modules
    
    import dlt
    from pyspark.sql.functions import *
    
    # Assign pipeline parameters to variables
    
    my_catalog = spark.conf.get("my_catalog")
    my_schema = spark.conf.get("my_schema")
    my_volume = spark.conf.get("my_volume")
    
    # Define the path to source data
    
    volume_path = f"/Volumes/{my_catalog}/{my_schema}/{my_volume}/"
    
    # Define a streaming table to ingest data from a volume
    
    @dlt.table(
     comment="Covid 19 case data."
    )
    def covid_case_raw():
     df = (spark.readStream
       .format("cloudFiles")
       .option("cloudFiles.format", "csv")
       .option("inferSchema", True)
       .option("header", True)
       .load(volume_path)
     )
     return df
    
    # Define a materialized view that validates data
    
    @dlt.table(
     comment="Covid 19 case data cleaned and prepared for analysis."
    )
    @dlt.expect("valid_cases", "cases IS NOT NULL")
    @dlt.expect("valid_deaths", "deaths IS NOT NULL")
    def covid_case_prepared():
     return (
       spark.read.table("LIVE.covid_case_raw")
         .select("date", "cases", "deaths")
     )
    
    # Define a materialized view that has a filtered, aggregated, and sorted view of the data
    
    @dlt.table(
     comment="A Covid 19 cased table summerized by date."
    )
    def covid_case_by_date():
     return (
       spark.read.table("LIVE.covid_case_prepared")
         .groupBy("date")
         .agg(sum("cases").alias("cases"))
         .sort("date")
     )   
    ```

1. ノートブックやDLT UIの右上にある開始ボタンをクリックすることでパイプラインのアップデートをスタートします。DLTで定義されたテーブルが`<my_catalog>.<my_schema>`のカタログとスキーマの配下に生成されます。

# DLTのマテリアライズドビューに対するモデルトレーニング

DLTによって生成されたマテリアライズドビューに対して、サーバレス予測エクスペリメントを起動します。

1. **機械学習**セクションの**エクスペリメント**をクリックします。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-22.png?v=1740399227)
1. **予測**タイルの**トレーニングを開始**を選択します。
1. 設定フォームで以下を入力します:
    - トレーニングデータとしてマテリアライズドビューを選択します:
        `<my_catalog>.<my_schema>.covid_case_by_date`
    - 時間列としてTime列を選択します。
    - **予測頻度**では日を選択します。
    - 予測期間では7を入力します。
    - **予測**セクションでは**ターゲット列**でcasesを選択します。
    - **モデルの登録**では`<my_catalog>.<my_schema>`を選択します。
![](https://www.databricks.com/sites/default/files/inline-images/machine-learning-unity-catalog-best-practices-blog-img-23.png?v=1740399227)
    - 予測エクスペリメントをスタートするために**トレーニングを開始**をクリックします。

トレーニングが完了すると、予測結果は指定したDeltaテーブルに格納され、ベストモデルがUnity Catalogに登録されます。

エクスペリメントページでは、次のステップとして以下を行うことができます:

- 予測結果テーブルを参照するために**View predictions**を選択します。
- ベストモデルを用いたバッチ推論のために自動生成されたノートブックを開くために**Batch inference notebook**を選択します。
- モデルサービングエンドポイントにベストモデルをデプロイするために、**Create serving endpoint**を選択します。

# まとめ

この記事では、データの前処理からモデルのトレーニングに至る予測モデルのセットアップとトレーニングのエンドツーエンドのプロセスを探索しました。Unity Catalog、グループクラスター、Delta Live Tables、AutoMLの予測を活用することで、モデル開発を円滑にし、チーム間のコラボレーションをシンプルにすることができます。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)