bratサーバーをGCPのVM(Ubuntu 20.04)に作成し、Webブラウザを使ってアノテーションを始めるまでの手順

# はじめに

アノテーションの方法として、oxを判定する比較的簡単なデータ分析はグーグルスプレッドシートで対応していました。

しかし、最近系列ラベリングなどのアノテーションが必要になり、グーグルスプレッドシートでは厳しくなってきたので、何かしらのアノテーションツールを導入することにしました。

要件としては以下のとおりです。

1. OSによらず（特にWindowsは必須）、極力複雑な手順を含めずに、かつ複数ユーザーからアクセス可能にする
2. サーバーはGCPのVMを使い、データはサーバ上で管理する（クライアントにデータを置かない）

今回は利用経験があるということもあり、[brat](https://brat.nlplab.org/)を使うことにしました。

ただ、bratサーバを立てる記事は少なめ（ローカルでとりあえず使うというのは結構ある）なので、「VM作成〜クライアントからbratへアクセスしてexampleにタグ付け」までの流れを忘備録としてまとめることにしました。


# 手順

## 0. 前準備: gcloudをインストールする

GCPのVMへ接続する上で、クライアントPCに`gcloud`をインストールしておくと、色々はかどります。

以下のクイックスタートからOSに応じたgcloudをインストールしておきましょう。

https://cloud.google.com/sdk/docs/quickstart


## 1. GCPでbratを導入するVMを作成する

まずbratをインストールするサーバーを作ります。今回はGCP computer engingのVMを使います。

ポイントは以下のとおりです。

- スペックは軽めで問題ない(アノテーション対象のデータが乗る程度のディスク容量は確保しておく）
- bratサーバーへHTTPでアクセスできるようにするためのファイアウォールの設定が必要
- セキュリティを高めるために外部IPは付与しない（エフェメラルIPもなし）


今回は、例として以下のようなサーバーを作成しました

- OS: Ubuntu 20.04
- スペック: 適当（ディスクは一応20G用意)
- サーバー名: brat-server
- project名: test
- zone名: asia-east1-a
- 外部IP: なし
- ファイアウォール: tcp:8888を開ける（ポートは他と重複しなければ自由。接続元IPアドレスの範囲は適宜調整）
- サービスアカウント: アクセス予定のユーザーを詰め込んだものを設定しておく

## 2. dockerをインストールする

今回はbratのdockerコンテナを利用するため、先にdockerをインストールします。

といっても、brat用に特別な対応は必要なく、普通にdockerをインストールすればよいだけです。

記述する必要性も薄いですが、一応手順を掲載しておきます

```shell

# gcloud ssh を使って(1)で作成したサーバーへ接続(ブラウザからのアクセスでも問題ない）
gcloud compute ssh --project "test" --zone "asia-east1-a" brat-server

# とりあえずupdate
sudo apt update

# インストールに必要なアプリケーションをインストール
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

# 承認用のキーを取得・確認し、dockerのリポジトリ情報をインストール
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# dockerのインストールとテスト
sudo apt update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo docker run --rm run-test
sudo docker rmi run-test #イメージの削除
```

## 3. bratをインストールする

brat用のdockerコンテナを作成している方がいますので、それをそのまま利用します。

https://github.com/cassj/brat-docker

https://github.com/roy29fuku/brat-docker

今回はコメントなどを日本語化しているroy29fuku様のコンテナを使いました。

bratコンテナとそのデプロイ方法は、コンテナ作成者の以下のサイトを参考にさせていただきました（というかほぼそのまま）。

https://roy29fuku.com/natural-language-processing/brat-server-on-ec2-with-docker/

```shell

# docker volumeの作成と確認(brat関係のデータ置き場になります）
sudo docker volume create --name brat-data
sudo docker volume create --name brat-cfg

sudo docker volume ls

# bratコンテナDL〜起動まで
git clone https://github.com/roy29fuku/brat-docker.git
cd brat-docker/

### 注意: Dockerfileの書き換えが必要 ###
# `FROM ubuntu` 以降の近いところに `ENV DEBIAN_FRONTEND=noninteractive` を追加

# build
sudo docker build . -t roy29fuku/brat
# 確認
sudo docker images

# docker コンテナの初回起動
sudo docker run --name=brat-dev -d -p 8888:80 -v brat-data:/bratdata -v brat-cfg:/bratcfg -e BRAT_USERNAME=brat -e BRAT_PASSWORD=brat -e BRAT_EMAIL=hogehoge@xxx.com roy29fuku/brat
```

注意点としては、ubuntu18以降の環境だと`docker build`がうまく通らないことです（タイムゾーン選択で詰まる）。

対処方法として、Dockerfileに`ENV DEBIAN_FRONTEND=noninteractive`を書き加えることで解決できます。


原因については以下の記事を参照してください。

https://qiita.com/yagince/items/deba267f789604643bab

## 4. クライアントからブラウザ上でbratサーバーにアクセスする。

gcloud ssh でローカルフォワーディングし、ブラウザから設定したポートへアクセスすることで比較的安全にbratサーバーへアクセスできます（設定したprojectおよびサービス アカウントに関するGoogleの認証が必要になります）。

```shell
# ポートフォワーディング（ローカルのポートは他のポートと被らないなら何でも良い）
gcloud compute ssh --project "test" --zone "asia-east1-a" brat-server -- -N -L 2222:localhost:8888

# Chromeなどのブラウザ上で localhost:2222 にアクセス(bratサーバーにつながる）
↓
# 右上のbratのアイコンからログインする(ユーザー名とパスワードは(3)で設定したもの)
↓
# example のデータでタグ付けができればOK
```

## 5. その他

本記事ではbrat自体の設定については省略します。以下のページが参考になると思います。

https://brat.nlplab.org/manual.html

https://roy29fuku.com/natural-language-processing/anntation-with-brat/


# おわりに

今回はGCPのVMにUbuntuサーバーを作成し、bratをdockerインストールして、ローカル環境からexampleをアノテーションするところまでを解説しました。

やっぱりアノテーション専用のツールを使うと作業が快適になりました。皆様もぜひ導入してみてはいかがでしょうか？