ONEforALL-S003/TWO

Tricky Pytorch-Circle Mapping support

Opened this issue · 3 comments

@wnwoghd22 @Judgement9882 @skqlck @FantBlog @0minyoung0
tricky mapping for torch exporter

original model을 circle로 변환시켜서 내부에 있는 tensor 값을 이용해서 tensor mapping 정보를 얻고
mapping 된 경우 입력한 입력한 json으로 넣어주고 (e.g. qparam.json)
mapping 되지 않은 경우 manually mapping 해서 implant 할 수 있도록 not_mapped를 붙여서 따로 json 파일을 생성하게 했어요 (e.g. not_mapped_qparam.json)

mapping을 위해 circle의 tensor를 볼 수 밖에 없어서 pics가 사용되고, circle 변환 과정에서 tflite2circle이 필요하기도 해요...
그래서 좀 많이 tricky 한 방법이여서 멘토님이 좋아하실 방법일 지는 모르겠지만,
pics는 pics dependency 이 필요해요(실제로는 nncc build 될 때 생성되게 해야해요..)

@FantBlog numpy 부분 수정하셔서 latest commit을 사용하면 될 것 같아요

갑자기 드는 생각이 mapping 할 때 circle까지 안 보내고 tf 까지 보냈을 때 이름이 mapping 되나 봐도 좋을 것 같네요.
거기서도 mapping 할 수 있으면 굳이 python에서 circle로 안 바꿀 수 있는 장점이 있는데,
mapping 잘 될지는 모르겠네요

Q. 보충설명 부탁드립니다!

A. torch 원본 모델이 있고, torch 원본 모델을 tflite 로 바꾼 모델이 있습니다.
두 모델은 같은 tensor라고 하더라도 name이 다르기 때문에 내부 tensor 값을 이용해서 tensor mapping을 진행합니다.

torch 원본 모델을 quantize 한 모델이 있습니다. 해당 모델에서의 name은 원본 모델과 매칭시킬 수 있기 때문에 mapping이 된 tensor의 경우 qparam.json에 정보를 입력해주고 매핑이 되지 않은 경우는 따로 처리할 수 있도록 not_mapped_qparam.json에 quantization parameter를 넣어준다고 합니다.

skqlck commented

말씀하신대로, circle과 tflite가 거의 동일하다 보니까, torch2tflite만 성공하면, tflite2circle을 미뤄도 되니까 더 좋을 것 같습니다.