
영어 | 简体中文
ONNX 모델을 편집하려면 한 가지 일반적인 방법은 모델 그래프를 시각화하고 ONNX Python API를 사용하여 편집하는 것입니다. 이것은 잘 작동합니다. 그러나 편집하려면 코드를 작성한 다음 시각화하여 확인해야합니다. 두 프로세스는 여러 번 반복 할 수 있으며, 이는 시간이 많이 걸립니다.
완전히 시각화 된 방식으로 편집 효과를 편집하고 미리 볼 수있는 도구가 있다면 어떨까요?
그런 다음 onnx-modifier 온다. 그것으로, 우리는 시각화 pannel에서 모델 그래프를 편집하는 데 집중할 수 있습니다. 모든 편집 정보는 마침내 Python Onnx API에 의해 요약되고 처리됩니다. 그러면 우리의 시간을 구할 수 있습니다!
onnx-modifier 인기있는 네트워크 뷰어 Netron 및 Lightweight Web Application Framework Flask를 기반으로 구축되었습니다.
현재 다음 편집 작업이 지원됩니다.
✅ 노드 삭제
✅ 새 노드를 추가하십시오
node 노드 입력 및 출력의 이름을 바꿉니다
model 모델 입력 및 출력의 이름을 바꿉니다
✅ 새로운 모델 출력을 추가하십시오
✅ 새 모델 입력을 추가하십시오
✅ 모델 입력 모양을 편집합니다
✅ 노드의 속성을 편집합니다
model 모델 초기화기를 편집합니다
다음은 업데이트 로그 및 TODO 목록입니다. 이 프로젝트에 기여하고자하는 사람에게 도움이 될 수있는 디자인 개요는 다음과 같습니다.
도움이되기를 바랍니다!
우리는 지금 onnx-modifier 시작하는 세 가지 방법이 있습니다.
저장소를 복제하고 필요한 파이썬 패키지를 설치하십시오.
git clone https://github.com/ZhangGe6/onnx-modifier.git
cd onnx-modifier
pip install -r requirements.txt그런 다음 실행하십시오
python app.py Flask에서 생성 된 출력 정보에서 URL을 클릭하십시오 ( http://127.0.0.1:5000/ 의 기본값)는 웹 브라우저에서 onnx-modifier 시작됩니다.
app_desktop.py에서 실행 파일을 어떻게 만든 방법을 기록했습니다. 다른 플랫폼의 실행 파일은 향후 작업을 위해 남겨집니다.
우리는 다음과 같은 Docker 컨테이너를 만듭니다.
git clone [email protected]:ZhangGe6/onnx-modifier.git
cd onnx-modifier
docker build --file Dockerfile . -t onnx-modifier 컨테이너를 제작 한 후 Docker 포트와 로컬 폴더 modified_onnx 매핑하여 Onnx-Modifier를 실행합니다.
mkdir -p modified_onnx
docker run -d -t
--name onnx-modifier
-u $( id -u ${USER} ) : $( id -g ${USER} )
-v $( pwd ) /modified_onnx:/modified_onnx
-p 5000:5000
onnx-modifier 그런 다음 URL http://127.0.0.1:5000에서 Onnx- 모디퍼에 액세스 할 수 있습니다. 수정 된 ONNX 모델은 로컬 폴더 modified_onnx 내에서 발견 될 것으로 예상됩니다.
Onnx 모델을 업로드하려면 Open Model... 클릭하십시오. 모델은 구문 분석되어 페이지에 표시됩니다.
그래프 레벨 수용 요소는 페이지의 왼쪽 꼭대기에 배치됩니다. 현재 세 가지 버튼이 있습니다. Reset , Download 및 Add node . 그들은 할 수 있습니다 :
Reset : 전체 모델 그래프를 초기 상태로 재설정합니다.Download : 수정 된 모델을 디스크에 저장하십시오. 오른쪽에있는 두 개의 확인란에 유의하십시오shape inference 선택하여 형상 추론을 선택하십시오.shape inference 기능은 강력한 ONNX 타사 도구 인 ONNX-TOOL에 구축됩니다.clean up 선택하여 사용하지 않는 노드와 텐서 (Onnx GraphSurgeon)를 제거하십시오.Add node : 모델에 새 노드를 추가하십시오.노드 레벨 수용 요소는 모두 사이드 바에 있으며 특정 노드를 클릭하여 호출 할 수 있습니다.
자세히 살펴 보겠습니다.
노드를 삭제하기위한 두 가지 모드가 있습니다 : Delete With Children 하고 Delete Single Node . Delete Single Node 클릭 된 노드 만 삭제하는 반면, Delete With Children 클릭 된 노드에 루팅 된 모든 노드를 삭제합니다.
Delete With Children의 구현은 역 추적 알고리즘을 기반으로합니다.
미리보기의 경우 삭제 된 노드는 처음에는 회색 모드입니다. 노드가 실수로 삭제되면 Recover Node 하면 다시 그래프로 복구 할 수 있습니다. Enter 버튼을 클릭하여 삭제 작업을 실행하면 업데이트 된 그래프가 페이지에 자동으로 표시됩니다.
다음 그림은 일반적인 삭제 프로세스를 보여줍니다.

때때로 우리는 존재하는 모델에 새 노드를 추가하려고합니다. onnx-modifier 이 기능을 실험적으로 지원합니다.
참고 인덱스 페이지의 왼쪽 상단에 선택기 요소가 다음과 같은 Add node 버튼이 있습니다. 이렇게하려면 우리가해야 할 일은 3 단계만큼 쉽습니다.
선택기에서 노드 유형을 선택하고 Add node 버튼을 클릭하십시오. 그런 다음 선택한 유형의 빈 노드가 그래프에서 나타납니다.
선택기에는
ai.onnx(171),ai.onnx.preview.training(4),ai.onnx.ml(18) 및com.microsoft(1)의 도메인에 지원되는 모든 연산자 유형이 포함되어 있습니다.
새 노드를 클릭하고 호출 된 Siderbar에서 편집하십시오. 우리가 채워야 할 것은 노드 속성 (기본적으로 undefined )과 입력/출력 (그래프에 노드가 삽입 될 위치 결정)입니다.
우리는 끝났습니다.

다음은이 기능에 대한 몇 가지 메모입니다.
클릭하여 ? NODE PROPERTIES -> type 요소 또는 각 Attribute 요소의 + 에서 노드 정보를 채우는 데 도움이되는 참조를 얻을 수 있습니다.
undefined 것으로 남겨 두지 않고 모든 Attribute 채우는 것이 좋습니다. 현재 버전에서는 기본값이 잘 지원되지 않을 수 있습니다.
유형 list 있는 Attribute 의 경우 항목이 ' , '(comma)로 분할됩니다. [] 는 필요하지 않습니다.
유형 list 있는 Inputs/Outputs 의 경우 현재 버전에서 최대 8 개의 요소가되어야합니다. 실제 입력/출력 번호가 8 미만인 경우 list_custom 으로 시작하여 사용하지 않은 항목을 남겨두고 자동으로 생략됩니다.
노드의 입력/출력 이름을 변경하면 모델 포워드 경로를 변경할 수 있습니다. 모델 출력의 이름을 바꾸려면 도움이 될 수 있습니다.
onnx-modifier 사용하면 해당 입력 자리 표시 자에 노드 입력/출력의 새 이름을 입력하여이를 달성 할 수 있습니다. 새로운 이름에 따라 그래프 토폴로지가 자동으로 즉시 업데이트됩니다.
예를 들어, 이제 우리는 다음 그림에 표시된 전처리 연산자 ( Sub->Mul->Sub->Transpose )를 제거하려고합니다. 우리는 할 수 있습니다
Conv 노드를 클릭하고 입력 (x)의 이름을 serving_default_input : 0 (Node data_0 의 출력)로 바꿉니다.Conv 에 직접 링크를 볼 수 있습니다. 또한, 전처리 연산자는 주요 루틴에서 나뉘어졌습니다. 삭제하십시오.Download 클릭하면 수정 된 ONNX 모델을 얻을 수 있습니다).참고 : 노드를 연결합니다
$ a $ (위의 예에서data_0) 노드로$ B $ (위의 예에서 첫 번째Conv), 노드 입력을 편집하는 것이 좋습니다.$ B $ 노드의 출력을 편집하기보다는 노드A의 출력에$ a $ 노드의 입력에B. 입력 때문입니다$ B $ 다른 노드의 출력 (위의 예에서Transpose) 일 수 있으며 예기치 않은 결과가 발생할 수 있습니다.
프로세스는 다음 그림에 표시됩니다.

모델 입력/출력 노드를 클릭하고 사이드 바에서 새 이름을 입력 한 다음 완료됩니다.

때로는 특정 노드의 출력을 모델 출력으로 설정하려고합니다. 예를 들어, 세밀한 분석을 위해 중간 층 출력을 추출하려고합니다. onnx-modifier 에서 해당 노드의 사이드 바에서 Add Output 버튼을 클릭하면이를 달성 할 수 있습니다. 그런 다음 해당 노드를 따라 새로운 모델 출력 노드를 얻을 수 있습니다. 이름은 해당 노드의 출력과 동일합니다.
다음 예에서는 각각 1 차 Conv 노드 및 2 차 Conv 노드의 출력 인 2 개의 새로운 모델 출력을 추가합니다.

때로는 모델에 입력을 추가해야합니다 (예 : 원본 모델에서 추출한 서브 모델과 같은). onnx-modifier 에서는 다음과 같이 달성 할 수 있습니다.

참고 : 입력 모양은 "dtype [dim0, dim1, ...]"형식, "float32 [1,3, 224,224]"와 같이 가정됩니다. 그렇지 않으면 경고가 표시되고 "확인"버튼이 비활성화됩니다. 또한 모델을 분석하여 입력 모양을 미리 채울 수 있습니다 (신뢰할 수 있음). 그렇지 않은 경우 수동으로 설정해야합니다.
원래 속성을 새 값으로 변경하면 완료됩니다.
자리 표시 자의 오른쪽에서
+클릭하면 유용한 참조를 얻을 수 있습니다.

onnx-modifier 현재 편집 입력 모양을 지원합니다. 대상 모델 입력을 클릭 한 다음 Change input shape (static) 버튼을 클릭하십시오. 팝 된 대화 상자에서 입력에 대한 새 모양을 설정하고 "확인"을 클릭하십시오. DownSrteam 텐서 모양은 다운로드 된 수정 된 모델에서 업데이트됩니다 ( "다운로드"가 클릭 한 후에도 형상 추론 프로세스가 적용되므로 Pannel이 아닌 즉시 대신).
onnx-modifier 또한 입력 변경이 동적이되도록 지원합니다. 현재 배치 치수 만 지원됩니다. Set dynamic batch size 버튼을 클릭하면 동적 배치 크기 추론을 지원하는 모델이 나타납니다.
때로는 컨볼 루션 레이어의 중량/바이어스 또는 Reshape 노드의 모양 매개 변수와 같은 모델 초기화기에 저장된 값을 편집하려고합니다. onnx-modifier 지금이 기능을 지원합니다! 호출 된 사이드 바에서 이니셜 라이저의 새 값을 입력하고 다운로드를 클릭 한 다음 완료됩니다.

참고 : 새로 추가 된 노드의 경우 이니셜 라이저의 데이터 유형을 입력해야합니다. (데이터 유형이 무엇인지 확실하지 않은 경우
NODE PROPERTIES->type->?몇 가지 단서가있을 수 있습니다.)
최신 버전 (2023.12.10 이후)은 Numpy 파일에서 이니셜 라이저 값을 읽는 것을 지원합니다! "열린 *.npy"버튼을 클릭하고 Numpy 파일을 선택하면 값이 구문 분석되어 위의 자리 표시 자에 표시됩니다. 값을 더 많이 편집 할 수 있습니다.

빠른 테스트를 위해 일부 일반적인 샘플 모델이 다음과 같이 제공됩니다. 그들 대부분은 Onx Model Zoo 출신입니다
onnx-modifier 적극적으로 개발 중입니까?. 사용에 오신 것을 환영합니다. 문제를 만들고 요청을 가져 오십시오! ?