Databricksワークスペース間で特徴量テーブルを共有する

[Share feature tables across workspaces \| Databricks on AWS](https://docs.databricks.com/applications/machine-learning/feature-store/multiple-workspaces.html) [2021/12/6時点]の翻訳です。

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

Databricksでは、複数のワークスペースでの特徴量テーブルの共有をサポートしています。例えば、お使いのワークスペースから、集中管理された特徴量ストアの特徴量テーブルに対して特徴量の作成、書き込み、読み込みを行うことができます。これは、異なる開発ステージを取り扱う複数のワークスペースをお持ちのケース、あるいは複数のチームで特徴量テーブルへのアクセスを共有する際に有用です。

集中管理された特徴量ストアに関しては、全ての特徴量ストアのメタデータを格納する単一の専用のワークスペースを作成し、特徴量ストアへのアクセスを必要とするユーザーそれぞれにアカウントを作成することをお勧めします。

チームが[ワークスペース間でモデルを共有](https://qiita.com/taka_yayoi/items/ddddbf9637fe03607b4f)している場合には、特徴量とモデルの両方に対して同じ集中管理の専用ワークスペースを選択することも可能です。
![](https://docs.databricks.com/_images/multiworkspace.png)

集中管理された特徴量ストアへのアクセスはトークンによって制御されます。アクセスを必要とするユーザー、スクリプトは、集中管理されている特徴量ストアで[パーソナルアクセストークンを作成](https://docs.databricks.com/dev-tools/api/latest/authentication.html#token-management)し、ローカルのワークスペースの[シークレットマネージャにトークンをコピー](https://docs.databricks.com/dev-tools/cli/secrets-cli.html)します。集中管理された特徴量ストアのワークスペースに送信されるAPIリクエストにはアクセストークンを含める必要があります。Feature Storeクライアントは、ワークスペース間のオペレーションを実行する際に簡単にシークレットを指定することができるシンプルなメカニズムを提供しています。

# 要件

ワークスペースにまたがる特徴量ストアを使用する際には、以下の要件が必要となります。

- Databricksランタイム10.2 ML以降
- 両方のワークスペースは生の特徴量データへアクセスできる必要があります。両者は同じ[Hiveメタストア](https://docs.databricks.com/data/metastores/external-hive-metastore.html)を共有し、同じ[DBFSストレージ](https://docs.databricks.com/data/data-sources/aws/amazon-s3.html#mount-an-s3-bucket)にアクセスできる必要があります。
- [IPアクセスリスト](https://docs.databricks.com/security/network/ip-access-list.html)が有効化されている場合には、ワークスペースのIPアドレスはアクセスリストに記載されている必要があります。

# リモートレジストリに対するAPIトークンのセットアップ

1. 特徴量ストアのワークスペースにおいて[アクセストークンを作成](https://docs.databricks.com/dev-tools/api/latest/authentication.html#token-management)します。
1. ローカルのワークスペースで、アクセストークンとリモートワークスペース情報を格納するための[シークレットを作成](https://docs.databricks.com/dev-tools/cli/secrets-cli.html)します。
    1. シークレットのスコープを作成します: `databricks secrets create-scope --scope <scope>`
    1. ターゲットのワークスペースのユニークな名称を指定します。ここでは`<prefix>`となります。そして、指定したキー名を用いて3つのシークレットを[作成](https://docs.databricks.com/dev-tools/cli/secrets-cli.html#create-a-secret-scope)します。
        - `databricks secrets put --scope <scope> --key <prefix>-host`: 特徴量ストアのワークスペースのホスト名を指定します。例えば、`https://cust-success.cloud.databricks.com/`
        - `databricks secrets put --scope <scope> --key <prefix>-token`: 特徴量ストアワークスペースのアクセストークンを入力します。
        - `databricks secrets put --scope <scope> --key <prefix>-workspace-id`: 任意のページで[取得可能](https://docs.databricks.com/workspace/workspace-details.html#workspace-instance-names-urls-and-ids)な特徴量ストアのワークスペースIDを入力します。

> **注意**
[ワークスペースごとのシークレットスコープの数の制限](https://docs.databricks.com/security/secrets/secret-scopes.html)が存在するので、別のユーザーと[シークレットスコープを共有](https://docs.databricks.com/security/access-control/secret-acl.html)することも可能です。

# リモート特徴量ストアの指定

リモート特徴量ストアワークスペース用に作成したシークレットスコープと名前のプレフィクスに基づき、以下のフォーマットで特徴量ストアのURIを構築することができます。

```py:Python
feature_store_uri = f'databricks://<scope>:<prefix>'
```

そして、`FeatureStoreClient`のインスタンスを作成する際に明示的にURIを指定します。

```py:Python
fs = FeatureStoreClient(feature_store_uri=feature_store_uri)
```

# リモート特徴量ストアに特徴量ストアを作成

リモート特徴量ストアの特徴量テーブルを作成するAPIは、使用するDatabricksランタイムバージョンに依存します。

**Databricksランタイム10.2 ML以降**

`FeatureStoreClient.create_table` APIを使用します。

```py:Python
fs = FeatureStoreClient(feature_store_uri=f'databricks://<scope>:<prefix>')
fs.create_table(
  name='recommender.customer_features',
  primary_keys='customer_id',
  schema=customer_features_df.schema,
  description='Customer-keyed features'
)
```

**Databricksランタイム10.1 ML以前**

`FeatureStoreClient.create_feature_table` APIを使用します。

```py:Python
fs = FeatureStoreClient(feature_store_uri=f'databricks://<scope>:<prefix>')
fs.create_feature_table(
  name='recommender.customer_features',
  keys='customer_id',
  schema=customer_features_df.schema,
  description='Customer-keyed features'
)
```

その他のFeature Storeメソッドに関しては、[サンプルノートブック](#サンプルノートブック)を参照ください。

# リモート特徴量ストアから特徴量テーブルを利用

`feature_store_uri`を設定した`FeatureStoreClient.read_table`メソッドを用いることで、リモートの特徴量ストアの特徴量テーブルを読み込むことができます。

```py:Python
fs = FeatureStoreClient(feature_store_uri=f'databricks://<scope>:<prefix>')
customer_features_df = fs.read_table(
  name='recommender.customer_features',
)
```

特徴量テーブルにアクセスするための他のヘルパーメソッドもサポートされています。

```py:Python
fs.read_table()
fs.get_feature_table() # in Databricks Runtime 10.1 ML and below
fs.get_table() # in Databricks Runtime 10.2 ML and above
fs.write_table()
fs.publish_table()
fs.create_training_set()
```

# リモートモデルレジストリの利用

リモート特徴量ストアのURIを指定することに加え、ワークスペース間でモデルを共有するためにモデルレジストリのURIを指定することも可能です。

モデルのロギングやスコアリングのためにリモートレジストリを指定するために、FeatureStoreClientのインスタンスを作成する際にモデルレジストリのURIを使用することができます。

```py:Python
fs = FeatureStoreClient(model_registry_uri=f'databricks://<scope>:<prefix>')
customer_features_df = fs.log_model(
    model,
    "recommendation_model",
    flavor=mlflow.sklearn,
    training_set=training_set,
    registered_model_name="recommendation_model"
)
```

`feature_store_uri`と`model_registry_uri`を用いることで、任意のローカルあるいはリモートの特徴量テーブルを用いてモデルをトレーニングし、任意のローカルあるいはリモートのモデルレジストリにモデルを登録することができます。

```py:Python
fs = FeatureStoreClient(
    feature_store_uri=f'databricks://<scope>:<prefix>',
    model_registry_uri=f'databricks://<scope>:<prefix>'
)
```

# サンプルノートブック

https://github.com/taka-yayoi/public_repo/tree/main/feature_sharing

### Databricks 無料トライアル

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