Files
my-blog-posts/about-npu/index.md
2026-03-07 16:59:15 +03:00

137 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Введение
Год назад я приобрел ноутбук категории Copilot+ PC с процессором [AMD Ryzen AI 9 HX 370](https://www.amd.com/en/products/processors/laptop/ryzen/ai-300-series/amd-ryzen-ai-9-hx-370.html). Тогда такие устройства были в новинку, да и сейчас не сильно распространены. Прошло достаточно времени и теперь хочу рассказать о том, что из себя представляют устройства такого типа.
Статью можно разделить на две части. Сначала расскажу об опыте использования Copilot+ PC и его функций в рамках Windows 11, а потом углубимся в NPU, разберемся что оно из себя представляет и даже проведем тестирование с запуском LLM.
# Copilot+ PC
В мае 24-го года Microsoft представили новую категорию устройств [Copilot+ PC](https://www.microsoft.com/en-us/windows/copilot-plus-pcs?r=1). Главная особенность таких устройств - процессор с NPU на 40+ TOPS для работы локальных нейросетей, которые в том числе будут встроены в Windows 11 и доступны только на этих устройствах.
NPU (Neural Processing Unit) - это отдельный сопроцессор, предназначенный для нейронных вычислений. Не редко мощность NPU измеряется в TOPS - количество триллионов операций в секунду.
## ИИ-функции Windows 11
Стоит отметить, что на момент покупки ноутбука этих функций в Windows 11 не было и появлялись они со временем. Хотя даже сейчас далеко не все функции доступны.
Далее я расскажу лишь о некоторых таких ИИ-функциях, которые сам пощупал или по крайней мере пытался пощупать.
### Recall
Одной из наиболее интересных, для меня, стала функция [Recall](https://support.microsoft.com/en-us/windows/retrace-your-steps-with-recall-aa03f8a0-a78b-4b3e-b0a1-2eb8ac48701c) - она периодически делает снимки экрана и сохраняет их, создавая историю использования устройства.
Затем можно выполнить ИИ-поиск по этим снимкам, котороые хранятся вплодь до 3-х месяцев.
Конечно в такой функции пользователей больше всего волнует конфиденциальность. Первое время с этим были проблемы, но сейчас Recall имеет вполне гибкие настройки и неплохую безопасность.
Кроме того, именно для этого нужен NPU, который позволяет обрабатывать снимки локально, так что они не покидают устройства.
Но в этой статье я не буду подробно затрагивать безопасность, это тема для отдельной статьи, по этому ограничимся общим описанием.
Сама функция работает вполне неплохо. Но больше всего волновало "а для чего использовать?". За пол года так ни разу не воспользовался поиском в Recall, просто не было нужды, хотя он работал, снимки делал и действительно позволял заглянуть на 3 месяца назад. За ненадобностью функция была благополучно отключена.
### Click to do
Другой, действительно полезной, оказалась функция [Click to do](https://support.microsoft.com/en-us/windows/click-to-do-do-more-with-what-s-on-your-screen-6848b7d5-7fb0-4c43-b08a-443d6d3f5955) - она позволяет анализировать текст на экране, даже если он на картинке.
Текст определяет не идеально, есть ошибки, но в целом хорошо, периодически выручает.
Не хватает возможности выделить фрагмент на экране и найти по нему информацию в интернете, подобно Circle to Search на смартфонах Android. Но можно быстро выполнить поиск по тексту, найденному на экране.
### Что еще
Есть еще несколько функций, таких как Cocreator и Restyle Image, которые помогают рисовать и изменять изображения соответственно, но на данный момент в РФ они не доступны.
Сам Copilot, который должен работать локально, так и не нашел. Предлагают только Microsoft 365 Copilot, но это уже совсем другое.
# Neural Processing Unit
Как ранее уже упомянул, NPU - это сопроцессор, предназначенный для нейронных вычислений. Не буду углубляться в техническую архитектуру и различия меду CPU, GPU и NPU. Об этом можно найти достаточно материала как на хабре, так и на других ресурсах.
NPU может в десятки раз проигрывать GPU по производительности, так зачем он нужен?
Чтобы разобраться в этрм, немного разберем нейросети. В них можно выделить два основных этапа: обучение и выполнение.
Обучение - процесс тяжелый и требует больших вычислительных ресурсов, по этому для них используются различные ускорители, в том числе видеокарты.
После обучения, нейросеть попадает к пользователю (сейчас мы говорим о локальных нейросетях) для работы и выполнения своих задач. На этом этапе все еще требуется значительная вычислительная мощность, но видеокарты уже не являются предпочтительным вариантом, т.к. они совершенно не мобильные и имеют высокое энергопотребление.
Например, я не хочу, чтобы в процессе работы, нейросети работающие в фоне, съедали все ресурсы устройства, тем самым мешая работать.
И тут в дело вступает NPU в виде отдельного сопроцессора, который не затрагивает ресурсы CPU и GPU. Он потребляет меньше энергии, но и производительности значительно ниже, чем у GPU.
# Тестируем NPU
А теперь посмотрим на производительность NPU на практике.
Мне, как разработчику, хочется иметь собственную LLM, для решения небольших задач, но так, чтобы она не сжирала весь бюджет за час. Локальная LLM - отличный вариант. Кроме того, работа на NPU означает, что CPU и GPU не будут затронуты и моей работе ничего не помешает.
Далее запустим несколько LLM на NPU, но перед этим рассмотрим характеристики устройств и углубимся в детали.
## Характеристики устройства
В качестве рабочего устройства используется ноутбук со следующими характеристиками:
| Процессор | AMD Ryzen AI 9 HX 370 |
| --------------------------- | ------------------------------------------ |
| NPU TOPS | 50 |
| Оперативная память | 32гб LPDDR5x, распаяна на плате в 4 гнезда |
| Скорость оперативной памяти | 7500 |
| Оперативная память для NPU | 16гб (заимствует оперативную память) |
Обратите внимание, что поскольку NPU не имеет большого объема собственной памяти, как VRAM в GPU, он использует оперативную память, как это делает процессор.
Но объем оперативной память для NPU определен на аппаратном уровне, по этому расширению не подлежит. Это важная деталь, о которой позже поговорим.
## Как тестируем
Запуск локальной LLM на процессорах AMD Ryzen AI оказался непростой задачей. Тут важно уточнить, что процессоры AMD являются далеко не единственными представителями, имеющими NPU. У других производителей использование NPU может и скорей всего будет совершенно другим. AMD в этом плане имеет свои особенности и именно о них мы далее будем говорить.
И так, задача запуска LLM на NPU оказалась нетривиальной. Я перебрал не мало вариантов и таки смог запустить, установив RyzenAI Software (его скачивание и установка само по себе как отдельный квест) и запустив предварительно оптимизированную под NPU модель через ONNX Runtime.
Почему ONNX Runtime, а не, например, LM Studio? Дело в том, что llama.cpp, как и LM Studio в целом, не поддерживают NPU. Хотя спрос есть и [пользователи просят добавить поддержку](https://github.com/lmstudio-ai/lms/issues/30), но на данный момент это невозможно.
Есть альтернативный вариант - запуск через DirectML, но как бы ни пытался, задействовать NPU не удалось. В конечном итоге я просто следовал инструкции от AMD и таки смог запустить модель.
Кроме того, модель должна быть предварительно оптимизирована для работы на NPU. Благо AMD предоставляют некоторое количество таких моделей. Со списком можно ознакомиться [тут](https://huggingface.co/collections/amd/ryzen-ai-17-npu-llm).
Для тестирования выбрал 3 модели: [Phi-3.5-mini-instruct](https://huggingface.co/amd/Phi-3.5-mini-instruct-onnx-ryzenai-npu), [Qwen2.5-Coder07B-Instruct](https://huggingface.co/amd/Qwen2.5-Coder-7B-Instruct-onnx-ryzenai-npu) и [gpt-oss-20b](https://huggingface.co/amd/gpt-oss-20b-onnx-ryzenai-npu). Разберем результаты для каждой модели отдельно.
### Phi-3.5-mini-instruct
При запуске, модель потребляет 2.7гб памяти. После начала генерации, потребление памяти повышается до 4-4.5гб, скорей всего выделяется память для вычислительных буферов.
В среднем NPU генерирует 12 tps (токенов в секунду). Это не много, например видеокарта NVIDIA GeForce RTX 3060 может выдавать 100+ tps для этой же модели.
Во время генерации используется 90-100% NPU.
![](./img_1.png)
### Qwen2.5-Coder07B-Instruct
Эта модель уже потребляет 5.4гб памяти и почти 6гб после начала генерации. Генерирует в среднем 10-11 tps. И нагружает NPU так же на 90-100%.
![](./img_2.png)
### gpt-oss-20b
Эта модель уже потребляет почти 13гб памяти и что интересно, после начала генерации это значение никак не меняется. Что еще более интересно, график показывает использование NPU в пределах 60-70%. Но генерация особо не падает, в среднем 10-11 tps.
Почему происходит такое поведение с большими моделями - мне не известно. Возможно найдутся знатоки в комментариях, буду благодарен за объяснение.
![](./img_3.png)
Запустить модели большего размера не представляется возможным. Как писал ранее, память NPU ограничена 16гб и изменить это нельзя. Кроме того, это самая большая оптимизированная для NPU модель, которую мне удалось найти.
## Итоги тестирования
Конечно все протестированные модели можно использовать только для решения простых задач. На сложных они начинают галлюцинировать из-за нехватки контекста. Но что можно было ожидать от локальной LLM?
Во всяком случае такой модели можно не бояться скормить конфиденциальные данные и не беспокоиться о нагрузке на устройство, благодаря NPU.
Скорость генерации тоже оставляет желать лучшего, но опять же, для простых задач этого вполне хватит и вновь скажу, что поскольку основные ресурсы устройства (CPU и GPU) не задействуются, есть возможность запустить такую LLM для работы в фоновом режиме.
# Заключение
NPU - это неплохой сопроцессор для работы фоновых нейронных процессов, которые требуют не быстрого результата, а экономной работы без перегрузки устройства.
И такие фоновые нейронные процессы это не только про LLM. В качестве хорошего примера у нас уже есть ИИ-функции в Windows 11 на устройствах категории Copilot+ PC. Хотя, как по мне, многие из этих функций не являются супер полезными, они все же задают правильное направление для использования NPU в повседневных задачах.