지원되지 않는 연산 Layer 관련 문의

안녕하세요, Model Zoo에 없는 모델을 convert→ quantize→ compile을 진행하고 싶습니다.
다양한 모델들을 찾아봤지만, reshape 연산이 백본 중간에 있거나, Sqrt와 같은 지원되지 않는 레이어 연산이 포함된 모델들이 대다수라 혹시 다른 방법이 있을지 궁금하여 문의드립니다.

현재 권장 방식은 지원되지 않는 레이어 이전 레이어를 Output 처리하여 convert한 후, 이후 레이어들의 연산을 post_process.c / custom_portproc.c 파일을 수정하여 해결하는 방식으로 이해하고 있습니다. 하지만 이는 출력 레이어 근처일 경우에만 유의미함으로 해석하였습니다.

유사한 방식으로 Sqrt와 같은 레이어만 CPU연산으로 빼는 방법이나 혹은 다른 권장 방식이 있는지 여쭤보고 싶습니다.
(모델 레이어를 수정하여 파인튜닝 및 재배포하는 작업은 최후로 두고있습니다)

감사합니다

안녕하세요.
TOPST 매니저입니다.
현재 저희 tc-nn-toolkit에서 지원하지 않는 연산자가 포함된 모델의 경우에는 모델 뒷단에 있는 레이어를 CPU 후처리로 빼는 방법만을 제공하고 있습니다. 현재는 백본의 중간에 지원하지 않는 연산이 존재할 경우에는 모델 레이어를 수정하여 파인튜닝 방법을 진행하셔야 할 것 같습니다.

현재 사용하고자 하시는 모델이 어떤 것인지 알려주시면 좀 더 자세히 도움 드리도록 하겠습니다.

감사합니다.

확인 감사합니다. 현재 이미 배포된 ONNX 모델을 찾고 있으나, Hand Keypoints Extraction 모델을 사용해보고 싶습니다.
MediaPipe 혹은 MMPose-RTMPose_Hand 모델을 사용하고자 하였으나, 우선 AI-G NPU에 포팅 가능한 모델을 찾고자 합니다

우선 2개의 모델 모두 모델 레이어 수정이 필요한 상황입니다.
AI-G NPU에 바로 올릴 수 있는 Hand Keypoints 모델은 yolov8-hand 모델 사용을 추천드립니다.
뒷단의 dfl 레이어를 제거 후에 컴파일 하시면 바로 포팅가능하십니다.

감사합니다.

빠른 답변 감사드립니다.
말씀주신 YOLO 모델로 시도 후 추가적으로 문의 있으면 남겨드리겠습니다

1 Like

NeuralVulture/yolo-hand-pose: Trained the first ever hand pose model on YOLOv8-Pose
해당 링크의 모델 참고하시면 좋을 것 같습니다!

감사합니다!!
말씀주신 repo 확인하여 현재 입출력 구조 확인 및 onnx 전환 과정에 있습니다
레이어 확인후 다시 말씀 드리겠습니다!

1 Like

NeuralVulture/yolo-hand-pose/model/best.pt 를 변환하였습니다.
ONNX 전환 후 레이어 확인 결과 처리해야할 Reshape 레이어들이 보입니다.
이전에 시도했던 모델들보다 Output 레이어와 근접한 위치에 있긴 하지만, 이를 후처리로 변환하는 것이 효율적일지 판단하기 어려워 추가 문의 남겨드립니다.

네, 비교적 무거운 연산들이 아니라서 괜찮습니다.
model zoo에 존재하는 yolov8 모델도 비슷한 방식으로 레이어 제거 후 포팅하여 사용중입니다.

넵 내용 확인했습니다.

바쁘실텐데 빠른 답변 도와주셔서 감사드립니다!

천천히 답변주셔도 괜찮습니다!
혹시, yolov8 모델 후처리 레퍼런스를 참고하고 싶은데
공유 가능시다면 후처리 파트 c코드를 받을 수 있는지 여쭤보고 싶습니다

감사합니다!

추가적으로, >netron output_networks/Hand.enlight 실행을 통해 레이어 이름을 확인하고자 하였으나, netron으로 enlight파일이 확인이 안됨을 말씀드립니다.

기존 venv를 삭제하고 chmod 로 권한 부여한 후, ./setup_venv.sh 를 실행하여 다시 진행하였으나 마찬가지로 .enlight만 열리지 않습니다. 해결 방법을 알려주시면 감사드리겠습니다.

혹시, 커뮤니케이션에 도움이 될까 하여 이전에 convert 진행한 로그와 onnx 구조를 다시 첨부해봅니다.

감사합니다

(cut해야 하는 레이어의 위치가 여러개라면, convert.py –force-output 에 직렬로 레이어 이름을 그냥 적으면 되는지도 여쭤보고 싶습니다)

=======convert 결과 ======

=====onnx구조 =====

현재 netron의 default 포트에 문제가 있어 열리지 않는 상황입니다.
netron -p 8081로 여시면 .enlight도 문제 없이 열릴거같습니다.
추가적으로 force-output에 직렬로 나열하여 9개의 레이어를 적으시면 됩니다. .enlight로 확인한 레이어의 명을 입력하셔야 올바르게 레이어 수정이 가능합니다.

감사합니다.

yolov8 후처리 레퍼런스는 build_network/detector/yolo_detector.c 파일에서 확인 가능합니다.

늦은시간에 답변주셔서 대단히 감사드립니다!
답변 주신 내용으로 모두 시도해보겠습니다

감사합니다 :slight_smile:

1 Like

안녕하세요, 바쁘신 와중에 감사드립니다.

9개의 Conv2d 레이어를 –force-output 설정하여 양자화까지 진행 성공하였습니다.

하지만, 기존 ONNX구조에서 확인했던 각 Conv2d의 output 과 convert → quant* 결과의 output의 결과가

다르게 나오는 것이 정상인지 확인차 여쭈어 봅니다

(e.g., 기존 ONNX 내 Conv2d output : 1x1x80x80 –> –force-output 후 Conv2d output : 1x64x80x80)

이제 quantizer.py 까지 실행하여 나온 모델의 레이어 구조를 확인하여 후처리 로직을 작성해야 하는 것으로 이해했습니다.

convert.py 를 실행하고 나온 enlight 의 레이어 output과 quantizer를 실행하고 나온 quantized.englight의 레이어 output 마저 달라, 후처리 로직을 어떻게 작성해야 할지 어려움을 겪고 있습니다

안녕하세요
onnx 변환에 사용하신 코드, 컨버팅, 양자화 시 사용하신 명령어를 전달해주시면 빠르게 확인 후 답변 드리겠습니다.
구글 드라이브로 주시면 감사하겠습니다.

추가로 컨버팅 시에 저희 tcnntoolkit 내부적으로 모델 레이어 일부를 수정하여 저희 npu에 맞게 최적화 하는 과정을 거쳐 레이어의 형상 일부가 달라질 수 있습니다.

감사합니다.

안녕하세요, 답변 확인하였습니다.

말씀 주신 대로 레이어 구조가 바뀐것을 확인하였고 custom_postproc.c 수정 작업을 진행하려고 합니다.

혹시 몰라 구글드라이브 링크 남겨드립니다

추가적으로 output_code/post_process.c 와 build_network/custom_postproc.c 수정 후
tcnnapp 의 NnNeuralNetwork.c 와 NnAppMain.c 도 함께 수정하여 컴파일 하면 되는지 확인 차 여쭤봅니다

감사합니다!