งานหลาย ๆ งาน มีความต้องการใช้งานโมเดล Machine Learning บนอุปกรณ์ Edge ของ Network แทนที่จะต้องเสียเวลา ส่งข้อมูลไป-กลับระหว่าง Server เราสามารถแปลงโมเดลเป็น TensorFlow Lite ให้ไปรันบนมือถือ และอุปกรณ์ Edge ได้เลย

TensorFlow Lite (TFLite) คืออะไร

How TensorFlow Lite Works - Pick a model, Convert, Deploy, Optimize. Credit https://www.tensorflow.org/lite
How TensorFlow Lite Works – Pick a model, Convert, Deploy, Optimize. Credit https://www.tensorflow.org/lite

TensorFlow Lite (TFLite) คือ Tools ที่ช่วยให้นักพัฒนาสามารถรันโมเดล TensorFlow ทำ Inference บนมือถือ Mobile, Android, iOS, อุปกรณ์ Edge, IoT Device, Raspberry Pi, Jetson Nano, Arduino, Embedded, Microcontroller, Etc. ได้ ด้วยโมเดลที่มีขนาดเล็กลง ทำงานได้เร็วขึ้น ลด Latency โดยอาจจะลดความแม่นยำลงไปบ้าง

Coral’s first products are powered by Google’s Edge TPU chip, and are purpose-built to run TensorFlow Lite, Credit https://blog.tensorflow.org/2019/03/build-ai-that-works-offline-with-coral.html
Coral’s first products are powered by Google’s Edge TPU chip, and are purpose-built to run TensorFlow Lite, Credit https://blog.tensorflow.org/2019/03/build-ai-that-works-offline-with-coral.html

TensorFlow Lite ประกอบด้วย 2 ส่วนดังนี้

  • TensorFlow Lite Interpreter เป็นตัวรันโมเดลที่ถูกแปลง และ Optimize มาเป็นพิเศษ บน Hardware ที่กำหนด เช่น มือถือ, Embedded Linux และ Microcontroller
  • TensorFlow Lite Converter เป็นตัวแปลงโมเดล TensorFlow ไปเป็นโมเดลขนาดเล็ก ที่ทำงานได้รวดเร็ว สำหรับรันกับ Interpreter

ข้อดีของการใช้ Machine Learning บน อุปกรณ์ Edge

Personal Health Apps for Smartphones. Credit https://commons.wikimedia.org/wiki/File:Personal_Health_Apps_for_Smartphones.jpg
Personal Health Apps for Smartphones. Credit https://commons.wikimedia.org/wiki/File:Personal_Health_Apps_for_Smartphones.jpg
  • Latency ตอบสนองทันที่ ไม่ต้องส่งข้อมูลไปกลับข้ามเน็ตเวิร์ค
  • Privacy ข้อมูลไม่ต้องออกจากอุปกรณ์
  • Connectivity ไม่ต้องใช้อินเตอร์เน็ต ติดต่อ Server
  • Power Consumption เมื่อไม่ใช้เน็ตเวิร์คก็ประหยัดพลังงาน

เรามาเริ่มกันเลยดีกว่า

Open In Colab
In [0]:
#@title Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

0. Setup

ใน ep นี้ เราจะใช้ TensorFlow 2 ด้วยคำสั่ง Magic %tensorflow_version 2.x (สำหรับ Google Colab)

In [0]:
try:
    %tensorflow_version 2.x
except:
    pass

1. Import

Import Library ที่เกี่ยวข้อง

In [41]:
import pathlib
import numpy as np
import matplotlib.pyplot as plt

import tensorflow as tf

print('\u2022 Using TensorFlow Version:', tf.__version__)
• Using TensorFlow Version: 2.1.0-rc1

2. Dataset

ชุดข้อมูลนี้สร้างจาก y = 5x + 0 บวก Noise อีกนิดหน่อย

In [0]:
x = [   -1,   0,  1,    2,     3,     4 ]
y = [ -5.1, 0.1,  5, 10.1,  14.9,  20.2 ]

3. Model

สร้างโมเดล Linear Regression ด้วย 1 Dense Layer ที่ไม่มี Activation Function

In [0]:
model = tf.keras.models.Sequential([
        tf.keras.layers.Dense(units=1, input_shape=[1])
])

ใช้ Mean Squared Error Loss Function และ Adam Optmizer

In [0]:
model.compile(optimizer=tf.optimizers.Adam(learning_rate=1., beta_1=0.),
              loss='mean_squared_error')

4. Train

เทรนไป 20 Epoch

In [45]:
model.fit(x, y, epochs=20)
Train on 6 samples
Epoch 1/20
6/6 [==============================] - 0s 29ms/sample - loss: 200.0258
Epoch 2/20
6/6 [==============================] - 0s 1ms/sample - loss: 126.2419
Epoch 3/20
6/6 [==============================] - 0s 1ms/sample - loss: 76.9531
Epoch 4/20
6/6 [==============================] - 0s 1ms/sample - loss: 46.1516
Epoch 5/20
6/6 [==============================] - 0s 745us/sample - loss: 28.1457
Epoch 6/20
6/6 [==============================] - 0s 996us/sample - loss: 18.1603
Epoch 7/20
6/6 [==============================] - 0s 1ms/sample - loss: 12.7066
Epoch 8/20
6/6 [==============================] - 0s 1ms/sample - loss: 9.5826
Epoch 9/20
6/6 [==============================] - 0s 1ms/sample - loss: 7.5843
Epoch 10/20
6/6 [==============================] - 0s 1ms/sample - loss: 6.1350
Epoch 11/20
6/6 [==============================] - 0s 2ms/sample - loss: 4.9866
Epoch 12/20
6/6 [==============================] - 0s 2ms/sample - loss: 4.0387
Epoch 13/20
6/6 [==============================] - 0s 2ms/sample - loss: 3.2481
Epoch 14/20
6/6 [==============================] - 0s 1ms/sample - loss: 2.5911
Epoch 15/20
6/6 [==============================] - 0s 1ms/sample - loss: 2.0498
Epoch 16/20
6/6 [==============================] - 0s 2ms/sample - loss: 1.6083
Epoch 17/20
6/6 [==============================] - 0s 1ms/sample - loss: 1.2519
Epoch 18/20
6/6 [==============================] - 0s 1ms/sample - loss: 0.9671
Epoch 19/20
6/6 [==============================] - 0s 869us/sample - loss: 0.7417
Epoch 20/20
6/6 [==============================] - 0s 1ms/sample - loss: 0.5650
Out[45]:
<tensorflow.python.keras.callbacks.History at 0x7f49b54da710>

5. Generate a SavedModel

เราจะ Export โมเดลในไฟล์ Format ใหม่ ของ TensorFlow ที่เรียกว่า SavedModel

/1 คือ เลข Version

In [46]:
export_dir = 'saved_model/1'
tf.saved_model.save(model, export_dir)
INFO:tensorflow:Assets written to: saved_model/1/assets

6. Convert the SavedModel to TFLite

แปลงโมเดลในไฟล์ SavedModel ไปเป็นไฟล์ tflite ที่เหมาะสำหรับใช้ในอุปกรณ์ Edge

In [0]:
# Convert the model.
converter = tf.lite.TFLiteConverter.from_saved_model(export_dir)
tflite_model = converter.convert()

Save ไฟล์ tflite ลง Disk เพื่อนำไปใส่อุปกรณ์ที่ต้องการต่อไป

In [48]:
tflite_model_file = pathlib.Path('model.tflite')
tflite_model_file.write_bytes(tflite_model)
Out[48]:
792

ได้ไฟล์ขนาด 792 Byte

7. Initialize the TFLite Interpreter

ในเคสนี้ เราจะลองรันโมเดล tflite ใน Notebook นี้เลย ให้เราโหลด TFLite Intepreter ขึ้นมา แล้วสั่งให้ Allocate Tensors เพื่อใช้เหมือนเป็น Emulator

In [0]:
# Load TFLite model and allocate tensors.
interpreter = tf.lite.Interpreter(model_content=tflite_model)
interpreter.allocate_tensors()

ดึงข้อมูล Input และ Output ของ Intepreter / Model

In [0]:
# Get input and output tensors.
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

เราจะวนลูป Random เรียก Intepreter 100 ครั้ง ด้วยค่า Input ต่าง ๆ ดูว่า Output จะเป็นอย่างไร

In [0]:
# Test the TensorFlow Lite model on random input data.
input_shape = input_details[0]['shape']
inputs, outputs = [], []
for _ in range(100):
    input_data = np.array(np.random.random_sample(input_shape), dtype=np.float32)
    interpreter.set_tensor(input_details[0]['index'], input_data)
    
    interpreter.invoke()
    tflite_results = interpreter.get_tensor(output_details[0]['index'])
    
    # Test the TensorFlow model on random input data.
    tf_results = model(tf.constant(input_data))
    output_data = np.array(tf_results)
    
    inputs.append(input_data[0][0])
    outputs.append(output_data[0][0])

8. Visualize the Model

นำ Output ที่ได้มาพล็อตกราฟ จะได้เส้นตรง y = 5x + 0

In [52]:
%matplotlib inline

plt.plot(inputs, outputs, 'r')
plt.show()

9. Download the TFLite Model File

ดาวน์โหลดไฟล์โมเดล เพื่อนำไปใส่ Edge Device ที่ต้องการ

In [0]:
try:
    from google.colab import files
    files.download(tflite_model_file)
except:
    pass

10. Credit

In [0]:
 

แชร์ให้เพื่อน:

Keng Surapong on FacebookKeng Surapong on GithubKeng Surapong on Linkedin
Keng Surapong
Project Manager at Bua Labs
The ultimate test of your knowledge is your capacity to convey it to another.

Published by Keng Surapong

The ultimate test of your knowledge is your capacity to convey it to another.

Enable Notifications    Ok No thanks