Windows10環境でLanguage Interpretability Tool (LIT)を実行(1.環境構築編)

Google ResearchがNLPモデルの理解と可視化をするプラットフォーム[Language Interpretability Tool (LIT)](https://github.com/PAIR-code/lit)をオープンソース化しました。試しに動かしてみたいと思います。

全3記事を予定しています。
**1. Windows10環境でLanguage Interpretability Tool (LIT)を実行(1.環境構築編)【本記事】**
2. Windows10環境でLanguage Interpretability Tool (LIT)を実行(2.機能確認編)
3. Windows10環境でLanguage Interpretability Tool (LIT)を実行(3.独自モデル編)

本記事では、**Windows10 Home環境**での**環境構築手順**について記載します。

#目次
1. [LITとは](#1-litとは)
2. [Docker Desktop for Windowsのインストール](#2-docker-desktop-for-windowsのインストール)
3. [LITサンプルプログラムの実行](#3-litサンプルプログラムの実行)
4. [最後に](#4-最後に)

#1. LITとは
Language Interpretability Tool (LIT)は、 NLPモデルの理解と可視化のためのツールです。
![LIT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173913/f37a3a35-97ce-a508-8a1d-81890f3ff6c8.png)

ブラウザベースのUIで、以下の機能が存在します。(論文抜粋)
![paper.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173913/8a0b9ab8-e2b3-97db-9e5f-27ff99f644a9.png)

詳細を知りたい方は以下をご参考ください。

 - 論文は[こちら](https://arxiv.org/abs/2008.05122)
 - GitHubは[こちら](https://github.com/PAIR-code/lit)
 - ユーザーガイドは[こちら](https://github.com/PAIR-code/lit/blob/main/docs/user_guide.md)

こういうツール系は触ってみないと何とも言えない気がするので、試しに動かしてみることにしました。


#2. Docker Desktop for Windowsのインストール
今回、Dockerを用いてサーバを立てるため、**Windows10 Home環境**に**Docker Desktop for Windows**をインストールします。
##2-1. Docker ID作成
※手順省略
いきなりですが、簡単なので手順を省略します。
以下のURLからDocker IDを作成してください。
https://hub.docker.com/

##2-2. Windows 10 Homeのアップデート
Docker Desktop for Windowsをインストールしようとすると、私の環境では以下のエラーが発生しました。
>Docker Desktop requires Windows 10 Pro/Enterprise (15063+) or Windows 10 Home (19018+).

※上記文言が画面上に表示されます。

インストール前に**Windowsのアップデートが必要**みたいです。

以下の手順を実行し、Windows 10 Homeのアップデートを行います。
**Windowsスタートメニュー → 設定 → Windows Update からアップデートを実行**
1時間ぐらい待っても終わらなかったですが、寝て起きたら終わってました。

朝見たら無事以下のバージョンに上がっていました。
![windows_update.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173913/26ecb02b-0cf1-3a4c-ded9-ff6f8780592c.png)


##2-3. Docker Desktop for Windows のインストール
実際にインストールをしていきます。
以下URLから**Download for Windows(stable)**をクリックし、インストーラーをダウンロードします。
https://www.docker.com/products/docker-desktop
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173913/ffb940c1-2be0-3c9f-fbe0-28ff3dcdee7a.png)


インストーラーをダブルクリックし、手順を実行していくと、以下のエラーに遭遇しました。
何やら**Linuxカーネルのアップデートをする必要がある**みたいです。
指示通りにリンクをクリックします。

![wls2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173913/21965242-9715-db69-ab18-3a5c1e49cc83.png)

MSのマニュアルに飛ぶので、**Linuxカーネル更新プログラムパッケージをダウンロード**します。
![wls2_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173913/1feaa06b-dd8e-cb8c-4b5b-fc97358bae34.png)

ダウンロードした**wsl_update_x64.msi**を実行します。
一瞬で終わります。
![wls2_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173913/31136b51-8b5b-04f2-7d42-a2b343a3e3ba.png)

その後、手順に戻り、全ての手順を終わらせると**Docker Desktop for Windowsのインストールは終了**です。

### 参考
似たようなエラーに当たった人の記事
https://tech.guitarrapc.com/entry/2020/04/21/034236


「Docker Toolbox」と「Docker Desktop for Windows」の違い
https://fumidzuki.com/knowledge/1033/

#3. LITサンプルプログラムの実行
最終的には、サンプルプログラム**quickstart_sst_demo.py**を実行することでDocker上にサーバを立て、
それをホスト側からブラウザで見に行くことになります。

[LITのREADME](https://github.com/PAIR-code/lit/blob/main/README.md)ではcondaで環境を作っているため、
仮想環境の準備を行い、その後ホストからサーバにアクセスできるようにするための設定を行います。

#3-1. WSL2のメモリ割り当て量の変更
仮想環境の準備に入る前に、**WSL2のメモリ割り当て量の変更**を行います。
これを実行しないと、デフォルトで**PCのメモリの80%が割り当てられてしまい**、私の場合だと16GBのPCなので約13GBもメモリを割り当ててしまう現象が発生してしまいました。

手順は簡単でホスト側の**%UserProfile%**に**.wslconfig**ファイルを作成し、メモリ割り当て量を指定します。
デモを動かすだけなら3GBで十分でした。

```~/.wslconfig
[wsl2]
memory=3GB
```

#3-2. 仮想環境の準備
**Anacondaが入ったDockerコンテナをpullし、立ち上げます。**
コマンドラインから以下を実行します。
(コンテナ名の**lit_env**は任意変更可です。)
参考：https://hub.docker.com/r/continuumio/anaconda3

```
docker pull continuumio/anaconda3
docker run -it --name lit_env continuumio/anaconda3 /bin/bash
```
Dockerコンテナを立ち上げるとデフォルトの仮想環境名である**baseがactivateされた状態**となっています。


次に、**必要なパッケージのインストール等**を行います。
基本的にREADMEの手順に沿って進めますが、そのままだとエラーが発生するので少し変更しています。
参考：https://github.com/pair-code/lit/issues
参考：https://github.com/yarnpkg/yarn/issues/7329
※rootユーザのまま実行するのもどうなんだろうと思いつつも、結局rootのまま実行しました。。


```
git clone https://github.com/PAIR-code/lit.git ~/lit

# Set up Python environment
cd ~/lit
conda env create -f environment.yml
conda activate lit-nlp
conda install cudnn cupti  # optional, for GPU support
conda install -c pytorch pytorch  # optional, for PyTorch

# Build the frontend
cd ~/lit/lit_nlp/client
######yarnがないのでインストールします
# 単純に"apt-get install yarn" だと後続でエラーが発生するので以下を実行
curl https://deb.nodesource.com/setup_12.x | bash
curl https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
apt-get update && apt-get install -y nodejs yarn postgresql-client
######
yarn && yarn build
```

パッケージのインストール等が完了し、仮想環境の準備が終わりました。

#3-3. ホストからサーバにアクセスするための設定変更

あとは基本的にサンプルプログラムを叩くだけなのですが、
サンプルのままでは**Dockerコンテナのlocalhost上にLISTENするサーバを立ち上げてしまい、
ホストからアクセスできない**ので、**0.0.0.0にサーバを立てるようにサンプルプログラムを書き換えます。**

まず、**vimをインストール**します。

```
apt-get install vim
```

以下のコマンドを実行し**server_flags.py**ファイルを開きます。
(必要に応じて編集前にバックアップを取得してください。)

```
vi /root/lit/lit_nlp/server_flags.py
```

以下の部分を書き換え、保存します。

```
#flags.DEFINE_string('host', '127.0.0.1', 'What host address to serve on.')
flags.DEFINE_string('host', '0.0.0.0', 'What host address to serve on.')
```

後々ポートフォワードオプションを入れて**docker run**コマンドを打つので、コンテナをイメージとして保存します。
まずはexitします。

```
exit
```

**docker commit**コマンドを実行し、**lit_env**という名前のコンテナをイメージとして保存します。
(**lit_env_img**という名前で保存していますが、名前はもちろん任意です。)

```
docker commit lit_env lit_env_img
```

#3-4. サンプルプログラムの実行
[LITのREADME](https://github.com/PAIR-code/lit/blob/main/README.md)通りに実行すると、後々サーバを**--port5432**で立ち上げることになります。
なので、コンテナ側の**ポートを5432**に指定したポートフォワードオプションをつけて**docker run**コマンドを実行します。
(ホスト側のポート番号はもちろん任意です。)

```
docker run -it -p 5432:5432 lit_env_img /bin/bash
```



サンプルプログラムである感情分類タスクのデモを実行します。
何やら3epochぐらいfine tuningしているようです。

```
conda activate lit-nlp
cd ~/lit
python -m lit_nlp.examples.quickstart_sst_demo --port=5432
```

以下のメッセージが出力されたら完了です。


>Starting Server on port 5432
>You can navigate to 0.0.0.0:5432


ホスト側のブラウザから以下のURLにアクセスします。

```
http://127.0.0.1:5432/
```

正常にアクセスできるはずです。
![LIT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173913/85fdc714-1be2-b40e-fac4-c262aaffc97f.png)


以上でWindows10 Home環境下での環境構築手順は終了です。

#4. 最後に
今回エラーを回避するために色々設定を変えました。
[LITのIssue](https://github.com/PAIR-code/lit/issues)を見てもらうとわかると思いますが、
その内容も含めてここ1週間で結構やりとりが行われているため、
近いうちにアップデートがあるかもしれません。
そうなったらもっと楽に環境構築できると思います。

次回はLITの機能を色々見ていきたいと思います！