「ラズパイでAI」の本を3冊ほど読んだので、早速、実践あるのみかと。ま、「読んだ」といっても、つらつら「眺めた」程度であります。ホントのところ、自分で計算(実際に働くのはマシンですが)してみないと記憶にも残りませぬ。実を言えば、手元には Raspberry Pi 3 Model B+ も届いているのです。しかし、長年使った(埃を被っていた時間も長い)
Raspberry Pi 1 Model B+
でどこまでやれるのか(どの辺を超えると酷いことになるのか)調べておきたいと思いました。低価格、小スペースで人気の Raspberry Pi zero と同じCPUでもあるし。。。無理やりは承知で、まずは非力なArm11機で、どこまで行けるかやってみました。
まずは、インストールするフレームワークですが、
といたしました。ぶっちゃけ3冊のうちの1冊、『算数&ラズパイから始めるディープ・ラーニング』(牧野、西崎著、CQ出版)で、Raspberry Pi 1でも動くとされていたからです。
とりあえず、比較対象用にパソコンにもインストールいたしましょう。パソコンにはVirtualBoxもインストールしてあるのですが、このごろはなるべく使わないようにしています。立ち上げるのに重いし、仮想DISKも膨れるばかりなので。なるべくWSLに振りたいということで、WSL上のUbuntuで作業してみました。
インストールから起動まで何の問題もなくOK
ご本家ChainerのWebサイトの手順と、本に書かれていたそれとは微妙に違うところもありますが、誤差の範囲内、Python 使えて pip が走るようになっていれば、pip 一発で Chainer 入ります。なお、Poormanな私がインストールする先は、かなり古い(Ivy Bridge) Core i5、2コア(4Tの筈だが2T設定)@2.5GHz。Cuda使えるGPUなどはありませぬ。
サンプルプログラムとしては、『AI業界におけるHello World!』MNISTですね。GitHubのChainerのところへ行き、exampleの中のMNISTのディレクトリから
train_mnist.py
を頂いてきました。後は何も要らない。入力画像など所定の場所に無ければ、勝手にインストールしてくれる優れものです。
さっそく起動。昔、初めてMNISTをやったとき(Caffe使った)は、当時としては結構良い目のGPU積んだマシンだったので、MNISTの学習などあれよあれよという内に終わったです。しかし、今回は、「非力な」CPUのみ。実行の具合は以下のような感じ。
epoch あたり45秒ってところでしょうか。20世代で15分というところ。ま、GPUと比べちゃいけませんが、MNISTくらいであれば、少し待てば終わる感じでしょうか。でも、この結果見ると、GPUで一晩から2,3日程度で終わるような仕事も、この環境でやってはイケない、ことは理解できます。
でもま、今回は相手がRaspberry Pi 1 だし。。。
周波数的には3割くらい、コアも一つしかないうえに、スーパスカラーのx86に比べたら大分遅い筈のArm11、画像などの読み込みも遅い筈、いろいろあるので、20倍とか30倍とか時間かかるかな~くらいの気持ちです。
まずは、ChainerをRaspbianにインストールせねば。。。やはり、トラブりました。こうでなければ面白くありません。もともとPythonもpipもインストールしてありました。システム自体は少し前に結構な時間をかけてフルに更新しているので、大体のソフトウエアは新しい筈。pipを更新して作業を始めました。
しかし、Chainerのインストールでエラー
エラーで落ちるのは良いのですが、1時間以上も頑張ったあげくに、諦めてエラーを吐きます。もっと早く言ってくれれば良いのに。見れば、Chainer本体は何の問題もなさそうなのですが、
Numpyのバージョンでトラブっていました。
エラーメッセージ見る限り、Chainerご指定のNumpyバージョンを入れるために、もともと入っていた古いNumpyを除去しようといたしましたが、pipで入れたもんじゃないから、除去の仕方がわかりまへん、というような感じです。過去どうやってNumpyをインストールしたのか忘却の彼方です。いずれにせよ、Pythonにおいて配列計算みたいなことを担うNumpyは、ほぼ間違いなくインストールするものなので、そうとう前に入れたのでしょう。
直接、パッケージのNumpyのディレクトリ内のsetup.pyとか動かすと、これまたバージョンが違うとか言って怒られます。仕方がないので、pip に、前のバージョンあっても無視して上書き、指定で最新版を入れてもらいます。Chainerご指定のバージョンよりも大分新しいですが、バージョンは指定よりも大なりイコールであればOKのようです。今度は、問題なくChainerのインストールが完了しました。
早速、パソコンからMNISTのサンプルプログラムを転送し、起動します。パソコンは20世代で15分くらいでした。Raspberry Pi 1だと、1世代数十分みたら大丈夫かな、くらいな期待。
しかしね、下の画面、1世代目の16.67%完了に至るまでに、すでに3,4時間経過しておりました。ま、最初は色々やることあるので、全てがMNISTの学習時間ではないと思いますが、これは相当遅い。
ま、20世代までやる必要もない(既に学習済のDBはパソコン上にあるのだし)、ゆるゆると走ってもらって、
1世代の結果(elapsed timeがでる)が見れればよいじゃん
甘い考えでしたね。33.3%まで進捗したのを確認して寝てしまいました。ふと夜中目覚めて、パソコンを見れば、スリープに入ってました。そういえば、6時間くらいで寝るように設定していたのだっけ。ヤな予感がして、ログインすれば、
ssh切れてました
そうです、Raspberry Pi 1には普段キーボードなど繋いていないので、リモートログインして使ってます。そんなに時間がかかるとは予想していなかったので、仮想端末の中から直接 サンプルプログラムを起動していました。よって、仮想端末が止まれば、Raspberry Pi側のプロセス死んでしまう。どこまで処理が進んだのかもわからず、結構な時間の「がんばり」(がんばったのはPiですが)、が虚空に消えていました。
そこで本日のリベンジは、まず Screenコマンドで、セッションを作って、その中からサンプルプログラムを起動いたしました。そして
デタッチ
これで目出度く?、 仮想端末が死んでもRaspberry Pi側のサンプルプログラムのプロセスは動き続ける筈。この設定で一晩動かせば、きっと1世代にかかる時間が分かるでしょう。本当か?