
Английский | 简体中文
Чтобы редактировать модель ONNX, одним из распространенных способов является визуализация графа модели и редактировать ее с использованием API Onnx Python. Это работает нормально. Тем не менее, мы должны кодировать для редактирования, а затем визуализировать, чтобы проверить. Два процесса могут повторяться много раз, что требует много времени.
Что если у нас есть инструмент, который позволяет нам редактировать и предварительно просмотреть эффект редактирования полностью визуализацией ?
Затем приходит onnx-modifier . С помощью этого мы можем сосредоточиться на редактировании модели в панели визуализации. Вся информация о редактировании будет суммирована и обработана Python Onnx API, наконец, автоматически. Тогда наше время можно сэкономить!
onnx-modifier создан на основе популярной сети Network Viewer Netron и легкой платформы веб-приложений.
В настоящее время поддерживаются следующие операции по редактированию:
✅ Удалить узлы
✅ Добавить новые узлы
✅ Переименовать входы и выходы узла
✅ Переименование входов и выходов модели
✅ Добавить новые выходы модели
✅ Добавить новые входы модели
✅ Изменить форму ввода модели
✅ Редактировать атрибут узлов
✅ Изменить модели инициализаторы
Вот журнал обновлений и список TODO. Вот обзор дизайна, который может быть полезен для того, кто хочет внести свой вклад в этот проект.
Надеюсь, это поможет!
У нас есть три метода для запуска onnx-modifier сейчас.
Клонировать репо и установить необходимые пакеты Python
git clone https://github.com/ZhangGe6/onnx-modifier.git
cd onnx-modifier
pip install -r requirements.txtЗатем беги
python app.py Нажмите на URL-адрес в результате информации о выводе, сгенерированной Flask (по умолчанию 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 После создания контейнера мы запускаем ONNX-модификатор, отображая порт Docker и локальную папку modified_onnx
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 Затем у нас есть доступ к Onnx-модиферу от URL http://127.0.0.1:5000. Ожидается, что модифицированные модели ONNX будут найдены в локальной папке modified_onnx .
Нажмите Open Model... Чтобы загрузить модель ONNX для редактирования. Модель будет проанализирована и показана на странице.
Элементы на уровне графика размещаются на левом вершине страницы. В настоящее время есть три кнопки: Reset , Download и Add node . Они могут сделать:
Reset : сбросить весь график модели в его начальное состояние;Download : Сохраните модифицированную модель в диск. Обратите внимание на два флажести справаshape inference для вывода формы при сохранении модели.shape inference построена на Onnx-Tool, который является мощным сторонним инструментом ONNX.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 мы можем получить некоторую ссылку, чтобы помочь нам заполнить информацию о узле.
Предполагается заполнить весь Attribute , не оставляя их как undefined . Значение по умолчанию не может быть поддержано хорошо в текущей версии.
Для Attribute с list типов элементы разделены с ' , ' (запятая). Обратите внимание, что [] не требуется.
Для Inputs/Outputs с list типов он вынужден быть не более 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 $ (1 -йConvв приведенном выше примере) предлагается редактировать ввод узла$ B $ к выводу узлаA, а не редактируют выход узела$ A $ к вводу узлаB. Потому что вклад$ B $ также может быть вывод другого узла (Transposeв приведенном выше примере), и произойдет неожиданный результат.
Процесс показан на следующем рисунке:

Нажмите на ввод модели/выходной узел, введите новое имя на боковой панели, затем мы закончили.

Иногда мы хотим установить вывод определенного узла в качестве выхода модели. Например, мы хотим извлечь вывод среднего уровня для мелкозернистого анализа. В onnx-modifier мы можем достичь этого, просто нажав кнопку Add Output в боковой панели соответствующего узла. Затем мы можем получить новый выходной узел модели после соответствующего узла. Его имя такое же, как и выходной узел.
В следующем примере мы добавляем 2 новых выхода модели, которые являются выходами 1 -го узла Conv и 2 -го узла Conv , соответственно.

Иногда нам нужно добавить входы в модель (например, подмодель, извлеченную из исходной модели). В onnx-modifier мы можем достичь этого:

Примечание. Форма ввода предполагается в формате «dtype [dim0, dim1, ...]», как «Float32 [1,3, 224,224]». В противном случае предупреждение показывает, и кнопка «Подтверждение» отключена. Кроме того, иногда форма ввода может быть заполнена путем анализа модели (мы можем доверять ей). Если нет, мы должны установить это вручную.
Измените исходный атрибут на новое значение, тогда мы закончили.
Нажав
+в правой стороне заполнителя, мы можем получить некоторую полезную ссылку.

onnx-modifier поддерживает редактирование входной формы сейчас. Нажмите ввод целевой модели, затем нажмите кнопку Change input shape (static) . В диалоговом окне «Покрас» установите новую форму для ввода и нажмите «Подтвердить». Форма тензора DownSrteam будет обновлена в загруженной модифицированной модели (а не в панеле мгновенно, так как процесс вывода формы применяется после нажатия «загрузка»).
onnx-modifier также поддерживает изменение входа в динамическую. В настоящее время поддерживается только партийное измерение. Просто нажмите кнопку Set dynamic batch size , затем мы получаем модель, которая поддерживает динамический вывод размера партии.
Иногда мы хотим отредактировать значения, которые хранятся в модельных инициализаторах, таких как вес/смещение слоя свертки или параметр формы узла Reshape . onnx-modifier поддерживает эту функцию сейчас! Введите новое значение для инициализатора в вызываемой боковой панели и нажмите загрузку, затем мы закончили.

ПРИМЕЧАНИЕ. Для недавно добавленного узла мы также должны ввести данные дата инициализатора. (Если мы не уверены, что такое дата, нажмите
NODE PROPERTIES->type->?Мы можем получить некоторые подсказки.)
Последняя версия (после 2023.12.10) поддерживает чтение значений инициализатора из файла Numpy! Просто нажмите кнопку «Открыть *.npy» и выберите файл Numpy, значения будут проанализированы и показаны в вышеуказанном заполнителе. Значения могут быть в дальнейшем.

Для быстрого тестирования некоторые типичные модели образцов предоставляются следующими. Большинство из них из onnx model Zoo
onnx-modifier находится в активном развитии? Добро пожаловать, создайте проблемы и вытяните запросы! ?