UbuntuでのImageMagickの”unable to read font `helvetica'”

UbuntuでのImageMagickのconvertコマンドで”helvetica”フォントがない、というエラーが出ることがあります(docker環境とかで特に)。

% convert in.jpg -annotate +10+50 "Hello World" out.png
convert-im6.q16: unable to read font `helvetica' @ error/annotate.c/RenderFreetype/1338

ぐぐるといろいろな解法が書いてありghostscriptの導入などもありましたが、自分の場合Ubuntuではgsfontsをapt installすることでした。

% sudo apt install -y gsfonts

参考
ImageMagick 画像中に文字を入れる – Qiita

2022シーズンのJリーグ公式戦試合日程ical電子カレンダーデータ

2022シーズンのJリーグの全日程も無事発表されました。
今季は開幕戦の発表が非常に早かったので例年であれば遠征計画を立てるのにとても助かったところですが、いかんせんコロナ禍とあって遠征計画の立てようがないのがモヤモヤするところです。

http://2022シーズンの日程が発表【Jリーグ】:Jリーグ.jp

観戦に行ける試合を検討するために電子データ形式でiPhoneやGoogleカレンダーに推しチームの全日程が今すぐ入ってほしい皆さんのために、おそらく日本最速(?)でicalカレンダー形式のデータを作成しました。
jleague2022-ical – Google Drive
これらのicsファイルは再頒布不可とします。Google Calendar等に取り込んだ上で共有カレンダーとすることは不可です。個人のカレンダーのみでご利用ください。

Jリーグデータサイトの日程表を手作業でCSV化し、こちらの自作script(その後Github化)でical形式に変換したものです。コードについてはMITライセンスとします。

活用方法としては、PCやスマートフォンであればicalファイルをダウンロードしてそのまま開くと標準のカレンダーアプリに取り込むことができます。またicalファイルをダウンロードしGoogle Calendarに取り込むことも可能です。
内容の正誤および今後の日程の確定に伴うアップデートについては一切無保証です。

今はとにかくコロナ禍が早く収束し観戦に足を伸ばせるようになることを願い、JリーグファンとしてはJリーグと世間様の足を引っ張るような行動をしないよう気をつけたいものです。
なお、Jリーグのマスコットはレノ丸が最強です。



変換スクリプトで地味にハマったところメモ

  • ブラウザからcsvにコピペするとSJISになってしまうこと
  • ical形式のタイムゾーン指定。とくに、RFC2445を参考にしてZをつけてしまうとGMT扱いとなりカレンダー上で9時間ずれる

自前WordPressを効率的かつタダでDropboxに定期バックアップ

新コロで人の出入りが少なくなると各地の名産品が出回りにくくなる中ですが、2020年はシラスが好漁だそうです。シラス、甘くてプリプリ:日本経済新聞4年ぶり出足好調 シラス漁が解禁 | 平塚 | タウンニュースシラス漁好発進 : ニュース : 静岡 : 地域 : ニュース : 読売新聞オンライン。旬が終わる前に収束してほしいものです。

このブログはさくらのVPS上に自前で構築したWordpressで稼働していて、同じVPS内にもうひとつのWordpressも稼働しています。この状況でデータベース・プラグイン・テーマ・画像といった全コンテンツの定期バックアップをとりかったのですが、お金がかからないこと(※Dropbox代はのぞく)も含めると、意外と適切な既存のソリューションがなかったため、自前で作ってしまいました。
似た状況の中では使えるかもしれないのでMITライセンスでOSS化します。

  • 状況

    • VPS上の自前構築のwordpress

      • MySQLを使用
      • root権限がとれる
      • /var/www/にwordpressインスタンスがある(複数可)

        • 複数の場合、マルチサイトではない。単に別のWordpressインスタンスが同居しているだけ
      • cronなどの設定ができる
  • 前提

    • Dropbox個人アカウント

      • 法人だとquotaを使い潰すのであんまりお勧めしないです
    • サーバにシェルで入ってメンテナンスできる程度には技術がちゃんとある人
    • 今回紹介するコードを読んで何してるかわかる程度には技術がちゃんとある人
    • 必要な技術がない人は、この方法には絶対に手を出さないほうがいいです

目次

なおサービスとオペレーションの行き届いたホスティングサービスとかでなく野良Wordpressでやってる理由については聞かないお約束です。

Continue reading

Webアプリ組み込み目的でSelenium WebDriver + Headless Chromium/Firefoxを使うときの雑多な知見

魚類は一般には変温動物とされますが、マグロなど一部の魚は体温を一定に保ち活動能力を維持する仕組みがあり事実上の恒温動物としての特徴をもつこともあるのだそうです。

PythonベースのWebアプリにHeadless Chrome(Chromium)やHeadless Firefoxを組み込みSeleniumでこれらを制御しようとしたとき、細かいことにいろいろとハマってしまいました。公式サンプルあるいはQiita記事などを含め、1つの例で自分の手元の環境でちゃんと動くようなものがまとまっているものがなかったので、知見をまとめました。
HerokuあるいはDokkuのような環境、すなわちUbuntuベースでDockerベースであり、計算リソースが比較的貧弱な環境を想定していますが、開発用にMacでも確認しています。

Continue reading

Chainerの学習ログをSlackに流すchainer-slack-reportを作った

魚類の中でもマンボウはとても多くの数の卵を生むことで知られており、それが産卵数とイコールなのかは諸説あるものの3億個もの卵を抱えていると言われているのだそうです。

さて、Chainerで学習してるとその進捗をSlackで見られるようにしたいですよね。
そこで、ChainerのPrintReport(標準出力への学習ログレポートExtension)を拡張して同じ内容をSlackに送るExtensionをさくっと作りました。

belltailjp/chainer_slack_report

screencast

Chainerの学習ログをSlackに流そう!という発想自体は当然いくらでもあって、ネットで軽く探しただけでとても優れた先例がたくさんありますし、野良で作って自分で使っている人も少なくないと思います。

DeepLearningの学習経過をslackで受け取れるようにする – Qiita
Chainerの学習の様子をリモートで確認するExtensionを作った – のんびりしているエンジニアの日記
dtaniwaki/chainer-watchdog: Watchdog extension for Chainer

ぼく個人が自分のユースケースにおいて一番困っていた点、そしてchainer-slack-reportで解決しかった点は、いろんな学習を並行して回してその全てをSlackに流しても表示や時系列が崩れないようにしたかったことです。上のスクリーンショットを見ていただくとSlackReportが複数の学習のレポートをうまくさばいている様子がわかるかと思います。

技術的には全く高度なことはしていなくて、「(SlackReportオブジェクトのライフタイムにおいて)初回はSlackに新規メッセージを投げる」「2回め以降はそのメッセージを編集する」というふうにしているだけです。何も難しくないです。

他に実装上の違いとして、ChainerのPrintReportをそのまま継承して画面表示部分のみを乗っ取る実装にしたため、テキストの整形やシリアライズの仕組みはまるごとPrintReportがやってくれるという超シンプルな作りになっています。
何もしないでもserialize・deserializeに対応している点も地味に助かります。たとえばPrintReportではtrainerのsnapshotをロードして学習を途中から再開したとき過去の学習記録をまるごと再表示してくれますが、SlackReportもそのまま同じように動いてくれます。

使い方
% pip install chainer-slack-report

学習コードで使うには、PrintReportと同じようにtrainerに差し込むだけでOKです。もちろんPrintReportと共存できますし、複数のチャンネルに同時に投げたい場合はchannel_idを変えて別々のSlackReportを作りそれぞれをtrainerにextendすればOKです。

PrintReportの初期化時に渡せるような引数はすべてSlackReportの初期化時にも渡せます。
それに加えてSlackに投稿するために必要な情報を渡す必要があり、またSlackでの通知内容の細かな制御のためのオプションを渡すこともできます。

必須の情報として、SlackのWeb APIを叩くためのアクセストークンおよび送信先となるChannelをさすIDがあります。
これらの情報の取得・確認方法はGithubでスクリーンショット付きで解説しています。
どちらかがNoneの場合は単純に何もしないようになっています。
そのため環境変数から取ってくるなどのイディオムを採用するのがよいでしょう。

複数の学習が破綻なくSlackに表示されるのはいいけど、どれがどれかわからないと(数が多いときは)意味がありませんね。
SlackReportではデフォルトでスクリプト名とその引数(要するにargv)をレポートの頭に表示します。
Jupyterで学習を回している場合はこれでは実質無意味な情報になるので、マニュアルで指定することもできます。その場合はSlackReportの初期化時にlabelという名前付き引数に任意の文字列を指定すればOKです。

また、SlackReportのイニシャライザのfinish_mentionsという引数にユーザのアカウント名(@何々)を文字列ないし文字列のリストで渡すと、学習が終了したときにmentionを飛ばしてくれる機能もあります。学習の終了に気づきやすくなるので便利でしょう。何も指定しないと(あるいは指定されたユーザが存在しないと)、普通のレポートのみが表示されて終了します。
Slackのメッセージ長さ制限(2000文字)に引っかからない限り何人でも大丈夫です。ただしユーザグループは未対応です。

import os
from chainer_slack_report import SlackReport
...
r = SlackReport(os.environ.get("SLACK_ACCESS_TOKEN", None),
                os.environ.get("SLACK_CHANNEL_ID", None),
                ['epoch', 'main/loss', 'validation/main/loss',
                 'main/accuracy', 'validation/main/accuracy', 'elapsed_time'],
                finish_mentions="@someone")
trainer.extend(r, trigger=(1, 'epoch'))
...
trainer.run()

FAQ
  • トークンが正しいはずなのにUnauthorizedになります

    • chainer-slack-report初公開時と今で(1日差ですが)、Slack APIを叩くために必要な権限が変わりました。
    • App typeをBotとする設定をしなおしてみてください
    • ちなみにSlackに詳しい方はGithub上のinstructionに従わず通常のAppとしてpermission settingしてもOKです。

      • chat:write:bot, channels:read, users:readの権限が必要です
  • Trainerを使っていないコードでも使えますか?

    • __call__関数で表示までしているのですがこれがtrainerを受け取っているという形で依存しているので、基本的にはTrainerを使っていただけたらと思います。
断念した機能

ChainerにはPlotReportという学習曲線を随時グラフ(PNG画像)にして保存するExtensionがあります。
これもSlackReportで乗っ取ってSlackに投げるようにしてみよう!と思ったのですが、SlackのAPIには「画像を上書きアップロードする」という機能がないため、強引に実現しても「時系列が狂わない」という基本コンセプトが守れないので、断念しました。
いい見せ方ができるアイデアが何かあればよいのですが。

TODO
  • テストする
  • Chainer v5系でも確認

ZealをショートカットキーでToggleするためのshell script

DashのalternativeとしてLinuxマシンではZealを使っています。
Dashにはキーボードショートカット機能があり、指定したキーマップでDashのウィンドウのアクティブ・非アクティブをトグルすることができてとても便利です。
Zealには標準機能としてはこれがなくて、手で毎回画面を出し入れする面倒くささに真面目に対処してこなかったんですが、ちょっとUbuntuのキーボードショートカット機能とxdotoolによるウィンドウ操作を駆使して(というほどのことはしてない)一発でトグルできるようにするシェルスクリプトを書いたので自分用メモも兼ねて記録。

ウィンドウを操作するためにxdotoolが入っている必要があるのでaptで事前に入れておいてください。

Ubuntuの場合、設定方法は”Menu” -> “Keyboard shortcuts” -> “+ Add”で、このシェルスクリプトへのパスを追加するだけです(+xパーミッションをつけるかshを頭につけるかしないとエラーになります)。

Dashのキーボードショートカット機能ではDashをdeactivateするときDashウィンドウは最小化され見えなくなりますが、このシェルスクリプトでは単にZealを(このshell scriptで)activateする直前までactiveであったウィンドウを再びactiveにするのみで、Zealのウィンドウ自体はその元ウィンドウの後ろに行くだけで最小化されたり見えなくなったりはしません。
つまり、もしZealがactivateされたとき直前まで使っていたウィンドウを隠していない場合、deactivateされたZealは見えたままフォーカスだけが元のウィンドウに戻ります(元ウィンドウをZealが隠していた場合、元ウィンドウが最前面に出てくることに伴ってZealは隠されることになります)。
この挙動はデュアルスクリーンの左右でコーディングとZealを行き来するときに便利であると思います。

Dashと同じ挙動にする(Zealをdeactivateする際に最小化させる)場合、

xdotool windowactivate $LAST_ACTIVE_WINDOW_ID

となっているところを、

xdotool windowminimize $ZEAL_WINDOW_ID

と書き換えればOKです(それに伴ってCURRENT_ACTIVE_WINDOW_IDをこねこねしてる部分はまるっと不要になり、shell scriptはだいぶ軽くできます)。

Ubuntu MATE 18.04・Zeal 0.6.1・xdotool 3.20160805.1で動作を確認しています。

Python+Peewee ORM+SQLiteで1億レコード最速insertチャレンジ

イワシの大群が特に大規模になったとき、それをサーディンランと呼び、個体数は数千万とも数億とも数十億ともいわれるのだそうです。そのような生物量がそれほど密集したとき酸素濃度は足りるんだろうかと心配です。

さて、データ処理の一環で億オーダーのレコード数(ディスク上で~100GB)をもつSQLiteテーブルを構築しようということになり、データ自体は生CSVがある状態でこれをなるべく短時間でDBに流し込むという雑なチャレンジをしてみたので、雑な記録をまとめておきました。

できるだけPythonで閉じさせたかったため、C++などで書くという選択肢はなし。
またDBサイズがサイズなのでインメモリではなくファイルに吐き出します。
またスキーマ定義をさくっとやりたい・DB構築後の扱いを楽にしたいということで、PythonベースのORM Peeweeを使用することにしています。なおPeeweeについて詳細は触れないですが、(ユーザビリティ的な意味で)とても軽量でありまたPythonicであるので個人的にはとても好きです。selectのwhereの比較演算子を文字列で渡すとかしなくていいのです。

DB関連は全くの素人なので、もっといい方法があったらぜひアドバイスをいただきたいです。

完全なコードをGist上のipynbにまとめています。

Continue reading

Core i7 7700Kとi7 9700KのUnixBench

あけましておめでとうございます。毎年が魚年です。

手元のデスクトップPCのベンチマークをUnixBenchでとってみたのでメモ。

項目 自宅新PC 業務PC 自宅旧PC
CPU i7 9700K
8C8T 3.6GHz TB4.9GHz
i7 7700K
4C8T 4.2GHz TB4.5GHz
i5 3570
4C4T 3.4GHz TB3.8GHz
メモリ DDR4-2666 8GBx2 (16GB) DDR4-2400 16GBx2 (32GB) DDR3-1600 8GBx2 (16GB)
SSD WD Black 500GB High-Performance NVMe Crucial MX300 525GB N/A (Live USB)
(本来はCrucial M4 256GB)
OS Ubuntu MATE 18.04.1 Ubuntu MATE 18.04.1 Ubuntu MATE 18.04.1 (Liveモード)
GCC 7.3.0 7.3.0 7.3.0

6年戦士の自宅旧PCがLive USBなのは、処分前でディスクをすでに抜いてしまっため。File Copy関連は参考にならない(低く出ているはず)です。

いずれもCPU scaling governerをperformanceにしています。

% sudo cpufreq-set -g performance

なおIntel CPU搭載のUbuntuであればperformanceとpowersaveモードが利用可能ですが、powersaveにしてもスコアは誤差レベルでしか変わりませんでした。

i7 9700K

X Benchmarks (Version 5.1.3)

   System: sillaginoid: GNU/Linux
   OS: GNU/Linux -- 4.15.0-43-generic -- #46-Ubuntu SMP Thu Dec 6 14:45:28 UTC 2018
   Machine: x86_64 (x86_64)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz (7200.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 1: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz (7200.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 2: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz (7200.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 3: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz (7200.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 4: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz (7200.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 5: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz (7200.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 6: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz (7200.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 7: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz (7200.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   00:01:57 up 2 min,  4 users,  load average: 0.14, 0.05, 0.01; runlevel 2018-12-31

 ------------------------------------------------------------------------
Benchmark Run: 火  1月 01 2019 00:01:57 - 00:32:27
8 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       62027018.9 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     3567.3 MWIPS (25.1 s, 7 samples)
Execl Throughput                               5934.1 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks       1738508.8 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          457482.9 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       4629351.3 KBps  (30.0 s, 2 samples)
Pipe Throughput                             2933013.1 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 282824.7 lps   (10.0 s, 7 samples)
Process Creation                               2678.1 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   3386.2 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   5832.1 lpm   (60.0 s, 2 samples)
System Call Overhead                        4218840.7 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   62027018.9   5315.1
Double-Precision Whetstone                       55.0       3567.3    648.6
Execl Throughput                                 43.0       5934.1   1380.0
File Copy 1024 bufsize 2000 maxblocks          3960.0    1738508.8   4390.2
File Copy 256 bufsize 500 maxblocks            1655.0     457482.9   2764.2
File Copy 4096 bufsize 8000 maxblocks          5800.0    4629351.3   7981.6
Pipe Throughput                               12440.0    2933013.1   2357.7
Pipe-based Context Switching                   4000.0     282824.7    707.1
Process Creation                                126.0       2678.1    212.5
Shell Scripts (1 concurrent)                     42.4       3386.2    798.6
Shell Scripts (8 concurrent)                      6.0       5832.1   9720.1
System Call Overhead                          15000.0    4218840.7   2812.6
                                                                   ========
System Benchmarks Index Score                                        1977.0

 ------------------------------------------------------------------------
Benchmark Run: 火  1月 01 2019 00:32:27 - 01:02:03
8 CPUs in system; running 8 parallel copies of tests

Dhrystone 2 using register variables      360870045.0 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    27462.9 MWIPS (19.2 s, 7 samples)
Execl Throughput                              30488.8 lps   (29.7 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks       1423574.4 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          368401.6 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       4716377.0 KBps  (30.0 s, 2 samples)
Pipe Throughput                            17216147.8 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                2686191.6 lps   (10.0 s, 7 samples)
Process Creation                              84876.2 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  59599.6 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   9173.1 lpm   (60.0 s, 2 samples)
System Call Overhead                        7779244.7 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0  360870045.0  30922.9
Double-Precision Whetstone                       55.0      27462.9   4993.3
Execl Throughput                                 43.0      30488.8   7090.4
File Copy 1024 bufsize 2000 maxblocks          3960.0    1423574.4   3594.9
File Copy 256 bufsize 500 maxblocks            1655.0     368401.6   2226.0
File Copy 4096 bufsize 8000 maxblocks          5800.0    4716377.0   8131.7
Pipe Throughput                               12440.0   17216147.8  13839.3
Pipe-based Context Switching                   4000.0    2686191.6   6715.5
Process Creation                                126.0      84876.2   6736.2
Shell Scripts (1 concurrent)                     42.4      59599.6  14056.5
Shell Scripts (8 concurrent)                      6.0       9173.1  15288.5
System Call Overhead                          15000.0    7779244.7   5186.2
                                                                   ========
System Benchmarks Index Score                                        7787.0

アイドル時は800MHzまでクロックが落ちるのでいいですね。
CPUファンをちょっと良いやつにしてみたので、CPU温度もアイドル時30度・UnixBench時や動画並列エンコードなど最大負荷をかけても50度にはいかない程度にとどまるので、とても安心感あります。空冷でもちゃんとしたやつならハイエンドCPUに対しても十分みたいですね。

この構成で1070Tiを載せてパーツ代全部で税込み17万円ぐらい。BTOだったら20万を下回ることはない構成(2018年12月現在)なので自作だとやはり結構抑えられますね。PC組むの久々なのでまる1日仕事にはなりましたが。

i7 7700K

Benchmark Run: 火  1月 01 2019 03:48:55 - 04:19:10
8 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       56530085.0 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     3475.1 MWIPS (23.2 s, 7 samples)
Execl Throughput                               4584.7 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks       1132522.6 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          293491.9 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       2832499.6 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1581458.1 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 248860.2 lps   (10.0 s, 7 samples)
Process Creation                              18400.0 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  15613.3 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   5388.5 lpm   (60.0 s, 2 samples)
System Call Overhead                        1167379.7 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   56530085.0   4844.1
Double-Precision Whetstone                       55.0       3475.1    631.8
Execl Throughput                                 43.0       4584.7   1066.2
File Copy 1024 bufsize 2000 maxblocks          3960.0    1132522.6   2859.9
File Copy 256 bufsize 500 maxblocks            1655.0     293491.9   1773.4
File Copy 4096 bufsize 8000 maxblocks          5800.0    2832499.6   4883.6
Pipe Throughput                               12440.0    1581458.1   1271.3
Pipe-based Context Switching                   4000.0     248860.2    622.2
Process Creation                                126.0      18400.0   1460.3
Shell Scripts (1 concurrent)                     42.4      15613.3   3682.4
Shell Scripts (8 concurrent)                      6.0       5388.5   8980.8
System Call Overhead                          15000.0    1167379.7    778.3
                                                                   ========
System Benchmarks Index Score                                        1913.0

 ------------------------------------------------------------------------
Benchmark Run: 火  1月 01 2019 03:48:55 - 04:19:10
8 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       56530085.0 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     3475.1 MWIPS (23.2 s, 7 samples)
Execl Throughput                               4584.7 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks       1132522.6 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          293491.9 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       2832499.6 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1581458.1 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 248860.2 lps   (10.0 s, 7 samples)
Process Creation                              18400.0 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  15613.3 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   5388.5 lpm   (60.0 s, 2 samples)
System Call Overhead                        1167379.7 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   56530085.0   4844.1
Double-Precision Whetstone                       55.0       3475.1    631.8
Execl Throughput                                 43.0       4584.7   1066.2
File Copy 1024 bufsize 2000 maxblocks          3960.0    1132522.6   2859.9
File Copy 256 bufsize 500 maxblocks            1655.0     293491.9   1773.4
File Copy 4096 bufsize 8000 maxblocks          5800.0    2832499.6   4883.6
Pipe Throughput                               12440.0    1581458.1   1271.3
Pipe-based Context Switching                   4000.0     248860.2    622.2
Process Creation                                126.0      18400.0   1460.3
Shell Scripts (1 concurrent)                     42.4      15613.3   3682.4
Shell Scripts (8 concurrent)                      6.0       5388.5   8980.8
System Call Overhead                          15000.0    1167379.7    778.3
                                                                   ========
System Benchmarks Index Score                                        1913.0

 ------------------------------------------------------------------------
Benchmark Run: 火  1月 01 2019 04:19:10 - 04:50:33
8 CPUs in system; running 8 parallel copies of tests

Dhrystone 2 using register variables      325161813.9 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    19474.7 MWIPS (28.5 s, 7 samples)
Execl Throughput                              24605.3 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks       1695174.5 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          445061.6 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       4865765.0 KBps  (30.0 s, 2 samples)
Pipe Throughput                             9554265.8 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                1938914.1 lps   (10.0 s, 7 samples)
Process Creation                              86469.2 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  51215.3 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   7675.0 lpm   (60.0 s, 2 samples)
System Call Overhead                        7493113.4 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0  325161813.9  27863.1
Double-Precision Whetstone                       55.0      19474.7   3540.9
Execl Throughput                                 43.0      24605.3   5722.2
File Copy 1024 bufsize 2000 maxblocks          3960.0    1695174.5   4280.7
File Copy 256 bufsize 500 maxblocks            1655.0     445061.6   2689.2
File Copy 4096 bufsize 8000 maxblocks          5800.0    4865765.0   8389.2
Pipe Throughput                               12440.0    9554265.8   7680.3
Pipe-based Context Switching                   4000.0    1938914.1   4847.3
Process Creation                                126.0      86469.2   6862.6
Shell Scripts (1 concurrent)                     42.4      51215.3  12079.1
Shell Scripts (8 concurrent)                      6.0       7675.0  12791.7
System Call Overhead                          15000.0    7493113.4   4995.4
                                                                   ========
System Benchmarks Index Score                                        6854.2

i5 3570

BYTE UNIX Benchmarks (Version 5.1.3)</pre>
System: ubuntu-mate: GNU/Linux
OS: GNU/Linux -- 4.15.0-29-generic -- #31-Ubuntu SMP Tue Jul 17 15:39:52 UTC 2018
Machine: x86_64 (x86_64)
Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
CPU 0: Intel(R) Core(TM) i5-3570 CPU @ 3.40GHz (6799.9 bogomips)
Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
CPU 1: Intel(R) Core(TM) i5-3570 CPU @ 3.40GHz (6799.9 bogomips)
Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
CPU 2: Intel(R) Core(TM) i5-3570 CPU @ 3.40GHz (6799.9 bogomips)
Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
CPU 3: Intel(R) Core(TM) i5-3570 CPU @ 3.40GHz (6799.9 bogomips)
Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
18:56:39 up 2:06, 1 user, load average: 0.00, 0.00, 0.09; runlevel 2018-12-31

 ------------------------------------------------------------------------
Benchmark Run: Mon Dec 31 2018 18:56:39 - 19:25:38
4 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables 46001947.1 lps (10.0 s, 7 samples)
Double-Precision Whetstone 3571.7 MWIPS (15.9 s, 7 samples)
Execl Throughput 5504.8 lps (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks 1080708.2 KBps (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks 282868.5 KBps (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks 2941169.9 KBps (30.0 s, 2 samples)
Pipe Throughput 1295184.1 lps (10.0 s, 7 samples)
Pipe-based Context Switching 209435.3 lps (10.0 s, 7 samples)
Process Creation 13663.2 lps (30.0 s, 2 samples)
Shell Scripts (1 concurrent) 9563.6 lpm (60.0 s, 2 samples)
Shell Scripts (8 concurrent) 3438.4 lpm (60.0 s, 2 samples)
System Call Overhead 936350.5 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 46001947.1 3941.9
Double-Precision Whetstone 55.0 3571.7 649.4
Execl Throughput 43.0 5504.8 1280.2
File Copy 1024 bufsize 2000 maxblocks 3960.0 1080708.2 2729.1
File Copy 256 bufsize 500 maxblocks 1655.0 282868.5 1709.2
File Copy 4096 bufsize 8000 maxblocks 5800.0 2941169.9 5071.0
Pipe Throughput 12440.0 1295184.1 1041.1
Pipe-based Context Switching 4000.0 209435.3 523.6
Process Creation 126.0 13663.2 1084.4
Shell Scripts (1 concurrent) 42.4 9563.6 2255.6
Shell Scripts (8 concurrent) 6.0 3438.4 5730.6
System Call Overhead 15000.0 936350.5 624.2
========
System Benchmarks Index Score 1636.8

 ------------------------------------------------------------------------
Benchmark Run: Mon Dec 31 2018 19:25:38 - 19:54:23
4 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables 172882513.2 lps (10.0 s, 7 samples)
Double-Precision Whetstone 14921.4 MWIPS (14.4 s, 7 samples)
Execl Throughput 19555.6 lps (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks 3048166.0 KBps (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks 849643.4 KBps (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks 7705026.7 KBps (30.0 s, 2 samples)
Pipe Throughput 4863898.8 lps (10.0 s, 7 samples)
Pipe-based Context Switching 1002740.5 lps (10.0 s, 7 samples)
Process Creation 47665.8 lps (30.0 s, 2 samples)
Shell Scripts (1 concurrent) 28147.8 lpm (60.0 s, 2 samples)
Shell Scripts (8 concurrent) 4407.1 lpm (60.0 s, 2 samples)
System Call Overhead 3330777.8 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 172882513.2 14814.3
Double-Precision Whetstone 55.0 14921.4 2713.0
Execl Throughput 43.0 19555.6 4547.8
File Copy 1024 bufsize 2000 maxblocks 3960.0 3048166.0 7697.4
File Copy 256 bufsize 500 maxblocks 1655.0 849643.4 5133.8
File Copy 4096 bufsize 8000 maxblocks 5800.0 7705026.7 13284.5
Pipe Throughput 12440.0 4863898.8 3909.9
Pipe-based Context Switching 4000.0 1002740.5 2506.9
Process Creation 126.0 47665.8 3783.0
Shell Scripts (1 concurrent) 42.4 28147.8 6638.6
Shell Scripts (8 concurrent) 6.0 4407.1 7345.2
System Call Overhead 15000.0 3330777.8 2220.5
========
System Benchmarks Index Score 5193.7

所感

i5 3570→i7 9700Kであっても倍精度演算(Whetstone MWIPS)が実はコア当たりだと全然速くなってないらしいのが意外。SIMDでなければ1FLOP/1clockに漸近していくからかな?
OS関連、プロセスとかシステムコールとかが圧倒的に速くなってるみたい。日頃の動作で差を感じることは多そう。

Chainerで書いたニューラルネットの理論計算量を推定するchainer_computational_cost

海洋の生物量の推定をするときには、実際にある空間の種ごとの個体数を1匹1匹数えるわけにはいきません。そこで、水中に残った生物の細胞のDNAすなわち環境DNAの密度を手がかりにして推計をするのだそうです(バケツ一杯の水で海洋生物の量や種類を知る)。

Chainerで書いたNNとダミー入力があるとき、そのNNのforward passの理論的な計算量・メモリ転送量を計算するchainer_computational_costを作りました。
ChainerのFunction Hookをベースにしているため、NNの定義コードに手を入れる必要は一切ありません。

Continue reading

OpenCV野良ビルド時にCMakeが指定したPythonのライブラリをうまく見つけてくれない時は

OpenCVをPythonサポート込みでビルドしたいことがあります。
Python側へインタフェースを露出するためのヘッダなどが必要なので、いくつかのPython関連パッケージを入れれば、あとはシンプルにCMakeを実行すればよいことがほとんどです。
(そのやり方はネットにたくさんまとまっているので他をご参照ください)

% sudo apt-get install python2.7-dev python3.4-dev #などなど。
% cd /path/to/opencv/source/root
% mkdir build; cd build
% cmake -DBUILD_opencv_python2=ON -DBUILD_opencv_python3=ON ..

一方で、rootがないなどの状況でpython2.7-devなどのパッケージがシステムにない場合は、例えばpyenvを使って一時的にpythonをユーザ環境に入れそのパスを参照させることで、Python対応こみでビルドすることが可能です。
(ビルドがおわったら一時的に入れたPython環境は消してOKです)

% pyenv install miniconda2-latest
% pyenv install miniconda3-latest
% cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=$HOME \
        -DBUILD_opencv_python2=ON \
        -DPYTHON2_EXECUTABLE=`pyenv local miniconda2-latest; pyenv which python` \
        -DPYTHON2_INCLUDE_DIR=`pyenv local miniconda2-latest; python -c 'from distutils.sysconfig import get_python_inc; print(get_python_inc())'` \
        -DPYTHON2_NUMPY_INCLUDE_DIRS=`pyenv local miniconda2-latest; python -c 'import numpy; print(numpy.get_include())'` \
        -DPYTHON2_LIBRARIES=`find $PYENV_ROOT/versions/miniconda2-latest/lib -name 'libpython*.so'` \
        -DBUILD_opencv_python3=ON \
        -DPYTHON3_EXECUTABLE=`pyenv local miniconda3-latest; pyenv which python` \
        -DPYTHON3_INCLUDE_DIR=`pyenv local miniconda3-latest; python -c 'from distutils.sysconfig import get_python_inc; print(get_python_inc())'` \
        -DPYTHON3_NUMPY_INCLUDE_DIRS=`pyenv local miniconda3-latest; python -c 'import numpy; print(numpy.get_include())'` \
        -DPYTHON3_LIBRARIES=`find $PYENV_ROOT/versions/miniconda3-latest/lib -name 'libpython*.so'` \
        ..

このとき、CMakeを走らせたときの序盤にこんなメッセージが出たり(PythonLibsを見つけられてなかったり、意図したのと違うものを見つけに行ってる)、

 -- Found PythonInterp: /home/xxxx/.pyenv/versions/miniconda2-latest/bin/python (found suitable version "2.7.14", minimum required is "2.7")
 -- Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython2.7.so (found suitable exact version "2.7.14")
 -- Found PythonInterp: /home/xxxx/.pyenv/versions/miniconda3-latest/bin/python (found suitable version "3.6.3", minimum required is "3.4")
 -- Could NOT find PythonLibs (missing:  PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS) (found suitable exact version "3.6.3")

CMakeの最後の結果表示のときにこんなメッセージが出たり(LibrariesがNO)、

 --   Python 2:
 --     Interpreter:                 /home/xxxx/.pyenv/versions/miniconda2-latest/bin/python (ver 2.7.14)
 --     Libraries:                   NO
 --     numpy:                       /home/xxxx/.pyenv/versions/miniconda2-latest/lib/python2.7/site-packages/numpy/core/include (ver 1.14.0)
 --     packages path:               lib/python2.7/site-packages
 --
 --   Python 3:
 --     Interpreter:                 /home/xxxx/.pyenv/versions/miniconda3-latest/bin/python (ver 3.6.3)
 --     Libraries:                   NO
 --     numpy:                       /home/xxxx/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/numpy/core/include (ver 1.14.0)
 --     packages path:               lib/python3.6/site-packages

正しく指定したはずのライブラリのパスをCMakeがどうも認識してくれない様子のときは、CMakeのバージョンを疑ってみてください

% cmake --version
cmake version 2.8.12.2

2.8系では、うまくPythonのライブラリをみつけてくることができないようです。
OpenCVの提供するCMakeLists.txtのcmake_minimum_requiredは(Linuxであれば)2.8になっているので、特に怒られることなく進んでしまう、というのが罠でした(今回取り上げたかなり限定的なシチュエーション以外ではそれで問題なく動くためです)。
より新しいCMake 3.5などを使ってください。

特にUbuntu14.04をまだ使っていたりした場合は、標準でapt-getしたものは2.8までになります。
野良ビルドするなり、PPAにするなり、新しいUbuntuに乗り換えるなりするといいです。

自分用メモ。