Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
TFLite and PyTorch Mobile
Search
shibuiwilliam
March 15, 2022
Technology
0
560
TFLite and PyTorch Mobile
Running TFLite and PyTorch Mobile
shibuiwilliam
March 15, 2022
Tweet
Share
More Decks by shibuiwilliam
See All by shibuiwilliam
生成AIのためのデータ収集とデータエンジニアリング
shibuiwilliam
4
460
LLMで推論するライブラリを整理する
shibuiwilliam
5
1.3k
生成AIの研究開発を事業につなげる データ、仕組み、コミュニケーション
shibuiwilliam
1
82
デプロイして本番システムで使うことから考えるAI
shibuiwilliam
2
630
今日からRAGを 始めることを考える
shibuiwilliam
2
1.6k
2024年生成AI新年会登壇資料
shibuiwilliam
0
330
Creative as Software Engineering
shibuiwilliam
2
640
Kubernetesクラスターを引き継ぐ技術
shibuiwilliam
3
340
機械学習システム構築実践ガイド
shibuiwilliam
1
920
Other Decks in Technology
See All in Technology
株式会社Awarefy(アウェアファイ)会社説明資料 / Awarefy-Company-Deck
awarefy
3
12k
【Snowflake九州ユーザー会#2】BigQueryとSnowflakeを比較してそれぞれの良し悪しを掴む / BigQuery vs Snowflake: Pros & Cons
civitaspo
2
310
生成AI×財務経理:PoCで挑むSlack AI Bot開発と現場巻き込みのリアル
pohdccoe
1
810
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership, regardless of position
madoxten
1
930
AI自体のOps 〜LLMアプリの運用、AWSサービスとOSSの使い分け〜
minorun365
PRO
9
990
[OpsJAWS Meetup33 AIOps] Amazon Bedrockガードレールで守る安全なAI運用
akiratameto
1
130
IoTシステム開発の複雑さを低減するための統合的アーキテクチャ
kentaro
1
130
DeepSeekとは?何がいいの? - Databricksと学ぶDeepSeek! 〜これからのLLMに備えよ!〜
taka_aki
1
180
RayでPHPのデバッグをちょっと快適にする
muno92
PRO
0
200
Exadata Database Service on Cloud@Customer セキュリティ、ネットワーク、および管理について
oracle4engineer
PRO
2
1.6k
スクラムというコンフォートゾーンから抜け出そう!プロジェクト全体に目を向けるインセプションデッキ / Inception Deck for seeing the whole project
takaking22
3
130
30→150人のエンジニア組織拡大に伴うアジャイル文化を醸成する役割と取り組みの変化
nagata03
0
350
Featured
See All Featured
A better future with KSS
kneath
238
17k
A designer walks into a library…
pauljervisheath
205
24k
Speed Design
sergeychernyshev
27
810
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7.1k
For a Future-Friendly Web
brad_frost
176
9.6k
Typedesign – Prime Four
hannesfritz
41
2.5k
Code Review Best Practice
trishagee
67
18k
Optimising Largest Contentful Paint
csswizardry
34
3.1k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
366
25k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3k
Building Adaptive Systems
keathley
40
2.4k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7.1k
Transcript
TFLiteとPyTorch Mobile 2020/06/17 shibui yusuke 1
自己紹介 cat : 0.55 dog: 0.45 human : 0.70 gorilla
: 0.30 画像分類 Shibui Yusuke • メルカリ AI Team 基盤エンジニア MLエンジニア その他いろいろ • Github: @shibuiwilliam • Qiita: @cvusk • Facebook: @shibui yusuke • 最近やってること:Android、AR MLシステムデザインパターン作成中。 これにEdge AIパターンを追加したい! https://github.com/mercari/ml-system -design-pattern 2
今日のアイドル マルグレーテちゃん( ♀) 1歳 ノルウェージャンフォレストキャット 趣味は爪研ぎとゴミ箱あさり! 3
• Why Edge AI? • Tensorflow Lite & PyTorch Mobile
• Let’s Edge AI Agenda 4
Why Edge AI? • サーバサイドでAI • クライアントサイドで AI ボトル ネック
ボトル ネック 高性能 低性能 リアル タイム ・Kotlin ・Java ・Swift ・C++ ・C 情報保護 ・Python ・Python ・Python 5
AIをスマホで動かす • AIはAIだけではない。 ◦ 前処理 カメラで画像を取得し、 画像をAIで扱えるように サイズとRGBを調整して テンソル(行列)に変換する。 ◦
AI 前処理済みのテンソルにたくさんの 掛け算と足し算(積和演算)をする。 ◦ 後処理 AIの結果をスマホの画面に表示。 猫! 6 この画像に写っているものを AIで判定したい
AIをスマホで動かす前処理 • カメラで画像を取得し、画像を AIで扱えるように サイズとRGBを調整してテンソル(行列)に変換する。 0.2 0.3 0.9 0.0 0.0
0.1 0.5 0.7 0.1 0.3 0.5 0.7 0.7 0.6 0.4 0.6 0.2 0.3 0.9 0.0 0.0 0.1 0.5 0.7 0.1 0.3 0.5 0.7 0.7 0.6 0.4 0.6 0.2 0.3 0.9 0.0 0.0 0.1 0.5 0.7 0.1 0.3 0.5 0.7 0.7 0.6 0.4 0.6 画像を正方形 (224*224)にリサイズ RGBのテンソル (行列)に分ける テンソルを0~1に正規化 60 90 240 0 0 10 127 195 10 92 128 195 195 161 111 161 7
AIをスマホで動かすモデル • 前処理済みのテンソルにたくさんの掛け算と足し算(積和演算)をする。 AIの実態(ロジックとパラメータの集まり)を「モデル」と呼ぶ。 0.2 0.3 0.9 0.0 0.0 0.1
0.5 0.7 0.1 0.3 0.5 0.7 0.7 0.6 0.4 0.6 0.2 0.3 0.9 0.0 0.0 0.1 0.5 0.7 0.1 0.3 0.5 0.7 0.7 0.6 0.4 0.6 0.2 0.3 0.9 0.0 0.0 0.1 0.5 0.7 0.1 0.3 0.5 0.7 0.7 0.6 0.4 0.6 tench hen jay kite goose beagle collie stove lion persian siamese gown mask ski ...1000 モデル 演算中にテンソルの形状が変化していく 8
AIをスマホで動かす後処理 • AIの結果をスマホの画面に表示。 猫! tench 5% hen 2% jay 3%
kite 2% goose 10% beagle 2% collie 3% stove 1% lion 10% persian 15% siamese 10% gown 4% mask 2% ski 3% ...1000 ... 9
Google製のTensorflowをモバイルで 動かすためのライブラリ。 Android/iOS/ラズパイ/マイコン対応。 AIのモバイル対応では高性能で汎用的。 TensorFlow Lite & PyTorch Mobile スマホでAIのモデルを動かすための主なライブラリ
Facebook製のPyTorchをモバイルで 動かすためのライブラリ。 Android/iOS対応。 PyTorchは使いやすさやシンプルさから AI研究で使われることが多い。 10
Let's Edge AI ImageAnalysisでTFLiteと PyTorchMobileを実行 WorkerThreadで推論 推論結果 上位3件 ソースコードはこちら。 https://github.com/shibuiwilliam/TFLitePyTorch
11
CameraXにImageAnalysisをbind abstract class AbstractCameraXActivity : AppCompatActivity(){ @WorkerThread protected abstract fun
analyzeImage(image: ImageProxy, rotationDegrees: Int): Map<String, Float> ~~~~省略~~~~ private fun setupCameraX() { ~~~~省略(preview)~~~~ val imageAnalysisConfig = ImageAnalysisConfig .Builder() .apply { setCallbackHandler(mBackgroundHandler) setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE) } .build() ~~~~次ページへ~~~~ } } TFLiteとPyTorchMobileが analyzeImage()をoverride 12
CameraXにImageAnalysisをbind abstract class AbstractCameraXActivity : AppCompatActivity(){ @WorkerThread protected abstract fun
analyzeImage(image: ImageProxy, rotationDegrees: Int): Map<String, Float> ~~~~省略~~~~ private fun setupCameraX() { ~~~~前ページから~~~~ val imageAnalysis = ImageAnalysis(imageAnalysisConfig) imageAnalysis.analyzer = ImageAnalysis.Analyzer { image: ImageProxy?, rotationDegrees: Int -> if (image == null) return@Analyzer val result = analyzeImage(image, rotationDegrees) if (result != null) runOnUiThread(Runnable { showResult(result) }) } CameraX.bindToLifecycle(this, preview, imageAnalysis) } } 結果を画面に表示 推論して結果を取得 13
AIの開発ステップ 前処理 学習 前処理 推論 後処理 モデル 学習 サーバサイド Python
推論 クライアントサイド Kotlin/Swift モデル 変 換 14 グレー部分を TensorFlowや PyTorchがカバー
• tf.lite.TFLiteConverter ◦ TFLite向けの専用のコンバータでモデルを FlatBuffersに変換する。 ◦ 各種クライアントのTFLite InterpreterがFlatBuffersを読み込んでモデルを動かす。 https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/python TensorFlow
Lite スマホで推論するためのモデル変換 スマホで推論モデルを動かすためのランタイム • org.tensorflow.lite.* ◦ チップセットへのdelegateを含めたInterpreter(推論器)を動かすためのライブラリ。 ◦ データの入出力はjava.nio.Bufferに変換、Interpreterを呼び出す。 https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/experimenta l/support/java/src/java/org/tensorflow/lite/support 15
TensorFlow Lite Python Java (Kotlin) 16
Neural Network API (NNAPI) Androidデバイスで演算負荷の 高いAI処理を実行するための ネイティブAPI。 演算をGPUや専用チップへ移譲。 アプリ TFLite
NNAPI CPU Proc GPU 17
class TFLiteActivity : AbstractCameraXActivity() { ~~~~省略~~~~ private fun initializeTFLite(device: Constants.Device
= Constants.Device.NNAPI, numThreads: Int = 4) { val delegate = when (device) { Constants.Device.NNAPI -> NnApiDelegate() Constants.Device.GPU -> GpuDelegate() Constants.Device.CPU -> "" } if (delegate != "") tfliteOptions.addDelegate(delegate) tfliteOptions.setNumThreads(numThreads) tfliteModel = FileUtil.loadMappedFile(this, Constants.TFLITE_MOBILENET_V2_PATH) tfliteInterpreter = Interpreter(tfliteModel, tfliteOptions) ~~~~次ページへ~~~~ } } TFLiteの演算を NNAPIやGPU に移譲 既存のモデルファイルを ロード モデルを計算 グラフに変換 TFLiteの推論モデルを用意する 18
TFLiteの推論モデルを用意する class TFLiteActivity : AbstractCameraXActivity() { ~~~~省略~~~~ private fun initializeTFLite(device:
Constants.Device, numThreads: Int) { ~~~~前ページから~~~~ inputImageBuffer = TensorImage(tfliteInterpreter.getInputTensor(0).dataType()) outputProbabilityBuffer = TensorBuffer.createFixedSize( tfliteInterpreter.getOutputTensor(0).shape(), tfliteInterpreter.getInputTensor(0).dataType()) probabilityProcessor = TensorProcessor .Builder() .add(NormalizeOp(0.0f, 1.0f)) .build() } } 入出力テンソルのバッファ 実態はjava.nio.Buffer 出力(確率)の プロセッサ 19
TFLiteで推論 @WorkerThread override fun analyzeImage(image: ImageProxy, rotationDegrees: Int): Map<String, Float>
{ val bitmap = Utils.imageToBitmap(image) val cropSize = Math.min(bitmap.width, bitmap.height) inputImageBuffer.load(bitmap) val inputImage = ImageProcessor .Builder() .add(ResizeWithCropOrPadOp(cropSize, cropSize)) .add(ResizeOp(224, 224, ResizeMethod.NEAREST_NEIGHBOR)) .add(NormalizeOp(127.5f, 127.5f)) .build() .process(inputImageBuffer) ~~~~次ページへ~~~~ } 前処理 ImageProxyをbitmap →テンソルに変換 (同時にリサイズと正規化 ) 20
TFLiteで推論 @WorkerThread override fun analyzeImage(image: ImageProxy, rotationDegrees: Int): Map<String, Float>
{ ~~~~前ページから~~~~ tfliteInterpreter.run(inputImage!!.buffer, outputProbabilityBuffer.buffer.rewind()) val labeledProbability: Map<String, Float> = TensorLabel( labelsList, probabilityProcessor.process(outputProbabilityBuffer) ).mapWithFloatValue return labeledProbability } @UiThread override fun showResult(result: String) { textView.text = result } outputProbBufferに 推論結果を格納 ラベルと推論結果を紐 付ける 結果を表示 21
• torch.jit.trace() ◦ 汎用的なJITコンパイラでモバイル用のモデルを生成。 モバイル用に最適化するものではない。 ◦ Pythonで作ったPyTorchのモデルをC++から直接呼べるように変換している。 https://github.com/pytorch/pytorch/tree/master/torch/jit PyTorch Mobile
• org.pytorch.* torch.jit.trace()で生成したモデルを Nativeライブラリで動かすための Java実装を提供。 https://github.com/pytorch/pytorch/tree/master/android • com.facebook.soloader.* org.pytorch.*の実態はSoLoaderというFacebook製のネイティブコードローダー。 https://github.com/facebook/SoLoader スマホで推論するためのモデル変換 スマホで推論モデルを動かすためのランタイム 22
server Torch API PyTorch Mobile client Torch torch.jit.trace model.pt SoLoader
Graph computation CPU Python Java (Kotlin) 23
PyTorch Mobileの推論モデルを用意する class PyTorchActivity : AbstractCameraXActivity() { ~~~~省略~~~~ private fun
initializePyTorch() { val pytorchModule = Module.load(Utils.assetFilePath( this, Constants.PYTORCH_RESNET18_PATH)) val mInputTensorBuffer = Tensor.allocateFloatBuffer(3 * 224 * 224) val mInputTensor = Tensor.fromBlob( mInputTensorBuffer, longArrayOf(1, 3, 224L, 224L) ) } } 推論モデルファイルをロード この先はSoLoader 入力のテンソルを用意 実態はjava.nio.Buffer 24
PyTorch Mobileで推論 @WorkerThread override fun analyzeImage(image: ImageProxy, rotationDegrees: Int): Map<String,
Float> { TensorImageUtils.imageYUV420CenterCropToFloatBuffer( image.image, rotationDegrees, 224, 224, TensorImageUtils.TORCHVISION_NORM_MEAN_RGB, TensorImageUtils.TORCHVISION_NORM_STD_RGB, mInputTensorBuffer, 0 ) ~~~~次ページへ~~~~ } 前処理 ImageProxyを テンソルに変換 (同時にリサイズと正規化 ) 25
PyTorch Mobileで推論 @WorkerThread override fun analyzeImage(image: ImageProxy, rotationDegrees: Int): Map<String,
Float> { ~~~~前ページから~~~~ val outputModule = pytorchModule.forward(IValue.from(mInputTensor)).toTensor() val scores = outputModule.dataAsFloatArray val labeledProbability: MutableMap<String, Float> = mutableMapOf() for (i in 0 until labelsList.size - 1) { labeledProbability[labelsList[i + 1]] = score[i] } return labeledProbability } @UiThread override fun showResult(result: String) { textView.text = result } 推論し、結果を テンソルに変換 ラベルと 推論結果を 紐付ける 結果を表示 26
こんな感じで動きます 27
TFLiteとPyTorch Mobileを使ってみた感想 • 高性能。 • CPUだけでなくGPU/NNAPI移譲が可能。 • 各種オプションやExampleが豊富。 • 最低限必要な機能がある。
• CPUのみ。 • オプションが少ない分、シンプルに書くことが できる。 28