Databricks Container Service(DCS)のウォークスルー

Databricks Container Service(DCS)のマニュアルを読んだことはあったのですが、触ったことがなかったのでウォークスルーします。

# Databricksランタイムの課題

Databricksの計算資源であるクラスターを起動する際には、ランタイムを用いて必要なソフトウェアが自動でインストールされます。

https://www.databricks.com/jp/glossary/what-is-databricks-runtime

> Databricks ランタイムは、データブリックスが管理するマシンのクラスタ上で実行されるソフトウェアアーティファクトのセットです。Spark はもちろん、ビッグデータ分析の操作性やパフォーマンス、セキュリティなどを大幅に向上させるコンポーネントや更新プログラムも数多く追加されています。

大抵のニーズはこれで充足できるのですが、以下のようなケースでは代替案が欲しくなります。

- 自分のクラスターでどのようにdatadogをセットアップしたらいいのか？
- ネイティブにコンパイルしたコードを必要とする複雑なMLライブラリをどのようにインストールしたらいいのか？
- PyPiは当てにならない。10回に1回はジョブが失敗する。どのように信頼性を高めることができるのか？
- ネイティブコードのコンパイルに時間がかかりすぎる。
- ライブラリが必要だが、ランタイムに組み込まれているライブラリと競合する依存関係がある。

[ライブラリ](https://learn.microsoft.com/ja-jp/azure/databricks/libraries/cluster-libraries)や[initスクリプト](https://learn.microsoft.com/ja-jp/azure/databricks/init-scripts/)の機能である程度カバーはできるのですが完全ではありません。

# Databricks Container Service(DCS)

そこで、Databricks Container Service(DCS)の出番です。

https://learn.microsoft.com/ja-jp/azure/databricks/compute/custom-containers

> Databricks Container Services を使用するとコンピューティングの作成時に Docker イメージを指定できます。 ユース ケースの例を次に示します。
>
> - ライブラリのカスタマイズ: インストールするシステム ライブラリを完全に制御できます。
> - ゴールデン コンテナー環境: Docker イメージは、絶対に変更されないロックダウンされた環境です。
> - Docker CI/CD 統合: Azure Databricks を Docker CI/CD と統合できます。

全体的な流れは以下の通りです。
![Screenshot 2024-07-03 at 8.50.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/89e1fd99-b4f7-d888-650a-50ab6c707bc4.png)

# DCSの有効化

最初に、イメージをカスタマイズせずにインストールしてみますが、その前にDCSを有効化する必要があります。有効化には[Workspace Conf REST API](https://docs.databricks.com/api/azure/workspace/workspaceconf)を使います。

まずは、対象のワークスペースでDCSが有効化されているかどうかを確認します。ここでは、背後ではREST APIを呼び出している[Databricks CLI](https://learn.microsoft.com/ja-jp/azure/databricks/dev-tools/cli/)を使います。なお、以下の`my_azure`はプロファイル名です。

```sh
databricks workspace-conf get-status enableDcs -p my_azure
```

この時点では有効化されていません。

```json
{
  "enableDcs":""
}
```

有効化します。

```sh
databricks workspace-conf set-status enableDcs --json '{"enableDcs": "true"}' -p my_azure
```

確認します。

```sh
databricks workspace-conf get-status enableDcs -p my_azure
```

有効化されました。

```json
{
  "enableDcs":"true"
}
```

これで、クラスター作成時にDockerイメージを選択できるようになります。
![Screenshot 2024-07-03 at 9.27.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/95afd0d9-2fd8-00ac-4422-32e016b92508.png)

# ベースイメージのインストール

Dockerhubでベースイメージが公開されています。

https://hub.docker.com/u/databricksruntime

[`databricksruntime/standard:10.4-LTS`](https://hub.docker.com/layers/databricksruntime/standard/10.4-LTS/images/sha256-8390ad8920aebcd6b7966b9a6fa9480363a2c7104092641bee066918be5ed364?context=explore)をインストールしてみます。

DockerイメージURLには`databricksruntime/standard:10.4-LTS`を指定します。コロン以降がタグとなり、これが対応するDatabricksランタイムのバージョンを指定しています。
![Screenshot 2024-07-03 at 9.29.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fe34fe0b-ab17-ee7d-dc08-947c7e772c5f.png)

ですので、ランタイムのバージョンもそろえます。
![Screenshot 2024-07-03 at 9.30.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6390c01e-764f-cd9c-c0d8-e538100439d8.png)

起動しました。
![Screenshot 2024-07-03 at 9.34.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/049f47be-8599-5624-aaf6-3b5241ecb69d.png)

# カスタムイメージのインストール

次にカスタムイメージを作成します。なお、[こちらの記事](https://cloud.sojitz-ti.com/blog/azure-databricks-custom-containers/)で非常に詳細な手順がカバーされています。

ここからは、Dockerがインストールされているマシンでの作業となります。Azure Container Regstryを使う場合には[Azure CLI](https://learn.microsoft.com/ja-jp/cli/azure/)もインストールします。以下では、Azure Container Regstryを前提に作業します。事前にコンテナレジストリを作成しておきます。
![Screenshot 2024-07-03 at 9.34.01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3be1be87-2900-04be-142b-7cf79196874d.jpeg)

```sh
az login
```
```sh
az acr login --name <レジストリ名>
```

ベースイメージをインポートします。

```sh
az acr import --name <レジストリ名> --source docker.io/databricksruntime/standard:10.4-LTS --image standard:10.4-LTS
```

取り込まれました。
![Screenshot 2024-07-03 at 10.38.24.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4934491e-2576-0cb1-9c51-58a0a57d6a7d.jpeg)

カスタムイメージのdockerfileを作成します。ここでは[`dbdemos`](https://pypi.org/project/dbdemos/)ライブラリを追加しています。

```dockerfile:dokcerfile
FROM <レジストリ名>.azurecr.io/standard:10.4-LTS
RUN /databricks/python3/bin/pip install dbdemos==0.4.6
```

なお、デフォルトではインストールされていないので、importするとエラーになります。
![Screenshot 2024-07-03 at 10.50.41.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/830284fe-f310-8c92-6b70-318a7e9bd43d.jpeg)

dockerfileのあるパスで以下を実行します。

```sh
docker build -t <レジストリ名>.azurecr.io/standard_custome_image:10.4 .
```

処理が終わるとイメージが出来上がります。
![Screenshot 2024-07-03 at 11.07.17.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/099a08de-2a21-9a90-aef6-4d4e49ea3c82.jpeg)

コンテナレジストリにプッシュします。

```sh
docker push <レジストリ名>.azurecr.io/standard_custome_image:10.4
```

プッシュされました。
![Screenshot 2024-07-03 at 11.10.26.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/64940303-9ffa-8973-8632-559b15e83899.jpeg)

Databricksからイメージを取り出せるように、トークンとパスワードを作成します。
![Screenshot 2024-07-03 at 11.13.17.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8b8389df-98c9-4262-cceb-ddf7f8830777.jpeg)

Databricksのクラスター設定で、**DockerイメージURL**に上記レジストリのURLを指定し、上で作成したユーザー(トークン名)とパスワードを指定します。
![Screenshot 2024-07-03 at 11.14.30.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4d261721-0007-1813-f301-6034cdaafddf.jpeg)

起動しました！
![Screenshot 2024-07-03 at 11.25.47.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ef9f09a8-dfc3-121a-21cd-3ffa2109cafc.jpeg)

`pip install`しなくてもdbdemosが動きました！
![Screenshot 2024-07-03 at 11.30.25.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4a0c2665-2dc2-e930-7984-c5e5e1ff39d1.jpeg)

# 参考資料

- [Databricks Container ServiceでTensorRT\-LLMを動かしてみた \- NTT Communications Engineers' Blog](https://engineers.ntt.com/entry/2024/04/26/095739#Databricks%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A)
- [【Azure Databricks】「Databricks Container Servicesの設定」をしてみる \| Azure導入支援デスク](https://cloud.sojitz-ti.com/blog/azure-databricks-custom-containers/)


### はじめてのDatabricks

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

### Databricks無料トライアル

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