変わりモノがいい!

変わりモノには価値がある・・・ハズ?

PiCar-V Self-driving tensorflow+keras編 進捗報告6

思った以上に難航しています。

前の記事で
W tensorflow/core/framework/cpu_allocator_impl.cc:81] Allocation of exceeds 10% of free system memory. 
が発生して処理が止まったと書きましたが、この対応が予想以上に難しく未だ答えを見いだせていません。
僕はマイコンのプログラムを昔作っており、メモリ4KBの時代も経験しています。
昔はメモリ不足に散々悩まされました。
プログラムを簡素化したり使う命令を変えて1バイト、2バイト削ってエリアの確保をしていました。
でも、今の時代にメモリ不足で悩むとは思いませんでした。
パソコン上では問題なく走ったモデルが、Raspberry Pi上ではメモリ不足で止まる。
そのRaspberry Pi4はメモリを4MBも搭載しています。
それに使っているモデルは、ChainerやPyTorchでは動いたモデルです。
tensorflowってメモリをたくさん使うのでしょうか。

f:id:ken2017:20201101072028j:plain
調べてみると同じではないもののtensorflowにおけるメモリ不足で悩んでいる人がいることが判りました。

 どうも原因はGPUのためのメモリの確保に起因しているようで以下のような記事がありました。

qiita.com

ところが、この処置を行っても改善できませんでした。
SWAPの容量を増やしたり減したりしましたが変化なし。
参りましたね。
何が起きているかを知るためにモデルを変えてみました。
小さなモデルに変えて動かしてみるとメモリ不足のエラーは発生しませんでした。
どうやって使用するメモリを減らすか。
ChainerやPyTorchではできているわけで、tensorflowで何をやれば良いか?
これに関して幾つか試みてみました。

試したこと

まずは、モデルの変更です。
下の図が本来動かしたいモデルです。

f:id:ken2017:20201101091401p:plain
これがメモリ不足で動かないので、Denseの数を色々と変えて動くことができるサイズを探しました。
その結果が、下の図です。
400を20に、256を8に、64を4にして、やっと動きます。

f:id:ken2017:20201101091537p:plain
これでは精度は全く期待できませんね。
パソコンで上の設定にして学習してみました。
その結果がコチラ。

f:id:ken2017:20201101091821p:plain
1000回のepochの後でもステアリング角度のLossは70から100程度と大きな値です。
このモデルを使っての予測でもステアリング角度において大きく相違しているケースが見かけられます。

f:id:ken2017:20201101091948p:plain
でもRaspberry Piに載せて試す価値はあると思って載せてみました。
メモリ不足は解消でき、モデルを作り、ビルドし、パラメータの展開というステップに入ったところで下のようなcheckpoinのデータが足りないという警告が出て処理が進みませんでした。
WARNING:tensorflow:A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/guide/checkpoint#loading_mechanics for details.
tensorflow2.2.0のSubclassing APIというのを使っているのですが、使い方に工夫がいるようです。
tensorflowでディープラーニングをするには大きく3つのやりかたがあります。
Sequential API
Functional API
Subcassing API
この3つで、今回はChainerでのモデルの作り方に近いSubclassing APIを使っています。
これは、1入力2出力に対応できるのがSubclassing APIしかないという所に起因しています。
でも、途中で挫折して1入力2出力を諦め1入力1出力+1入力1出力に切り替えたので3つのどれでもOKです。

note.nkmk.me

Subclassing APIは結果の保存として学習済モデルだけなく各種パラメータも保存するようで他の2つのAPIと保存方法も違います。
このことがメモリを沢山使う原因にもなっているのかなと勝手に思っています。
ネットで色々と調べてみましたが、そもそもRaspberry Pi上でtensorflowのSubclassing APIを走らせている記事がなかなか見つけることもできず真偽のほどは不明です。
モデルを変えてメモリ不足の解消はできましたが、モデルを走らせることができないので別のことを確かめてみました。
それは、別のAPIを使うことです。
Sequential APIを試してみます。
ということで今日はここまで。
悪戦苦闘は続きます。
下の写真のように颯爽と走る姿を早く見たいものです。

f:id:ken2017:20200826101154j:plain

では、また。

 

プライバシーポリシー お問い合わせ