Почему скрипт на Python с использованием PyTorch использует только 6 из 12 ядер?

Вопрос или проблема

Я запускаю Whisper на Intel-Mac с процессором Intel Core i7 (в данный момент Whisper, похоже, не поддерживает графические процессоры AMD Radeon, поэтому я использую CPU). Когда я запускаю Whisper на этом компьютере, который в остальном в основном бездействует, Whisper использует около 500-550 % процессорного времени (максимум – 1200 % – 6+6 ядер), поэтому используется примерно половина возможностей моего процессора. Если я запускаю еще один Whisper, он тоже использует 500-550 %, что означает, что мой процессор более или менее полностью загружен.

Другими словами, обрабатываются два файла со скоростью примерно в половину. Я предпочел бы обрабатывать один файл на полной скорости, то есть чтобы первый процесс Whisper использовал, возможно, 1100 %.

Почему Python (?) использует всего лишь половину доступной вычислительной мощности в такой ситуации? Можно ли это контролировать через какую-либо настройку, флаг или подобное?

Я протестировал whisper на своем процессоре Intel 12700 с установленным torch.set_num_threads(n), где n=[4,8,12,20].

  • самая высокая скорость была при 8 ядрах (у этого процессора Intel 8 производительных ядер и 4 эффективных ядра): 9 секунд
  • следующая по скорости была 4 ядра: 11,8 секунд
  • следующая по скорости была 12 ядер: 11,9 секунд
  • самая низкая скорость была при 20 ядрах: 23 секунды

Число 20 ядер представляет собой общее количество всех логических ядер, как указано: import multiprocessing;print(multiprocessing.cpu_count());.

Так что если вы хотите быстрое время обработки (т.е. минимальное время обработки), то вы должны доверять whisper (т.е. PyTorch), потому что он умный и использует все ваши физические ядра.

p.s. Для “САМОЙ БЫСТРОЙ” скорости читайте далее:

Если вы знаете, что у вас процессор Intel И если ваш процессор имеет производительные и эффективные ядра, то вы можете ускорить его еще больше, подсчитав количество производительных ядер, а затем передав это значение, и ваша обработка whisper будет значительно быстрее. В моем примере выше на 30% быстрее. Однако я не знаю, как программно получить число производительных ядер, кроме как получить номер модели процессора Intel, затем зайти на сайт intel-ark, затем прочитать спецификации, А ЗАТЕМ вернуться к коду, чтобы жестко закодировать это число.

Поэтому, на мой взгляд, использовать общее количество физических ядер проще и гарантирует почти максимальную скорость без какого-либо болезненного жесткого кодирования или создания огромной таблицы соответствия моделей процессоров Intel с учетом числа производительных ядер.

p.p.s. Для получения дополнительной информации о том, что такое логические и физические ядра на процессорах x86_64/AMD64, пожалуйста, смотрите https://en.wikipedia.org/wiki/Hyper-threading. Некоторые будущие продукты процессоров Intel не будут иметь Hyper Threading, и поэтому больше не будет логических и физических ядер. В общем приложения, которые используют много 100% процессорного времени, не получают выгоду от HyperThreading и могут пострадать от него. Whisper/PyTorch – это идеальный пример, когда HyperThreading не помогает вообще, и если вы попытаетесь использовать все логические ядра, тогда обработка идет в 2 раза медленнее.

whisper имеет параметр для количества потоков.

--threads THREADS количество потоков, используемых torch для обработки на CPU;
замещает MKL_NUM_THREADS/OMP_NUM_THREADS (по умолчанию: 0)

Поэтому, чтобы получить полное использование на процессоре с 12 ядрами, выполните

whisper --threads 12

Ответ или решение

Использование всей вычислительной мощности процессора при выполнении Python-скрипта на базе PyTorch может быть затруднено по нескольким причинам, даже если у вас есть данные о количестве доступных ядер. В этом ответе мы рассмотрим, почему скрипт, использующий библиотеку Whisper, на вашем Intel Core i7 использует только 6 из 12 доступных ядер, а также возможные способы оптимизации.

1. Архитектура процессора

Ваш Intel Core i7 имеет 12 ядер, из которых 6 являются производительными и 6 – эффективными. Производительные ядра позитивно влияют на общую производительность задач с высокой нагрузкой, в то время как эффективные ядра предназначены для менее требовательных задач.

При выполнении интенсивных вычислений Whisper использует только производительные ядра, что ведет к тому, что вы видите использование порядка 500-550% CPU, что соответствует использованию почти половины вычислительных ресурсов.

2. Гиперпоточность

Гиперпоточность (Hyper-Threading) позволяет процессору обрабатывать больше потоков, чем количество физических ядер. В вашем случае, хотя процессор имеет 12 логических потоков (6 производительных и 6 эффективных), Whisper может не извлекать выгоду из гиперпоточности, если нагруженная задача не требует этого. В большинстве сценариев, особенно в задачах с высокой загрузкой CPU, такие как обработка аудио, использование всех логических потоков может даже замедлить выполнение.

3. Конфигурация библиотеки

По умолчанию PyTorch определяет количество потоков, которое использовать для вычислений, исходя из количества доступных ядер. Однако это поведение может быть изменено с помощью переменных окружения, таких как OMP_NUM_THREADS, и параметров конфигураций, интегрированных в Whisper. При этом Whisper имеет собственный параметр --threads, который позволяет явно задать количество потоков, используемых для обработки.

Для достижения наилучшей производительности вы можете использовать следующую команду:

whisper --threads 12

4. Производительность с различным количеством потоков

Ваши тесты показывают, что с использованием 8 потоков вы получили наибольшую производительность. Это может указывать на оптимальное распределение для вашего процессора, где использование всех 12 потоков не всегда приводит к улучшению — наоборот, иногда оно замедляет процесс из-за дополнительной нагрузки на систему.

5. Рекомендации по оптимизации

  • Изучите архитектуру вашего процессора. Понять, сколько у вас производительных и эффективных ядер, важно для оптимизации потоков в задачах, которые вы выполняете.

  • Пробуйте разные настройки. Экспериментируйте с параметром --threads в Whisper, чтобы найти оптимальную конфигурацию для вашего случая.

  • Мониторинг загрузки процессора. Используйте инструменты для мониторинга нагрузки на процессор в реальном времени, чтобы оценить, как распределяются потоки при выполнении задач.

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

Заключение

Ваша ситуация является отличным примером того, как характеристика процессора и внутренние механизмы библиотек могут влиять на производительность. Важно настраивать параметры обработки, адаптируясь к архитектуре процессора для достижения максимальной производительности. Следуя приведенным выше рекомендациям, вы сможете более эффективно использовать ресурсы вашего процессора для обработки аудио-файлов в Whisper.

Оцените материал
Добавить комментарий

Капча загружается...