M2Macで公式Dockerを用いたkaggle用Python環境構築(VSCodeで)


## はじめに
とある機会があってkaggleの勉強をしよう！となり、せっかくならローカルでもできるように環境構築をしようとしたのですが、ドン詰まりしたので環境構築までの経緯を備忘録として書いておこうと思います。

こういった文章を書くのは初めてで、しかもこの機会にDockerを使いはじめたペーペーなので、読みづらかったら我慢して読んでください。間違いがあったらぜひ指摘してくださると幸いです。

#### 自分の環境
- MacOS Sonoma 14.0(Apple M2チップ)
- Docker Desktop 4.25.0

注:2023/10/27時点のものなので、kaggleのDockerイメージがM2MacのGPUやarm64に対応したら最適なやり方は変わってくると思います。

## 手順
### 1. まずDockerのインストール、設定
[DockerのDLサイト](https://matsuand.github.io/docs.docker.jp.onthefly/desktop/mac/install/)からDocker Desktopをインストール。今回はM2 MacなのでAppleチップのものを選びました。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1105752/3a70ac7e-12a0-5fd9-3e20-f61ab8f692ad.png", width=75%>

次に公式の推奨にもある通り、Rosetta 2をインストールするために下記コマンドをterminalに打ってください。今回のDockerイメージのアーキテクチャはx86-64なので、arm64で動かすために必要です。
```terminal:terminal
$  softwareupdate --install-rosetta
```

つぎにDockerの設定をします。インストール後各種アカウント設定をしたら、Dockerのアプリから右上の歯車を押して設定を開き、
- General > Use Rosetta for x86/amd64 emulation on Apple Siliconをチェック

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1105752/978f9422-a499-9c05-42a3-9dbb8323e6d9.png", width = 75%>

- Resource ＞ Memory Limit を24GB(最大)に設定(デフォルトは8GB)

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1105752/7ce87ab6-e75d-8687-e897-d0981d42c83f.png", width = 75%>

をしてApply & Restart
以上で設定は終了です。

### 2. kaggleのDockerイメージのダウンロード
kaggleの公式GithubからPythonのDockerFileをgit cloneします。
```terminal:terminal
$ git clone https://github.com/Kaggle/docker-python
```

次にREADME.mdに従ってcloneしてきたリポジトリに移動、./buildコマンドでDockerイメージをビルドします。このDockerイメージはM2MacのGPUにおそらく対応していない？ので--gpuはつけないほうがいいです。(僕は何度もやって失敗しました。)
```terminal:terminal
$ cd docker-python
$ ./build
```
2時間弱ぐらいかかります。
$ docker images で確認すると...
```terminal:terminal
$ docker images
REPOSITORY                           TAG       IMAGE ID       CREATED        SIZE
kaggle/python-build                  latest    88ced0ac5df0   12 hours ago   20.9GB 
gcr.io/kaggle-images/go-renderizer   latest    127ffc5f1590   2 years ago    962MB
```
ちゃんと入ってますね。
イメージを作れたのでコンテナを起動します。
```terminal:terminal
$ docker run --rm --platform linux/amd64 -v /Users/USERNAME/kaggle:/kaggle -it kaggle/python-build /bin/bash 
```
各種オプション説明
- --platform linux/amd64 
    Intelイメージ(amd64)をM2Mac(arm64)で動かすためのもの。
- -v /Users/USERNAME/kaggle:/kaggle
    ローカル(/Users/USERNAME/kaggle)のフォルダをコンテナ下フォルダ(/kaggle)と共有するためのもの。この場合コンテナ下にkaggleフォルダが作られます。

$ docker ps でコンテナが起動しているか確認できます。
```terminal:terminal
CONTAINER ID   IMAGE                 COMMAND                   CREATED          STATUS          PORTS      NAMES
f9038c400659   kaggle/python-build   "/entrypoint.sh /bin…"   16 seconds ago   Up 16 seconds   8080/tcp   zealous_jones
```
起動完了!

### 3. VSCode のDev Containersでひらく
最後に自分はVSCodeで編集したかったので、VSCodeで開くための設定をします。
まず拡張機能 Dev Containersをインストールします。
![DevContainer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1105752/cb557107-8fd9-6227-a2a1-af21e76d3ff3.png)

インストールしたら左のテレビみたいなアイコンからDev Containersのページを開き、先ほど作成したcontainerにattachします。(このときコンテナ起動したterminal(VSCodeのterminalでも)を閉じないようにしてください。閉じるとコンテナも終了します。)

![attach.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1105752/905f03eb-e664-d35c-e297-54a29c1845b6.png)


コンテナ内に入ったら、JupyterとPythonの拡張機能をインストールします。これによって、ノートブックでコンテナのPythonカーネルを選べるようになります。
![スクリーンショット 2023-10-28 14.32.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1105752/9ff505b4-10f3-96bc-0e67-a5a850f65dfc.png)
.pyファイルを編集するときはcommand+shift+p→インタプリターを選択すればインテリセンスが機能します。
以上で環境構築は終わりです。お疲れ様でした。

## おまけ
コンテナ起動のコマンドが長いので、下のようにエイリアスを作っておくと便利です。
```.zshrc:.zshrc
alias drk='docker run --rm --platform linux/amd64 -v /Users/USERNAME/kaggle:/kaggle -it kaggle/python-build /bin/bash'
```
## 最後に
最初は気軽にMacでkaggleの環境作っておきたいなーぐらいの気持ちだったのにえらい目に遭いました。GPU版をビルドしようとしたら６時間以上かかった上にエラー吐いたり、ビルドが終わってもarm64だからか起動に失敗したり....。何度もDockerをリセットしました。M2チップほんま...
未来にはAppleSilicon向けのkaggleイメージができてると嬉しいな(怒)
はじめにでも述べましたが、何か間違いがあったり、より良い方法があれば教えていただけると嬉しいです。
ありがとうございました。

## 参考にしたサイト
- [kaggleの環境をdockerで再現](https://vasteelab.com/2020/06/08/kaggleの環境をdockerで再現/)
- [公式Dockerとvscodeを使ったKaggleの環境構築
](https://qiita.com/Artela_0000/items/4b0f3c02b1e9e1b2695b)
- [【Docker✖️M1】no matching manifest for linux/arm64/v8 in the manifest list entriesを解決(arm/amd/rosetta)](https://qiita.com/Ryo-0131/items/dbd5d6d94bdb2b5f0f82)
- [【Visual Studio Code】Dockerコンテナ内のPythonライブラリを参照する方法
](https://it-dxblog.com/vscode-python-docker/)