20200919のTensorFlowに関する記事は2件です。

Rasperry Pi 4のCPUでDeep Learningを高速化

私たちは、マルチコアCPUSIMDアーキテクチャのHW性能を引出す組込みSW最適化技術をコアコンピタンスとするスタートアップを目指す有志集団です。

Raspberry Pi 3/4のCPUだけでどれくらいDeep Learningを高速化できるかに挑戦しています。

過去、Chainerやdarknetといったフレームワーを対象としていましたが、現在はONNX runtimeの高速化に挑戦しています。

現時点での結果は以下の通りです。
compare.png

もともとMicrosoftやFacebookがプロジェクトを推進しているだけあって、数倍の高速化は難しいですが、im2colやgemm、Activation関数などをチューニングすることでなんとかパフォーマンスを2倍にすることができました。

その他にもいろいろなモデルのデモ動画を公開しています。
Youtubeチャンネル

私たちのこだわりポイント

1. Raspberry PiのCPUだけを使用してDeep Learningを実行する
2. 32bit版Rasbianを使用する
まだ64bit版Raspbianに対応できていない...
3. 既存モデルをそのまま使用する
私たちで量子化/枝刈り/蒸留などの軽量化を行わない(そもそもできない...)
4. 計算精度を可能な限り変えない

高速化アプローチ

高速化アプローチは以下に示すような一般的なものです。

a. コード最適化
b. マルチコア並列化
c. SIMDベクトル化
d. ソフトウェアパイプライン
e. メモリ効率化

一般的な項目を、プロファイルを取りながら少しでも速くもう少しでも速くと空雑巾を絞るがごとく突き詰めていく姿勢がほかにない私たちの特徴的なところだと思っています。

記事の最後に

今回は、結果の紹介にとどまってしまいましたが、忘備録を兼ねて各項目毎に技術資料をまとめて、随時公開していきたいと考えています。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

tf.train.start_queue_runners()で0xC0000005エラーが発生した場合の対処法

tensorflowで非同期処理しようとしたらエラーでハマった。
対処法を探したが見つからなかったので誰かの参考になればと思います。

現象

以下のコードを実行するとtf.train.start_queue_runners()でエラーが発生する

filename_queue = tf.train.string_input_producer(["../dataset/sample1.tfrecord"])
reader = tf.TextLineReader()

// ... 

with tf.Session() as sess:
    # 入力 enqueue スレッド開始
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(sess=sess, coord=coord)

[実行結果]

Process finished with exit code -1073741819 (0xC0000005)

原因

ファイルパスの参照先が間違っていた。

()filename_queue = tf.train.string_input_producer(["../dataset/sample1.tfrecord"])

()filename_queue = tf.train.string_input_producer(["../dataset/samples/sample1.tfrecord"])

凡ミスだが地味にハマった。
tf.train.string_input_producer()でエラーが出てくれればいいのに…。

0xC0000005がそもそもメモリアクセス違反系のエラーなのでファイルなどの参照周りをまず怪しむべき。

(参考)Tensorflowで非同期処理

以下の記事がわかりやすい。
https://qiita.com/antimon2/items/c7d2285d34728557e81d
https://qiita.com/ashigirl966/items/99b0f8d9713ee90db13a

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む