В наши дни искусственный интеллект и глубокое обучение постоянно попадают в заголовки газет, будь то ChatGPT, генерирующий плохие советы, автомобили с автопилотом, художники, обвиняемые в использовании искусственного интеллекта, медицинские советы от искусственного интеллекта и многое другое. Большинство из этих инструментов полагаются на сложные серверы с большим количеством аппаратного обеспечения для обучения, но использование обученной сети для генерации изображений может быть выполнено на вашем ПК с помощью видеокарты. Но насколько быстры потребительские графические процессоры для выполнения выводов ИИ?
Мы провели сравнительный анализ Stable Diffusion, популярной программы для создания изображений с помощью ИИ, на новейших графических процессорах Nvidia, AMD и даже Intel, чтобы посмотреть, как они работают. Если вы случайно пытались запустить Stable Diffusion на собственном ПК, вы, возможно, догадываетесь, насколько сложной - или простой! - это может быть сложно. Вкратце можно сказать, что графические процессоры Nvidia правят бал, а большинство программного обеспечения разработано с использованием CUDA и других наборов инструментов Nvidia. Но это не значит, что вы не можете запустить Stable Diffusion на других GPU.
В итоге мы использовали три разных проекта Stable Diffusion для нашего тестирования, в основном потому, что ни один пакет не работал на всех GPU. Для Nvidia мы выбрали версию Automatic 1111 с webui – она показала наилучшие результаты, имела больше опций и легко запускалась. Графические процессоры AMD тестировались с помощью версии Shark от Nod.ai - мы проверили производительность на графических процессорах Nvidia (в режимах Vulkan и CUDA) и обнаружили, что она... недостаточная. Запустить GPU Arc от Intel оказалось немного сложнее из-за отсутствия поддержки, но Stable Diffusion OpenVINO предоставил нам некоторые базовые функции.
Отказ от ответственности. Мы не разрабатывали ни один из этих инструментов, но мы искали то, что было легко запустить (под Windows), а также казалось достаточно оптимизированным. Мы относительно уверены, что тесты Nvidia 30-й серии хорошо справляются с извлечением близкой к оптимальной производительности - особенно при включении функции xformers, которая обеспечивает дополнительный прирост производительности на ~20% (хотя при этом снижается точность, что может повлиять на качество). Результаты RTX 40-серии изначально были ниже, но Джордж SV8ARJ предоставил это исправление , где замена PyTorch CUDA DLLs дала здоровый прирост производительности.
Результаты AMD также немного неоднозначны: Графические процессоры RDNA 3 работают очень хорошо, а графические процессоры RDNA 2 выглядят довольно посредственно. Nod.ai сообщила нам, что они все еще работают над "настроенными" моделями для RDNA 2, которые должны значительно повысить производительность (потенциально вдвое), когда они станут доступны. Наконец, на графических процессорах Intel, несмотря на то, что конечная производительность кажется приличной по сравнению с вариантами AMD, на практике время рендеринга значительно больше - требуется 5-10 секунд, прежде чем запустится задача генерации, и, вероятно, происходит много дополнительных фоновых процессов, которые замедляют ее.
Мы также используем разные модели стабильной диффузии, что связано с выбором программных проектов. Версия Shark от Nod.ai использует SD2.1, в то время как Automatic 1111 и OpenVINO используют SD1.4 (хотя есть возможность включить SD2.1 в Automatic 1111). Опять же, если у вас есть какие-то внутренние знания о Stable Diffusion и вы хотите порекомендовать другие проекты с открытым исходным кодом, которые могут работать лучше, чем те, что мы использовали, дайте нам знать в комментариях
Наши параметры тестирования одинаковы для всех GPU, хотя в версии для Intel нет опции отрицательного промта - negative prompt (по крайней мере, мы не смогли ее найти). Приведенная выше галерея была создана с помощью веб-интерфейса Automatic 1111 на графических процессорах Nvidia, с более высоким разрешением (которое занимает гораздо больше времени). Здесь те же промпты, но разрешение 2048x1152 вместо 512x512, которые мы использовали для наших бенчмарков. Обратите внимание, что настройки, которые мы выбрали, были подобраны для работы на всех трех проектах SD; некоторые опции, которые могут улучшить пропускную способность, доступны только в сборке Automatic 1111, но об этом позже. Вот основные настройки:
Positive Prompt:
postapocalyptic steampunk city, exploration, cinematic, realistic, hyper detailed, photorealistic maximum detail, volumetric light, (((focus))), wide-angle, (((brightly lit))), (((vegetation))), lightning, vines, destruction, devastation, wartorn, ruins
Превод:
постапокалиптический стимпанк-город, исследование, кинематографический, реалистичный, гипердетализированный, фотореалистичный максимальная детализация, объемный свет, (((фокус))), широкоугольный, (((ярко освещенный))), (((растительность))), молнии, лианы, разрушение, опустошение, варторн, руины
Negative Prompt:
(((blurry))), ((foggy)), (((dark))), ((monochrome)), sun, (((depth of field)))
Перевод:
(((размытый))), ((туманный)), (((темный))), ((монохромный)), солнце, (((глубина резкости)))
Steps (Шаги): 100
Classifier Free Guidance (Свободное ведение классификатора):
15.0
Sampling Algorithm:
Some Euler variant (Ancestral on Automatic 1111, Shark Euler Discrete on AMD)
Перевод:
Алгоритм выборки:
Некоторый вариант Эйлера (Ancestral на Automatic 1111, Shark Euler Discrete на AMD)
Алгоритм выборки не оказывает существенного влияния на производительность, но может влиять на результат. Automatic 1111 предоставляет наибольшее количество вариантов, в то время как сборка Intel OpenVINO не дает вам никакого выбора.
Вот результаты нашего тестирования графических процессоров AMD RX 7000/6000 серии, Nvidia RTX 40/30 серии и Intel Arc A серии. Обратите внимание, что каждый графический процессор Nvidia имеет два результата: один с использованием вычислительной модели по умолчанию (более медленный и выделен черным цветом) и второй с использованием более быстрой библиотеки "xformers" от Facebook (более быстрый и выделен зеленым цветом).
Как и ожидалось, графические процессоры Nvidia обеспечивают превосходную производительность - иногда с огромным отрывом - по сравнению с продукцией AMD или Intel. С установленным DLL исправлением для Torch, RTX 4090 обеспечивает производительность на 50% выше, чем RTX 3090 Ti с xformers, и на 43% выше без xformers. На генерацию каждого изображения уходит чуть более трех секунд, и даже RTX 4070 Ti способна обогнать 3090 Ti (но только если отключить xformers).
Ситуация падает довольно последовательно, начиная с топовых карт для графических процессоров Nvidia, от 3090 до 3050. Между тем, RX 7900 XTX от AMD сравнялась с RTX 3090 Ti (после дополнительного повторного тестирования), а RX 7900 XT сравнялась с RTX 3080 Ti. Карты 7900 выглядят довольно хорошо, в то время как все карты серии RTX 30 в итоге выигрывают у AMD серии RX 6000 (на данный момент). Наконец, графические процессоры Intel Arc занимают почти последнее место, и только A770 удается обогнать RX 6600. Давайте немного подробнее поговорим об этих расхождениях.
Правильная оптимизация может удвоить производительность карт серии RX 6000. Nod.ai заявляет, что в ближайшие дни она должна подготовить модели для RDNA 2, и тогда общее положение должно начать лучше коррелировать с теоретической производительностью. Говоря о Nod.ai, мы также провели тестирование некоторых графических процессоров Nvidia с помощью этого проекта, и с моделями Vulkan карты Nvidia оказались значительно медленнее, чем со сборкой Automatic 1111 (15,52 it/s на 4090, 13,31 на 4080, 11,41 на 3090 Ti и 10,76 на 3090 - мы не смогли протестировать другие карты, поскольку их нужно сначала включить).
Основываясь на производительности карт 7900 с использованием настроенных моделей, нам также интересно узнать о картах Nvidia и о том, насколько они способны извлечь выгоду из своих ядер Tensor. На бумаге 4090 имеет более чем в пять раз большую производительность, чем RX 7900 XTX - и в 2,7 раза большую производительность, даже если отбросить дефицит. На практике же 4090 сейчас лишь на 50% быстрее XTX в тех версиях, которые мы использовали (и это значение снижается до 13%, если опустить результат xformers с более низкой точностью). Эта же логика применима и к картам Arc от Intel.
Графические процессоры Arc от Intel в настоящее время показывают очень разочаровывающие результаты, особенно учитывая, что они поддерживают FP16 XMX (матричные) операции, которые должны обеспечивать производительность в 4 раза выше, чем обычные вычисления FP32. Мы подозреваем, что текущий проект Stable Diffusion OpenVINO, который мы использовали, также оставляет много возможностей для улучшения. Кстати, если вы хотите попробовать запустить SD на Arc GPU, обратите внимание, что вам нужно отредактировать файл 'stable_diffusion_engine.py' и изменить "CPU" на "GPU" - иначе он не будет использовать видеокарты для вычислений и займет значительно больше времени.
В целом, используя указанные версии, карты Nvidia серии RTX 40 являются самым быстрым выбором, за ними следуют карты 7900, а затем GPU серии RTX 30. Карты серии RX 6000 отстают, а графические процессоры Arc выглядят в целом плохо. Ситуация может кардинально измениться с обновлением программного обеспечения, а учитывая популярность искусственного интеллекта, мы считаем, что это лишь вопрос времени, когда мы увидим более качественную настройку (или найдем подходящий проект, который уже настроен на более высокую производительность).
Мы также провели несколько тестов на устаревших GPU, в частности, на архитектуре Turing от Nvidia (серии RTX 20- и GTX 16) и серии RX 5000 от AMD. RX 5600 XT вышел из строя, поэтому мы остановились на тестировании RX 5700, а GTX 1660 Super оказался достаточно медленным, поэтому мы не посчитали нужным проводить дальнейшее тестирование деталей более низкого уровня. Но результаты здесь довольно интересные.
Во-первых, RTX 2080 Ti в итоге опережает RTX 3070 Ti. Обычно такого не случается, и в играх даже ванильная 3070, как правило, обходит бывшего чемпиона. Что еще более важно, эти цифры позволяют предположить, что оптимизация "sparsity / разреженности" в архитектуре Ampere от Nvidia вообще не используется - или, возможно, она просто неприменима.
Мы перейдем к другим цифрам теоретической вычислительной производительности через некоторое время, но для примера рассмотрим RTX 2080 Ti и RTX 3070 Ti. Тензорные ядра 2080 Ti не поддерживают разреженность и имеют до 108 TFLOPS вычислений FP16. RTX 3070 Ti поддерживает разреженность и имеет 174 TFLOPS FP16, или 87 TFLOPS FP16 без sparsity / разреженности. Тот факт, что 2080 Ti выигрывает у 3070 Ti, явно указывает на то, что разрозненность не является фактором. Та же логика применима и к другим сравнениям, например, 2060 и 3050, или 2070 Super и 3060 Ti.
Что касается карт AMD RDNA, RX 5700 XT и 5700, то здесь наблюдается большой разрыв в производительности. 5700 XT находится чуть впереди 6650 XT, а 5700 - ниже 6600. На бумаге карта XT должна быть на 22% быстрее. Однако в нашем тестировании она оказалась быстрее на 37%. В любом случае, ни один из старых графических процессоров Navi 10 не показал особой производительности в наших начальных бенчмарках Stable Diffusion.
Наконец, GTX 1660 Super на бумаге должен быть примерно на 1/5 теоретической производительности RTX 2060, используя ядра Tensor последнего. Если мы используем производительность шейдеров FP16 (Turing имеет вдвое большую пропускную способность на шейдерном коде FP16), то разрыв сокращается до 22%. Но в нашем тестировании GTX 1660 Super оказалась лишь на 1/10 быстрее RTX 2060.
Опять же, неясно, насколько оптимизированы все эти проекты. Также неясно, в полной ли мере эти проекты используют такие вещи, как ядра Tensor от Nvidia или ядра XMX от Intel. Поэтому мы решили, что будет интересно посмотреть на максимальную теоретическую производительность (TFLOPS) различных GPU. На следующей диаграмме показана теоретическая производительность FP16 для каждого GPU (рассматриваются только самые последние видеокарты), с использованием тензорных/матричных ядер, где это применимо. Результаты Nvidia также включают scarcity / дефицит - возможность пропускать умножение на 0 для половины ячеек матрицы, что, предположительно, довольно часто встречается в рабочих нагрузках глубокого обучения.
Эти ядра Tensor на Nvidia явно набирают обороты (серые/черные полосы - без учета sparsity / разреженности), и очевидно, что наши тесты Stable Diffusion не совсем совпадают с этими цифрами - даже близко. Например, на бумаге RTX 4090 (при использовании FP16) на 106% быстрее RTX 3090 Ti, а в наших тестах без xformers она оказалась на 43% быстрее, а с xformers - на 50%. Заметим также, что мы предполагаем, что проект Stable Diffusion, который мы использовали (Automatic 1111), не использует новые инструкции FP8 на GPU Ada Lovelace, что потенциально может удвоить производительность на RTX 40-серии.
Между тем, посмотрите на графические процессоры Arc. Их матричные ядра должны обеспечивать схожую производительность с RTX 3060 Ti и RX 7900 XTX, плюс-минус, с A380 около RX 6800. На практике графические процессоры Arc не приблизились к этим показателям. Самые быстрые GPU A770 находятся между RX 6600 и RX 6600 XT, A750 отстает от RX 6600, а A380 примерно на одну четверть быстрее A750. Таким образом, все они имеют примерно четверть ожидаемой производительности, что было бы логично, если бы ядра XMX не использовались.
Тем не менее, внутренние коэффициенты на Arc выглядят примерно правильно. Теоретическая производительность вычислений на A380 составляет примерно одну четвертую от A750, и именно на этом уровне он находится сейчас с точки зрения производительности Stable Diffusion. Скорее всего, графические процессоры Arc используют шейдеры для вычислений в режиме полной точности FP32 и упускают некоторые дополнительные оптимизации.
Другой момент, который следует отметить, это то, что теоретические вычисления на AMD RX 7900 XTX/XT значительно улучшились по сравнению с серией RX 6000. Нам предстоит увидеть, закроют ли тюнингованные модели 6000-й серии пробелы, поскольку Nod.ai заявила, что ожидает примерно 2-кратного улучшения производительности на RDNA 2. Пропускная способность памяти не была критическим фактором, по крайней мере, для целевого разрешения 512x512, которое мы использовали - модели 3080 10GB и 12GB располагаются относительно близко друг к другу.
Вот другой взгляд на теоретическую производительность FP16, на этот раз сфокусированный только на том, что различные GPU могут делать с помощью шейдерных вычислений. Архитектуры Ampere и Ada от Nvidia выполняют FP16 с той же скоростью, что и FP32, поскольку предполагается, что FP16 можно закодировать для использования ядер Tensor. Графические процессоры AMD и Intel, напротив, имеют двойную производительность при шейдерных вычислениях FP16 по сравнению с FP32.
Очевидно, что этот второй взгляд на вычисления FP16 не соответствует нашей реальной производительности лучше, чем график с ядрами Tensor и Matrix, но, возможно, существует дополнительная сложность в настройке матричных вычислений, и поэтому полная производительность требует... чего-то дополнительного. Что приводит нас к последнему графику.
Этот последний график показывает результаты нашего тестирования в более высоком разрешении. Мы не тестировали новые графические процессоры AMD, поскольку нам пришлось использовать Linux на картах AMD серии RX 6000, а для серии RX 7000, очевидно, требуется более новое ядро Linux, и мы не смогли заставить его работать. Но посмотрите на результаты серии RTX 40, с замененными библиотеками Torch DLL.
RTX 4090 теперь на 72% быстрее, чем 3090 Ti без xformers, и на целых 134% быстрее с xformers. 4080 также опережает 3090 Ti на 55%/18% с/без xformers. Интересно, что 4070 Ti оказался на 22% медленнее 3090 Ti без xformers, но на 20% быстрее с xformers.
Похоже, что более сложное целевое разрешение 2048x1152 начинает лучше использовать потенциальные вычислительные ресурсы, и, возможно, более длительное время работы означает, что ядра Tensor могут в полной мере использовать свои возможности.
В конечном счете, это в лучшем случае моментальный снимок производительности Stable Diffusion. Мы видим частые обновления проекта, поддержку различных библиотек обучения и многое другое. Мы еще вернемся к этой теме в следующем году, надеюсь, с более оптимизированным кодом для всех различных GPU.