Tensorflowによる行列演算速度を、CPU/GPUで、Windows/Ubuntuで比較
Tensorflowによる行列演算速度を比較しました。CPUとGPU、WindowsとUbuntuでそれぞれ比較。で、同じPCでOSが異なるだけなのに、やたらWindowsの場合が遅い結果となりました。
まずはWindows10の場合。
次はUbuntu 18.04の場合。
こうしてみると、Windows10の場合が、CPU/GPUともにやたら遅い結果です。原因不明。
プログラムは次のものをそのまま使用。
Introduction to TensorFlow — CPU vs GPU
https://medium.com/@erikhallstrm/hello-world-tensorflow-649b15aed18c
使用したPCのスペックは次の通り。
CPU: Core i7-8700K
GPU: RTX 2080 8GiB
マザーボード: Z370M Pro4
RAM: 32GiB
参考として、NVIDIA Jetson Nanoの結果です。縦軸の時間が3秒までとなっているのに注意。CPUが遅いため、上記と同じ1.5秒では収まらなかったため。
Zybo/Petalinux 2018.3でUSBカメラを使う
無印ZyboにPetalinux 2018.3をインストールしてUSBカメラ(Webカメラ)を使用する。
- 無印Zybo(Zybo Z7-10/20ではなく古いほうのZybo)
- 開発用PC:Windows 10(Vivado/XSDKをインストール)
- 開発用Linux:Ubuntu 16.04(Petalinux開発環境をインストール)
次の記事の手順で開発環境をインストールする。
ZYBO (Zynq) 初心者ガイド (1) 開発環境の準備
https://qiita.com/take-iwiw/items/966f252f6ca954aff08b
ただし、Vivado/XSDK/Petalinuxのバージョンは2018.3を使用する。
次の記事の手順で、ZyboをEthernet使用可能な状態にする。ボードファイルのMDIO設定ミスを修正したPS部のみのブロックを生成する。
ZYBO (Zynq) 初心者ガイド (13) LAN(Ethernet 0)を使う (PetaLinux)
https://qiita.com/take-iwiw/items/ac489acaca1ab54d7ce8
ボードファイルは、"Zybo"(Zybo Z7-10/20ではない)を使用する。
開発用Linuxで次のようにコンフィグ、ビルドする。以下の例では、~/work/SimplePS/images/linux/ディレクトリにBOOT.BINとimages.ubが生成されるので、この2つのファイルをSDカードに書き込んでZyboを起動する。
cd ~/work/ petalinux-create --type project --template zynq --name SimplePS cd SimplePS/ petalinux-config --get-hw-description=../project_1.sdk →このコンフィグ画面では何も変更しない。 petalinux-config -c kernel →UVCサポートなどを有効にする。下記の通り。 petalinux-config -c rootfs →packagegroup-petalinux-x11などを有効にする。下記の通り。 vi project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dsti →デバイスツリーを修正する。 petalinux-build petalinux-package --boot --force --fsbl images/linux/zynq_fsbl.elf --fpga project-spec/hw-description/design_1_wrapper.bit --u-boot
最後に実行するpetalinux-packageコマンドによるBOOT.BIN生成は上記の通りで、Qiitaの記事(Petalinux 2017.4)とはdesign_1_wrapper.bitのディレクトリが異なる。
petalinux-build時に次の警告が出るが、無視しても大丈夫なようだ。
WARNING: petalinux-user-image-1.0-r0 do_rootfs: [log_check] petalinux-user-image: found 1 warning message in the logfile: [log_check] warning: %post(sysvinit-inittab-2.88dsf-r10.plnx_zynq7) scriptlet failed, exit status 1
参考
AR# 71110
2018.x Zynq UltraScale+ MPSoC: Yocto or PetaLinux throws warnings when the build do_rootfs task completes
https://www.xilinx.com/support/answers/71110.html
petalinux-config -c kernel時のコンフィグ項目
Device Drivers > USB supportには最初からチェックが入っている。その項目内で、Support for Host-side USBなどいくつかの項目に最初からチェックが入っている。さらに次の項目にチェックを入れる。
Device Drivers > USB suport > USB Gadget Support > [*] USB Webcam function <*> USB Webcam Gadget Device Drivers > Multimedia support > [*] Media USB Adapters > ←チェックを入れると、さらに下層に入れるようになる <*> USB Video Class (UVC) (NEW)
petalinux-config -c rootfs時のコンフィグ項目
Filesystem Packages > misc > python3 > [*] python3 Filesystem Packages > misc > v4l-utils > [*] v4l-utils Filesystem Packages > misc > xauth > [*] xauth Petalinux Package Groups > packagegroup-petalinux-opencv > [*] packagegroup-petalinux-opencv Petalinux Package Groups > packagegroup-petalinux-x11 > [*] packagegroup-petalinux-x11
python3とopencvは、USBカメラ映像表示プログラムで使用するため。不要ならチェックなし。
デバイスツリー(system-user.dtsi)の修正内容
初期状態では空の状態なので、次のように追記する。
/include/ "system-conf.dtsi" /{ usb_phy0: usb_phy@0 { compatible = "ulpi-phy"; #phy-cells = <0>; reg = <0xe0002000 0x1000>; view-port = <0x0170>; drv-vbus; }; }; &usb0 { compatible = "xlnx,zynq-usb-2.20a", "chipidea,usb2"; status = "okay"; clocks = <0x1 0x1c>; dr_mode = "host"; interrupt-parent = <0x4>; interrupts = <0x0 0x15 0x4>; reg = <0xe0002000 0x1000>; usb-phy = <&usb_phy0>; };
起動、USBカメラ映像表示
起動時、Zyboのコンソールには次のようにX11のエラーが表示される。Zyboの出力画面を用意していないためだと思われる。開発用PC/LinuxのX serverを使用して(sshでログイン、X forward)USBカメラの映像を表示する場合は問題なし。
(EE) Fatal server error: (EE) no screens found(EE) 中略 (EE) Please also check the log file at "/var/log/Xorg.0.log" for additional information. (EE) (EE) Server terminated with error (1). Closing log file. 中略 xinit: unable to connect to X server: Connection refused xinit: server error
LinuxなどのX serverありのPCから、X forwardありのsshでログイン後、次のようなプログラムを実行することで、USBカメラ(Webカメラ)の画面を表示できる。
import cv2 capture = cv2.VideoCapture(0) while(True): ret, frame = capture.read() cv2.imshow('frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break capture.release() cv2.destroyAllWindows()
USBカメラの映像が表示されるが、1秒以上の遅延があり、Frame Per Secondも少ない。
参考Web
ZYBO (Zynq) 初心者ガイド (1) 開発環境の準備
https://qiita.com/take-iwiw/items/966f252f6ca954aff08b
ZYBO (Zynq) 初心者ガイド (13) LAN(Ethernet 0)を使う (PetaLinux)
https://qiita.com/take-iwiw/items/ac489acaca1ab54d7ce8
Ubuntu+ZynqでUSB-HOSTが機能しないときの解決方法
https://qiita.com/lp6m/items/45d90e9d2443c2198e96
AR# 71110
2018.x Zynq UltraScale+ MPSoC: Yocto or PetaLinux throws warnings when the build do_rootfs task completes
https://www.xilinx.com/support/answers/71110.html
Zybo+PetalinuxでUVCカメラを使う
http://d.hatena.ne.jp/seinzumtode/20171120/1511167136
Zynq Linux USB Device Driver
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842272/Zynq+Linux+USB+Device+Driver
OpenCV 接続したカメラから動画を取得しよう (Python)
https://weblabo.oscasierra.net/python/opencv-videocapture-camera.html
弾速計試作その2:エアガン機能拡張
銃に取り付けるタイプの弾速計試作その2を作成しました。初速だけでなく、次の4つのデータを表示します。
- 発射弾数
- 初速(m/s)
- ターゲットまでの距離(m)
- 銃口の方位(deg)
初速を測定するための赤外線センサーは、ホントはサイレンサーに埋め込んできれいな見た目にしたかったのですが、とりあえずプラスチックのパイプに取り付けてあります。基板や部品の配置をきれいにしてケースに収めたかったのもありますが、試作ってことでむき出しのままです。
制御に使用しているマイコンはBlue Pill(STM32F103)で、2つ使用しています。ソフトウェアを手抜きしたので、一つは初速の測定専用で、もう一つで距離・方位の測定や液晶ディスプレイへの表示を行っています。
使用している銃は、WE SCAR-L(ガスブローバック)です。本体を上面のレールに取り付けているため、この状態ではサイトでねらえない状態です。透明なヘッドアップディスプレイにしたいところですが、無機ELとかはかなり高額なため手が出せず。
サイドレールに取り付けられるようにすればよかったですね。
Blue Pill/STM32duinoで電子コンパスHMC5883Lを動かす
Blue Pill+Arduino_STM32(Roger Clark氏作成版stm32duino環境)
Arduino_STM32(Roger Clark氏作成版)環境のBlue Pillでは、電子コンパスHMC5883Lが動作しません。
2019/03/17時点のmaster
https://github.com/rogerclarkmelbourne/Arduino_STM32
注:Arduino_STM32のWebサイトは http://www.stm32duino.com/ となっていますが、 https://github.com/stm32duino とは別物です。
このArduino_STM32環境で電子コンパスHMC5883L用ライブラリを使用し、スケッチ例のQMC5883_compassをビルドして実行すると、電子コンパスを動かしても値が変化しません。
2017/12/04コミット版
https://github.com/DFRobot/DFRobot_QMC5883
注:ライブラリ名はQMC5883ですが、HMC5883L/QMC5883両対応となっています。
このライブラリの、次の2行を削除すると動作します(HMC5883Lのみ)。
DFRobot_QMC5883/DFRobot_QMC5883.cpp:482 行目 DFRobot_QMC5883::readRegister16()
Wire.beginTransmission(HMC5883L_ADDRESS); ←削除
Wire.requestFrom(HMC5883L_ADDRESS, 2);
while(!Wire.available()) {};
#if ARDUINO >= 100
uint8_t vha = Wire.read();
uint8_t vla = Wire.read();
#else
uint8_t vha = Wire.receive();
uint8_t vla = Wire.receive();
#endif
Wire.endTransmission(); ←削除
QMC5883では未確認です。
原因:Data Outputレジスタread後に不要なwriteがあるため
直接の原因は、HMC5883Lレジスタのoffset+03~+08のData OutputレジスタX/Y/Zの2バイトずつに対して、それぞれをI2Cでreadしたあと、そのreadした同じ値を2バイトwriteしてしまうことです。
理由は不明ですが、上記readRegister16()内でWire.write(reg)でreadするアドレスを指定した後、Wire.read()する際にWire.beginTransmission/endTransmisstionで囲んであるとreadした値をそのままwriteします。
Wire.requestFrom()/Wire.read()するだけならWire.beginTransmission/endTransmissionで囲む必要はないように思えます。
ただし、ArduinoUNOでは、上記の2行を削除しなくても正常に動作します。ArduinoUNOの場合は、Data Outputレジスタread後、I2Cのwriteでデータなし(I2CスレーブアドレスとR/Wビットのみ)の状態となり、おかしな値をwriteしないためです。正常に動作するといっても、このように不要なwrite(データなし)が行われます。
推測ですが、Blue Pillで動作しない原因は次の2つの組み合わせで発生しているように思えます。
- DFRobot_QMC5883::readRegister16()内の不要なWirte.beginTransmission/endTransmission実行。
- Arduino_STM32のWire(I2C)ライブラリの不具合。
BluePillでLIDAR-Lite v3
電子コンパス比較
電子コンパスのHMC5883LとQMC5883Lの精度を比較してみました。
起動後、8の字を描くようにグネグネさせた後、南方向に向けて水平にし、そのままにしておいた時の方位を取得しました。
HMC5883Lが安定して183.5度前後で推移しているのに対し、QMC5883Lは185~191度ぐらいとかなり揺れています。
使用したセンサーはそれぞれ次の通り。
・GY-271 QMC5883L 3軸磁気センサー 磁場センサー 電子 デジタル コンパス モジュール 地磁気センサー
・3軸磁気電子コンパス&気圧センサーモジュールSEN315-652-16WI
Arduino UNOに接続し、ライブラリとして次のものを使用しました。