Windowsでお試しで自然言語処理のデバッグをやってみる。with VSCode

メリークリスマス。
老後はサンタクロース協会に入って、子どもたちに夢を与えたいと思っている人です。


ところで、皆さんWindowsは好きですか？私は大好きです。
※愛用機は[Surface Laptop3] (https://www.microsoft.com/ja-jp/p/surface-laptop-3/8vfggh1r94tm?activetab=overview)

しかし、Windows機はデータ分析界隈では使っている人が少ないせいなのか、最新の分析ライブラリやフレームワークはWindows対応が不十分なケースが多く、環境構築に苦戦するシーンがあります。

Windows機しかもっていない開発者の皆様でも「データ分析やりたい」,「自然言語処理やりたい」など素敵なモチベーションをもっているけど、「Macが支給されていなくて　(´·×·`)・・・Startできないよ(SIer関連様）」とお悩みの方の為に、本記事では、自然言語処理のプログラムをVSCode+Dockerで実行する手順について紹介いたします。
Let's Dive into Docker for Debugging!!!

※私はSIer出身です。

## 1. デバッグを試してみる自然言語処理のテーマ

今回は、自然言語処理のタスクである「感情分析」の初歩的なコードでTryします。
　※感情分析：与えられた文章が「ポジティブ or ネガテイブ」なのか判定

利用するフレームワークは自然言語処理に特化した[HuggingFace](https://huggingface.co/)を利用します。
参考記事: [自然言語処理（NLP）で注目を集めているHuggingFaceのTransformers](https://qiita.com/kenta1984/items/a20e525247e4848761f6)



## 2. 実行例

```python
# INPUT
text = ['めっちゃええで',
       '今日は調子が悪い',
       '微妙だ',
       'まぁまぁやな',
       '良いとは思わない']

------------------------------------------------------------------------
# OUTPUT
[[{'label': 'ポジティブ', 'score': 0.9899728894233704}] #めっちゃええで
[{'label': 'ネガティブ', 'score': 0.8069409132003784}]  #今日は調子が悪い
[{'label': 'ネガティブ', 'score': 0.7249351143836975}]  #微妙だ
[{'label': 'ポジティブ', 'score': 0.6537005305290222}]  #まぁまぁやな
[{'label': 'ネガティブ', 'score': 0.9345374703407288}]  #良いとは思わない
```
任意のテキストを入力して、そのテキストがPositive/Negativeか判定できるプログラムを動かしましょう。
わくわくしますね。


## 3. 前提とする条件
以下の環境が準備されている事を前提とします。
※念の為、インストール手順の参考情報をつけておきました。

1. [WSL2](https://docs.microsoft.com/ja-jp/windows/wsl/about)がインストールされていること  
  → 手順:[Windows 10 用 Windows Subsystem for Linux のインストール ガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10) 
1. Dokcer Desktop WSL2がインストールされていること  
  → 手順:[Docker Desktop WSL 2 backend](https://docs.docker.com/docker-for-windows/wsl/) ※英語
1. VSCodeがインストールされていること  
  → 手順:[Visual Studio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)
1. VSCodeのExtentsion「Remote Development(ms-vscode-remote.vscode-remote-extensionpack)」がインストールされていること。



## 4. 手順

### 4-1. プログラム作成
さてさて、まずはプログラムを作りましょう。

最初に準備するファイルはたったの２つです。
ファイル構成はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259530/14598475-31df-afd6-d9b3-255a9643f0e8.png)

まずは、Dockerファイルから。

```docker:Dockerfile
FROM continuumio/anaconda3
WORKDIR /app
#RUN conda install -y tensorflow
RUN pip install -U pip && \
    pip install mecab-python3 && \
    pip install fugashi && \
    pip install  ipadic && \
    pip install torch && \
    pip install transformers 

```

次に実行するメインプログラム(Python)です。

```python:main.py
from transformers import pipeline
from transformers import BertForSequenceClassification
from transformers import BertJapaneseTokenizer

def nlp_main():

    #入力するテキスト
    text_list =  ['めっちゃええで','今日は調子が悪い','微妙だ','まぁまぁやな','良いとは思わない']

    model = BertForSequenceClassification.from_pretrained('daigo/bert-base-japanese-sentiment')
    tokenizer = BertJapaneseTokenizer.from_pretrained("daigo/bert-base-japanese-sentiment")

    #感情分析を行う関数
    nlp_sentiment_analyzer = pipeline('sentiment-analysis', model=model, tokenizer=tokenizer)

    #処理実行
    for index, text in enumerate(text_list):

        print(f"No{index}『{text}』:{nlp_sentiment_analyzer(text)}")

if __name__ == '__main__':
    nlp_main()
```

~~いたってシンプル is Best.~~

### 4-2. Dockerビルド
Dockerfileを定義したので、ビルドしましょう。
本来ならば、NativeのWindows環境に直接ライブラリ等をインストールする必要がありますが、
Dockerなら、超簡単にコンテナ上で環境構築ができます。

1.  VSCodeの左下の緑色の領域をクリック
2. 「ReOpen Folder Contianer」を選択
3. 「Dockerfile」を選択

たったこれだけで、VSCodeを用いてDockerビルドができます。簡単でしょう？
![2kvnh-hrayp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259530/7e318287-afd0-239f-dd13-55c922babe07.gif)
ビルド時間は10分程度かかります。　※ちなみに、私の環境はCorei71065G7 @1.3GHz,1.5GHz 16GBです。

### 4-3. プログラム実行
お試しで、Debugではなくて、普通にコンソールにてプログラムを実行します。
※VSCodeでコンソールを開くには「Ctrl + @」です。

```bash
python main.py
```
![p9egb-74x1y.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259530/917854a0-e9ed-c517-07db-fb0f4fc604b9.gif)


## 5. Debugでプログラムを実行する。
では、ここからが本題となるデバッグ実行のやり方です。

### 5-1. Extentionのインストール
Debug実行ができるように、VSCodeのExtentionをインストールします。

##### Extention名
- Python (ms-python.python)
![ttllm-rzuul.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259530/d18dd5ea-9851-1210-208f-92da1855872f.gif)  
Extentionのインストールが成功したら、以下の画像のように、Debugアイコンが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259530/2f0ed9f9-08a1-5ba4-8e49-47805e492852.png)


### 5-2. Debug設定
それではDebug設定を行いましょう。

先の「Debugアイコン」をクリックし「create a launch.json file リンク」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259530/21f64227-c6a3-ba30-b6ae-b71f6fceb6b8.png)

クリック後、何を対象にDebugするか選択画面が表示されます。「Python」を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259530/302b5ebe-ae8c-307a-48eb-db572e896733.png)


次に「Python File」を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259530/6de1a3bb-645b-3287-ed24-534cef16490b.png)

以下の自動生成されたファイル「launch.json」が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259530/9ad883b4-cd6a-3114-7caa-e15b13aa9574.png)

以下のように書き換えてください。
変更点："program": "${workspaceRoot}/main.py"

```json:launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${workspaceRoot}/main.py", 
            "console": "integratedTerminal"
        }
    ]
}

```
Debug設定の詳細はこちらの情報を参考にしてください。
[Visual Studio Code Debugging](https://code.visualstudio.com/docs/editor/debugging)

### 5-3. Debug開始
Debug実行を行います。

1. main.pyに処理を止めたいポイント「ブレークポイント」を追加します。
2. 「Debugアイコン」をクリックします。
3. 「Debug実行ボタン」をクリックします。

動画解説
![o1d0g-zxcid.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259530/746169b7-b2ce-6d1e-7cca-3e73480b5393.gif)


### 5-4. Debugのやり方
デバッグセッションが開始されると、エディターの上部に[デバッグ]ツールバーが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259530/c3403833-b83a-2715-9eb9-e51f381cefa6.png)

* Continue / Pause F5　  ※次のブレークポイントまで進む
* Step Over F10          ※1ステップずつ進む
* Step Into F11　        ※ステップの内部実行を行う
* Step Out Shift+F11　   ※内部実行を終了して、一つ上のステップまで戻る
* Restart Ctrl+Shift+F5　※プログラムを再起動する
* Stop Shift+F5　        ※プログラムを終了する  

※「ステップ」はソースコードの1行分のことです。


動画解説
![0mhpx-2x78o.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259530/e030d208-030e-1df4-29d5-eb127856c291.gif)



### 5-5 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259530/ed8a7421-546d-30e5-c73d-0d3cface9dce.png)
ここまで出来たら、後はVisual StudioやEclipse(古い)でDebugしてきた方なら大丈夫ですよね？

また、入力されたテキストに対して、
Positive/Negativeの分類と、信頼度スコアも表示されていますが、我々人間の目からみても妥当な結果となっているのではないでしょうか。すごいですね。

## 6. おわりに
NativeなWindows環境に、自然言語処理の環境構築は苦戦しますが、
このようにDockerを間に挟むことで、容易に環境構築が可能となります。
またVSCodeでDebug実行もできます。

Windows環境で分析をしてみたい方は、ぜひぜひお試しくださいませ。



## 7. 補足
Docker化して開発できるということは、AWSのEC2といった強いインスタンスを立ち上げ、
そこで実行させた状態でリモートデバッグすることも実は　VSCodeではできます。
つまりはGPUインスタンスも利用できるということですね。