Перейти до основного вмісту

Операції над графом.

Більшість моделей можна скомпілювати безпосередньо, якщо їхні оператори та розміри тензорів підтримуються Model Compiler. Перш ніж змінювати модель, перевірте список сумісності моделей і спочатку спробуйте стандартний процес компіляції.

Редагування графа — це розширений крок для моделей, яким потрібні цілеспрямовані зміни графа перед тим, як їх можна буде успішно скомпілювати або ефективно запустити на пристрої SiMa. Ви можете внести ці зміни в оригінальний код моделі Python і знову експортувати модель, або ви можете безпосередньо редагувати експортований граф ONNX.

У складі SDK є попередньо створений модуль sima-model-surgery для Codex і Claude. Попросіть агента перевірити вашу модель, і він зможе перевірити сумісність, запропонувати та застосувати необхідні зміни графа, перевірити результат і підготувати модель до наступної спроби компіляції. Цей модуль особливо корисний для моделей YOLO, де редагування графа може покращити сумісність із компілятором і оптимізувати вихідні дані моделі для середовища виконання SiMa.

Наприклад, запитайте:

Use the sima-model-surgery skill to inspect my YOLO model, optimize unsupported
graph sections, and validate the modified model.

Зрозумійте суть операцій над графами.

Операції над графом змінюють структуру обчислювального графа нейронної мережі. Використовуйте їх, коли моделі потрібні цілеспрямовані зміни перед квантуванням, компіляцією або розгортанням.

Поширені причини:

  • Налаштуйте попередньо навчену модель.
  • Замініть оператор, який не підтримується Model Compiler.
  • Змініть або перепишіть операції графа, які перешкоджають ефективній компіляції.
  • Оптимізуйте граф моделі, щоб більша частина обчислень виконувалася на пристрої MLA.
  • Адаптуйте модель для конкретного пристрою або з урахуванням обмежень, пов’язаних із розгортанням.

Оберіть, де внести зміни.

Model Compiler регулярно оновлюється з додаванням підтримки додаткових операторів. Деяким моделям все ще потрібне редагування графа, перш ніж усі шари зможуть працювати на MLA або перш ніж модель досягне цільових показників продуктивності.

За можливості, вносьте зміни в вихідний код моделі, наприклад, у модуль PyTorch або TensorFlow, який створив експортовану модель. Зміни на рівні вихідного коду зазвичай легше перевіряти, тестувати та підтримувати.

Якщо зміни на рівні вихідного коду неможливі, відредагуйте експортований ONNX граф безпосередньо. Решта цієї сторінки присвячена структурі ONNX графа, оскільки ONNX є форматом обміну даними, який використовується Model Compiler.

Наприклад, ви можете змінити форму не-4D тензорів на 4D або замінити непідтримувані оператори на підтримувані альтернативи.

Model Compiler містить пакет sima-utils. Імпортуйте допоміжний модуль ONNX перед тим, як змінювати граф:

from sima_utils.onnx import onnx_helpers as oh

Для Model Compiler API, див. AFE Довідник API..

Проаналізуйте обсяг матеріалів, охоплених стандартами MLA.

SiMa MLSoC використовує такі середовища виконання:

  • Асоціація сучасних мов (MLA)
  • CVU (EV74)
  • APU (A65)

Під час компіляції Model Compiler призначає оператори для виконання на MLA, коли це можливо. Оператори, які не можуть виконуватися на MLA, призначаються для виконання на CVU або APU. Це може призвести до поділу моделі на кілька сегментів MLA та створення кількох файлів .elf.

Для досягнення найкращої продуктивності змініть модель таким чином, щоб більша її частина виконувалася на MLA. Якщо вся модель призначена для виконання на MLA, компіляція створить один файл .elf.

Почніть із визначення шарів, які не призначені для виконання на MLA. Потім вирішіть, які оператори потрібно замінити або змінити. Для цього потрібні як вихідні дані Model Compiler, так і знання про ML-оператори, обробку цифрових сигналів (DSP) і підтримку MLA.

Змініть граф.

Використовуйте цей алгоритм, коли виконуєте операції над графом:

  1. Скомпілюйте модель за допомогою Model Compiler.
  2. Визначте шари, які не відповідають структурі MLA. Збережіть і перевірте граф SiMa IR. у Netron або ввімкніть детальне ведення журналу для Model Compiler.
  3. Змініть визначені шари. Якщо ці шари зустрічаються в різних частинах моделі, Спочатку розділіть модель, а потім поступово змінюйте кожен її розділ.
  4. Збережіть змінену модель. Якщо ви розділили модель, об’єднайте змінені частини. підграфи.
  5. Запустіть процес обчислення з використанням оригінальної моделі та модифікованої моделі. Порівняйте результати. вихідні дані.
  6. Скомпілюйте змінену модель за допомогою Model Compiler.
  7. Підтвердіть, що під час компіляції з повним охопленням MLA створюється один файл .elf. це і є мета.

Для змін, пов’язаних із переформатуванням даних, таких як Reshape, Slice, Concat та Transpose, вихідні та змінені дані повинні збігатися в числовому вираженні. Якщо зміна впливає на математичний порядок, то точна відповідність не передбачається. У таких випадках слід оцінити числову різницю та точність на рівні моделі.

Інформацію щодо підтримки оператора MLA див. у розділі Сумісність моделей.

Перегляньте структуру графа ONNX.

ONNX — це відкрита специфікація, що базується на протоколах буферів. ONNX модель містить:

  • розширювана модель обчислювального графа.
  • стандартні типи даних
  • вбудовані оператори

Граф ONNX і типи даних складають проміжне представлення (ПР). Вбудовані оператори визначаються специфікацією OPSET.

 ONNX Ієрархія ПР

Граф ONNX визначає обчислення моделі. Він містить вузли, які утворюють спрямований ациклічний граф через їхні вхідні та вихідні дані. Це еквівалентно мережі або графу в інших фреймворках глибокого навчання.

На сутності графа ONNX посилаються за назвою:

  • До переліку значень входять вхідні дані графа, вихідні дані графа, вхідні дані вузла, вихідні дані вузла. і константи.
  • Для імен вузлів використовується окремий простір імен.
  • Ребро графа існує, коли вихід одного вузла та вхід іншого вузла посилаються на одне й те саме. однакове значення імені.

Отримайте доступ до полів графа.

Після завантаження моделі, отримайте доступ до полів на рівні графа за допомогою:

  • model.graph.node: вузли
  • model.graph.input: вхідні дані для графа
  • model.graph.output: вихідні дані графа.
  • model.graph.initializer: константи

Ви можете видаляти, змінювати або додавати компоненти на рівні графа.

Доступ до полів на рівні вузла здійснюється за допомогою:

  • node.name: назва вузла
  • node.op_type: тип оператора
  • node.input: вхідні дані вузла
  • node.output: вихідні дані вузла
  • node.attribute: атрибути вузла

Ви можете видаляти, змінювати або додавати компоненти на рівні вузла.

Перевірте змінену модель.

Файл ONNX є повідомленням у форматі Protobuf. Його можна переглянути за допомогою будь-якого інструменту, який зчитує або записує повідомлення Protobuf. Щоб перевірити ONNX модель, використовуйте onnx.checker.check_model.

Перевірка моделі включає:

  • Сумісність із версією IR.
  • Сумісність з OPSET.
  • узгодженість моделі

Завжди запускайте перевірку моделі після внесення змін до графа та перед збереженням зміненої моделі на диск.

Використовуйте такий остаточний процес перевірки:

  1. Завантажте ONNX модель.
  2. Виконайте операцію над графом.
  3. Видаліть наявну інформацію про розмірність вихідних даних.
  4. Перевірте змінену модель за допомогою onnx.checker.check_model.
  5. Збережіть змінену модель.
  6. Перевірте точність модифікованої моделі.