Raspberry Pi 3 B+ & Raspberry Pi OS & OpenCV 4.2.0

システムに最適化してOpenCV 4.2.0の環境を構築する

Raspberry Pi 3 B+に Raspberry Pi OS (旧名 Raspbian ) を載せて OpenCV 4.2.0 をNEONとVFPV3を有効にしてコンパイルした時のcmakeのオプションと、ちょっとしたノウハウを書いておく。全体のコンパイルのやり方はあちこちに書いてあるので、そっちを参照して欲しい。

拡張命令

Raspberry Pi 3 にはSoC(CPUチップ)にARMv7が使われていて、拡張命令・拡張機能が用意されており、それを使えばCPUのみで処理するよりも速くなる。

  • モデル名 ARMv7 Processor rev 4 (v7l)
  • 拡張命令・拡張機能 half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32

OpenCV 4.2.0では cmakeの引数でFAST_MATHと NEONと VFPV3 をONにすることで、これらの拡張機能が使えるようになる。

  • VFP (Vector Floating Point) はARMアーキテクチャのコプロセッサ拡張で、VPFv3では半精度、単精度、倍精度の浮動小数点演算が計算できる。
  • NEONとはSIMD and Floating-point命令の名称で、こちらも処理の高速化に寄与する。

cmakeの引数

cmake -D CMAKE_BUILD_TYPE=RELEASE \
 -D CMAKE_INSTALL_PREFIX=/usr/local \
 -D INSTALL_C_EXAMPLES=OFF \
 -D INSTALL_PYTHON_EXAMPLES=ON \
 -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
 -D BUILD_EXAMPLES=OFF \
 -D BUILD_TEST=OFF \
 -D ENABLE_FAST_MATH=ON \
 -D ENABLE_NEON=ON \
 -D ENAVLE_VFPV3=ON ..

結果

CPUのみのものと、拡張命令を使ったものを2つ作って比較したところ、顔検出、両目検出などにおいては、拡張命令を使ったものは平均で半分程度の処理時間で終わった。

コンパイル時についてのTips

makeを使ってのコンパイルでは、最初の方は軽い処理からは始まり、最後の方はライブラリ全体を最適化するような重い処理がいくつも発生する。この時、仮想記憶容量がデフォルトのままでは足りなくなるので、スワップサイズを1024KBにしておく必要がある。

makeの後半にあるpythonのcv2ライブラリを作る段階では大量にメモリを消費する。この時、実メモリを1GBしかもたないRaspberry Pi 3では、当然ながら、ページイン・ページアウトによるスラッシングが発生し、ロードアベレージが極端に上昇する。少しでもメモリに余裕が欲しいため、ディスプレイを接続せずにブートしGUIに使うメモリ量を節約した。作業はssh経由でログインして行った。

microSDカードやUSBメモリ上でコンパイルせずに、nfsを使いファイルサーバー(M.2 SSD)に接続し、その上にソースコードを展開し、コンパイルした。ファイルサーバーとなったGNU/Linux上でネットワークのトラフィックを確認していたが30MB/sec程度のスループットが確保出来ていた。

makeは-jオプションを使ってコンパイルを並列化することが可能であり、4コアを持つarmv7lなので、4コアをフルに使うことが有効といわれている。しかし、現実にはコンパイル以外のシステムも同時に動いているので、すべてのコアをコンパイルに充てると、トータルでのシステムのスループットが悪くなってしまう。そのため3コアのみをコンパイルに使用し、1コアをシステムに割り当てた。

並列化の最大の問題点はRaspberry Pi 3の実メモリは1GBと余裕がなく、それを複数のコンパイル・プロセスが奪い合うことである。小さいサイズのモジュールをコンパイルしている時は良いが、後半になり大きなモジュールをコンパイルする際は、頻繁にページイン・ページアウトを繰り返すようになる。また、コンパイル時に大量のメモリが必要なケースはランダムに発生するわけではなく、後半に連続して発生する。スラッシングは極端にスループットを落とす。そこで、定期的にスワップ領域の利用状況をみて、長期間に渡りスワップ領域が逼迫している時は、makeを一旦killし、シングルタスクのmakeに戻して処理し、スワップ領域が使われなくなったらば、また並列処理オプションをつけたmakeに戻すといったことをした。比較をしていないので、どの程度コンパイル時間が短くなったかはわからないが、理屈としてはページイン・ページアウトのスラッシングを避けているので、トータルで効率がよくなっているはずである。

OpenSSL Performance Check with aes-256-cbc for ROCKPro64 Software and Hardware

ROCKPro64 is a Single Board Computer released by Pine64. Its powered by a Rockchip RK3399 Hexa-Core (dual ARM Cortex A72 and quad ARM Cortex A53) 64-Bit Processor with MALI T-860 Quad-Core GPU.

OpenSSL Performance Check with aes-256-cbc for ROCKPro64 software and hardware.

$ openssl speed  -elapsed    aes-256-cbc 
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-256 cbc      68450.84k    78235.35k    78989.91k    79455.23k    78370.13k
$ openssl speed  -elapsed   -evp  aes-256-cbc 
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-256-cbc     135741.27k   499927.91k   903577.00k   995216.04k  1021971.11k

巨匠マイケル・マン監督でもコンピュータセキュリティの表現はうまくいかない。映画「ブラックハット」

「「ヒート」「コラテラル」の巨匠マイケル・マン監督5年ぶりの最新作<ブラックハット>という文字がまず最初に目に飛び込んで来るこの映画。いきなりキャッチコピーで巨匠ですよ、巨匠。自分の中ではTVシリーズのマイアミ・バイスでガッツリ当てた製作総指揮の巨匠でも、最後に見た巨匠が関わった映画は「ハンコック(2008)」、悪くはないが微妙な映画のイメージだ。

謎のサイバー攻撃とそれを追う天才サイバー犯罪者

ざっくりいうと、謎のサイバー攻撃で、香港の原子炉は暴走して破壊するわ、シカゴの取引所で先物取引が急騰するわ、さあ大変ということで、刑務所にいる天才サイバー犯罪者ハザウェイを引きずり出して、犯人を追うというストーリーである。

この映画の特徴はコンピュータセキュリティに関してリアルな表現をしようとしている点だ。巨匠のインタビューにこうある。

僕はStuxnet(スタックスネット)に引かれるようになっていた〜
(blackhatパンフより)

この巨匠の言葉にある”Stuxnet“がこそがこの映画の最大のキーである。Stuxnetを短く説明すると、世界で初めてのマルウェア兵器と認識された悪意のあるソフトウェアなのである。より詳しい説明をしよう。

映画を理解するためのキーワード”Stuxnet”

Stuxnetというのは工場の生産ラインやプラント制御といった場面で使われている独シーメンス社製制御システムを狙ったマルウェアである。マルウェアとは悪意のあるソフトウェアの総称で、誰でも一度は聞いたことがあるであろうコンピュータ・ウイルスもマルウェアの範囲に入る。Stuxnetは、厳密には自律的に感染を広げるコンピュータ・ワームに分類されるマルウェアである。

独シーメンス社製制御システムはイランの核燃料施設のウラン濃縮用遠心分離機に使われている。Stuxnetによる攻撃によって核燃料施設ではウラン濃縮が長期間に渡り出来なくなった。イランの核開発は大きな遅れを発生させるどころではなく、原因不明の機材不調で続行不可能なレベルになったといわれている。

StuxnetはUSBメモリからも感染可能である。核燃料施設の制御システムは外部からネットワーク的にも物理的にも隔離されており外部からネットワーク経由で侵入するということはできない。つまり誰かが核燃料施設の制御用コンピュータにUSBメモリを差し込んだのだ。そしてStuxnetは内部で接続している制御用コンピュータに次々と感染していった。しかも、静に深く潜り込み、プラントを止めるのではなく遠心分離機の精度を微妙に狂わせ、出来上がった濃縮ウランが兵器には使えないレベルの精度になる、という巧妙な手法を取る。

Stuxnetが世に知られることになったのは、後にかなり感染が広がってからベラルーシで発見されてからである。後の分析の結果、極めて巧妙に作られいることがわかった。まだ知られていないソフトウェアの脆弱性(セキュリティ侵害を起こすことができるソフトウェアの誤り)を使っている、確実に動作する、目立った形で動作しない、分析が難しいように作られている、などなどだ。しかも、西側のシステムには感染しない、もしくは感染しづらいように出来ており、感染地域の6-7割はイランで、あとはイスラム圏の工業が進んでいる諸国がほとんどだった。

今ではStuxnetは「エネミー・オブ・アメリカ(1998)」でお馴染みの米国国家安全保障局NSAと、イスラエル参謀本部諜報部局情報担当ユニット Unit8200が、イランの核開発を妨害するための「兵器」として作ったマルウェアということになっている。なので、この映画のウリでもある原子力発電所の原子炉を暴走させるシーンは、あながち絵空事ではない。

攻撃側の技術描写は正確…だが

ネタバレぎみになるので、これから観ようと思う人は読むのを避けた方がよい。

続きを読む

Raspberry Pi に OpenJDKをインストールしようとしたらうまくいかなかった

Raspberry PiにOpenJDK をaptでインストールしようとしたら途中でコケてしまい困った。次の方法でインストールした。

% sudo apt install openjdk-9-jdk
(エラー)

これでエラーになってしまったため、困る。ぐぐってみると個別にインストールするとうまくいくよ、というアドバイスがあったので試してみる。まず最初にopenjdk-9-jre-headless と openjdk-9-jre の2つを削除してから個別にインストールする。

% sudo apt-get remove openjdk-9-jre-headless openjdk-9-jre
% sudo apt-get install ca-certificates-java
% sudo apt-get install openjdk-9-jre-headless
% sudo apt-get install openjdk-9-jre

最後にもう一度 openjdk-9-jdk をインストールし直す。

% sudo apt install openjdk-9-jdk

とりあえずインストールだけは無事に終わった。