💭

mdxでNDL古典籍OCRを実行する

2023/08/29に公開

更新履歴

2024-05-22

  • 「Dockerコマンドを実行するユーザーをdockerグループに追加」を追記しました。

概要

mdxは大学・研究機関で共創する産学官連携のためのデータプラットフォームです。

https://mdx.jp/

今回は、mdxの仮想マシンを使用して、NDL古典籍OCRを実行してみます。

https://github.com/ndl-lab/ndlkotenocr_cli

プロジェクトの申請

今回、プロジェクトタイプは「お試し/Trial」を選択しました。

「お試し/Trial」では、1つのGPUパックが割り当てられました。

仮想マシンの作成

デプロイ

今回は、「01_Ubuntu-2204-server-gpu (Recommended)」を選択しました。

デプロイ前の画面では、以下のように設定しました。パックタイプを「GPUパック」、パック数を1としました。

公開鍵については、ローカルPCで以下のように作成しました。

cd ~/.ssh/mdx
ssh-keygen

その後に作成されたid_rsa.pubの内容を貼り付けました。

その後、仮想マシンのデプロイが完了するまで少し待ちます。

SSH接続のためのネットワーク設定

以下の動画を参考に進めることができました。

https://youtu.be/p7OqcnXBQt8?si=E5JtC-xnrc5ZQYo_

まず起動した仮想マシンのサービスネットワーク1のIPv4アドレスを控えておきます。

次に、ネットワークタグから「DNAT」を追加しました。「転送元グローバルIPv4アドレス」は自動入力され、「転送先プライベートIPアドレス」に先ほど控えておいたサービスネットワークのIPv4アドレスを入力しました。

次に「ACL」を追加しました。動画にならって、以下のように設定しました。

特定のIPアドレスからのみアクセスする場合、以下のように設定しました。

一方、セキュリティの観点から、無制限に任意のアドレスからのアクセスを許可するのはリスクが伴いますが、以下のように設定することで、任意のアドレスからssh接続できるようです。

接続を試す

DATで追加した転送元グローバルIPv4アドレスを使用します。初期ログイン後、パスワードの変更が求められるので、変更します。

ssh mdxuser@<DATで追加した転送元グローバルIPv4アドレス> -i ~/.ssh/mdx/id_rsa

VS Codeで接続する

その後の操作は、必須ではありませんが、VS Codeの拡張機能である「Remote Explorer」を使いました。

仮想マシン内での作業

GPUの確認

sudo su
root@ubuntu-2204:/home/mdxuser# nvidia-smi
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.86.10              Driver Version: 535.86.10    CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA A100-SXM4-40GB          On  | 00000000:03:00.0 Off |                    0 |
| N/A   25C    P0              45W / 400W |      4MiB / 40960MiB |      0%      Default |
|                                         |                      |             Disabled |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+

Dockerのインストール

以下のページの手順に沿って、Dockerをインストールしました。

https://docs.docker.com/engine/install/ubuntu/

for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker run hello-world

Hello from Docker!と表示されれば成功です。

NVIDIA Docker Runtime

(他にもよい方法があるかもしれませんが、)NVIDIA Docker Runtimeをインストールします。以下を実行しました。

# Add the package repositories
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

Dockerコマンドを実行するユーザーをdockerグループに追加

ユーザーをDockerグループに追加

sudo usermod -aG docker $USER

システム再起動

sudo reboot

NDL古典籍OCRのインストール

ここから、NDL古典籍OCRのセットアップを進めます。

以下は少し時間がかかります。

git clone https://github.com/ndl-lab/ndlkotenocr_cli
cd ndlkotenocr_cli
sh ./docker/dockerbuild.sh

次に、コンテナの起動を行いますが、ホストマシンのディレクトリをマウントするように変更しておきます。

./docker/run_docker.sh
docker run --gpus all -d -v /home/mdxuser/tmpdir:/root/tmpdir --rm --name kotenocr_cli_runner -i kotenocr-cli-py37:latest

そして、以下を実行します。

sh ./docker/run_docker.sh

コンテナに入ります。

docker exec -it kotenocr_cli_runner bash

推論の実行

画像のダウンロード

ディレクトリを作成して、「源氏物語」(国立国会図書館所蔵)をダウンロードします。

mkdir -p /root/tmpdir/input/2585098/img
wget https://dl.ndl.go.jp/api/iiif/2585098/R0000003/full/full/0/default.jpg -O /root/tmpdir/input/2585098/img/0001.jpg

OCRの実行

ダウンロードした画像に対して、OCRを実行します。

まず、出力フォルダを作成しておきます。

mkdir -p /root/tmpdir/output

実行します。

python main.py infer /root/tmpdir/input/2585098 /root/tmpdir/output/2585098 -s s

結果、ホストマシンの/home/mdxuser/tmpdir/outputフォルダに認識結果が格納されます。

その他

コンテナの停止

docker stop kotenocr_cli_runner

仮想マシンのシャットダウン

sudo shutdown -r now

まとめ

mdxやNDLラボのおかげで、機械学習を用いた研究に取り組みやすい環境が整っていると感じました。関係者の方々に感謝申し上げます。

Discussion