В Ultralytics мы создаем модели компьютерного зрения; по сути, мы учим компьютеры видеть! Представьте себе эти модели как гигантские математические рецепты. Они состоят из операций (мы называем их слоями) и огромного набора чисел, которые мы называем весами.
НашиYOLO Ultralytics YOLO обрабатывают изображения как то, чем они являются на самом деле: массивами чисел! Каждый пиксель — это просто значения цвета, количество красного, зеленого и синего (то есть RGB) для каждой отдельной точки, из которой состоит изображение. Мы называем эти массивы чисел «тензорами», потому что это звучит гораздо круче, чем «многомерные матрицы», что, в свою очередь, звучит гораздо круче, чем «числа, сложенные на числа, сложенные на числа».
Когда вы загружаете изображение в нашу модель, оно отправляется в эпическое путешествие по сети. Представьте себе, как ваш tensor через слой за слоем, преобразуясь, скручиваясь и математически изменяясь самым прекрасным образом. Представьте себе это как танцевальную вечеринку, где цифры смешиваются и перемешиваются, извлекая суть того, что делает кошку кошкой, а автомобиль автомобилем. Мы называем этот процесс извлечением признаков.
Что получается в результате? Еще больше цифр! Значимые цифры. В задачах обнаружения они точно показывают, где на изображении находится объект и что это, вероятно, за объект. «Эй, с вероятностью 95 % это собака в точке с координатами (x, y)!» Мы называем этот волшебный процесс инференцией.
Теперь, прежде чем наши модели смогут проявить свои способности, им нужно пойти в школу, им нужно пройти обучение. Именно на этапе обучения все становится особенно интенсивным.
Во время обучения каждый раз, когда мы представляем сети изображение, мы не просто получаем ответ. Мы делаем две очень сложные вещи. Во-первых, мы вычисляем, насколько сеть ошиблась (мы называем это потерей, по сути, расстоянием от цели). Во-вторых, и это важная часть, мы обновляем каждое число (или вес) в сети на основе этой потери. Представьте себе, что вы одновременно настраиваете тысячи крошечных ручек, причем каждая настройка рассчитывается так, чтобы сеть с каждым разом становилась все более точной. По сути, мы обучаем сеть с помощью корректировок: каждая ошибка учит ее, чего НЕ нужно делать, и мы настраиваем все эти веса так, чтобы при повторном просмотре похожего изображения она приблизилась к правильному ответу. По сути, сеть учится, получая подсказки в правильном направлении, ошибка за ошибкой, пока не начнет давать точные прогнозы.
О каких цифрах мы говорим? Ну, наша милая маленькая YOLO11n имеет несколько миллионов параметров. А YOLO11x? Этот плохиш имеет более 50 миллионов параметров! Больше параметров означает больше деталей, которые можно закодировать, как разница между рисованием мелками и использованием полной палитры художника.
Во время вывода этот параметр становится решающим. Запуск сети с 3 миллионами параметров — это как пробежка вокруг квартала. А запуск сети с 50 миллионами параметров? Это скорее как марафон с жонглированием горящими факелами.
Так что же такое вычисления? Как на самом деле происходит обработка всех этих цифр? Как мы можем ускорить этот процесс? И что вообще означает «оптимизация вычислений»?
Как чипы на самом деле выполняют вычисления
Вычисления происходят с помощью микросхем. Эти маленькие квадратики из кремния — это, по сути, самые организованные песочные замки во вселенной. Каждая операция, которую выполняет ваш компьютер, каждое сложение, каждое сравнение, каждое «если это, то то» физически высечено в кремнии. В определенных областях микросхемы есть реальные физические схемы, предназначенные для сложения чисел, а в других — для логических операций. Это как маленький город, в котором разные районы специализируются на разных видах математики.
Это, вероятно, звучит странно, даже если вы являетесь компьютерным специалистом. Это потому, что последние 40 лет мы создавали слой за слоем абстракции, как технологическую лазанью, которая стала настолько высокой, что мы даже не можем больше увидеть нижнюю пластину. Мы упростили вещи настолько, что большинство программистов сегодня не имеют представления о том, как на самом деле происходит вычисление в кремнии. И это не их вина, а результат задуманного дизайна!
Давайте разберем эти слои. Возьмем этот простейший Python :
x = 1
if x == 1:
y = x + 1
Мы создаем переменную x, устанавливаем ее значение равным 1, и если x равно 1 (спойлер: это так), мы создаем y со значением x плюс 1. Три строки. Просто.
Но вот где становится интересно. Между этими тремя невинными строчками и реальными электронами, движущимися по кремнию, происходит как минимум четыре массивных слоя перевода (на самом деле их больше, но наш менеджер по цифровому контенту говорит, что количество слов в моем тексте уже вызывает у нее беспокойство). Позвольте мне провести вас через это головокружительное путешествие:
Уровень 1: Python Байт-код Сначала Python ваш код и компилирует его в так называемый байт-код — промежуточный язык, который легче воспринимается компьютерами, но при попытке прочитать его ваши глаза начнут кровоточить.
Уровень 2: Байт-код → Машинный код Python (например, CPython) принимает этот байт-код и преобразует его в машинный код, то есть в фактические инструкции, понятные процессору. Именно здесь ваш элегантный «if x == 1» превращается в нечто вроде «ЗАГРУЗИТЬ регистр, СРАВНИТЬ регистр, ПЕРЕЙТИ, если установлен флаг нуля».
Уровень 3: Машинный код → Микрокод Неожиданный поворот! Современные процессоры даже не выполняют машинный код напрямую. Они разбивают его на микрокод, еще более мелкие операции, которые могут обрабатывать внутренние компоненты чипа. Ваша единственная инструкция «ADD» может превратиться в несколько микроопераций.
Уровень 4: Микрокод → Физическая электроника Наконец, мы дошли до кремния. Эти микрооперации запускают реальные электрические сигналы, которые проходят через транзисторы. Миллиарды крошечных переключателей включаются и выключаются, электроны танцуют по тщательно спроектированным путям, и каким-то волшебным образом 1 + 1 становится 2.
Каждый слой существует для того, чтобы скрыть безумную сложность слоя, находящегося под ним. Это похоже на русские матрешки, только каждая кукла говорит на совершенно другом языке, а самая маленькая кукла буквально сделана из молнии, запертой в песке.
Ирония? Эти три строки Python , запускают МИЛЛИОНЫ транзисторных переключателей. Но благодаря этим абстракциям вам не нужно об этом думать. Вы просто пишете «y = x + 1» и верите, что где-то глубоко в кремнии происходит волшебство.
Архитектура
Каждая операция физически реализуется в кремнии, и МЕСТО ее выполнения на чипе полностью зависит от топологии чипа. Это похоже на городское планирование, но для электронов. Сумматор находится здесь, умножитель — там, и все они должны эффективно взаимодействовать друг с другом.
На рынке представлены сотни различных микросхем, каждая из которых предназначена для разных целей. Чем они отличаются друг от друга? Топологией, то есть расположением и реализацией операций в физической области. Это то, что мы называем архитектурой, и, черт возьми, у нас их очень много:
- x86 (Intel AMD) — прародитель настольных компьютеров, сложный, но мощный
- ARM — обеспечивает питание вашего телефона и все чаще вашего ноутбука, разработан для эффективности
- RISC-V — открытый мятежник, набирающий популярность повсюду
- PowerPC — «зверь» IBM, по-прежнему используемый в игровых консолях и серверах
- MIPS — любимый академический вариант, простой и элегантный
- SPARC — вклад Sun Microsystems (ныне Oracle) в развитие высокопроизводительных вычислений
- GPU ( CUDA NVIDIA, RDNA от AMD) — монстры параллельной обработки
Каждая архитектура не только по-разному располагает свои транзисторы, но и «говорит» на разных языках. Абстракции, которые мы используем для отправки инструкций этим машинам, совершенно разные. Это как если бы вам нужно было написать кому-то маршрут поездки, но в зависимости от его автомобиля вам пришлось бы писать на французском, китайском или выражать его танцем.
Сердце Силиконовой долины
Топливом для наших чипов являются электроны, то есть электричество, которое поступает в чип и обеспечивает энергию для вычислений. Но одной энергии недостаточно. Чтобы чип действительно работал, перемещая данные по своей сложной топологии, все зависит от одного критически важного компонента: тактового генератора. Именно он заставляет электроны течь по определенным путям в определенное время. Без него у вас был бы просто питаемый кремний, который ничего не делает.
Представьте, что вы пытаетесь скоординировать масштабное представление, в котором миллиарды компонентов должны двигаться в идеальной синхронизации. Без ритма это привело бы к хаосу. Именно это и делает тактовый генератор для вашего процессора. Это кристалл, который вибрирует с невероятно постоянной частотой, посылая электрические импульсы миллиарды раз в секунду.
Когда вы слышите «процессор 3,5 ГГц», то ГГц (гигагерц) означает тактовую частоту, равную 3,5 миллиардам импульсов в секунду. Каждый импульс называется тактовым циклом и является основной единицей времени в вычислениях.
Между тактовыми циклами ничего не происходит. Весь компьютер зависает, ожидая следующего импульса. Это похоже на самую экстремальную игру «красный свет, зеленый свет» во вселенной. При каждом «зеленом свете» (тактовом импульсе):
- Передача данных между компонентами
- Выполнение расчетов
- Принимаются логические решения
- Память считывается или записывается
Некоторые операции занимают один цикл (простое сложение), а другие — много циклов (деление или извлечение данных из ОЗУ). Все точно отлажено, миллиарды компонентов выполняют свои конкретные операции, все синхронизировано с этим неумолимым ритмом.
Вы можете разогнать процессор, заставив кристалл вибрировать быстрее; все происходит быстрее, но при этом выделяется больше тепла, и стабильность снижается. Если переусердствовать, компьютер выйдет из строя, потому что электроны буквально не смогут угнаться за ритмом.
В прошлом эти операции выполнялись с помощью машин размером с комнату. Но компоненты, которые выполняют все эти вычисления, на удивление просты: это всего лишь переключатели. Переключатели «вкл./выкл.».
Соедините достаточное количество таких переключателей в правильном порядке, и вы получите вычислительную систему. Вся цифровая революция сводится к сложной схеме переключателей.
Эта простота означает, что если у вас есть переключатели, любые переключатели, вы можете построить компьютер. Люди строили работающие компьютеры из водопроводных труб и клапанов, домино, кубиков LEGO, мраморных шариков и даже из красного камня в Minecraft.
Принципы не изменились с 1940-х годов. Мы просто стали невероятно хороши в создании чрезвычайно маленьких переключателей. Ваш телефон обладает большей вычислительной мощностью, чем все компьютеры, которые отправили человека на Луну, и он помещается в вашем кармане, потому что мы научились создавать переключатели на атомном уровне.
Когда мы запускаем нейронные сети с миллионами параметров, мы переключаем эти крошечные переключатели миллиарды раз в секунду, и все это идеально синхронизировано с этим кристальным сердцебиением. Каждое обновление веса, каждое умножение матриц, каждая функция активации — все они работают в такт с часами.
Неудивительно, что модели обучения заставляют ваш компьютер звучать так, будто он пытается взлететь!
Заставляя нейронные сети работать на полную мощность
Итак, у нас есть чипы с миллиардами переключателей, работающих в такт кристаллу, и мы хотим запустить на них нейронные сети с миллионами параметров. Должно быть легко, верно? Просто введите цифры в чип и дайте ему поработать!
Быстрое выполнение нейронных сетей похоже на попытку приготовить пятиразовое меню на кухне, где холодильник находится в трех кварталах от вас, у вас есть только одна кастрюля, а каждый ингредиент весит 500 фунтов. Сама по себе математика не является самой большой проблемой; проблема во всем остальном.
Несоответствие архитектуры
Большинство чипов были разработаны для работы с Microsoft , а не с нейронными сетями. Ваш CPU создан с расчетом на то, что он будет всю свою жизнь выполнять if-условные операторы, циклы и иногда вычислять ваши налоги (единственное вычисление, которое даже суперкомпьютеры считают эмоционально изнурительным). Он оптимизирован для последовательных операций: сделай это, потом то, потом другое.
Но нейронные сети совершенно другие. Они хотят делать ВСЁ СРАЗУ. Во время обучения вы обновляете миллионы весов в зависимости от того, насколько неверными были ваши прогнозы. Во время вывода (фактического использования обученной модели) вы одновременно пропускаете данные через миллионы вычислений. Представьте, что вам нужно умножить миллион чисел на другой миллион чисел. Ваш CPU, благослови его Бог, хочет делать это по одному, как очень быстрый, но очень методичный бухгалтер.
Именно поэтому графические процессоры стали основой вычислений в области искусственного интеллекта. Графические процессоры были разработаны для видеоигр, где необходимо одновременно вычислять цвет миллионов пикселей. Оказалось, что вычисление цветов пикселей и математические вычисления в нейронных сетях удивительно похожи: и в том, и в другом случае речь идет о параллельном выполнении одной и той же операции над огромными объемами данных.
Но даже графические процессоры не идеальны для нейронных сетей. Поэтому компании сейчас создают специализированные чипы для искусственного интеллекта (TPU, NPU и все другие аббревиатуры, оканчивающиеся на PU). Эти чипы разработаны с нуля с одной целью: ускорить работу нейронных сетей. Это как нанять повара, который умеет готовить только одно блюдо, но готовит его с сверхчеловеческой скоростью. В то время как ваш CPU матричные операции последовательно, а ваш GPU ними довольно хорошо параллельно, эти специализированные чипы едят матрицы на завтрак, обед и ужин.
Стена памяти (или: почему перемещение битов сложнее, чем математика)
В современных нейронных сетях мы тратим больше времени и энергии на ПЕРЕМЕЩЕНИЕ данных, чем на их фактическое ОБРАБОТКУ.
Представьте себе компьютерный чип как гениального математика, который работает с молниеносной скоростью, но все его справочники хранятся в разных зданиях по всему городу. Он может мгновенно решить любое уравнение, но сначала ему нужно получить цифры, а это занимает вечность.
Ваш чип может умножать два числа за один такт (помните, это один из миллиардов тактов в секунду). Молниеносно! Но как перенести эти числа из памяти в чип? На это может уйти СОТНИ тактов. Это как если бы ваш математик мог решить задачу за одну секунду, но ему нужно пять минут, чтобы дойти до библиотеки и обратно.
Причина заключается в расстоянии (и пространстве). Электричество движется быстро, но не бесконечно быстро. Чем дальше данные должны пройти по чипу, тем дольше это занимает. Разработчики компьютеров решили эту проблему, создав иерархию памяти, как если бы у них было несколько мест хранения на разных расстояниях:
- Регистры (встроенные непосредственно в вычислительные блоки): рабочий стол математика. Мгновенный доступ! Но он крошечный, здесь можно хранить только около 32 чисел. Это как иметь перед собой стикеры с записями.
- Кэш L1 (на расстоянии микрометров): книжная полка в офисе. Чтобы достать что-то, требуется 3–4 цикла. Здесь можно поместить несколько тысяч чисел.
- Кэш L2 (на расстоянии миллиметров): картотека в конце коридора. Занимает 10–15 циклов и может вместить несколько миллионов чисел.
- Кэш L3 (по всему чипу): хранилище внизу. Занимает 30–50 циклов, вмещает десятки миллионов чисел.
- RAM (на совершенно другом чипе): склад на другом конце города. Требуется 100–300 циклов. Здесь хранятся ваши миллиарды чисел.
- SSD/жесткий диск (подключен кабелями): Совершенно другой мир. Требует миллионов циклов. Огромный объем памяти, ледяная скорость.
Точные структуры варьируются: чип вашего телефона может пропускать кэш L3, в то время как CPU сервера CPU иметь его огромное количество. Однако принцип остается тем же: ближайшая память быстрее, но меньше по объему.
И вот здесь для нейронных сетей начинаются проблемы. Представьте, что вашаYOLO Ultralytics YOLO имеет 50 миллионов параметров (кстати,ChatGPT миллиарды). Это 50 миллионов чисел, которые должны перемещаться из памяти в вычислительные блоки и обратно. Даже если каждое число занимает всего 4 байта, это 200 мегабайт данных, которые должны пройти через вашу систему.
Чип может обрабатывать каждое число за один цикл, но если для извлечения этого числа из ОЗУ требуется 100 циклов, вы тратите 99 % времени на ожидание доставки. Это как гоночный автомобиль Формулы-1 в пробке. Вся эта вычислительная мощность просто простаивает, ожидая поступления данных.
Вот ключевая идея: это ЕДИНСТВЕННОЕ узкое место в современных вычислениях. Оно называется «узким местом фон Неймана». Ускорить работу чипов при выполнении математических вычислений относительно легко. Ускорить работу памяти — это уже физический предел. Именно поэтому почти ВСЯ оптимизация производительности в ИИ происходит на уровне памяти. Когда инженеры ускоряют работу нейронных сетей, они редко ускоряют математические вычисления; они находят умные способы уменьшить объем перемещаемых данных, улучшить кэширование или сделать доступ к данным более эффективным.
Современные чипы искусственного интеллекта не сосредоточены только на скорости вычислений; они уделяют особое внимание пропускной способности памяти и стратегиям перемещения данных. Они заранее загружают данные, повторно используют значения, уже находящиеся в кэше, и организуют вычисления таким образом, чтобы минимизировать количество обращений к памяти. Победителями в гонке по созданию аппаратного обеспечения для искусственного интеллекта становятся не те, у кого самые быстрые вычислительные устройства, а те, кто понял, как обеспечить эти устройства данными. Вся игра заключается в оптимизации моделей доступа к памяти.
Каждый раз, когда вы перемещаете небольшой объем данных, вы расходуете энергию. Не много, речь идет о пикоджоулях, но когда вы перемещаете терабайты в секунду, это быстро складывается. Фактически, перемещение данных на 1 мм по чипу требует больше энергии, чем выполнение самих вычислений!
Вот почему ваш ноутбук звучит как реактивный двигатель при обучении нейронных сетей. Тепло генерирует не математика, а перемещение данных. Каждое обновление параметров, каждый расчет градиента, каждый прямой проход буквально нагревают вашу комнату.
Современные ускорители искусственного интеллекта — это, по сути, упражнения по термодинамике. Сколько вычислений мы можем втиснуть, прежде чем чип расплавится? Как быстро мы можем отвести тепло? Это похоже на разгон процессора, но тактовая частота всегда на уровне 11, и мы просто пытаемся не устроить пожар.
Решение? Проектирование с учетом архитектуры
Самые быстрые нейронные сети не обязательно являются самыми умными, они просто разработаны с учетом особенностей микросхем. Они:
- Храните данные локально, насколько это возможно
- Навязчиво повторяйте вычисления
- Идеально соответствует возможностям оборудования
- Свести к минимуму перемещение памяти любой ценой
Это как разница между рецептом, в котором написано «используйте ингредиенты из местного продуктового магазина», и рецептом, в котором требуется импортировать специи из Тибета, сыр из Франции и воду из Антарктиды. Оба рецепта могут быть вкусными, но один из них определенно более практичен.
И именно поэтому ускорение работы нейронных сетей является настоящим искусством. Недостаточно просто хорошо разбираться в математике; необходимо понимать аппаратное обеспечение, уважать иерархию памяти и идеально взаимодействовать с архитектурой.
Добро пожаловать в мир, где компьютерные науки встречаются с физикой, инженерией и чистой магией. Где перемещение числа стоит дороже, чем вычисления с ним. Где параллелизм — это скорость, а синхронизация — смерть. Где ваш главный враг — не сложность, а расстояние.
Как мы ускоряем YOLO
Когда вы обучаете YOLO , вы получаете нейронную сеть, которая прекрасно работает в вашей обучающей среде. Но вот в чем дело: ваш игровой GPU, ваш iPhone и тот крошечный чип в камере безопасности говорят на совершенно разных языках. У них разные сильные и слабые стороны, а также очень разные представления о том, как обрабатывать данные.
Подумайте об этом так: GPU тысячи ядер, которые могут работать одновременно – он создан для параллельной обработки данных. Между тем, мобильный чип может иметь специальные схемы, разработанные специально для операций искусственного интеллекта, но может обрабатывать только определенные типы математических вычислений. А что насчет того периферийного устройства в вашей дверной камере? Оно пытается запустить искусственный интеллект с энергопотреблением меньшим, чем у светодиодной лампочки.
В Ultralytics мы поддерживаем более десятка различных форматов экспорта, поскольку каждый из них оптимизирован для различного оборудования. Дело не в том, что у нас слишком много вариантов. Дело в том, что у нас есть подходящий вариант для ВАШИХ конкретных потребностей.
Операции слияния: делать больше с меньшими затратами
В исходной YOLO многие операции выполняются последовательно. Например, мы можем выполнить свертку, затем нормализовать результаты, а затем применить функцию активации. Это три отдельных шага, каждый из которых требует собственного чтения и записи в память.
Но вот в чем хитрость: мы можем объединить эти операции в один шаг. Когда мы экспортируем YOLO развертывания, мы объединяем эти операции. Вместо:
- Вычислить свертку → Сохранить в памяти
- Загрузить из памяти → Нормализовать → Сохранить в памяти
- Загрузить из памяти → Применить активацию → Сохранить в памяти
Мы делаем:
- Вычислить свертку + нормализацию + активацию → Сохранить в памяти
Для типичной YOLO , обрабатывающей изображение размером 640×640, этот простой трюк позволяет избежать гигабайтов ненужных переносов памяти. На мобильном телефоне это разница между плавным обнаружением в реальном времени и раздражающей задержкой.
Использование меньших чисел: магия квантования
YOLO на самом деле YOLO нуждается в сверхточных числах для точного detect . Во время обучения мы используем 32 бита для представления каждого веса — это все равно что использовать научный калькулятор для измерения ингредиентов для сэндвича. А для реального применения? 8 бит вполне достаточно.
Это называется квантованием и является одним из наших самых мощных методов оптимизации. Используя меньшие числа:
- Модель сокращается на 75% (с 200 МБ до 50 МБ для Ultrakytics YOLO11x)
- На большинстве устройств работает в 2–4 раза быстрее
- Он потребляет гораздо меньше энергии (батарея вашего телефона будет вам благодарна)
Не все слои в YOLO одинаково YOLO к этому сокращению. Ранние слои, которые detect края и формы? Они надежны — мы можем без проблем использовать 8-битные числа. Конечные слои обнаружения, которые определяют «это кошка или собака?», требуют немного большей точности. Поэтому мы настраиваем точность слой за слоем, используя ровно столько битов, сколько необходимо для поддержания точности при максимальной скорости.
Мы обнаружили, что при тщательной квантовании Ultralytics YOLO 99,5% своей первоначальной точности, при этом работая в 3 раза быстрее на телефонах. В этом заключается разница между исследовательской моделью и тем, что можно реально использовать в реальной жизни.
Выбор оптимального алгоритма
Существует множество различных способов выполнения одной и той же математической операции. Простая свертка (основная операция в YOLO) может быть вычислена с помощью совершенно разных алгоритмов, и лучший выбор зависит от вашего конкретного оборудования и размера входных данных.
Когда мы экспортируем YOLO, наша система оптимизации тестирует различные алгоритмы и выбирает самый быстрый для конкретного случая. Это похоже на то, как если бы у вас было несколько маршрутов до одного и того же пункта назначения и вы выбирали бы один из них в зависимости от текущей дорожной ситуации. На GPU мы можем использовать алгоритм, который обрабатывает много пикселей одновременно. На CPU мы можем использовать алгоритм, оптимизированный для последовательной обработки. Математика остается той же, но стратегия выполнения совершенно иная.
Память: скрытое узкое место
Помните, как мы говорили о том, что память является настоящим «узким местом» в современных вычислениях? Это особенно верно для YOLO. Модель может иметь 50 миллионов параметров, и во время вывода она создает гигабайты промежуточных результатов. Перемещение всех этих данных часто происходит медленнее, чем сами вычисления.
Мы используем несколько приемов, чтобы минимизировать перемещение памяти:
Интеллектуальное планирование: мы организуем операции таким образом, чтобы данные использовались сразу же, пока они еще находятся в быстрой кэш-памяти. Для пирамидальной сети YOLO это позволяет сократить трафик памяти на 40%.
Разбиение на фрагменты: вместо обработки всего изображения за один раз мы разбиваем его на более мелкие фрагменты, которые помещаются в кэш-память. Это означает, что процессор может работать с быстрой локальной памятью, а не постоянно извлекать данные из медленной основной памяти.
Повторное использование буфера: вместо того, чтобы постоянно создавать новую память для промежуточных результатов, мы повторно используем одни и те же буферы памяти. Это невероятно эффективно — вся основа YOLO может работать с помощью всего лишь нескольких повторно используемых буферов.
Обрезка: меньше значит больше
Вот удивительный факт: YOLO часто являются чрезмерно сложными. Мы можем удалить 30 % каналов во многих слоях практически без ущерба для точности. Это не просто уменьшает размер модели — это ускоряет ее работу, поскольку буквально уменьшается количество вычислений, которые необходимо выполнить.
Процесс элегантен: мы анализируем, какие части сети в наименьшей степени влияют на конечные результаты обнаружения, удаляем их, а затем тонко настраиваем модель, чтобы компенсировать это. Обрезанная модель YOLO11m может работать на 30 % быстрее, сохраняя 99 % своей первоначальной точности. На устройствах с батарейным питанием этот прирост эффективности может означать дополнительные часы работы.
Аппаратное ускорение: использование преимуществ каждого чипа
Разные процессоры хороши в разных вещах, и различия в производительности поразительны. Та же модель YOLO11n занимает:
- 45 миллисекунд на кадр на современномCPU Intel
- 4 миллисекунды на GPU процессоре NVIDIA
- 22 миллисекунды на высокопроизводительном процессоре телефона
- 15 миллисекунд на Google Edge TPU
Это не просто разница в скорости тактовой частоты — это отражение фундаментальных архитектурных различий. Графические процессоры имеют тысячи ядер, работающих параллельно, что идеально подходит для сверток YOLO. Мобильные нейропроцессоры имеют специализированные схемы, разработанные специально для нейронных сетей. Центральные процессоры — это универсальные устройства, гибкие, но не специализированные.
Ключом к оптимизации является согласование операций YOLO с тем, что каждый чип делает лучше всего. GPU выполнять одну и ту же операцию одновременно с большим количеством данных. Мобильный NPU может поддерживать только определенные операции, но выполняет их невероятно эффективно. Edge TPU работает TPU с 8-битными целыми числами, но достигает замечательной скорости в рамках этого ограничения.
Магия компиляции
Когда вы экспортируете YOLO , за кулисами происходит нечто удивительное. Мы не просто конвертируем формат файла — мы фактически компилируем модель специально для вашего целевого оборудования. Это похоже на разницу между Google и носителем языка. Процесс компиляции:
- Анализирует вашу модель, чтобы понять ее структуру и требования
- Учитывает возможности вашего оборудования – в чем оно сильное, а в чем слабое
- Генерирует оптимизированный код, который «говорит» на родном языке вашего оборудования.
Компилятор может реорганизовать операции, чтобы лучше использовать кэш процессора, выбрать специализированные инструкции, которые поддерживает ваш чип, или даже использовать машинное обучение для поиска оптимальной стратегии оптимизации. Да, мы используем ИИ для оптимизации ИИ — будущее уже наступило!
Этот этап компиляции может в 10 раз повысить производительность. Одна и та же YOLO может работать очень медленно с общим кодом, но работать очень быстро с правильно оптимизированными инструкциями.
Развертывание на периферии в реальных условиях
Давайте поговорим о том, что происходит, когда YOLO реальным миром, а именно YOLO непростым миром периферийных устройств. Представьте себе камеру безопасности, которая должна YOLO работать YOLO для обнаружения объектов. Она сталкивается с жесткими ограничениями:
- Память: возможно, всего от 512 МБ до 2 ГБ ОЗУ
- Мощность: часто всего 2–5 Вт (меньше, чем зарядное устройство для телефона)
- Охлаждение: без вентиляторов, только пассивное рассеивание тепла
- Надежность: Должен работать непрерывно без сбоев
Вот что дает оптимизация на практике. Камера безопасности, работающая на YOLO11s:
- Оригинальная модель: 15 Вт, нагревается до 85 °C, достигает 20 FPS
- Оптимизировано с помощью квантования и обрезки: 3 Вт, комфортная температура 45 °C, достигает 25 FPS
Мы снизили энергопотребление на 80% и при этом улучшили производительность! В этом и заключается разница между устройством, которое перегревается и быстро разряжает батареи, и устройством, которое надежно работает в течение многих лет.
Ключом к успеху является выбор правильных компромиссов. На периферийных устройствах мы часто:
- Используйте квантование INT8 (меньшая точность, значительно меньшее энергопотребление)
- Обрабатывайте меньше кадров при низкой активности
- Распределите работу между разными процессорами для управления нагревом
- Сохраняйте модели достаточно маленькими, чтобы они полностью помещались в быстрой памяти.
Процесс оптимизации
В Ultralytics мы используем системный подход к оптимизации. Сначала мы профилируем модель, чтобы понять, где на самом деле тратится время. Часто узкие места находятся не там, где можно было бы ожидать. Возможно, 80 % времени тратится всего на несколько слоев, или же основную часть времени занимают переносы памяти.
Далее мы применяем оптимизации итеративно:
- Начните с самых серьезных проблем
- Применяйте по одной оптимизации за раз
- Измерьте как улучшение скорости, так и влияние на точность
- Сохраняйте оптимизации, которые обеспечивают хороший компромисс
- Повторяйте, пока не достигнем поставленных целей
Например, при развертывании YOLO11m на телефоне:
- Базовые показатели: 200 мс на кадр, модель 200 МБ
- После квантования: 80 мс на кадр, модель 50 МБ
- После обрезки: 60 мс на кадр, модель 35 МБ
- После операции слияния: 45 мс на кадр, модель 35 МБ
Каждый шаг улучшает производительность, сохраняя при этом более 99% исходной точности. Результат? Обнаружение объектов в реальном времени на устройстве, которое помещается в кармане.
Будущее: гетерогенные вычисления
Современные устройства становятся все более умными в использовании нескольких процессоров одновременно. Ваш телефон имеет не один процессор, а несколько, каждый из которых специализируется на выполнении определенных задач:
- Датчик камеры имеет ISP (процессор обработки изображений) для предварительной обработки
- НПУ (нейронный процессор) выполняет YOLO
- CPU сложную логику и координацию
- GPU процессор GPU результаты на экране.
Будущее YOLO заключается в интеллектуальном распределении модели между этими процессорами. Возможно, NPU будет обрабатывать основные свертки, CPU окончательную логику обнаружения, а GPU результаты. Каждый процессор будет выполнять то, что он делает лучше всего, создавая конвейер, который будет более эффективным, чем любой отдельный процессор.
Мы разрабатываем интеллектуальные алгоритмы разбиения, которые автоматически определяют оптимальный способ распределения YOLO доступными процессорами, учитывая не только их возможности, но и затраты на перемещение данных между ними.
Суть в следующем
Оптимизация YOLO — это не просто преобразование форматов файлов, а преобразование передовых технологий искусственного интеллекта в нечто, что действительно работает в реальном мире. Благодаря таким методам, как квантование (использование меньших чисел), обрезка (удаление ненужных частей), слияние операций (объединение шагов) и интеллектуальное управление памятью, мы достигаем 10-100-кратного повышения производительности при сохранении точности.
Что примечательно? Не существует универсальной «лучшей» оптимизации. Облачный сервер с неограниченной мощностью требует другой оптимизации, чем дрон на батарейках. Телефон со специальным чипом искусственного интеллекта требует другого подхода, чем Raspberry Pi. Именно поэтому Ultralytics так много вариантов экспорта — каждый из них оптимизирован для разных сценариев.
Каждая из обсуждаемых нами оптимизаций преследует одну цель: сделать компьютерное зрение доступным повсеместно. Независимо от того, создаете ли вы умный дверной звонок, приложение для дронов или масштабный облачный сервис, мы предоставляем инструменты, которые позволяют YOLO в рамках ваших ограничений.
Когда вы экспортируете YOLO с помощью Ultralytics, вы не просто сохраняете файл. Вы используете многолетние исследования в области практического применения нейронных сетей. Вы преобразуете современную модель искусственного интеллекта в нечто, что может работать на реальном оборудовании, с реальными ограничениями, решая реальные проблемы.
Именно этим мы и занимаемся в Ultralytics. Мы сокращаем разрыв между исследованиями в области искусственного интеллекта и их практическим применением. Мы делаем компьютерное зрение доступным повсеместно, потому что будущее искусственного интеллекта заключается не только в создании лучших моделей, но и в том, чтобы сделать эти модели полезными в реальном мире.