![](https://habrastorage.org/getpro/habr/upload_files/6e5/982/d13/6e5982d1374efe71e52204873ecdd407.jpg)
Презентация Nvidia в 2018. Внимание миллионов было приковано к новой технологии RTX: теперь у нас в реальном времени будет рендериться реалистичная система отражений и засветов! Ого, вот только... Никто даже внимание не обратил на технологию DLSS, которая получила лишь 10 минут времени на презентации...
Зачем нужны тензорные ядра игровых видеокартах?
Начнем мы издалека и поговорим о тензорах и тензорных ядрах.
Тензоры обладают достаточно контринтуитивным концептуальным/геометрическим смыслом, но достаточно уже того, что их можно записать в виде многомерного массива. Следовательно, тензор можно записать в виде матрицы любой размерности. Одно из важнейших свойств тензоров – каждое значение в строчке/столбце обладает зависимостью от другого значения в строчке/столбце.
Допустим, точка в 3D пространстве описывается тремя значениями по осям “o”, “x”, “y”, все они отображают координату точки.
Обычно перемножение многомерных массивов приводит к длинным формулам по типу этой:
![](https://habrastorage.org/getpro/habr/upload_files/eb9/23f/213/eb923f213d520da25b49aac8bed7a974.png)
Все вычисления производятся в одностороннем порядке, поэтому суммы и перемножения каждого столбца и строки нужно где-то хранить, а значит использовать доп. регистры. Если матричных перемножений много, то и вычисления становятся неподъемной задачей и требуют, как минимум, огромного кэша для постоянной перезаписи информации. Обычные ядра выполняют операции последовательно, из-за чего вычисления проходят слишком медленно…
Именно поэтому GPU (видеокарты) идеально подходят для подобных матричных перемножений, так как их ядра CUDA могут выполнять параллельные однообразные вычисления. Как в примере выше. General Matrix Multiplication – так называется функция простого перемножения матриц с накоплением результатов в отдельной матрице. Просто результат перемножения складывается с еще одной матрицей. Этот простой способ позволяет упростить процесс вычислений и число задействуемых регистров и существенно снизить потребность в хэше.
Но почему CUDA ядра, точнее, GPU должны выполнять операции по подсчитыванию тензоров?
Во-первых, в 3D графике из-за симуляции отражений и текстур, используется много векторной информации. Real-time рендеринг тому пример с “подвижной” камерой, которая в каждом кадре схватывает новые грани “объектов”, наделенных расположением относительно других объектов и другой камеры. И это не говоря об освещении и отражениях…
Поэтому их прозвали графическими, т.к по большей части работа с перемножением матриц была задачей для обработки перемножений векторов… Впоследствии, безусловно GPU работали со всеми видами перемножений многомерных массивов данных.
Тогда зачем нужны вообще тензорные ядра, которые установлены во всяких RTX видеокартах? Затем, что это ядра, которые специально заточены под вычисление подобных матричных перемножений: они могут выполнять по 64 GEMM (матричных перемножений с накоплением результатов в отдельной матрице) за один такт.
![](https://habrastorage.org/getpro/habr/upload_files/ba5/92b/b80/ba592bb80de5da5ea47c878c3e82352c.png)
Последняя светло-зеленая матрица – матрица, в которую перезаписываются выходные данные, пока бирюзовая и фиолетовая наполнены входными. Допустим, FP16 – это соответственно матрица 8x8, она перемножается с матрицей 8x8 – результаты накапливаются в последующем массиве.
![](https://habrastorage.org/getpro/habr/upload_files/ee3/2bd/ff5/ee32bdff5dc370ed2266c49ba71a2f82.png)
На картинке выше – сравнение вычислений матричных перемножений на CUDA-ядрах (архитектура Pascal) и тензорных ядрах на архитектуре Turing. Дело в том, что ускорители способны параллельно обрабатывать благодаря разбиению на маленькие блоки огромные тензоры. Выше приведено сравнение скорости за один такт.
Активно используются в DL, где необходимо умножать элементы данных на веса соединений в слоях, т.е исчислять те самые операции с ненасущными тензорами. И вот теперь вопрос… А зачем ставить то эти ядра в обычные потребительские карты? Чтобы нейронки работали прямо на домашних компьютерах геймеров… Для использования ИИ в повседневной жизни, получается.
И сегодня главная Nvidia-технология ИИ, DLSS, которая основана на действии заранее предобученной 3D модели, может совершить серьезный переворот в мире геймерского “железа”. Установка тензорных ядер кажется не излишком, а смелым решением.
DLSS 1.0 и ультра сглаживание
Да, многие частично называют эту технологию апскейлом, но и это не совсем так. Переводится DLSS как “Deepl Learning Super Sampling”, т.е сглаживание с использованием глубокого обучения. Подобное название отсылает нас к стандартным методам сэмплирования или попросту сглаживания, которое присутствует во всех играх.
В DLSS 2.0 действует как известная многим 3D художникам технология "суперсэмплинг".
Ранее сглаживание происходило разными способами: например, при помощи суммирования значений соседних пикселей (билинейное сглаживание) или бикубической интерполяцией. Интерполяция – нахождение промежуточных значений. Короче говоря, эти методы действовали на основе относительно простых алгоритмов и “достраивали” промежуточные пиксели, чтобы избежать резкостей в изображении.
![Пример билинейного сглаживания Пример билинейного сглаживания](https://habrastorage.org/getpro/habr/upload_files/b5a/b95/319/b5ab953195c65f24aac78c1f879a9eb4.png)
Суперсэмплинг в DLSS – это “сглаживание” широкого масштаба, когда из одного пикселя достраивается буквально несколько пикселей. И, таким образом, технология, основанная на принципе сглаживания, становится настоящим апскейлом. Вместо изображения 1080p мы получаем “достроенное” изображение в 4K на основе действия ИИ. Но как так получается, что ИИ эффективно и правдиво достраивает дополнительные пиксели без артефактов?
Особый тип сети искусственного интеллекта, называемый сверхточным автокодировщиком, использует текущий кадр с низким разрешением и предыдущий кадр с высоким разрешением, чтобы попиксельно определить, как создать текущий кадр более высокого качества. В этих слоях нейронная сеть использует фильтры, чтобы применять операцию свертки к входному изображению. Это позволяет сети выявлять локальные особенности изображений, такие как края, текстуры и другие шаблоны.
Этот ИИ чаще всего как раз и используется для распознавания изображений.
Так как технология использует данные для обучения, необходимо загружать в видеокарты уже готовые Data: к каждой новой игре нужно предобучать модель DLSS. Да, разработчики реально отсылали килотонны подготовленных данных для предобучения "суперсэмплирования" NVIDIA, точнее многообразные кадры из игры с качеством в 16K (т.е не в два раза, а в 8 раз превышающее пользовательский FullHD).
![](https://habrastorage.org/getpro/habr/upload_files/d9c/549/3b7/d9c5493b7fd7246b96a2ad00995c9d52.png)
В таком случае, если наш монитор (4К), то можем отрендерить больше кадров в разрешении 1080p, получить “достраивание” при помощи DLSS и на выходе картинку в высоком качестве. Короче говоря, рендерим FullHD на карте, а получаем изображение в 4K. Круто же.
Нейронные сети обучаются через «идеальные кадры» с использованием традиционного суперсэмплинга до 64 выборок на пиксель.
Дальше модель добавлялась в обновления драйверов, и тензорные ядра позволяли нейросети работать в штатном режиме на геймерских карточках. Естественно, тензоры нужны были, чтобы опять заниматься вычислениями тех самых пресловутых матричных перемножений…
Такая технология оказалась неудачной.
Почему?
Дело в том, что разработчики просто технически не могут предоставить полный объем данных для обучения нейросети. Поэтому очень часто игроки наблюдали мыло и артефакты, засветы и мерцания, хотя и получали прирост ФПС. Все изменилось с появлением DLSS 2.0, которая работала по-другому.
Temporal Anti-Aliasing Upsample – технология, которая подсматривает предыдущие кадры и на их основе дорендеривает последующие.Теперь для работы DLSS (уже 2.0) стали использоваться еще и векторные карты движения пикселей во времени. ИИ подсматривает и предугадывает последующее движение пикселей – воссоздает изображение на основе предыдущих кадров. Здесь вновь подключаются дополнительные векторные вычисления.
Короче говоря, теперь ИИ использует не только информацию с подготовленных совпадающих по содержанию кадров просто в более высоком разрешении, но и предыдущие. Два кадра вместо одного.
![Именно поэтому, кстати, разрешилась проблема DLSS 1.0, где наблюдались артефакты у подвижных объектов Именно поэтому, кстати, разрешилась проблема DLSS 1.0, где наблюдались артефакты у подвижных объектов](https://habrastorage.org/getpro/habr/upload_files/4ca/f0a/e61/4caf0ae61c6627fe5dfea90956b972ff.png)
Как работала TAA (старший брат TAAU) в играх до этого можно почитать, например, в документации к Unreal Engine.
На самом деле, именно поэтому видеокарты 3 серии лучше справляются с DLSS 2.0. В них попросту выше производительность тензорных ядер в сравнении с картами в 2ой серии. Да, их стало меньше, вот только архитектурно они относятся к новому поколению.
Так что получается? DLSS, магическая технология, повышающая качество изображения – это старый методы “улучшения” графики просто с доработкой ИИ? Да, и в этом состоит весь маркетинговый ход.
Маркетинговый ход и влияние на игровую индустрию
Тензорные ядра появились на рынке очень давно. Дело в том, что сама по себе идея технологии DLSS до ужаса проста и включает в себя попросту пример сглаживания и старой технологии учета предыдущих кадров, которые работали алгоритмически и вручную.
DLSS-технология – пример маркетингового хода, который позволил NVIDIA обособиться на рынке и подчеркнуть уникальность собственных видеокарт за счет внедрения на тот год привычных сверточных нейронных сетей.
Подключение “векторных карт” позволило компании создать универсальную нейросеть, которая работает для любых игр. Поэтому практически все новинки получают к себе в арсенал технологию DLSS.
Технологическая заслуга зеленого гиганта здесь – повышение производительности тензорных ядер и помещение их в потребительские видеокарты. На самом деле, такое провернуть можно было и раньше, реальных технологических скачков в 2018 году не наблюдалось.
Но для игровой индустрии DLSS означает совершенно новый подход к оптимизации игр. Технология впоследствии может завысить планку ограничений по графике.
Если раньше 1млн полигонов в кадре уже казалась предельной границей, как и текстуры в 2к – теперь благодаря тензорным ядрам и DLSS можно завернуть разрешение текстур и числа полигонов в несколько раз, что приведет к возможному гиперреализму в будущем игровой индустрии без использования 3D-костылей для создания иллюзии “реалистичности”. В основном, подобные изменения могут коснуться органики/анимации мимики/наполненности игровых миров деталями от мусора до числа NPC.
Именно поэтому внедрение технологии большой шаг не столько с точки зрения ИИ, сколько самой индустрии геймдева, где в скором времени поменяются правила игры.