ラズパイ 64bit Kernel

ラズパイに64bit Kernelを適用する必要があったため、Kernel再構築以外の方法が無いか、ちょっと調べたら、これがいいというものが見つかった。

https://ubuntu.com/download/raspberry-pi
https://wiki.ubuntu.com/ARM/RaspberryPi

これで十分だが、シャットダウンフリー化しないなら、ここでやったようにスワップ領域は作った方が良い。

なお、昨日、技適マーク付きラズパイ4Bがようやく発売された。\(^o^)/

スワップ領域をファイル化

ここに書かれた内容は、sudo apt install dphys-swapfile (導入)、sudo apt purge dphys-swapfile (除去)でも可能。以下は、マニュアルで設定する場合を示す。私はマニュアル派。


Ubuntuをインストールする時、スワップ領域を指定しなければ/swapfileが自動的に作成される様子だが、ここではマニュアルでの対応を整理する。スワップ領域をファイル化しても、SSD/MicroSD/eMMC等のNANDフラッシュメモリ系ストレージのウェアレベリング効果は上がらないというのが定説のようはである。しかし、ウェアレベリングの実装はデバイスマターであり、パーティションで物理的に区切られ偏る可能性は否定できない。ファイル化するメリットは、ext4ファイルシステム上で調整できる利便性と、TRIMコマンドによる何らかの効果を期待できる点にあるが、ケースバイケースであろう。なお、ラズパイ上でDarknetを実行する時、このスワップファイルを用意しておかないと、OOMキラーが発動するケースがある。

/swapfile 実体を作る。

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 ## 1GBの場合
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

/etc/fstab を編集する。

### SSDへのスワップの例
/swapfile swap swap sw,discard 0 0

適用

sudo mount -a



/etc/initramfs-tools/conf.d/resumeがある場合、initrdの⼀部を処置し更新しないと、OS起動が30秒遅くなる。
/etc/initramfs-tools/conf.d/resume:

RESUME=/swapfile

initrd更新:

update-initramfs -u -k all

参考情報:ここ

Darknet YOLOv3で組込ベンチマーク環境構築

既に情報は多く、今更感もあるが、Darknet YOLO v3 で組込ベンチマーク環境を構築する手順をメモする。

目的:
AI処理を使っての、組込CPUでのオフロード(CPU負荷外出し)効果を検証するための環境構築手順を確立する。

オフロード先候補(興味無い順):
 ・GPU
 ・Neon 演算コプロセッサ
 ・RTプロセッサ(Xilinx MPSoC RPU)
 ・FPGAプロセッサ(Microbrase, Nios)
 ・FPGA

まずは、私のホビーマシン(Core i7-4790 @3.60GHz / 16GB MEM / ubuntu 5.0.0-36-lowlatency)で検証する。あっさり5行、3分で終わってしまう。

git clone https://github.com/pjreddie/darknet
cd darknet
git checkout <hash値> ## 特定のコミットを使う場合
make
wget https://pjreddie.com/media/files/yolov3.weights  ## 80の物体を識別する重みファイル
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

備考:重みファイルはCOCO という規格に基く80 thing classes の学習データと思われる。

結果:

Loading weights from yolov3.weights...Done!
data/dog.jpg: Predicted in 18.518765 seconds.
dog: 100%
truck: 92%
bicycle: 99%

f:id:t0a9n9a4k:20191104163729j:plain:w220:left
predictions.jpgが結果を示す画像。AI初心者向け資料では高確率で登場するワンちゃんのようです。名前は何かな?
犬・自転車・トラックを認識するまでの時間:
 18〜21秒 (dog: 100%)/ Darknet hash:61c9d02
 7〜9秒 (dog: 99%)/ Darknet hash:f6d8617
* Kernelのバージョンアップで数値が少し変わるケースがある。

考察:
sudo chrt -r 50 ./darknet detect ... (ラウンドロビンで優先度増)で実行すると、数値が悪化かつ不安定となるのは興味深い。AI処理が直線的なのか?今回使ったUbuntu StodioはLow Latency (CONFIG_PREEMPT)がデフォルトで、メディアのリアルタイム処理には向いているが、AIの推論処理とは相性が悪い可能性が高い。
また、Darknetのコミットによって結果が大きく変わる様子を見ると、これは、オフロード実装の工夫や調整を頑張った分だけ成果になる感じがする。つまり、純粋にオフロードのトレードオフ評価を行うのは困難であり、適用先・条件等を狭くを絞った上でトレードオフしないと、意味が無さそう。

感想:
やばい、やばすぎる。時代に乗り遅れた感MAX!! CPU負荷の動きを見ていると改善余地が有りそうにも見えたが、そのネタも既にMakefile冒頭に仕込まれていた。。。_| ̄|◯

フォロー:
ガートナーのハイプ・サイクルによれば、エッジAI、まだ黎明期を脱したばかり。AI処理のオフロード/HWアクセラレートは、今後、組込エンジニアのお仕事となっていくのは間違い無さそう。AIを深く知る必要は無いが、AI組込/最適化のテクニックは要チェック。YOLOv3デモ動画を見ていると、馬と牛とラクダを区別しろとか、carだけ認識させろとか、いろいろ面白そうな要求が出て来そうだが、組込エンジニアのお仕事の本質はそこではなさそう。

関連:
1) YouTube
2) YouTube
3) Darknet: Open Source Neural Networks in C

ストリート・ピアノで聴きたい名曲

ストリート・ピアノが流行っているのでしょうか? 都庁など、名所がいくつかあるようなので、近くに寄ったら聴きに行こうと思います。もしリクエストできるなら・・・

  

1位:ショパン 幻想即興曲 お手本 
月並みですが、ピアノではこれが一番です。

  

2位:リスト ラ・カンパネラ お手本  お手本  川崎  パリ  パリ

ピアノで難易度MAX級のようですが、その割には聴きやすい名曲です。

 

3位:ショパン 英雄ポロネーズ お手本  都庁  岡山  パリ  神戸

途中、スペースインベーダーからの侵略があることにお気付きでしょうか。そこをどう弾くか、その個性を聴き分けるのも楽しいです。

 

4位:ベートーベン 月光第3楽章 お手本  都庁  日比谷

ただただ、かっこいい。

 

・・・音楽の道は、親からの強力な押し付けに反発し、徹底的に反抗して止めた経緯があります。こんな楽しみ方もできたのかと思うと、今になって少しかなり後悔しています。

 

スマホの分解修理

一昨日、いつものように、寝る前に愛用の中華スマホの充電をスタンバイしようとしたら、USBケーブルがなかなか挿さらず、更にグイっとやったら、何か鈍い感覚が走り、充電できない状態となった。あと残り命75%。あぁ、やっちまった ... _| ̄|◯

私にとってスマホは体の一部とまではいかないが、大事な存在。命が尽きる前に対処せねばならない。

 

案1:修理屋に持っていく。

→ 調査したところ、USBサブ基板交換の場合、~15,000円。これは痛い。。。

案2:この機会に政治リスクの無い格安スマホを買う。

→ 格安スマホは、どれも政治リスクを抱えている。

案3:自分で修理する。

→ 破損した箇所はサブ基板となっており、交換可能、かつ、AmazonPrimeでお安く売っていることが判明した。お急ぎ手配したらすぐに届いたので本日さっそく作業にとりかかる。まぁ、失敗したら、通信系組込エンジニアには懐かしいブランド名のg7 plusあたりを速攻で買おう。

 

準備:

  1. 壊したスマホのサブ基板:1000〜1500円。AmazonPrimeでお急ぎ手配。
  2. スマホ専用工具:700〜1200円。手持ちのものでも問題無さそうだったが、買っておくことにした。 iPhone用でもOK。AmazonPrimeでお急ぎ手配。
  3. 使用済テレカ等:QUOカード、ポイントカード等でOK。バックパネルのノリの再接着防止で使う。2~3枚、または、1枚を1/3 x 3にしておく。
  4. ドライヤー:バックパネルのノリをはがす時に使う。
  5. 手袋:あっちっちになるので。基板に触れる時も手袋している方が良い。

格安中華スマホとはいえ、昔のスマホようにツメで開封できるような甘さは無い。なめてかかると失敗しそう。

 

結果:

途中、あぶないシーンが1つあったが、無事、修理できた。手順としては、

  1. 本体とバックパネルの間をドライヤーであたためながら、三角ピックかテレカを使って隙間を開ける。空けた隙間にはテレカをはさみ、再接着させないようにする。テレカは中に入り込み過ぎないように。
  2. 1の作業を続ける。1周したら、注意深くゆっくりと開ける。
  3. 本体下のネジ(黒6, 銀1)を外してから黒いカバーを取り外す。ここで初めて交換対象のサブ基板が見える。
  4. サブ基板のアンテナ線とリード線をピンセット等で外す
  5. 本体からサブ基板を外し、新品のサブ基板を挿入する。
  6. あとは上記と逆の作業。

  

参考にしたサイト:

ここここ
*Teardownサイトのサウンドに乗って余計な分解までしないように(笑

 

あぶなかったシーン:

アンテナ線を外す際に、基板側のコネクタを根こそぎフットパタンごとはがしてしまった。丁度このシーン。これはやばいと思ったが、今回はサブ基板は交換なので、アンテナ線側のコネクタ部さへ壊さなければ大丈夫。冷や汗ものだったが、無事リカバーできた。

 

感想:

Amazon最強! ただし、自己責任で。警告↓
https://www.amazon.co.jp/b/?node=5859744051

 

体に染み付いた古い習慣を一掃

どの分野においても、変化を受け入れ順応していくと、更なる新しい展開を楽しく受け入れられるようになる。

未だにifconfigとか、service samba restartとか、体に染み付いた時代遅れコマンドをつい使ってしまうが、Debian 10やCentOS 8の運用をきっかけに、今時の実装に慣れていきたいと思う。

以下、気付いたコマンド・デーモン。

古い実装 今時の実装 備考
ifconfig
(net-tools)
ip a, ip -s a, ip n, …  
route add -net default gw 192.168.0.1 nmcli c modify eth0 ipv4.gateway 192.168.0.1  
iptables nftables  
ntpd chronyd redhat解説
xorg wayland (GNOME, KDE) XFCExorg
cron systemd.timer man systemd.timer
rsyslog journalctl man journalctl
service, rcconf, chkconfig, ... systemctl  
eth0 enp0s3 命名規則等
AppArmor RedHat系ではSELinux

参考:Debian 10 (buster) リリースノート (64 ビット PC 用)

server-worldさんの備忘録ページで、Debian10や、間もなく出てくるであろうCentOS8に関する記事の設定を見ると良いと思う。

iptables/fireholでNAT/IPマスカレード/ポートフォワディングしている部分をnftablesに乗り換えるところは、いずれ整理したい。 

 

Debian10 でScreenlets

[再掲] Screenletsのようなガジェットは、セキュリティリスクが多分にあって全く推奨できず、標準パッケージはもはや存在しないが、閉塞的な開発PCや仮想マシンでの限定的な用途であれば問題無いであろう、たぶん。


やり方はここと同じノリだが、やはり一筋縄でななかった。
やった後で気付いたのだが、単に、stretchのリポジトリを指定してインストールすればよかった気もするが、試していない。

apt install python-cairo python-gtk2 libwnck22 libwnck-common python-gobject-2 python-tz python-dbus python-xdg gnome-icon-theme
apt install python-gconf  ## GNOMEを使う場合は必要みたい
wget http://ftp.debian.org/debian/pool/main/g/gnome-python-desktop/python-wnck_2.32.0+dfsg-3_amd64.deb
wget http://ftp.debian.org/debian/pool/main/g/gnome-python-desktop/python-rsvg_2.32.0+dfsg-3_amd64.deb
wget http://ftp.debian.org/debian/pool/main/b/beautifulsoup/python-beautifulsoup_3.2.1-1_all.deb
sudo dpkg -i *.deb

## 必要に応じて
sudo apt --fix-broken install

## 以下、UbuntuとDebianで、ScreenletsのPythonコンテンツの対応とフォルダ構成が
## わずかに異なる。過去の資産に合わせて対応すると良い。

## Ubuntu派:screenletsをlaunchpadから入手
wget https://launchpad.net/screenlets/trunk/0.1.7/+download/screenlets-0.1.7.tar.bz2
tar xaf screenlets-0.1.7.tar.bz2
cd screenlets-0.1.7/
sudo make install  ## エラー出るけど無視

## Debian派:screenletsを http://ftp.debian.org/debian/pool/main/s/screenlets/ から入手
wget http://ftp.debian.org/debian/pool/main/s/screenlets/screenlets_0.1.2-8.1.diff.gz
wget http://ftp.debian.org/debian/pool/main/s/screenlets/screenlets_0.1.2.orig.tar.gz
gunzip -d screenlets_0.1.2-8.1.diff.gz
tar xaf screenlets_0.1.2.orig.tar.gz
cd screenlets
patch -p1 < ../screenlets_0.1.2-8.1.diff 
sudo make install  ## エラー出るけど無視

## シンボリックリンクの処置
cd /usr/share/icons
ln -s hicolor/scalable/apps/screenlets-tray.svg 
ln -s hicolor/scalable/apps/screenlets.svg 
ln -s /usr/lib/python2.7/site-packages/screenlets /usr/lib/python2.7/dist-packages/screenlets

## Screenletsのコンテンツにこれまでのコレクションを適用する場合
scp -r <Screenletsが稼働しているPC>:/usr/share/screenlets /tmp
# root権限で
mv /tmp/screenlets /usr/share
chown -R root:root /usr/share/screenlets

## Screenletsの設定を引き継ぐ場合
## Ubuntu派はSが小文字:
cd $HOME/.config/screenlets
scp -r <Screenletsが稼働しているPC>:/home/<user>/.config/screenlets/* .
## Debian派はSが大文字:
cd $HOME/.config/Screenlets
scp -r <Screenletsが稼働しているPC>:/home/<user>/.config/Screenlets/* .


Screenletsウィジェットをマウスで移動できないときの処置:
GNOME環境ではこの処置が必要だが、Cinammon, MATE, XFCE環境では不要(やってもいい)。処置する場合、インストール前のソース __init__.py またはインストール後の/usr/lib/python2.7/site-packages/screenlets/__init__.py を、ここにある内容となるように編集する。
つまり、
 NG: self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DOCK)
 OK: self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_UTILITY)