Databricks Container Servicesを使って Runtime環境をカスタムする


# はじめに

Databricksではクラスター作成時にRuntimeを選択することで、さまざまなライブラリーやバージョンの入ったRuntimeを選ぶことが出来ます。Runtimeに含まれるライブラリーやバージョンは[こちらから確認](https://docs.databricks.com/release-notes/runtime/releases.html)出来ます。

また追加のライブラリーや設定ファイルなどは、Databricksライブラリーサービスやinitスクリプトを利用することでクラスター起動時に追加や設定が可能です。

- [Databricksでライブラリをインストールする](https://qiita.com/taka_yayoi/items/66cec8cf4c159666c4e0) (@taka_yayoi)
- [自作ライブラリをインストールする - Databricks](https://ktksq.hatenablog.com/entry/databricks-library) (by tktsqさん)
- [Databricksで python モジュールをimportするには？](https://qiita.com/maroon-db/items/7b06db3af52796033a06)
- [Databricksクラスターノード初期化スクリプト](https://qiita.com/taka_yayoi/items/88cb46be00a175085f87) (@taka_yayoi)

**基本的にはベースのライブラリーには新機能への対応やBug fixなどのアップデートもあるため上記の方法で運用することがベストだと思います。**

しかし毎回のクラスター起動時に大量のライブラリーなどをインストールしていては起動時間が遅くなってしまうのも事実です。またバージョンをロックダウンしたいケースなどもあるかと思います。

そこで、DatabricksではRuntime環境をカスタマイズして保存しておくことができます。これがDatabricks Container Serviceとなります。Databricksのクラスターインスタンス上ではDocker　Containerが動作するため、それを予め作成しておくことで起動時に読み込む事ができます。

今回はこのContainer Serviceを試してみたいと思います。

> 正式な設定方法については、こちらをご覧ください
https://learn.microsoft.com/ja-jp/azure/databricks/clusters/custom-containers

# 準備

- ローカルPCにDockerをインストールしておく
- クラスター環境からアクセスできるDockerレジストリを用意しておく（Amazon ECRや、 Azure Container Registry、Docker Hubなど）
- Databricks Container Serviceを有効にする。[設定方法](https://learn.microsoft.com/ja-jp/azure/databricks/administration-guide/clusters/container-services)

# コンテナ Baseイメージについて

コンテナのベース イメージは、https://hub.docker.com/u/databricksruntime の Docker Hub でホストされています。 これらのベースの生成に使用される Dockerfile は https://github.com/databricks/containers にありますのでベースの中身が知りたい方はご確認ください。

Standardのベースイメージとしては各LTSのバージョンが利用出来ますが、MLバージョンは用意されておりませんので、各自でBuildする必要があります。また、ベースイメージを用いずに１から作成することも可能です。詳しく知りたい方は[こちら](https://learn.microsoft.com/ja-jp/azure/databricks/clusters/custom-containers#option-2-build-your-own-docker-base)をご覧ください。（今回はベースイメージを利用します）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/cd5c88b3-69b1-0ede-dbdf-cabc0d7af124.png)

GPUをご利用の方は、GPUのライブラリーが含まれたベースイメージもあります。こちらの利用に関しては[マニュアル](https://learn.microsoft.com/ja-jp/azure/databricks/clusters/gpu#--databricks-container-services-on-gpu-clusters)をご覧ください。これらのベースの生成に使用される Dockerfile は https://github.com/databricks/containers にあります

# Container Serviceの利用手順

## 1. ベースイメージを利用したDockerfileの作成

それでは、カスタムするためのDockerfileを作成していきます。ローカルPC上の任意のDirectory上にDockerfileを作成します。以下のようにベースイメージと追加するライブラリーなどを記述します。Dockerfileの記述方法は他に多数の解説記事があるのでそちらをご覧ください。（[参考サイト](https://www.wakuwakubank.com/posts/270-docker-build-image/#dockerfile%E4%BD%9C%E6%88%90-2))



```Dockerfile:Dockerfile
FROM databricksruntime/standard:11.3-LTS
RUN /databricks/python3/bin/pip install mlflow
RUN /databricks/python3/bin/pip install tensorflow
```
mlflow, tensorflowを入れたらサイズが3GBになってしまったので、試すのであればもっと別のライブラリーにした方が良かった。。

## 2. Build

作成したDockerfileを元に新規イメージをBuildします。

```
docker build --pull --rm -f "Dockerfile" -t standarddemo "." 
```

VSCodeに Docker Extensionが入っている場合は、右クリックでBuildできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/7f661e1b-52fb-17b9-7b54-5dbb883fc8c6.png)

## 3. Docker　Registoryにログイン

今回はDocker HUBを利用します。
```
docker login
```

VSCodeにDocker Extensionが入っている場合は、Registories のコンセント見たいなマークから接続できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/44aa54ab-2799-c49b-b00d-26a20122ea75.png)

## 4. イメージをPush

Docker HUBにイメージをプッシュします。tagはわかりやすいように今回は11.3-LTSとしておきます。
```
docker push <myregistry>/standarddemo:11.3-LTS 
```

VSCodeにDocker Extensionが入っている場合は、ImageをクリックしてPUSHで、namespaceやtagを選択して実行出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/a9ca3dc0-ec17-8448-666d-283101d42125.png)

## 5. Databricks ClusterでContainerイメージを指定します。

新規クラスター作成にて、下部にある「高度なオプション」内の「Docker」タブを開き、「自分のDockerコンテナを使用する」にチェックを入れます。DockerイメージURLと認証（Docker HUBの場合はPublicのため認証なしなため、デフォルトで大丈夫です）。また\<myregistry>箇所はPushしたレジストリー名に変更してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/631edbb2-2264-9f51-f9a5-487a5da7ae97.png)


起動してpythonライブラリーを確認すると、mlflowやtensorflowが含まれているのが確認出来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/85b5f9f4-d33c-181e-af89-8c6c5126d801.png)

# 注意点

Containerイメージは自分でメンテナンスしないといけないため、ライブラリーのパッチやバージョンアップデートをセルフで行う必要があります。
またBaseイメージだけではいくつかのDatabricks機能が利用できませんでした。
- Gangulia
- クラスターのWeb Terminal 
- MLflow Auto Logging 
など

Databricksの機能や新機能を利用したい場合は素直にDatabricksが用意しているRuntimeを使用しましょう。