문제 1 : 대부분 SOTA 모델은 Pytorch인데, Mobile inference 최적화는 TFLite가 잘되어 있음
문제 2 : Pytorch->TFlite의 공식 지원은 없으며, 개개인이 구현한 convert 방법들은 지원하는 Layer가 매우 한정적임
해결책 : Pinto0309님이 만들어논 openvino2Tensorflow가 그나마 낫다. (완벽하진 않음)
Pytorch -> onnx -> onnx-simplify -> openvino -> TFLite
python3 mo.py --input_model <INPUT_MODEL>.onnx ##openvino 파일 생성(xml, bin, mapping)
docker pull ghcr.io/pinto0309/openvino2tensorflow:latest
docker run -it --rm \
-v `pwd`:/home/user/workdir \
ghcr.io/pinto0309/openvino2tensorflow:latest
python3 mo.py --input_model <INPUT_MODEL>.onnx ##openvino 파일 생성(xml, bin, mapping)
docker pull ghcr.io/pinto0309/openvino2tensorflow:latest
docker run -it --rm \
-v `pwd`:/home/user/workdir \
ghcr.io/pinto0309/openvino2tensorflow:latest
openvino2tensorflow \
--model_path <input_model>.xml \
--output_saved_model \ #saved model True
--output_pb \ #pb model True
--output_float16_quant_tflite \ #float16 Quantize
--output_no_quant_float32_tflite \ #float32
##########################################################################
#-weight_replacement_config=config.json #아래에서 자세하게 설명
#########################################################################
가장 기본적인 convert 명령어로 다음과 같은 모델이 output으로 나옴.
example json
{
"format_version": 2,
"layers": [
{
"layer_id": "660", #openvino의 660번째 layer가 문제가 되서
"type": "Reshape", #Reshape layer를
"replace_mode": "insert_after", #660번째 layer 뒤에
"values": [ #다음과 같은 값으로 지정해줘
2100,
85
]
}
]
}
top-k layer : feature에서 특정 dim을 기준으로, k개의 상위 value와 그 index를 계산하는 layer로 딥러닝 모델에 종종 쓰이는 layer이다.
우리 착한 pytorch에서는 다음과 같이 dimension을 지정할수 있게 지원해주는 반면
우리의 Tensorflow는 그런거 모름 ㅋㅋㅋㅋㅋㅋ.