
الإنجليزية | 简体中文
لتحرير نموذج ONNX ، تتمثل إحدى الطرق الشائعة في تصور الرسم البياني النموذجي ، وتعديله باستخدام API ONNX Python. هذا يعمل بشكل جيد. ومع ذلك ، يتعين علينا رمز التعديل ، ثم تصور للتحقق. قد تتكرر العمليتان لعدة مرات ، والتي تستغرق وقتًا طويلاً.
ماذا لو كان لدينا أداة ، والتي تسمح لنا بتحرير ومعاينة تأثير التحرير بطريقة تصور تماما ؟
ثم يأتي onnx-modifier . مع ذلك ، يمكننا التركيز على تحرير الرسم البياني النموذجي في pannel التصور. سيتم تلخيص جميع معلومات التحرير ومعالجتها بواسطة Python ONNX API تلقائيًا في النهاية. ثم يمكن حفظ وقتنا!
تم تصميم onnx-modifier استنادًا إلى Netron مشاهد الشبكة الشهير وقارورة إطار تطبيق الويب الخفيفة الوزن.
حاليًا ، يتم دعم عمليات التحرير التالية:
✅ حذف العقد
✅ أضف العقد الجديدة
✅ أعد تسمية مدخلات العقدة والمخرجات
✅ إعادة تسمية مدخلات النموذج والمخرجات
✅ أضف مخرجات طراز جديدة
✅ أضف مدخلات نموذجية جديدة
✅ تحرير شكل إدخال النموذج
✅ تحرير سمة العقد
✅ تحرير المهيئات النموذجية
هنا هو سجل التحديث وقائمة تودو. فيما يلي نظرة عامة على التصميم ، والتي قد تكون مفيدة لشخص يريد المساهمة في هذا المشروع.
أتمنى أن يساعد!
لدينا ثلاث طرق لإطلاق onnx-modifier الآن.
استنساخ الريبو وتثبيت حزم بيثون المطلوبة
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 modifier عن طريق تعيين منفذ 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-modifer من 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 (إخراج العقدة data_0 ).Conv الأولى مباشرة. بالإضافة إلى ذلك ، تم تقسيم مشغلي المعالجة المسبقة عن الروتين الرئيسي. حذفهم.Download ، ثم يمكننا الحصول على نموذج ONNX المعدل).ملاحظة: لربط العقدة
$ a $ (data_0في المثال أعلاه) إلى العقدة$ b $ (Convالأول في المثال أعلاه) ، يُقترح تحرير مدخلات العقدة$ b $ إلى إخراج العقدةA، بدلاً من تحرير إخراج العقدة$ a $ إلى إدخال العقدةB. لأن مدخلات$ b $ يمكن أيضًا أن يكون إخراج Node الآخر (Transposeفي المثال أعلاه) وستحدث نتيجة غير متوقعة.
يتم عرض العملية في الشكل التالي:

انقر فوق عقدة إدخال/إخراج النموذج ، اكتب اسمًا جديدًا في الشريط الجانبي ، ثم انتهينا.

في بعض الأحيان نريد ضبط إخراج عقدة معينة كإخراج النموذج. على سبيل المثال ، نريد استخراج إخراج الطبقة المتوسطة للتحليل الدقيق. في onnx-modifier ، يمكننا تحقيق ذلك من خلال النقر ببساطة على زر Add Output في الشريط الجانبي للعقدة المقابلة. ثم يمكننا الحصول على عقدة إخراج طراز جديدة بعد العقدة المقابلة. اسمها هو نفسه إخراج العقدة المقابلة.
في المثال التالي ، نضيف 2 مخرجات نموذجية جديدة ، وهما مخرجات عقدة Conv الأولى وعقدة Conv الثانية ، على التوالي.

في بعض الأحيان نحتاج إلى إضافة مدخلات إلى نموذج (مثل النموذج الفرعي المستخرج من نموذج أصلي). في 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 ، سيتم تحليل القيم وعرضها في العنصر النائب أعلاه. يمكن أن تكون القيم مصنفة بشكل أكبر.

للاختبار السريع ، يتم توفير بعض نماذج العينة النموذجية على النحو التالي. معظمهم من حديقة حيوانات طراز Onnx
onnx-modifier تحت التطوير النشط؟ مرحبًا بك في استخدام وإنشاء مشكلات وسحب الطلبات! ؟