가상 타겟 설정
아키텍처 선택
아키텍처 최적화
프레임워크 선택
앞서 안드로이드와 IOS 기기에서 반드시 실행 가능해야 하기 때문에, Pytorch 만으로는 각 기기에 올리기가 어렵다.
아래는 모바일로 서빙하기 위해 사용 가능한 프레임워크들이다.
Tensorflow lite
텐서플로우 모델을 모바일, 임베디드, IoT 환경에서 돌릴 수 있도록 도와주는 툴
안드로이드, IOS, 내장형 Linux, 마이크로 컨트롤러 등 사용 가능
대리자를 통해 GPU, DSP, NPU 등 지원
모델 유형 | GPU | NNAPI | Hexagon | CoreML |
---|---|---|---|---|
부동점 (32bit) | Y | Y | N | Y |
훈련 후 FP16 양자화 | Y | N | N | Y |
훈련 후 동적 범위 양자화 | Y | Y | N | N |
훈련 후 정수 양자화 | Y | Y | Y | N |
양자화 인식 훈련 | Y | Y | Y | N |
pytorch 모델을 tflite 모델로 변경시키려면 다음과 같은 과정을 진행한다.
pytorch → onnx → Tensorflow → TFLite
2.4.0-dev20200923
as well)
import onnx
import torch
example_input = get_example_input() # exmample for the forward pass input
pytorch_model = get_pytorch_model()
ONNX_PATH="./my_model.onnx"
torch.onnx.export(
model=pytorch_model,
args=example_input,
f=ONNX_PATH, # where should it be saved
verbose=False,
export_params=True,
do_constant_folding=False, # fold constant values for optimization
# do_constant_folding=True, # fold constant values for optimization
input_names=['input'],
output_names=['output']
)
onnx_model = onnx.load(ONNX_PATH)
onnx.checker.check_model(onnx_model)
from onnx_tf.backend import prepare
import onnx
TF_PATH = "./my_tf_model.pb" # where the representation of tensorflow model will be stored
ONNX_PATH = "./my_model.onnx" # path to my existing ONNX model
onnx_model = onnx.load(ONNX_PATH) # load onnx model
# prepare function converts an ONNX model to an internel representation
# of the computational graph called TensorflowRep and returns
# the converted representation.
tf_rep = prepare(onnx_model) # creating TensorflowRep object
# export_graph function obtains the graph proto corresponding to the ONNX
# model associated with the backend representation and serializes
# to a protobuf file.
tf_rep.export_graph(TF_PATH)
tensorflow to tflite
TF_PATH = "./my_tf_model.pb" # where the forzen graph is stored
TFLITE_PATH = "./my_model.tflite"
# protopuf needs your virtual environment to be explictly exported in the path
os.environ["PATH"] = "/opt/miniconda3/envs/convert/bin:/opt/miniconda3/bin:/usr/local/sbin:...."
# make a converter object from the saved tensorflow file
converter = tf.compat.v1.lite.TFLiteConverter.from_frozen_graph(TF_PATH, # TensorFlow freezegraph .pb model file
input_arrays=['input'], # name of input arrays as defined in torch.onnx.export function before.
output_arrays=['output'] # name of output arrays defined in torch.onnx.export function before.
)
# tell converter which type of optimization techniques to use
# to view the best option for optimization read documentation of tflite about optimization
# go to this link https://www.tensorflow.org/lite/guide/get_started#4_optimize_your_model_optional
# converter.optimizations = [tf.compat.v1.lite.Optimize.DEFAULT]
converter.experimental_new_converter = True
# I had to explicitly state the ops
converter.target_spec.supported_ops = [tf.compat.v1.lite.OpsSet.TFLITE_BUILTINS,
tf.compat.v1.lite.OpsSet.SELECT_TF_OPS]
tf_lite_model = converter.convert()
# Save the model.
with open(TFLITE_PATH, 'wb') as f:
f.write(tf_lite_model)
```
지원하는 연산자가 없다면?
CoreML
기계학습(Machine Learning)에 의한 이미지 분석, 텍스트 처리 등의 작업을 네트워크를 통하지 않고 기기(아이폰, 아이패드, 맥 등) 내의 AP를 이용하여 수행할 수 있도록 하는 라이브러리
Apple 하드웨어를 활용하고 메모리 공간 및 전력 소비를 최소화하여 다양한 모델 유형의 기기 내 성능에 최적화되어 있음
Apple 하드웨어에서만 사용 가능
pytorch 모델을 coreML로 변환하려면 torchscript 변환 후 coremltools를 사용한다
import torch
import torchvision
# Load a pre-trained version of MobileNetV2
torch_model = torchvision.models.mobilenet_v2(pretrained=True)
# Set the model in evaluation mode.
torch_model.eval()
# Trace the model with random data.
example_input = torch.rand(1, 3, 224, 224)
traced_model = torch.jit.trace(torch_model, example_input)
out = traced_model(example_input)
import coremltools as ct
# Using image_input in the inputs parameter:
# Convert to Core ML program using the Unified Conversion API.
model = ct.convert(
traced_model,
convert_to="mlprogram",
inputs=[ct.TensorType(shape=example_input.shape)]
)
# Save the converted model.
model.save("newmodel.mlpackage")
지원하는 연산자가 없다면?
Pytorch Mobile
MNN
Qualcomm Neural Processing SDK
MACE
Paddle lite
NCNN
참고한 자료