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に乗り換えるなりするといいです。

自分用メモ。

tmuxのセッション作成時に名前付けを強制するzshrc

魚を飼う時、繁殖をさせやすいのはグッピーやアカヒレなどだそうです。数匹のつがいがいればすぐに数百匹まで増えてしまうんだとか。

さて、tmuxヘビーユーザーなんですがセッションが乱立しがちで、外からsshして既存セッションをattachするときにどれがどれかわからないことが個人的にはよくあります。
セッション内の任意のウィンドウもしくはペインでtmux rename-sessionをすることでセッション全体に名前をつけることができ、attachするときこの名前で参照することができて便利です。
これを、セッション作成時に自動で聞くようにしてみました。

やりたいこと

  • tmuxでセッションを作ったあと最初のウィンドウが開かれる時、そのセッションに名前をつけるのを強制したい
  • 何も入力しないことも許容する。その場合は名前付けしない

やりたくないこと

  • 名前付けしなかった場合、セッション内で新たなウィンドウやペインを開く度にまた聞かれたくない

やってることは単純で、zshが起動した時それがtmuxセッション内でかつセッション名がデフォルト(数字のみ)のままである場合、名前の入力を求めtmux rename-sessionコマンドを呼ぶだけです。
何も入力しない場合はセッション名はデフォルトのまま放置しますが、そのままだとセッション内で新たなshellを開く度にプロンプトが出て鬱陶しいので、それが出ないようtmuxのsession-wideな環境変数を使いマークしています。シェル環境変数にマークした場合引き継がれないのでうまくいきません。

tmux 2.2(Mac)と2.1(Ubuntu)で確認しています。

てきとうに書いたのでもっとCOOLなやり方もあると思いますが、ひとまずこんなかんじで。

Firefox QuantumでTree Style Tabを使う時タブバーを消したかった

マッコウクジラは鯨の中でも特に深海に特化した進化をしていて、海面で息継ぎをしてから3000メートルを一気に潜ってしまうそうです。頭部にびっしり詰まっている脳油を海水と血液で冷やしたりし温めたりて比重を変えることで潜ったり浮いたりする様は、潜水艦よりも高度とさえ言えるのかもしれない。

さて、最近爆速になって登場したFirefox Quantumを使っているのですが、WebExtension版のTree Style Tabを使っていても画面上の方にタブバーが一緒に出てきてしまって邪魔でした。

基本的には
Firefox Quantum(57以上)で上部のタブバーを消す – Qiita
の通りなのですが、それだけだとなぜか動かなかったので、もう少し調べた結果出てきたこちら
Firefox Quantum (ver >= 57) – How Can I Hide the Horizontal Tab Bar with TreeStyle Tabs? – Super User
を適用すると動きました。

合わせると、新規作成するuserChrome.cssには次のような内容を書けばOKです。

@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
#tabbrowser-tabs {
  visibility: collapse !important;
}
#sidebar-header {
  visibility: collapse;
}

Macだとちょっとだけウィンドウのタイトルバー?がおかしいですが、困るものではないのでまぁいいでしょう。

完全に自分用メモ。

cupyで2次元ガウス窓を生成する

8000メートルなどを超えるような超深海では、超高圧のためタンパク質の構造自体が保てなくなる(水分子が侵入し破壊される)ことから、通常の構造の延長としての生物は生息できないのだそうです。そこにいる生物は、TMAOという物質がもつタンパク質に侵入する水分子をブロックする性質を利用して生きているのだとか。したたかです。

さて、Pythonを使って2次元のガウス窓を生成したくなりました。
1次元でのscipy.signal.gaussianの多次元版にあたるものです。

具体的には、画像として描画するとこんなかんじになるような配列の生成が目的です。

Continue reading

Dashにchainerのドキュメントを登録する

魚について調べる時、(Wikipediaもいいんですが)FishBase : A Global Information System on Fishesとかは結構分量も凄くて、英語中心ですがときどき役に立ちます。

さて、Macを3年ぐらい使ってきてて恥ずかしながらわりと最近までドキュメントのインクリメンタルサーチができるDashを知らなかったんですけども、ちょっと前から使うようになりました。仕事や趣味でChainerを使うんですが、ChainerのドキュメントはDashで提供されてないので、自分でドキュメントをDash用に変換する必要があります。

とは言えChainerはSphinxでドキュメントが書かれているので、doc2dashというpipを使えば一発でできます。

なのですごい簡単なんですが、環境を新しくする度にやり方を調べてやってる気がするので、メモ。
別にchainer限定ではなくて他の何にでも当てはまる一般的な話なんですが、あえてchainer specificな話題にしてみました。

# 準備。doc2dashを入れる。
% pip install doc2dash

# Cloneしてくる
% git clone https://github.com/pfnet/chainer.git --branch v2.0.0
% cd chainer/docs

# Optional: アイコンに使う画像をダウンロードしてくる。ここではTwitterから。
% wget https://pbs.twimg.com/profile_images/606654945438203905/D7LygzpN_400x400.png -O chainer_logo.png

# ドキュメントをビルドし、dash形式に変換
% make html
% doc2dash build/html -n chainer2 -i chainer_logo.png
# % doc2dash build/html -n chainer2   #アイコンが不要な場合

これを実行すると、chainer2.docsetというディレクトリが生成されます。Sphinx等はもちろん入っている必要があるので、怒られた場合は指示に従って入れてください。
Dashをインストール済みのMacでFinderにてこのディレクトリをダブルクリックすると、検索できるドキュメントとして追加されます。

ぼくの場合手元のMacだと、2017/7/3現在でのmasterのときsphinxのビルド(上記のmake html)がこんなかんじで失敗することがあったので、Linux環境でmakeしました。また、いきなりmake htmlするとエラーで死ぬんですがmake dirhtmlしてからmake htmlすると通ることも度々ありました。ちょっと謎。

% make dirhtml
...
...
reading sources... [ 76%] reference/generated/chainer.links.StatelessLSTM
reading sources... [ 76%] reference/generated/chainer.links.VGG16Layers
reading sources... [ 76%] reference/generated/chainer.links.caffe.CaffeFunction
reading sources... [ 77%] reference/generated/chainer.links.model.vision.googlenet.prepare
reading sources... [ 77%] reference/generated/chainer.links.model.vision.resnet.ResNetLayers
reading sources... [ 77%] reference/generated/chainer.links.model.vision.resnet.prepare
reading sources... [ 77%] reference/generated/chainer.links.model.vision.vgg.prepare
reading sources... [ 78%] reference/generated/chainer.optimizers.AdaDelta
/Users/hoge/Work/chainer/chainer/docs/source/reference/check.rst:30: WARNING: failed to import chainer.gradient_check.check_backward
/Users/hoge/Work/chainer/chainer/docs/source/reference/check.rst:30: WARNING: failed to import chainer.gradient_check.numerical_grad
/Users/hoge/Work/chainer/chainer/docs/source/reference/check.rst:30: WARNING: toctree references unknown document 'reference/generated/chainer.gradient_check.check_backward'
/Users/hoge/Work/chainer/chainer/docs/source/reference/check.rst:30: WARNING: toctree references unknown document 'reference/generated/chainer.gradient_check.numerical_grad'
/Users/hoge/Work/chainer/chainer/docs/source/reference/check.rst:43: WARNING: failed to import chainer.testing.assert_allclose
/Users/hoge/Work/chainer/chainer/docs/source/reference/check.rst:43: WARNING: toctree references unknown document 'reference/generated/chainer.testing.assert_allclose'
/Users/hoge/Work/chainer/chainer/docs/source/reference/check.rst:53: WARNING: failed to import chainer.testing.unary_math_function_unittest
/Users/hoge/Work/chainer/chainer/docs/source/reference/check.rst:53: WARNING: toctree references unknown document 'reference/generated/chainer.testing.unary_math_function_unittest'
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.Chain.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.ChainList.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.Link.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/Work/chainer/chainer/docs/source/reference/core/optimizer.rst:4: WARNING: failed to import chainer.Hyperparameter
/Users/hoge/Work/chainer/chainer/docs/source/reference/core/optimizer.rst:4: WARNING: toctree references unknown document 'reference/core/generated/chainer.Hyperparameter'
WARNING: /Users/hoge/Work/chainer/chainer/docs/source/reference/datasets.rst:57: (WARNING/2) autodoc: failed to import class 'ConcatenatedDataset' from module 'chainer.datasets'; the following exception was raised:
Traceback (most recent call last):
  File "/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/sphinx/util/inspect.py", line 169, in safe_getattr
    return getattr(obj, name, *defargs)
AttributeError: module 'chainer.datasets' has no attribute 'ConcatenatedDataset'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/sphinx/ext/autodoc.py", line 664, in import_object
    obj = self.get_attr(obj, part)
  File "/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/sphinx/ext/autodoc.py", line 554, in get_attr
    return safe_getattr(obj, name, *defargs)
  File "/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/sphinx/util/inspect.py", line 185, in safe_getattr
    raise AttributeError(name)
AttributeError: ConcatenatedDataset
/Users/hoge/Work/chainer/chainer/docs/source/reference/functions.rst:30: WARNING: failed to import chainer.functions.tree_lstm
/Users/hoge/Work/chainer/chainer/docs/source/reference/functions.rst:30: WARNING: toctree references unknown document 'reference/generated/chainer.functions.tree_lstm'
/Users/hoge/Work/chainer/chainer/docs/source/reference/functions.rst:216: WARNING: failed to import chainer.functions.layer_normalization
/Users/hoge/Work/chainer/chainer/docs/source/reference/functions.rst:216: WARNING: toctree references unknown document 'reference/generated/chainer.functions.layer_normalization'
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.BatchNormalization.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Bias.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Bilinear.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.BinaryHierarchicalSoftmax.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.BlackOut.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.CRF1d.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Classifier.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Convolution2D.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.ConvolutionND.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Deconvolution2D.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.DeconvolutionND.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.DepthwiseConvolution2D.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.DilatedConvolution2D.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.EmbedID.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.GRU.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.GoogLeNet.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Highway.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Inception.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.InceptionBN.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.LSTM.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.LayerNormalization.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Linear.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.MLPConvolution2D.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Maxout.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NStepBiGRU.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NStepBiLSTM.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NStepBiRNNReLU.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NStepBiRNNTanh.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NStepGRU.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NStepLSTM.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NStepRNNReLU.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NStepRNNTanh.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NegativeSampling.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.PReLU.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.ResNet101Layers.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.ResNet152Layers.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.ResNet50Layers.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Scale.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.SimplifiedDropconnect.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.StatefulGRU.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.StatefulPeepholeLSTM.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.StatelessLSTM.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.VGG16Layers.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.caffe.CaffeFunction.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.model.vision.resnet.ResNetLayers.init_scope:19: WARNING: Unexpected indentation.
Exception occurred:
  File "/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/optimizer.py", line 598, in __get__
    return getattr(obj.hyperparam, self._attr_name)
AttributeError: 'NoneType' object has no attribute 'hyperparam'
The full traceback has been saved in /var/folders/y1/tp8l6j7n67bgbz8tpm0_05b40000gn/T/sphinx-err-6hlmrj53.log, if you want to report the issue to the developers.
Please also report this if it was a user error, so that a better error message can be provided next time.
A bug report can be filed in the tracker at <https://github.com/sphinx-doc/sphinx/issues>. Thanks!
make: *** [dirhtml] Error 1

また、DashのWindows/Linux版であるZealを使っている場合、上記の手順でビルドしてできたchainer2.docsetディレクトリを、Zealのdocsetsディレクトリに入れることでZealに見えるようになります。

% mv chainer2.docset ~/.local/share/Zeal/Zeal/docsets/

(docsetsディレクトリの場所は環境によって異なる可能性があります。optionsで確認できます)

✌(‘ω’✌ )三✌(‘ω’)✌三( ✌’ω’)✌たのしい!

なお、後になってDash-User-ContributionにChainerがあることを知った…
https://github.com/Kapeli/Dash-User-Contributions/tree/master/docsets/Chainer
常に自分の責任で最新に追従させたいわけじゃなければ、これで十分。メンテナのmitmulさんは同僚ですw

rakeとかでwarning: already initialized constant Rake::VERSIONみたいなエラーが出た

世界の総水産量は年間約9000万トン(養殖含め)だそうですが、世界の鯨が1年に食べる魚類の量は2.8億トンから5億トンになると試算されており(1)、人間の数倍もの水産物が鯨によって消費されているそうです。ヒトの生物量でもせいぜい3億トンかそこら(50kg*70億人=3.5億トン)ですから、すごい量です。とはいえオキアミや微生物など水産物として競合しないものもあるので単純な比較はできませんが。

さて、rails開発していて、見たことのないこんなエラーに遭遇しました。

% rake -T
/Users/foo/bar/hoge/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake/version.rb:2: warning: already initialized constant Rake::VERSION
/Users/foo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/version.rb:2: warning: previous definition of VERSION was here
/Users/foo/bar/hoge/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake/version.rb:5: warning: already initialized constant Rake::Version::MAJOR
/Users/foo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/version.rb:5: warning: previous definition of MAJOR was here
/Users/foo/bar/hoge/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake/version.rb:5: warning: already initialized constant Rake::Version::MINOR
/Users/foo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/version.rb:5: warning: previous definition of MINOR was here
/Users/foo/bar/hoge/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake/version.rb:5: warning: already initialized constant Rake::Version::BUILD
/Users/foo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/version.rb:5: warning: previous definition of BUILD was here
/Users/foo/bar/hoge/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake/version.rb:5: warning: already initialized constant Rake::Version::OTHER
/Users/foo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/version.rb:5: warning: previous definition of OTHER was here
/Users/foo/bar/hoge/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake/version.rb:7: warning: already initialized constant Rake::Version::NUMBERS
/Users/foo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/version.rb:7: warning: previous definition of NUMBERS was here
WARNING: Possible conflict with Rake extension: String#ext already exists
WARNING: Possible conflict with Rake extension: String#pathmap already exists

...(つらつら続きます)...

/Users/foo/bar/hoge/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake/task_arguments.rb:107: warning: already initialized constant Rake::EMPTY_TASK_ARGS
/Users/foo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/task_arguments.rb:107: warning: previous definition of EMPTY_TASK_ARGS was here
/Users/foo/bar/hoge/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake/invocation_chain.rb:54: warning: already initialized constant Rake::InvocationChain::EMPTY
/Users/foo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/invocation_chain.rb:54: warning: previous definition of EMPTY was here
/Users/foo/bar/hoge/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake/early_time.rb:20: warning: already initialized constant Rake::EARLY
/Users/foo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/early_time.rb:20: warning: previous definition of EARLY was here
/Users/foo/bar/hoge/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake/late_time.rb:16: warning: already initialized constant Rake::LATE
/Users/foo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/late_time.rb:16: warning: previous definition of LATE was here
/Users/foo/bar/hoge/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake/backtrace.rb:3: warning: already initialized constant Rake::Backtrace::SYS_KEYS
/Users/foo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/backtrace.rb:3: warning: previous definition of SYS_KEYS was here
/Users/foo/bar/hoge/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake/backtrace.rb:4: warning: already initialized constant Rake::Backtrace::SYS_PATHS
/Users/foo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/backtrace.rb:4: warning: previous definition of SYS_PATHS was here
/Users/foo/bar/hoge/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake/backtrace.rb:7: warning: already initialized constant Rake::Backtrace::SUPPRESSED_PATHS
/Users/foo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/backtrace.rb:7: warning: previous definition of SUPPRESSED_PATHS was here
/Users/foo/bar/hoge/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake/backtrace.rb:11: warning: already initialized constant Rake::Backtrace::SUPPRESSED_PATHS_RE
/Users/foo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/backtrace.rb:11: warning: previous definition of SUPPRESSED_PATHS_RE was here
/Users/foo/bar/hoge/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake/backtrace.rb:15: warning: already initialized constant Rake::Backtrace::SUPPRESS_PATTERN
/Users/foo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake/backtrace.rb:15: warning: previous definition of SUPPRESS_PATTERN was here
/Users/foo/bar/hoge/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake.rb:69: warning: already initialized constant FileList
/Users/foo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake.rb:69: warning: previous definition of FileList was here
/Users/foo/bar/hoge/vendor/bundle/ruby/2.4.0/gems/rake-12.0.0/lib/rake.rb:70: warning: already initialized constant RakeFileUtils
/Users/foo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rake-12.0.0/lib/rake.rb:70: warning: previous definition of RakeFileUtils was here

自分の場合はrbenvを使っていたので、rubyの処理系を一旦消した上でもっかい入れ直し、さらにvendor/bundleを消したらなおりました。

% rbenv uninstall 2.4.1
% rbenv install 2.4.1
% rbenv rehash
% rm -rf vendor/bundle
% gem install bundler
% bundle install
% rake -T
rake about                              # List versions of all Rails frameworks and the environment
rake app:template                       # Applies the template supplied by LOCATION=(/path/to/template) or URL
rake app:update                         # Update configs and some other initially generated files (or use just update:configs or update:bin)
rake assets:clean[keep]                 # Remove old compiled assets
rake assets:clobber                     # Remove compiled assets
...

原因は、rails newしたあと一回普通にbundle installしたのですが、その後でbundle install –path=vendor/bundleをしてしまったため、rbenvの下のrubyの中にgemがどばどば入ったのと、railsアプリ内のvendor/bundleの下に入ったgemが一緒にロードされてしまったためです。

上の対処法では両方消した形になりますが、本当は片方だけで良いはず。
自分はついでに.bundle/configの中からBUNDLE_PATHを除去し、vendor/bundleではなくruby処理系の中に入れることにしました(自分のruby使用頻度だとそれであんま困らないので)

備忘録でした。

tqdmをムリヤリprocess safeっぽくするdirty hack

生物界で最大の目(光を検知する器官)を持っているのはダイオウイカおよびダイオウホウズキイカと言われ、その大きさは30〜35cmほどにもなるのだそうです。

さて、世界70億人のPythonプログラマが手放せないのが、tqdmというプログレスバーを簡単に表示できるようにしてくれるライブラリです。
しかしながらtqdmは(当然と言えば当然ですが)複数のプロセスから1つのプログレスバーを管理することができるような設計にはなっていません。
たとえば高速化のためにmultiprocessingを用いて並列処理をしながらプログレスバーを出したいとき、tqdmはそのままでは使えないことになります。

例えば、下記のようなコードで単にtqdmのインスタンスを子プロセスに渡して中でupdateをすると…

import tqdm
import multiprocessing

def worker(pbar):
    pbar.update()

ar = [i for i in range(100)]
with tqdm.tqdm(ar) as pbar:
    jobs = []
    for t in ar:
        job = multiprocessing.Process(target=worker, args=(pbar,))
        job.start()
        jobs.append(job)
    for job in jobs:
        job.join()

実行結果はこんな感じ。

% python usage.py
  1%|▉                                                                                                 | 1/100 [00:00<00:25,  3.89it/s]

こんなふうに、100%まで行ってくれません。
端的に説明すると、100個forkされた内部カウント0の状態をそれぞれ+1するのが100回走るだけ、だからです。

じゃあ内部カウントが常によろしく増えるために、内部カウントを無視して共有メモリで常に正しくカウントしてればいいよね、っていう単純な発想による汚いハックをしてみました。

Continue reading

大量のサーバに同じファイル(でかい)を効率的にコピーする

インド洋では、夏頃にイワシの大群が押し寄せるサーディンラン現象というのがあるのだそうです。その個体数、にわかには信じがたいですが億のオーダーにもなるとのことです。すげーな!

さて、あるサーバ1台が数百GBにもなる巨大なファイル(群)を持っているとします。
このファイル群を、そのサーバに接続された他の複数(大量)のサーバのローカルディスクにコピーしたいです。
以後これを便宜的にbcast cpと呼ぶことにします。

rsyncを1台ずつ回すのが頭悪い方法なのは明らか。当然NFSなどを立てて共有するというのも本質的にはそれと同じ。
同僚のiwiwiさんがちょうど集団通信アルゴリズムの話をしていたのを聞いて、それを活用して効率的にファイルをバラまくようなアドホックなスクリプトを書いて、ときどき使えそうなのでまとめておきました。

「やってみた」ぐらいの話なのでガチ勢の方たちにはƱ”-ʓ飲んで寝ていてほしいです。

Continue reading