История изменений
Исправление byko3y, (текущая версия) :
вы шо и презентацию не смотрели? о чём тогда разговор про технические детали?
Посмотрел презентацию: https://www.youtube.com/watch?v=E98hC9e__Xs
Что ж, поясню для тех, кто мыслит презентациями вместо технических данных.
Давайте начнем с машинного обучения. Нейронная сеть в общем своем виде представляет собой преобразование, которое для трех входов (x1, x2, x3) и четырех выходов нейронов (y1, y2, y3, y4) можно описать как:
y1 = f(x1 * W1_1 + x2 * W1_2 + x3 * W1_3)
y2 = f(x1 * W1_2 + x2 * W2_2 + x3 * W2_3)
y3 = f(x1 * W1_3 + x2 * W3_2 + x3 * W3_3)
y4 = f(x1 * W1_4 + x2 * W4_3 + x3 * W4_3)
где f — это передаточная функция нейрона. Здесь я для упрощения убрал смещение из вычислений.
Математически это перемножение матриц, после которого по результирующей матрице проходятся передаточной функцией:
| x1 |
| x2 |
Х | x3 |
| W1_1 W1_2 W1_3 | | y1(f) |
| W2_1 W2_2 W2_3 | | y2(f) |
| W3_1 W3_2 W3_3 | | y3(f) |
| W4_1 W4_2 W4_3 | | y4(f) |
Мы умножили матрицу 3x4 на матрицу 1х3, затратив на это 4х3х1 = 12 умножений и 4х(3-1)х1 = 8 сложений. Если кто не в курсе, что такое умножение матриц:
https://ru.wikipedia.org/wiki/Умножение_матриц
Что такое тензорные ядра в нвидии. Это тупо вычислитель в составе потокового процессора, который берет три матрицы A, B, C размера 4х4, и вычисляет A x B + C. В данном случае матрица C — это смещения, которые нам не интересны. Сложность самого умножения матриц 4х4 — 4х4х4 = 64 умножения и 4х3х4 = 48 сложений.
Знакомый с продвинутой математикой человек сразу заметит, что в простой нейронной сети входные сигналы представляют собой одномерную матрицу, а вычислитель считает произведение двух двухмерных. Чтобы на полную катушку загрузить вычислитель, нужно иметь несколько наборов входных данных. А это именно то, что делает сверточная нейронная сеть — она проходит одной маской по всему изображению, уменьшая размерность данных. Таким образом одна большая входная картинка превращается в большое число маленьких входных картинок, пропускаемых по одним и тем же весам. То есть, тензорные ядра специализируются на ускорении обработки изображений.
Итак, 64 умножения и 48 сложений тензорное ядро выполняет за один цикл. По этой причине два таких ядра занимают столько же места, сколько 16 универсальных вычислителей с одинарной точностью, которые числа половинной точности считают по два за такт. При этом значения в матрицах A и B в операции «A x B + C» задаются в половинной точности (2 байта), а смещение C и результат — с одинарной точностью (4 байта). Ну типа сто помножить на сто — будет десять тысяч, число намного больше, потому множители вроде как должны быть меньше произведения по размеру.
Сколько же тактов нужно будет универсальным вычислителям для реализации тех же функций суперскоростных тензорных ядер? На 64 умножения половинной точности им нужно будет 64/16/2 = 2 цикла, на сложения с одинарной — 48/16 = 3 цикла. Итого 5 циклов, пятикратная разница производительности. Это примерно та цифра, которую вы увидите на реальных бенчах, например:
https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/#att...
то есть, 3-6 раз вместо маркетингового булшита про 8-20 раз ускорения.
Для тех, кто занимался высокопроизводительными вычислениями, может показаться логичным вопрос: а как весь этот массив данных будет читаться из памяти? Пропускная способность канала оперативной памяти не бесконечная, вы не можете просто пятикратно увеличить производительность процессора — нужно будет пятикратно увеличивать ширину канала памяти. Однако же, если вы посмотрите на спецификации, то увидете, что 1080 c 3840 шейдерными ядрами имела канал 550 Гб/с, а 3070 с 5900 ядрами имеет канал 512 Гб/с — удельная пропускная способность снизилась. Да, это первое, с чем столкнется юный программист сосбтвенных нейросеток на видеокарте — если плохо работать с кэшем, то никакого ускорения не будет. В случае грамотно реализованной сверточной сети маски остаются в кэше, а подгружаются части картинки.
Причем, как показали бенчи, где-то в районе матрицы 8129х8192 производительность тензорных вычислений падает эдак на 40%:
https://sci-hub.tw/10.1007/978-3-030-10549-5_35 - Benchmarking the NVIDIA V100 GPU and Tensor Cores
То есть, при применении самых оптимальных алгоритмов, карточка оптимизирована под изображение 8к. Причем, такого завала нет для обычных шейдеров.
Что же мы имеем в сухом остатке? 20% чипа заняты узкоспециализированными вычислителями для ускорения сверточных нейронных сетей, обрабатывающих изображения разрешением до 8к. Если бы вместо тензорных ядер нвидия поставила бы в два раза больше АЛУ одинарной точности, то 3-6 раз ускорения превратились бы в 2-3 раза ускорения, причем, не затыкающегося на больших разрешениях из-за ширины канала памяти.
Далее, перейдем к трассировке лучей. Это по сути ASIC, занимающий примерно 20% площади кристалла, интерфейсов программирования к которому у простого смертного нет, и всё, что мы о нем знаем — это что оно считает пересечение лучей с многогранниками, и делает это очень быстро. Замечательные алгоритмы для задания команд этим ASIC-ам будут содержаться исключительно в проприетарных драйверах нвидии. И если нвидия еще как-то пытается впарить перемножение матриц на тензорных ядрах для решения задач оптимизации/решения системы линейных уравнений (с половинной точностью, LOL), то трассировка лучей, судя по всему, настолько специализированная и бесполезная, что интерфейсы к ней даже не открыты.
А это значит, что драйвера нвидии станут больше, сложнее, и надежнее. Примерно как GeForce Experience, которая периодически превращает топовый графен-кинцо в тыкву с 10 фпс, и возвращает на 60 фпс после удаления софтины.
основной профит от лучей сначала будет для разработчиков игр и тридемоделеров
И вот я сижу и думаю: а чем же это лучи помогут мне проще разрабатывать игорь? Поскольку большинство карточек на рынке не имеют наглухо закрытых проприетарных интерфейсов для трассировки, особенно ноутбуки и игровые консоли, то разрабам придется делать версии с трассировкой и без — упростили себе работу? Не думаю.
В презентации упоминалось повышение разрешения изображния при помощи нейросеток. По сути, нейронная сеть распознает некоторые заранее изученные анимации по отдельным элементам, и воспроизводит анимацию в высоком разрешении. В презентации показан удачный пример — но они не показали неудачных примеров, когда нейросетка всовывает артефакты в изображения, некорректно распознавая анимацию. Недостаток нейросеток — это их плохая предсказуемость, так что артефакты вы не найдете до тех пор, пока не воспроизведете тестовую сцену. Чтобы максимизировать полезный эффект и минимизировать вредный, сцен должно быть меньше и нужно больше времени потратить на отыскивание нераспознающихся важных анимаций — как той самой надписи на ящике, которая даже в полном честно отрендереном разрешении отрисовывается хуже, чем в восстановленном нейросеткой из пониженного разрешения. Очевидно, на эту надпись разрабы сетку натаскали. Что делать разрабам рогаликов с открытым миром и случайными событиями в онном? Забыть про эту фичу, как про страшный сон.
Исходная версия byko3y, :
вы шо и презентацию не смотрели? о чём тогда разговор про технические детали?
Посмотрел презентацию: https://www.youtube.com/watch?v=E98hC9e__Xs
Что ж, поясню для тех, кто мыслит презентациями вместо технических данных.
Давайте начнем с машинного обучения. Нейронная сеть в общем своем виде представляет собой преобразование, которое для трех входов (x1, x2, x3) и четырех выходов нейронов (y1, y2, y3, y4) можно описать как:
y1 = f(x1 * W1_1 + x2 * W1_2 + x3 * W1_3)
y2 = f(x1 * W1_2 + x2 * W2_2 + x3 * W2_3)
y3 = f(x1 * W1_3 + x2 * W3_2 + x3 * W3_3)
y4 = f(x1 * W1_4 + x2 * W4_3 + x3 * W4_3)
где f — это передаточная функция нейрона. Здесь я для упрощения убрал смещение из вычислений.
Математически это перемножение матриц, после которого по результирующей матрице проходятся передаточной функцией:
| x1 |
| x2 |
Х | x3 |
| W1_1 W1_2 W1_3 | | y1(f) |
| W2_1 W2_2 W2_3 | | y2(f) |
| W3_1 W3_2 W3_3 | | y3(f) |
| W4_1 W4_2 W4_3 | | y4(f) |
Мы умножили матрицу 3x4 на матрицу 1х3, затратив на это 4х3х1 = 12 умножений и 4х(3-1)х1 = 8 сложений. Если кто не в курсе, что такое уножение матриц:
https://ru.wikipedia.org/wiki/Умножение_матриц
Что такое тензорные ядра в нвидии. Это тупо вычислитель в составе потокового процессора, который берет три матрицы A, B, C размера 4х4, и вычисляет A x B + C. В данном случае матрица C — это смещения, которые нам не интересны. Сложность самого умножения матриц 4х4 — 4х4х4 = 64 умножения и 4х3х4 = 48 сложений.
Знакомый с продвинутой математикой человек сразу заметит, что в простой нейронной сети входные сигналы представляют собой одномерную матрицу, а вычислитель считает произведение двух двухмерных. Чтобы на полную катушку загрузить вычислитель, нужно иметь несколько наборов входных данных. А это именно то, что делает сверточная нейронная сеть — она проходит одной маской по всему изображению, уменьшая размерность данных. Таким образом одна большая входная картинка превращается в большое число маленьких входных картинок, пропускаемых по одним и тем же весам. То есть, тензорные ядра специализируются на ускорении обработки изображений.
Итак, 64 умножения и 48 сложений тензорное ядро выполняет за один цикл. По этой причине два таких ядра занимают столько же места, сколько 16 универсальных вычислителей с одинарной точностью, которые числа половинной точности считают по два за такт. При этом значения в матрицах A и B в операции «A x B + C» задаются в половинной точности (2 байта), а смещение C и результат — с одинарной точностью (4 байта). Ну типа сто помножить на сто — будет десять тысяч, число намного больше, потому множители вроде как должны быть меньше произведения по размеру.
Сколько же тактов нужно будет универсальным вычислителям для реализации тех же функций суперскоростных тензорного ядра? На 64 умножения половинной точности им нужно будет 64/16/2 = 2 цикла, на сложения с одинарной — 48/16 = 3 цикла. Итого 5 циклов, пятикратная разница производительности. Это примерно та цифра, которую вы увидите на реальных бенчах, например:
https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/#att...
то есть, 3-6 раз вместо маркетингового булшита про 8-20 раз ускорения.
Для тех, кто занимался высокопроизводительными вычислениями, может показаться логичным вопрос: а как весь этот массив данных будет читаться из памяти? Пропускная способность канала оперативной памяти не бесконечная, вы не можете просто пятикратно увеличить производительность процессора — нужно будет пятикратно увеличивать ширину канала памяти. Однако же, если вы посмотрите на спецификации, то увидете, что 1080 c 3840 шейдерными ядрами имела канал 550 Гб/с, а 3070 с 5900 ядрами имеет канал 512 Гб/с — удельная пропускная способность снизилась. Да, это первое, с чем столкнется юный программист сосбтвенных нейросеток на видеокарте — если плохо работать с кэшем, то никакого ускорения не будет. В случае сверточной сети маски остаются в кэше, а подгружаются части картинки.
Причем, как показали бенчи, где-то в районе матрицы 8129х8192 производительность тензорных вычислений падает эдак на 40%: https://sci-hub.tw/10.1007/978-3-030-10549-5_35 - Benchmarking the NVIDIA V100 GPU and Tensor Cores
То есть, при применении самых оптимальных алгоритмов, карточка оптимизирована под изображение 8к. Причем, такого завала нет для обычных шейдеров.
Что же мы имеем в сухом остатке? 20% чипа заняты узкоспециализированными вычислителями для ускорения сверточных нейронных сетей, обрабатывающих изображения разрешением до 8к. Если бы вместо тензорных ядер нвидия поставила бы в два раза больше АЛУ одинарной точности, то 3-6 раз ускорения превратились бы в 2-3 раза ускорения, причем, не затыкающегося на больших разрешениях из-за ширины канала памяти.
Далее перейдем к трассировке лучей. Это по сути ASIC, занимающий примерно 20% площади кристалла, интерфейсов к которому у простого смертного нет, и всё, что мы о нем знаем — это что оно считает пересечение лучей с многогранниками, и делает это очень быстро. Замечательные алгоритмы для задания команд этим ASIC-ам будут содержаться исключительно в проприетарных драйверах нвидии. И если нвидия еще как-то пытается впарить перемножение матриц на тензорных ядрах для решения задач оптимизации/решения системы линейных уравнений, то трассировка лучей, судя по всему, настолько специализированная и бесполезная, что интерфейсы к ней даже не открыты.
А это значит, что драйвера нвидии станут больше, сложнее, и надежнее. Примерно как GeForce Experience, которая периодически превращает топовый графен-кинцо в тыкву с 10 фпс, и возвращает на 60 фпс после удаления софтины.
основной профит от лучей сначала будет для разработчиков игр и тридемоделеров
И вот я сижу и думаю: а чем же это лучи помогут мне проще разрабатывать игорь? Поскольку большинство карточек на рынке не имеют наглухо закрытых проприетарных интерфейсов для трассировки, особенно ноутбуки и игровые консоли, то разрабам придется делать версии с трассировкой и без — упростили себе работу? Не думаю.
В презентации упоминалось повышение разрешения изображния при помощи нейросеток. По сути, нейронная сеть распознает некоторые заранее изученные анимации по отдельным элементам, и воспроизводит анимацию в высоком разрешении. В презентации показан удачный пример — но они не показали неудачных примеров, когда нейросетка всовывает артефакты в изображения, некорректно распознавая анимацию. Недостаток нейросеток — это их плохая предсказуемость, так что артефакты вы не найдете до тех пор, пока не воспроизведете тестовую сцену. Чтобы максимизировать полезный эффект и минимизировать вредный, сцен должно быть меньше и нужно больше времени потратить на отыскивание нераспознающихся важных анимаций — как той самой надписи на ящике, которая даже в полном честном разрешении отрисовывается хуже, чем в восстановленном нейросеткой из пониженного разрешения. Очевидно, на эту надпись разрабы сетку натаскали. Что делать разрабам рогаликов с открытым миром и случайными событиями в онном? Забыть про эту фичу, как про страшный сон.