numpy vs cupy 速度比較

Anaconda の numpy がいつの間にかデフォルト mkl になっていたので、改めて numpy 対 cupy 対決をしてみました。

  • numpy: 1.16.2
  • cupy: 6.0.0b
  • CPU: intel 6960X(3.0GHz)
  • GPU: TITAN-V

結果を示すと以下の様になりました。

np(1000000):0:00:16.926656 sec
sum:250000055.953125
cp(1000000):0:00:01.184336 sec
sum:250006660.0
np(100000):0:00:01.684878 sec
sum:24998295.525390625
cp(100000):0:00:00.144552 sec
sum:24996460.0
np(10000):0:00:00.175715 sec
sum:2499707.635986328
cp(10000):0:00:00.143209 sec
sum:2499635.8

1万回ループでは殆ど差異はなく、10万回以上で10倍程度の差になっています。

CPUが今となっては非力な点があり、コア数が多く、周波数が高くAVX512 が使える 9XXX 番台だともっと高い数値が期待できると思います。

ちなみに計算時間の殆どは乱数計算が占めています。複雑な並列計算はGPU圧勝という感じでした。

最後に今回のスクリプトを掲載します。

# -*- coding: utf-8 -*-
# numpy(INTEL mkl edition) vs CuPy
import numpy as np
import cupy as cp
import datetime

# initiation...
cp.cuda.set_allocator(cp.cuda.MemoryPool().malloc)

xp = None
size=100000
loop = 1000

def func(r1, r2):
    return xp.dot(r1, r2)
    
def prepare(func, size, rem, el):
    st = datetime.datetime.now()
    r1 = xp.random.rand(size).astype(np.float32)
    r2 = xp.random.rand(size).astype(np.float32)
    rem += func(r1, r2)
    el += datetime.datetime.now() - st
    return (rem, el)

def measure(amble, size, func, count):
    rem = 0.0
    el = datetime.timedelta()
    for r in range(count):
        (rem, el) = prepare(func, size, rem, el)
    print (amble + ":" + str(el) + " sec")
    print ("sum:" + str(rem))

sizes = (1000000, 100000, 10000)
engines = (('np', np), ('cp', cp))

for s in sizes:
    for e in engines:
        xp = e[1]
        amble = e[0] + "(" + str(s) + ")"
        measure(amble, s, func, loop)

SHT31の暗電流が多い気がする

現在 SHT11 と SHT31 両方で室温と湿度を測っていますが、SHT11 の方は単4電池で1年近く持ったのに、SHT31 は単3電池でも 200 日くらいで電圧低下警告が出て止まってしまいました。

SHT31 が I2C であるのに対し、SHT11 が特殊なプロトコルだからかなとも思いましたが、自信はなし。CPU はどちらも TWEDIP を使っているので条件は同じだと思うのですが。

ちなみに SHT31 の高精度モードを使うと著しく電池のヘリが大きいです。

今更 Vocaloid を買ってみた

今まで使っていた PC が6年目を迎え、流石にWindows8.1だと辛くなってきたので、この際 MacBook Pro に乗り換えることにした。

で、なんとなくノリで Logic Pro X を買ってしまい、当然 Vocaloid5 も入れてしまった。

Vocaloid4 まではパラメータ調製が大変というイメージがあったが、5ではメニューから選んでかけ具合を調整するという形式に変更されたため、細かい調製は出来なくなっている。

喋り方はほぼ自動で制御してくれるので楽チンなのだが、音程が大きく下がって伸ばす音だと勝手にしゃくりを入れてしまうなど、若干使いにくいところもある。

付属の音声には英語と日本語があるが、英語がチンプンカンプンの私としては英語で歌詞を書くのはキツイですな。声質はどれも特徴的で一長一短という感じで曲想に合わせて使い分けていくことになるようです。

オーディオパラメータが大量に追加されているが、Logic Pro X を使う場合はそちらのエフェクターを使うと思うので、過剰な機能かなと思います。ただワンタッチでエフェクターを外して WAV ファイルを作成できるのは素晴らしい。

Logic Pro X は機能が多くてまだ覚えられません…
「Logic Pro X+ VOCALOID3 Editor 初心者からのステップアップ for Mac」という本をアマゾンで見つけて読み始めたが、MIXING で挫折しそうになっています。

勉強会に参加してみた

都内某所で開催された機械学習勉強会に参加してみた。
このような勉強会に参加するのは初めてなので、どんな感じなのかわからなかったが、この日は講義形式だった。

確率論の基本が分かっていれば理解できる内容だったが、項数が多くて途中の式変形を理解するのに苦労した。講義自体はテンポも良く、よく理解できた。

勉強会でもなければ本を読まなくなっている気がするので、たまには参加するのも良いと思いました。

Ultra96 の mini Display Port

Ultra96 は mini DisplayPort 端子なので、テレビに映したいと思い、パッシブ系の変換ケーブルを買ってきた。

違うメーカーのケーブル 2本買ってみたが、どちらもダメだった。どうやら Ultra96 のビデオ出力はデュアルモードがサポートされていない模様。

もちろん、Display Port への変換ケーブルは機能するので、DP 付きのモニタを使えばよいのだが、10インチ位のディスプレイは HDMI しかサポートしていなかったりする。

仕方がないので、HDMI モニタはラズパイ用にします。

PetaLinux 2018.2 エディションで Ultra96 の wlan1 の dhcp クライアントを使う

Ultra96 ボードを Vivado 2018.2 および PetaLinux 2018.2 から dhcp クライアントとして wlan1 を使用する場合のメモ書きです。

Ultra96 には WiFi チップが乗っていますが、デフォルトでは phy の存在までしか認識されず、wlanX インタフェースを明示的に作成する必要があるようです。

そこで、Ultra96 の wlan1 をWiFiルータに接続するための手順をまとめてみました。

ちなみに、2018.3 にはどうも必要なファイルが足りていないらしく、initramfs からのブートすら出来ませんでした。

  • Xilinx の PetaLinux 2018.2 ダウンロードコーナーにある Ultra96 の BSP をダウンロードする。
  • petalinux-create -t project -s <BSP ファイル名> でプロジェクトを展開する。
  • petalinux-config -c kernel で WiFi チップのデバドラがあることを確認する。
    (デフォルトで入っているので通常はいじらなくてOK)
  • petalinux-config -c rootfs で User packages を選択し、
    packagegroup-petalinux-ultra96-webapp
    ultra96-ap-setup
    のチェックを外す。
  • Filesystem backages => base => busybox にある busybox-udhcpc のチェックをつける。
  • petalinux-config でブート先が SD カードになっていることを確認する。
    (本BSPはデフォルトで SD カードブートになっているので、通常はいじらなくてOK)
  • petalinux-build でコンパイルする。気長に待つ。
  • コンパイルが終了したら、images/linux ディレクトリに降り、
    petalinux-build --boot --force --fsbl zynqmp_fsbl.elf --fpga system.bit --pmufw pmufw.elf --u-boot

    で BOOT.BIN を構築する。

  • sudo su で root ユーザになっておく。また /mnt に何もマウントしていないことを確認する。
  • この投稿の後ろの方に示すスクリプトを走らせ、起動時に wlan1 を作成して udhcpc を起動するようにする。
  • SD カードをセットして、マウントする。/dev/sdX1 (X はお使いのPCによって変わります。私のPCでは “d” でした。) の場合は
    mount -t vfat /dev/sdX1 /mnt

    として、/mnt に FAT32 パーティションをマウントする。

  • BOOT.BIN, image.ub を FAT32 パーティションにコピーする。
    cp -fp BOOT.BIN image.ub /mnt
  • アンマウントして先ほど編集した rootfs.ext4 を dd コマンドで /dev/sdX2 にコピーする。
    umount /mnt
    dd if=rootfs.ext4 of=/dev/sdX2 bs=1M

    これも時間がかかるので気長に待つ。

  • お好みで e2fsck, resize2fs をかけて割り当てたパーティション全体が使用できるようにする。
    e2fsck -f /dev/sdX2
    resize2fs /dev/sdX2

     

以上のように作成した SD カードを Ultra96 に挿して起動すると、wpa_supplicant.conf で指定した WiFi  ルータにつながるようになります。

最後に、rootfs.ext4 を編集するスクリプトを掲載します。SSID, PSK にはお手持ちの環境に合った値を入れて下さい。

#!/bin/bash

mount -t ext4 -o loop rootfs.ext4 /mnt

cat <<EOF >/mnt/etc/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
update_config=1

network={
        key_mgmt=WPA-PSK
        ssid=""
        #psk=""
        psk=
}
EOF

sed 's/wlan0/wlan1/g' /mnt/etc/network/interfaces > '/mnt/etc/network/interfaces
.XXX'
mv '/mnt/etc/network/interfaces.XXX' /mnt/etc/network/interfaces
cat <<EOF >/mnt/etc/init.d/ultra96-wlan1.sh
#! /bin/sh

### BEGIN INIT INFO
# Provides: Ultra96 wlan1 interface
# Required-Start:
# Required-Stop:
# Default-Start:S
# Default-Stop:
# Short-Description: attaches Ultra96 wlan1
# Description:       attaches Ultra96 wlan1
### END INIT INFO

DESC="ultra96-power-button.sh powers off the board when the power button is pushed"

case "\$1" in
  start)
    echo -n "Start Ultra96 wlan1"
    iw phy phy0 interface add wlan1 type managed
    echo "."
    ;;
  stop)
    echo -n "Stop Ultra96 wlan1"
    ifconfig wlan1 down
    ;;
  *)
    echo "Usage: /etc/init.d/ultra96-wlan1.sh {start|stop}"
    exit 1
esac

exit 0
EOF

chmod +x /mnt/etc/init.d/ultra96-wlan1.sh

rm -f /mnt/etc/rcS.d/S99ultra96-wlan1.sh

pushd /mnt/etc/rcS.d

ln -s ../init.d/ultra96-wlan1.sh S99ultra96-wlan1.sh

popd

umount /mnt

 

petalinux 2018.2 で ZYBO の eth0 を使う

本当に久々の記事更新です。
既知の問題かも知れませんが、散々ぐぐっても出てこなかったので、ここにメモしておきます。

petalinux 2018.2 を使い、ZYBO (Z7 ではなくて古いボード) の eth0 を使おうとしたところ

macb e000b000.ethernet eth0: unable to generate target frequency: 125000000 Hz

という謎のエラーが出て PHY チップと通信できない問題が発生。

ぐぐってもよくわからず、最終的に

https://github.com/wzab/Z-turn-examples/blob/master/README.md

を読んで気づきました。Vivado 2018.2 では ZYNQ-7000 の ENET0 のクロックソースがデフォルトで External になっていることを…。

記事にある通り、IO PLL に設定して hdf ファイルを再作成し、petalinux を再コンパイルしたところ、問題なくリンクが上がりました。
(petalinux 設定はこのサイトを見て実行しました。また、eth0 ポートは GbE に挿してください。)

あとはジャマな IPv6 設定を

echo 0 > /proc/sys/net/ipv6/conf/all/accept_ra
echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6

として無効化し、udhcpc を再起動すると IPv4 アドレスが無事、家庭内ルータから取得できました。

 

minosysScript 更新中

minosysScript 実装中です。

今日までに代入、++、– –、比較演算子、+, * を実装しました。
今週は地道に演算子の実装を行う予定です。

今週中に演算子全ての実装が終わると思いましたが、
演算子の数が思ったよりも多く、ちょっと無理そうです。