Освоение YOLO и оптимизация ResNet на HiSilicon NPU

Вы хотите получить максимальную производительность от своих моделей на HiSilicon NPU. Это может быть трудной задачей. Вы можете увидеть перформан

Освоение

Вы хотите получить максимальную производительность от своих моделей на HiSilicon NPU. Это может быть трудной задачей. Вы можете увидеть узкие места производительности или плохое использование оборудования. Архитектура Ascend NPU представляет уникальные проблемы. К примеру,Не используется массивный параллелизм на уровне потоков, чтобы скрыть задержки доступа к памяти.

Цель: Это руководство дает вам полный рабочий процесс для оптимизации YOLO/ResNet. Вы научитесь готовить модели, преобразовывать их с помощью Ascend Tensor Compiler, применять квантование INT8 и развертывать их с помощью AscendCL для максимальной эффективности.🚀

Ключевые выходы

  • Подготовьте свою модель кHilicon НПУ. Преобразуйте его в формат ONNX. Обрезать его, чтобы сделать его меньше и быстрее.
  • Используйте компилятор Ascend Tensor Compiler (ATC) для преобразования модели ONNX. Это создает оптимизированный файл ". om' для NPU.
  • Примените квантование INT8 для повышения производительности. Используйте квантование после обучения (PTQ) или обучение с обучением на основе квантования (QAT).
  • Используйте Ascend Profiler, чтобы найти медленные части вашей модели. Это поможет вам решить проблемы с производительностью.
  • Разверните свойОптимизированная модельИспользование AscendCL. Измерьте его задержку и FPS, чтобы проверить его скорость.

ПОДГОТОВКА И ОПТИМИЗАЦИЯ YOLO/RESNET ДЛЯ ПЕРЕВОЗКИ

ПОДГОТОВКА

Ваш первый шаг-подготовка модели для HiSilicon NPU. Хорошо подготовленная модель преобразуется плавно и работает лучше. Эта подготовка включает несколько ключевых этапов.

  1. Преобразование модели: Вы конвертируете свою обученную модель в формат, совместимый с NPU. Компилятор Ascend Tensor Compiler (ATC) помогает в этом процессе.
  2. Адаптация оператора: В вашей модели могут быть пользовательские операторы. Вам необходимо адаптировать их для NPU, если они изначально не поддерживаются.
  3. Модель вывода: Вы развернете преобразованная модель в NPU. Это включает в себя загрузку модели и подачу в нее данных для получения прогнозов.
  4. Оптимизация производительности: Вы можете еще больше улучшить производительность с помощью таких методов, как квантование и слияние операторов.

Использование ResNet в качестве костяной системы YOLO

Вы можете использовать архитектуру ResNet в качестве основы для вашей модели YOLO. ResNet отлично подходит для извлечения сложных функций из изображений. Эта власть приходит по цене. ResNet добавляет значительный вычислительный вес. Это делает следующий шаг, обрезка, очень важным для оптимизации YOLO/ResNet на устройствах с ограниченными ресурсами.

Обрезка для совместимости NPU

Обрезка удаляет ненужные соединения или нейроны из вашей нейронной сети. Этот процесс создает меньшую, более быструю модель без значительной потери точности. Обрезанная модель имеет меньше параметров и операций. Это делает его идеальным для NPU, уменьшаяПамятьИспользование и ускорение вывода. Это критический метод для оптимизации YOLO/ResNet.

Экспорт моделей в ONNX

Необходимо экспортировать модель в формат Open Neural Network Exchange (ONNX). ONNX-это промежуточный формат, который понимает инструмент ATC. Вы можете легко экспортировать модель PyTorch с помощью простой команды.

Пример: Экспорт модели YOLOv8n в ONNX.

# Эта команда создает 'yolov8n.onnx' из вашей модели PyTorch
Модель экспорта yolo = формат yolov8n.pt = onnx

Примечание: Вы можете столкнуться с ошибками при экспорте. Такие вопросы какНеподдерживаемый тип данных ONNX: INT64Или несоответствия формы вПредохранитель матмулЯвляются общими. Часто их можно исправить, убедившись в правильности размера входного тензора или преобразуя типы данных перед экспортом.

Проверка графика ONNX

Вы всегда должны проверять экспортированный файл ONNX. Эта проверка гарантирует правильность структуры модели, прежде чем приступить к преобразованию. Несколько инструментов могут помочь вам в этом заключительном этапе подготовки.⚙️

  • Нетрон: Это визуальный инструмент. Вы можете загрузить свой. OnnxФайл, чтобы увидеть весь график модели. Он позволяет проверять свойства, входы и выходы каждого слоя.
  • Проверка onnx: Это библиотека Python. Вы можете использоватьOnnx. checker.check_model()Функция в скрипте. Он программно подтверждает, что структура вашей модели действительна и вызовет ошибку, если обнаружит какие-либо проблемы.

МОДЕЛЬ КОНВЕРСИЯ С УВД

После подготовки вашей модели ONNX ваша следующая задача-преобразовать ее в формат, который может понять HiSilicon NPU. Вы будете использоватьКомпилятор Ascend Tensor (ATC)Для этого критического шага. ATC-это мощный инструмент в цепочке инструментов CANN (Вычислительная архитектура для нейронных сетей).

Его основная задача-превратить вашу модель в оптимизированную автономную модель.

  • ATC-это основной инструмент преобразования в цепочке инструментов Huawei CANN.
  • Вы используете его для адаптации моделей из популярных фреймворков в формат, совместимый с Ascend.
  • Он помогает эффективно развертывать обученные модели ИИ на оборудовании Huawei Ascend.

Этот процесс преобразования создает. ОмФайл, который является окончательной исполняемой моделью, которую вы будете развертывать в NPU.

Базовое преобразование ATC

Вы можете начать с базовой команды для преобразования проверенных. OnnxФайл. Эта команда сообщает ATC входную модель, исходную структуру, желаемое имя выходного файла и целевую версию чипа Ascend.

💡Что такое автономная модель (. Ом)? Автономная модель-это файл, который был предварительно обработан и оптимизирован для конкретной аппаратной цели. Он включает в себя такие задачи, как слияние операторов и оптимизация памяти, что означает, что NPU может выполнять его с минимальным временем настройки во время вывода.

Вот фундаментальныйATCПример из командной строки:

Atc -- модель = yolov8n.onnx \
-- Каркас = 5 \
-- Output = yolov8n \
-- Soc_version = Ascend310

Давайте разберем, что делает каждая часть этой команды:

ФлагОписание
-- МодельУказывает путь к вашему входу. OnnxФайл.
-- Рамки = 5Сообщает ATC, что модель находится в формате ONNX. (Другие значения для Caffe и т. Д.)
-- ВыходОпределяет базовое имя для вашего вывода. ОмФайл (расширение не требуется).
-- Soc_versionОпределяет целевой процессор Ascend, напримерAscend310ИлиAscend710.

Настройка входов

Ваша модель должна знать точный размер и формат данных, которые вы ей отправите. Вы настраиваете это во время преобразования ATC с помощью определенных флагов. Этот шаг жизненно важен для производительности и предотвращения ошибок во время выполнения.

Вы используете-- Input_shapeФлаг для определения размеров вашего входного тензора. Можно установить фиксированный размер пакета для постоянной производительности или динамический размер пакета для гибкости.

  • Статический размер партии:"-- Input_shape = изображения: 1,3, 640640"(Партия 1)
  • Динамический размер партии:"-- Input_shape = изображения:-1,3, 640640"(Переменный размер партии)

Вам также необходимо указать макет данных. Большинство моделей компьютерного зрения, обученных в PyTorch, используютNchwФормат. Этот макет организует данные тензора как (Количество выборок, Каналы, Высота, Ширина). Получение этого права имеет важное значение для вычислительной эффективности, поскольку это влияет на то, как NPU обращается к данным в памяти. Вы можете использовать-- Input_formatФлаг, чтобы установить это.

Вот расширенная команда с входной конфигурацией:

Atc -- модель = yolov8n.onnx \
-- Каркас = 5 \
-- Output = yolov8n \
-- Input_format = NCHW \
-- Input_shape = "images:1,3,640,640" \
-- Soc_version = Ascend310

Обработка неподдерживаемых Ops

Иногда модель может содержать специальные слои или операции ("ops"), которые ATC изначально не поддерживает. Когда это произойдет, преобразование не удастся. У вас есть мощный инструмент для решения этой проблемы:Тензорный двигатель Boost (TBE). TBE позволяет вам определять и реализовывать пользовательские операторы так, как может выполнять Ascend NPU.⚙️

Разработка пользовательского оператора с помощью TBE-это продвинутый процесс, который включает в себя несколько этапов:

  1. Модуль DSL: Сначала вы пишете основную математическую логику оператора. Для определения шагов расчета и потока данных используется язык, специфический для домена.
  2. Модуль планирования: Затем вы говорите аппаратному обеспечению, как эффективно выполнять вашу логику. Это включает в себя планирование того, как сегментировать данные (плитку) для оптимизации доступа к памяти и производительности.
  3. ИК модуль: TBE затем генерирует промежуточное представление (IR) вашего оператора. Это стандартизированный формат, который компилятор может понять и начать оптимизировать.
  4. Модуль передачи компилятора: Компилятор берет ИК и применяет дальнейшие оптимизации. Он использует такие методы, как двойная буферизация и интеллектуальное выделение памяти для подготовки оператора к конкретному оборудованию NPU.
  5. Модуль CodeGen: Наконец, модуль CodeGen создает файл кода, подобный C. Этот файл компилируется в исполняемый оператор, который может загружаться и запускаться фреймворком CANN непосредственно в NPU.

⚠️ Примечание: Создание пользовательских операторов требует глубокого понимания как функции оператора, так и лежащей в основе архитектуры NPU. Вы всегда должны сначала проверить официальный список операторов CANN. Создавайте пользовательский оператор только в том случае, если вы не можете найти поддерживаемую альтернативу.

РАСШИРЕННАЯ ОПТИМИЗАЦИЯ И ТУНИРОВАНИЕ

Вы уже преобразовали свою модель. Теперь вы можете раскрыть истинную мощь HiSilicon NPU. Передовые методы оптимизации будут подталкивать производительность вашей модели к ее пику. Этот этап фокусируется на снижении точности модели и анализе ее поведения во время выполнения для поиска и устранения узких мест.

NPU, такие как архитектура Da Vinci от HiSilicon, созданы для ускорения определенных математических операций. Ваша модель должна использовать эти «NPU-дружественные» операторы для свертки, объединения и активации для достижения максимальной скорости. Любая операция, не поддерживаемая NPU, выполняется на более медленном процессоре, создавая узкое место производительности.Квантование-это ключевой метод, который делает вашу модель более удобной для NPU. Это уменьшает точность чисел вашей модели, например, с 32-битной с плавающей запятой (FP32) до 8-битного целого числа (INT8). Это изменение делает модель меньше и быстрее.АнТест теста ИИЧетко демонстрирует это воздействие.Модель, работающей со скоростью 12 кадров в секунду с использованием FP32, может достигать 30 кадров в секунду при оптимизации с помощью квантования INT8.

Квантование после обучения (PTQ)

Квантование после обучения (PTQ)-это мощный метод оптимизации YOLO/ResNet. Вы применяете его к уже обученной модели FP32. Основным инструментом, который вы будете использовать для этого, является набор инструментов сжатия Ascend Model (AMCT). PTQ популярен, потому что это быстрый и простой способ получить значительное повышение производительности без переподготовки вашей модели.

Тем не менее, PTQ иногда может привести к снижению точности вашей модели.Для модели, такой как YOLOv8 Nano, вы можете увидеть небольшое снижение точности вывода. В некоторых случаях, особенно с меньшими моделями, эта потеря точности может быть более значительной. Статическое квантование INT8 может привести к умеренному падению точности примерно на 3-7% в абсолютном выражении.

Если потеря точности от PTQ слишком высока, у вас есть другой вариант:Обучение на основе квантования (QAT). QAT вводит моделирование квантования во время самого процесса обучения. Это позволяет модели научиться компенсировать потерю точности, что часто приводит к лучшей конечной точности.

Вот сравнение, которое поможет вам решить, какой метод использовать:

ОсобенностьКвантование после обучения (PTQ)Обучение на основе квантования (QAT)
Этап примененияПрименяется к предварительно обученной моделиВключение непосредственно в процесс обучения модели
Требуется переоснащениеНет, вам не нужно переучиватьДа, для адаптации к квантизации требуется больше времени на обучение
СложностьПроще и быстрее реализоватьБолее сложный, поскольку он имитирует квантование во время обучения
Влияние точностиМожет привести к заметному падению точностиЧасто достигается лучшая точность за счет оптимизации для квантованного вывода

Когда вы должны выбрать одно над другим?

  • Выберите PTQКогда вы не можете переобучить свою модель или когда небольшое падение точности приемлемо для большого увеличения скорости.
  • Выберите QATКогда точность является вашим главным приоритетом и у вас есть ресурсы для более длительного и сложного цикла обучения.

Подготовка калибровочных наборов данных

Чтобы выполнить PTQ, вам понадобитсяНабор калибровочных данных. Это небольшая, репрезентативная коллекция входных данных (например, изображений), которую использует АМКТ. Он запускает эти данные через вашу модель для анализа диапазона значений активации. Эта информация помогает вычислить оптимальные коэффициенты масштабирования для преобразования значений FP32 в INT8 без потери слишком большого количества информации.

Создание хорошего набора калибровочных данных имеет решающее значение для успешного квантования.

  • Качество над количеством: Вам не нужен большой набор данных. Набор вокруг1024 разнообразных и хорошо подготовленных изображенияЭто достаточно часто. Просто использовать больше изображений-не всегда лучше. Несбалансированный или избыточный набор данных может исказить статистику калибровки. Это может привести к тому, что квантованная модель будет плохо работать во время вывода в реальном мире.
  • Представительство является ключевым: Ваши калибровочные изображения должны отражать разнообразие данных, которые ваша модель будет видеть в производстве. Включите изображения с различными условиями освещения, размерами объектов и фоном, чтобы обеспечить надежность процесса калибровки.

Хорошо подобранный калибровочный набор является краеугольным камнем эффективного квантования при оптимизации YOLO/ResNet.

Профилирование с помощью Ascend Profiler

После того, как вы преобразуете и квантуете свою модель, вам нужно измерить ее производительность. ОAscend ПрофайлерЭто инструмент, который вы будете использовать для поиска оставшихся узких мест производительности. Это дает вам подробную разбивку того, как ваша модель выполняется на NPU.

Вы можете использовать данные профайлера для ответа на критические вопросы:

  • Какие операторы берут больше всего времени?
  • Есть ли операторы, неожиданно работающие на CPU вместо NPU?
  • Существует ли неэффективное перемещение данных между хостом и устройством?

Ascend Profiler имеет два ключевых компонента для этого анализа:

  1. Анализ временной шкалы: Этот вид дает вам низкоуровневое визуальное представление о выполнении вашей модели. Каждый цветной блок на временной шкале показывает время начала и продолжительность оператора. Вы можете точно видеть, какие операторы работают наAicore(Основной НПУ),АИКПУ, ИлиХОСТЦП. Это поможет вам точно определить операторов с длительным временем выполнения. Вы можете загрузить эти данные временной шкалы в виде файла JSON и открыть его в таких инструментах, какChrome: // трассировкаДля более глубокого взгляда.

  2. Анализ производительности оператора: Этот компонент предоставляет статистику высокого уровня. Он отображает время выполнения оператора в таблицах и диаграммах, отсортированных по продолжительности. Вы можете быстро увидеть, какие типы операторов (например, AICORE против AICPU) и какие конкретные операторы занимают больше всего времени. Это идеально подходит для определения того, тратится ли значительная часть времени выполнения вашей модели на несколько медленных операций.

Используя эти два вида вместе, можно эффективно диагностировать проблемы с производительностью. Например, если профилировщик показывает, что пользовательский или неподдерживаемый оператор работает на HOSTCPU, вы знаете, что создание пользовательского оператора TBE для него, вероятно, обеспечит значительное ускорение.

РАЗНООИЩЕНИЕ И ИНФЕРЕНЦИЯ

РАЗНООИЩЕНИЕ

Вы оптимизировали свою модель. Теперь вы разверните его на HiSilicon NPU. На этом заключительном этапе вы запускаете свою модель, чтобы делать прогнозы в реальном мире. Вы будете использоватьЯзык вычислений Ascend(AscendCL) для связи с оборудованием и измерения конечной производительности вашей модели.

Инициализация устройства с помощью AscendCL

Сначала вам нужно настроить NPU для вывода. Для этого вы будете использовать AscendCL. Python Ascend Computing Language (pyACL)-это библиотека Python API, которая упрощает этот процесс. Это позволяет вам управлять процессором Ascend AI непосредственно из вашего кода на Python.

Стандартный рабочий процесс для запуска модели следует четкой последовательности:

  1. Инициализировать pyACL: Вы запускаете библиотеку pyACL для подготовки системных ресурсов.
  2. Выделить ресурсы: Вы откладываете ресурсы времени выполнения, необходимые вашему приложению.
  3. Передача данных: Вы перемещаете свои входные данные, такие как изображения, в память устройства.
  4. Данные процесса: Вы можете выполнять изменения изображения в последнюю минуту, например, изменять размер.
  5. Выполнить модель: Вы загружаете свой. ОмМодель и запустить процесс вывода.
  6. Уничтожить распределения: Вы освобождаете ресурсы времени выполнения после завершения вывода.
  7. Деинициализация pyACL: Вы закрываете библиотеку, чтобы освободить все ресурсы.

Запись кода вывода

Ваш сценарий вывода объединяет все эти шаги. Этот код является движком, который загружает вашу модель, подает ей данные и извлекает прогнозы.

💡Использование pyACL для вывода ОПиаклБиблиотека-ваш главный инструмент для этой задачи. Вы используете его функции для управления устройством, обработки памяти, загрузки вашего. ОмМодель, и выполнять ее. Это дает вам полный контроль над всем конвейерным выводом в среде Python.

Ваш скрипт загрузит предварительно обработанные входные данные, отправит их в NPU, запустит выполнение модели, а затем обработает выходные данные модели.

Бенчмаркинг производительности

После развертывания, вы должны измерить производительность вашей модели. Это говорит вам, как быстро работает ваша модель. Два ключевых показателя имеют важное значение для этой оценки:

  • Задержка: Это время, необходимое вашей модели для обработки одного входного сигнала, измеряемого в миллисекундах (мс). Меньшая задержка-лучше.
  • Кадров в секунду (FPS): Это измеряет, сколько входов ваша модель может обработать за одну секунду. Чем выше FPS, тем лучше.

Эти две метрики имеют прямое отношение.Для видеоприложения в реальном времени, работающего со скоростью 30 кадров в секунду, задержка вашей модели должна быть менее 33,3 мс..Другие важные показатели задержки также могут дать вам более глубокое понимание.

  • Время до первого токена: Время, необходимое для получения самой первой части вывода.
  • Общее время генерации: Время от конца до конца от входа до полного выхода.

Измерение этих цифр поможет вам подтвердить, что ваша работа по оптимизации была успешной.🚀


Теперь вы освоили полный рабочий процесс для оптимизации NPU. Это руководство проведет вас через четыре основных этапа:

  1. Подготовка модели
  2. Преобразование ATC
  3. Настройка квантования
  4. Развертывание AscendCL

Следование этому структурированному процессу является ключом к раскрытию полной производительности ваших моделей компьютерного зрения наОборудование hilicon.

Теперь, примените эти методы к своим собственным проектам! Для получения дополнительной помощи обратитесь к официальной документации CANN или форумам сообщества. Удачи вам!🚀

Часто задаваемые вопросы

В чем заключается основная разница между PTQ и QAT?

Вы применяете квантование после обучения (PTQ) к уже обученной модели. Это быстро, но может снизить точность. Вы используете Quantization-Aware Training (QAT) в процессе обучения. Этот метод занимает больше времени, но часто сохраняет высокую точность.

Почему ONNX является предпочтительным форматом для преобразования?

Вы используете ONNX как универсальный формат. Компилятор Ascend Tensor Compiler (ATC) понимает файлы ONNX. Это позволяет легко конвертировать модели из фреймворков, таких как PyTorch, в. ОмФормат, который может выполнять NPU.

Что мне делать, если мое преобразование ATC не удается?

Сбой ATC часто означает, что ваша модель имеет неподдерживаемый оператор. Во-первых, проверьте журналы ошибок для подсказок. Возможно, вам потребуется создать пользовательский оператор с помощью Tensor Boost Engine (TBE) для решения проблемы.⚙️

Сколько изображений мне нужно для набора калибровочных данных?

Вам не нужны тысячи изображений. Часто достаточно разнообразного набора из примерно 1024 изображений. Главное-качество, а не количество. Данные калибровки должны представлять то, что ваша модель будет видеть в производстве.

Related Articles