ndlocr_cli実行時の共有メモリ不足への対応ほか
概要
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
が指定されていました。
上記のオプションを付与して実行したところ、無事、共有メモリ不足のエラーは解消しました。
(参考)現在の共有メモリのサイズを確認する
以下のコマンドにより確認できました。
df -h /dev/shm
上記のエラーが発生した時、64m
となっていました。
KeyError: 'STRING'
何度か、KeyError: 'STRING'
に遭遇しました。この対処にあたり、以下の二つのファイルに変更を加えました。
line_xml.attrib['STRING']
やelm.attrib['STRING']
の箇所でエラーが発生していたため、以下の処理を加えました。
if 'STRING' not in line_xml.attrib:
continue
参考:プログレスバーの追加
OCR処理中のプログレスバーを表示したいケースがありました。以下の箇所を修正します。
具体的には、以下のように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