📘

ndlocr_cli実行時の共有メモリ不足への対応ほか

2024/06/05に公開

概要

ndlocr_cli(NDLOCR(ver.2.1)アプリケーションのリポジトリ)を実行した際、いくつか対応を行う必要がありましたので、その備忘録です。

なお、これらの対応は私の設定漏れや変則的な使用方法によるものが多く、一般的な使用においては発生しないと思われます。同様の不具合が発生した際の参考としてご覧ください。

共有メモリ不足

ndlocr_cliを実行した際、以下のエラーが発生しました。

Predicting: 0it [00:00, ?it/s]ERROR: Unexpected bus error encountered in worker. This might be caused by insufficient shared memory (shm).
DataLoader worker (pid(s) 3999) exited unexpectedly

Chat GPTによる回答は以下でした。

「Unexpected bus error encountered in worker」というエラーメッセージは、通常、PyTorchのDataLoaderを使用している際に、共有メモリ(shared memory)が不足している場合に発生します。特に、データセットが大きい場合や多くのワーカーを使用している場合にこの問題が見られることがあります。

そして、以下の指示がありました。

Dockerや他の仮想環境を使用している場合は、共有メモリのサイズを増やす必要があります。Dockerを使用している場合は、コンテナを起動する際に --shm-size オプションを設定します。例えば、docker run --shm-size 2G ... のように設定します。

これについて、私のdockerの実行コマンドを確認したところ、--shm-sizeの指定が漏れていました。以下のスクリプトでは、--shm-size=256mが指定されていました。

https://github.com/ndl-lab/ndlocr_cli/blob/master/docker/run_docker.sh

上記のオプションを付与して実行したところ、無事、共有メモリ不足のエラーは解消しました。

(参考)現在の共有メモリのサイズを確認する

以下のコマンドにより確認できました。

df -h /dev/shm

上記のエラーが発生した時、64mとなっていました。

KeyError: 'STRING'

何度か、KeyError: 'STRING'に遭遇しました。この対処にあたり、以下の二つのファイルに変更を加えました。

https://github.com/ndl-lab/ndlocr_cli/blob/master/cli/core/inference.py#L681

https://github.com/ndl-lab/ruby_prediction/blob/646de35cefde6fa205f4b6a3ac308e7f5ba91061/output_ruby.py#L104C45-L104C65

line_xml.attrib['STRING']elm.attrib['STRING']の箇所でエラーが発生していたため、以下の処理を加えました。

if 'STRING' not in line_xml.attrib:
    continue

参考:プログレスバーの追加

OCR処理中のプログレスバーを表示したいケースがありました。以下の箇所を修正します。

https://github.com/ndl-lab/ndlocr_cli/blob/master/cli/core/inference.py#L213

具体的には、以下のようにtqdmを追加します。

from tqdm import tqdm

# for img_path in single_outputdir_data['img_list']:
for img_path in tqdm(single_outputdir_data['img_list']):
    ...

これにより、現在の進行状況や処理に要する残り時間の推定値などを確認できるようになります。

まとめ

ndlocr_cli を基本的に使用する際には、この記事のようなエラーハンドリングが必要な場面はないかと思いますが、同様の問題に対応する際の一助として参考になりましたら幸いです。

Discussion