Русский
Русский
English
Статистика
Реклама

Gpu

Чистый Cython VS nvc жжем металлические пластины на GPU для сравнения скорости

11.01.2021 20:23:30 | Автор: admin
image

image
Будем греть металлические пластины на GPU

Все знают, что Python не блещет скоростью сам по себе. На мой взгляд язык прекрасен своей читабельностью, но основная ниша его применения там, где вы большую часть времени ожидаете ввода/вывода каких-то данных. Условно, вы можете написать суперпроизводительный код на Rust или С, но 99% времени он будет просто ждать.

Тем не менее, Python прекрасен еще и как высокоуровневый синтаксический клей. В этом случае, его неторопливая интерпретируемая часть вызывает быстродействующий код, написанный на компилируемых языках программирования. Обычно для этого используются такие традиционные библиотеки как NumPy.

Но мы пойдем чуть дальше попробуем распараллелить вычисления на CUDA и задействуем странный, но работающий гибрид C++, stdpar и компилятора nvc++ от Nvidia. Ну и заодно попробуем оценить быстродействие. Возьмем две задачи: сортировку чисел и метод Якоби, которым будем рассчитывать нагрев металлической пластины.

Вызываем C++ из Python


Наш код сортировки будет иметь следующий вид:

# distutils: language=c++from libcpp.algorithm cimport sortdef cppsort(int[:] x):    sort(&x[0], &x[-1] + 1)

В первой строчке мы явно указываем, что Cython должен использовать C++, а не дефолтный C. Во второй мы импортируем функцию сортировки из C++, а дальше следует сама логика. Помещаем код в файл cppsort.pyx. Обратите внимание, что расширение отличается от привычного py, так как мы будем его компилировать или выполнять cythonize в терминологии Cython.

Компиляцию можно выполнить вручную или включить в setup.py, где мы полноценно описываем подготовку нашего окружения.

В setup.py это выглядит примерно так:

from setuptools import setupfrom Cython.Build import cythonizesetup(    ext_modules = cythonize("cppsort.pyx"))

Но мы можем и просто выполнить это в командной строке:

cythonize -i cppsort.pyx

Под капотом произойдет примерно следующее:

image

  1. Cython транслирует python код в C++ и сгенерирует валидный cppsort.cpp.
  2. C++ компилятор (в данном случае g++) компилирует C++ код в Python extension module
  3. Python extension module импортируется в код как обычный питоновский модуль.

После компиляции можем импортировать и сразу протестировать сортировку:

from cppsort import cppsortimport numpy as npx = np.array([4, 3, 2, 1], dtype="int32")print(x)cppsort(x)print(x)

Массив [4, 3, 2, 1] успешно отсортируется в [1, 2, 3, 4] с помощью C++ std::sort.

А давайте на GPU?


Стандартные библиотечные алгоритмы C++ могут вызываться с указанием аргумента parallel execution policy. Этот аргумент говорит компилятору о том, что вы хотите раскидать алгоритм на параллельные процессы.

При этом C++ имеет несколько вариантов этой политики:

  1. std::execution::seq: Последовательное выполнение. Параллельность запрещена.
  2. std::execution::unseq: Векторизированное выполнение в рамках вызвавшего потока.
  3. std::execution::par: Параллельное выполнение в одном и более потоках.
  4. std::execution::par_unseq: Параллельное выполнение в одном и более потоках. Каждый поток будет по возможности векторизирован.

При этом вы сами должны следить за race condition и deadlock. Стандартный компилятор g++ постарается распределить вычисления на ядра CPU. Но мы можем взять проприетарный компилятор от Nvidia nvc++ и скормить ему опцию "-stdpar". stdpar это C++ Standard Parallelism от Nvidia с выполнением параллельного кода на GPU.

Перепишем код, с учетом необходимости создавать локальную копию массива, так как GPU не сможет получить доступ к массиву, расположенному в рамках NumPy.

from libcpp.algorithm cimport sort, copy_nfrom libcpp.vector cimport vectorfrom libcpp.execution cimport pardef cppsort(int[:] x):    cdef vector[int] temp    temp.resize(len(x))    copy_n(&x[0], len(x), temp.begin())    sort(par, temp.begin(), temp.end())    copy_n(temp.begin(), len(x), &x[0])

image

Теперь это нужно снова скомпилировать, но уже с использованием nvc++. В этот раз напишем нормальный setup.py и вызовем его:

CC=nvc++ python setup.py build_ext --inplace

Импортируем в код и пробуем вызвать:

x = np.array([4, 3, 2, 1], dtype="int32")cppsort(x) # этот кусок выполняется на GPU

Производительность


Традиционно GPU хороши там, где есть много однотипных легковесных вычислений. Тяжелые задачи одиночные задачи GPU не подойдут. Более того, стоит учитывать объем ваших данных. Если у вас немного данных, то вы получите большой оверхед на процесс распараллеливания, ввод/вывод на между CPU и GPU. В итоге, такой код скорее всего наиболее эффективно будет выполняться на чистом CPU, иногда даже в пределах одного ядра, если данных совсем немного. Но на больших массивах GPU однозначно будет впереди.

Вот тут есть отличное сравнение сортировки. За единицу брали скорость NumPy, а затем считали кратность прироста скорости в каждом методе относительно него.


image

Как мы видим, гипотеза о том, что выигрыш в использовании GPU на большом количестве данных растет, подтверждается.

Вычисляем нагрев пластины


Возьмем задачу более приближенную к реальному инженерному моделированию вычислениям по методу Якоби. В частности, они отлично подходят для вычисления температурных процессов в 2D-пространстве.

image

Код для симуляции
"""simulates heat equation on rectangle returning a heat map at a number of timesboundary and initial conditions are 0, source represents burner on a stoveThis program is based on the script FEniCS tutorial demo program: Diffusion of a Gaussian hill.       u'= Laplace(u) + f  in a square domain  u = u_D = 0            on the boundary  u = u_0 = 0            at t = 0  u_D = f = stove burner flameThis program succesfully runs in the fenics docker image, see the book Solving PDEs in Python.to animate: convert -delay 4 -loop 100 heatequation10*.png heatstovelinn.gifto crop:convert heatstovelinn.gif -coalesce -repage 0x0 -crop 810x810+95+15 +repage heatstovelin.gif"""from fenics import *import timeimport matplotlib.pyplot as pltfrom matplotlib import cm# Create mesh and define function spacenx = ny = 100mesh = RectangleMesh(Point(-2, -2), Point(2, 2), nx, ny)V = FunctionSpace(mesh, 'P', 1)# Define boundary, source, initialdef boundary(x, on_boundary):    return on_boundarybc = DirichletBC(V, Constant(0), boundary)u_0 = interpolate(Constant(0), V)f = Expression('exp(-sqrt(pow((a*pow(x[0], 2) + a*pow(x[1], 2)-a*1),2)))', degree=2, a=5) #steep guassian centred on the unit spherefinal_time = 0.035num_pics = 72for i in range(num_pics):    T =   final_time*(i+1.0)/(num_pics+1)      #solve time even space    #T = final_time*1.1**(i-num_pics+1)        #solve time log  space    num_steps = 30    dt = T / num_steps # time step size    # Define variational problem    u = TrialFunction(V)    v = TestFunction(V)    F = u*v*dx + dt*dot(grad(u), grad(v))*dx - (u_0 + dt*f)*v*dx    a, L = lhs(F), rhs(F)    # Time-stepping    u = Function(V)    t = 0    for n in range(num_steps):        t += dt              #step        solve(a == L, u, bc) #solve        u_0.assign(u)        #update    #plot solution    plot(u,cmap=cm.hot,vmin=0,vmax=0.07)    plt.axis('off')    plt.savefig('heatequation10%s.png'%(i+10),figsize=(8, 8), dpi=220,bbox_inches='tight', pad_inches=0,transparent=True)


Напишем аналогичный солвер на Cython для последующей компиляции по CUDA:

# distutils: language=c++# cython: cdivision=Truefrom libcpp.algorithm cimport swapfrom libcpp.vector cimport vectorfrom libcpp cimport bool, floatfrom libc.math cimport fabsfrom algorithm cimport for_each, any_of, copyfrom execution cimport par, seq cdef cppclass avg:    float *T1    float *T2    int M, N     avg(float* T1, float *T2, int M, int N):        this.T1, this.T2, this.M, this.N = T1, T2, M, N    inline void call "operator()"(int i):        if (i % this.N != 0 and i % this.N != this.N-1):            this.T2[i] = (                this.T1[i-this.N] + this.T1[i+this.N] + this.T1[i-1] + this.T1[i+1]) / 4.0cdef cppclass converged:    float *T1    float *T2    float max_diff     converged(float* T1, float *T2, float max_diff):        this.T1, this.T2, this.max_diff = T1, T2, max_diff     inline bool call "operator()"(int i):        return fabs(this.T2[i] - this.T1[i]) > this.max_diff def jacobi_solver(float[:, :] data, float max_diff, int max_iter=10_000):    M, N  = data.shape[0], data.shape[1]    cdef vector[float] local    cdef vector[float] temp    local.resize(M*N)    temp.resize(M*N)    cdef vector[int] indices = range(N+1, (M-1)*N-1)    copy(seq, &data[0, 0], &data[-1, -1], local.begin())    copy(par, local.begin(), local.end(), temp.begin())    cdef int iterations = 0    cdef float* T1 = local.data()    cdef float* T2 = temp.data()     keep_going = True    while keep_going and iterations < max_iter:        iterations += 1        for_each(par, indices.begin(), indices.end(), avg(T1, T2, M, N))        keep_going = any_of(par, indices.begin(), indices.end(), converged(T1, T2, max_diff))        swap(T1, T2)     if (T2 == local.data()):        copy(seq, local.begin(), local.end(), &data[0, 0])    else:        copy(seq, temp.begin(), temp.end(), &data[0, 0])    return iterations

image

image

В итоге отрыв GPU получается еще более существенным.

Минусы


  1. Написание такого кода несколько сложнее, чем чистого варианта на Python и требует понимания принципов работы параллельных вычислений на GPU.
  2. Требуется копирование данных в отдельный массив для передачи на GPU, куда видеокарта не имеет доступа. Это может быть проблемой при работе с очень большими массивами.

Подробнее..

Перевод Как параллельные вычисления повлияют на индустрию безопасности?

13.04.2021 20:10:28 | Автор: admin

У центральных и графических процессоров разная архитектура и разные сценарии использования. ЦП это мозг большинства наших электронных устройств. Они хорошо справляются с множеством различных задач. Это процессоры очень общего назначения, координирующие широкий спектр задач, которые выполняет компьютер. С другой стороны, графические процессоры гораздо более специализированные вычислительные системы. Они предназначены для эффективной обработки 3D-изображений, но визуализация графики это очень большая вычислительная нагрузка на матричную арифметику. Типы вычислений, в которых графическим процессорам нет равных, называются параллельными вычислениями, то есть это задачи, которые можно разделить на меньшие, независимые вычисления и выполнять одновременно. И этому потенциалу находится нетипичное применение.


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

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

Если посмотреть на то, как количество ядер в графическом процессоре меняется со временем, видно, что последние несколько лет оно растёт экспоненциально. И в то время как большинство центральных процессоров имеет несколько десятков ядер, графические процессоры насчитывают тысячи ядер. В новейших высокопроизводительных графических процессорах компании Nvidia более 10 000 ядер.

Этот беспрецедентный рост привёл к тому, что разработчики начали изучать возможности применения графических процессоров не только для графической обработки, но и для того, что теперь известно как неспециализированные вычисления на графических процессорах (GPGPU).

Чтобы помочь разработчикам использовать все возможности графических процессоров и позволить центральным и графическим процессорам обрабатывать данные в двух направлениях, компания Nvidia создала программную платформу CUDA, которая облегчает разработчикам создание приложений с использованием API.

Они всегда сотрудничают с разработчиками в целях реструктуризации алгоритмов, используемых в их приложениях, чтобы использовать аппаратное обеспечение Nvidia с максимальной отдачей. В результате достигнута очень хорошая интеграция с широко используемыми приложениями, такими как Adobe Photoshop CC, Adobe Premiere CC и Autodesk Maya.

Платформу CUDA можно скачать бесплатно, но для работы с ней требуется графический процессор Nvidia. Также существует альтернатива с открытым исходным кодом OpenCL, которая служит основной платформой для обработки графики на графических процессорах AMD. Компания Nvidia поддерживает OpenCL, но, так как платформа CUDA разрабатывается для работы с оборудованием Nvidia, она показывает более высокую производительность при работе на графических процессорах Nvidia.

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

Рассмотрим сценарий, в котором требуется вручную сложить две матрицы 20x20. Вы зовёте ещё 19 друзей и говорите им, что каждый из них отвечает за вычисление одной строки, а затем вы снова объединяете результаты в одну матрицу.

Поскольку каждый элемент матрицы можно рассчитать независимо, вы можете выполнять собственные вычисления, не вмешиваясь в расчёты своих друзей; все вы можете делать свои вычисления параллельно.

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

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

Для простоты предположим, что:

  • Им известно, что приложение ограничивает пароли пользователей 10 символами.

  • Они могут только попытаться перебрать пароли (предположим, что нет словаря, нет масок и нет радужных таблиц).

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

Они должны будут повторить это для всех комбинаций символов, включая все 10 допустимых символов.

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

Однако результат вычисления одного хэша не влияет на вычисления других хэшей, поэтому мы можем ускорить этот процесс в тысячи раз, вычисляя их параллельно. Более того, скорость можно увеличить ещё больше, используя кластер с несколькими графическими процессорами.

У параллельных вычислений много других применений, многие из которых чрезвычайно ценны для общества, например прогноз погоды для сельского хозяйства, общественный транспорт и выявление спама.

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

FPGA и ASIC

Увеличение скорости хэширования в 100 раз с помощью графических процессоров плохая новость для людей, которые пытаются надёжно хранить пароли.

Однако не все алгоритмы хэширования уязвимы для атак с ускорением на основе графических процессоров.

Чтобы сделать алгоритмы хэширования более устойчивыми к таким атакам, разработчики пытаются заставить алгоритмы использовать большой объём памяти, чтобы увеличить вычислительные затраты такой атаки.

bcrypt один из таких алгоритмов.

Когда компьютер вычисляет bcrypt-хэш, большая часть времени тратится впустую на ожидание следующей команды, которая поступает из более медленной памяти в более быструю (подробнее об этом чуть позже), а не на вычисление хэшей.

FPGA и ASIC это вычислительные устройства двух других типов, которые играют решающую роль в параллельных вычислениях.FPGA, или программируемые пользователями вентильные матрицы, это интегральные схемы, которые после изготовления можно перепрограммировать под конкретные задачи. Такое оборудование может быть оптимизировано для конкретного применения.

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

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

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

Обратная сторона заключается в том, что разработка заказных микросхем обходится дорого, так как помимо производственных затрат требуются затраты на исследования и разработку.

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

Вот почему вы, вероятно, слышали о ASIC-микросхемах для майнинга биткойнов. Эти микросхемы могут делать только одно вычислять двойные хэши SHA256, а в настоящее время майнинг биткоинов достаточно прибылен, чтобы оправдать их производство.

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

Можно ли ASIC-микросхемы вместо майнинга биткоинов использовать взлома паролей?

Как я уже сказал, ASIC-микросхемы разрабатываются с нуля с одной целью, и в случае установок для майнинга биткойнов эта задача заключается в вычислении двойных хэшей SHA256.

Такие установки не могут делать ничего, кроме этого. Они полезны, только если пароли, которые пытаются взломать злоумышленники, были дважды хэшированы по алгоритму SHA256, что маловероятно.

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

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

FPGA-установки для взлома Bcrypt-паролей

Несмотря на то что FPGA менее эффективны, чем ASIC, для специализированного применения, такого как вычисление хэшей по определенному алгоритму, они компенсируют это большей дешевизной и универсальностью.

Давайте посмотрим, как FPGA смогут преодолеть ограничения графических процессоров при взломе bcrypt.

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

Для вычисления bcrypt-хэша процессору придётся постоянно обращаться к инструкциям, хранящимся в памяти. У каждого ядра есть быстрый, но небольшой объём памяти (кэш L1). Если в памяти L1 недостаточно места для вычисления хэша, данные должны храниться в более медленной основной оперативной памяти графического процессора, общей для всех ядер.

Передача этих данных обходится дорого, и это создаёт огромное узкое место для количества хэшей в секунду, которое может вычислить компьютер. Большая часть времени вычисления bcrypt-хэшей тратится впустую в ожидании поступления данных из основной памяти в более быструю память, чтобы можно было вычислить хэш.

Это не проблема для FPGA-микросхем, потому что у них более чем достаточно памяти L1 для работы с bcrypt-хэшами.

Персонал службы уведомлений о нарушении паролей Scattered Secrets хотел проверить это, поэтому они построили кластер из FPGA-микросхем, способный взламывать bcrypt примерно в 3540 раз быстрее, чем современные высокопроизводительные графические процессоры, используя только около 5% мощности.

Используя RTX 2080Ti в качестве бенчмарка, они получили 54 тысячи bcrypt-хэшей в секунду на своей тестовой установке, в то время как установка, которую они построили с 18 четырёхъядерными FPGA-платами Spartan-6 LX150, выдавала 2,1 миллиона bcrypt-хэшей в секунду.

Имейте в виду, что это не самые современные FPGA-микросхемы: они были введены ещё в 2011 году. Эти платы были популярным инструментом, потому что они поддерживали Jack The Ripper, популярное программное обеспечение для взлома паролей. Поскольку приложения для взлома паролей начинают поддерживать новые микросхемы, скорость таких атак будет только увеличиваться.

Заглядывая в будущее

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

Всегда будут существовать финансовые стимулы разработки новых технологий для решения сложных проблем, с которыми мы сталкиваемся как общество. Число ядер в одном графическом процессоре выросло с 1 ядра в 1995 году до 24 ядер в 2006 году, затем подскочило до 128 ядер в 2009 году и продолжило расти экспоненциально до 10 000 и выше к 2021 году.

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

Одно из наиболее перспективных в будущем разработок в области параллельных вычислений квантовые вычисления.

По мере приближения к концу закона Мура (который гласит, что число транзисторов в микросхемах удваивается каждые два года), исследователи пытаются найти способы сохранения экспоненциального роста скорости, с которой мы можем делать сложные вычисления. Квантовые компьютеры могут полностью революционизировать искусственный интеллект (которому уделяется время на курсах Machine Learning и Machine Learning и Deep Learning), конечно же, индустрию безопасности, которой посвящен наш отдельный курс по Этичному хакингу.

Узнайте, как прокачаться в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

Перевод Используем GPU для повышения производительности JavaScript

06.05.2021 14:05:14 | Автор: admin
image

Мы, разработчики, всегда стремимся искать возможности повышения производительности приложений. Когда речь идёт о веб-приложениях, то улучшения обычно вносятся только в код.

Но думали ли вы об использовании мощи GPU для повышения производительности веб-приложений?

В этой статье я расскажу о библиотеке ускорения JavaScript под названием GPU.js, а также покажу вам, как повысить скорость сложных вычислений.

Что такое GPU.js и почему его стоит использовать?


Если вкратце, GPU.js это библиотека ускорения JavaScript, которую можно использовать для любых стандартных вычислений на GPU при работе с JavaScript. Она поддерживает браузеры, Node.js и TypeScript.

Кроме повышения производительности если и множество других причин, по которым я рекомендую использовать GPU.js:

  • В основе GPU.js лежит JavaScript, что позволяет использовать синтаксис JavaScript.
  • Библиотека берёт на себя задачу автоматической транспиляции JavaScript на язык шейдеров и их компиляции.
  • Если в устройстве отсутствует GPU, она может откатиться к обычному движку JavaScript. То есть вы ничего не потеряете, работая с GPU.js.
  • GPU.js можно использовать и для параллельных вычислений. Кроме того, можно асинхронно выполнять множественные вычисления одновременно и на CPU, и на GPU.

Учитывая всё вышесказанное, я не вижу никаких причин не пользоваться GPU.js. Давайте узнаем, как его освоить.



Как настроить GPU.js?


Установка GPU.js для ваших проектов похожа на установку любой другой библиотеки JavaScript.

Для проектов Node


npm install gpu.js --saveoryarn add gpu.jsimport { GPU } from ('gpu.js')--- or ---const { GPU } = require('gpu.js')--- or ---import { GPU } from 'gpu.js'; // Use this for TypeScriptconst gpu = new GPU();

Для браузеров


Скачайте GPU.js локально или воспользуйтесь его CDN.

<script src="dist/gpu-browser.min.js"></script>--- or ---<script   src="http://personeltest.ru/aways/unpkg.com/gpu.js@latest/dist/gpu- browser.min.js"></script><script   rc="http://personeltest.ru/aways/cdn.jsdelivr.net/npm/gpu.js@latest/dist/gpu-browser.min.js"></script><script> const gpu = new GPU(); ...</script>

Примечание: если вы работаете в Linux, то нужно убедиться, что у вас установлены нужные файлы, при помощи команды: sudo apt install mesa-common-dev libxi-dev

Вот и всё, что нужно знать об установке и импорте GPU.js. Теперь можно использовать программирование GPU в своём приложении.

Кроме того, я крайне рекомендую разобраться в основных функциях и концепциях GPU.js. Итак, давайте начнём с основ GPU.js.

Создание функций


В GPU.js можно задавать выполняемые на GPU функции при помощи стандартного синтаксиса JavaScript.

const exampleKernel = gpu.createKernel(function() {    ...}, settings);

Показанный выше пример демонстрирует базовую структуру функции GPU.js. Я назвал функцию exampleKernel. Как видите, я использовал функцию createKernel, выполняющую вычисления при помощи GPU.

Также необходимо указать размер выводимых данных. В приведённом выше примере я использовал для задания размера параметр settings.

const settings = {    output: [100]};

Выходные данные функции ядра могут быть 1D, 2D или 3D, то есть можно использовать до трёх потоков. Доступ к этим потокам внутри ядра можно получить с помощью команды this.thread.

  • 1D: [length] value[this.thread.x]
  • 2D: [width, height] value[this.thread.y][this.thread.x]
  • 3D: [width, height, depth] value[this.thread.z][this.thread.y][this.thread.x]

Также созданную функцию можно вызывать как любую функцию JavaScript, по её имени: exampleKernel()

Поддерживаемые ядрами переменные


Число


Внутри функции GPU.js можно использовать любые integer или float.

const exampleKernel = gpu.createKernel(function() { const number1 = 10; const number2 = 0.10; return number1 + number2;}, settings);

Boolean


Булевы значения тоже поддерживаются в GPU.js, аналогично JavaScript.

const kernel = gpu.createKernel(function() {  const bool = true;  if (bool) {    return 1;  }else{    return 0;  }},settings);

Массивы


В функциях ядер можно задавать массивы чисел любого размера и возвращать их.

const exampleKernel = gpu.createKernel(function() { const array1 = [0.01, 1, 0.1, 10]; return array1;}, settings);

Функции


В GPU.js также допустимо использование приватных функций внутри функций ядер.

const exampleKernel = gpu.createKernel(function() {  function privateFunction() {    return [0.01, 1, 0.1, 10];  }  return privateFunction();}, settings);

Поддерживаемые типы вводимых данных


В дополнение к вышеуказанным типам переменных функциям ядер можно передавать множество других типов вводимых данных.

Числа


Функциям ядер можно передавать числа integer или float, аналогично объявлению переменных, см. пример ниже.

const exampleKernel = gpu.createKernel(function(x) { return x;}, settings);exampleKernel(25);

1D-, 2D- или 3D-массивы чисел


Ядрам GPU.js можно передавать типы массивов Array, Float32Array, Int16Array, Int8Array, Uint16Array, uInt8Array.

const exampleKernel = gpu.createKernel(function(x) { return x;}, settings);exampleKernel([1, 2, 3]);

Функции ядер также могут получать сжатые в одномерные (preflattened) 2D- и 3D-массивы. Такой подход сильно ускоряет загрузку, для этого нужно использовать опцию GPU.js input.

const { input } = require('gpu.js');const value = input(flattenedArray, [width, height, depth]);

HTML-изображения


По сравнению с традиционным JavaScript, передача в функции изображений является новой возможностью GPU.js. При помощи GPU.js можно передавать функции ядра одно или несколько HTML-изображений в виде массива.

//Single Imageconst kernel = gpu.createKernel(function(image) {    ...})  .setGraphical(true)  .setOutput([100, 100]);const image = document.createElement('img');image.src = 'image1.png';image.onload = () => {  kernel(image);    document.getElementsByTagName('body')[0].appendChild(kernel.canvas);};//Multiple Imagesconst kernel = gpu.createKernel(function(image) {    const pixel = image[this.thread.z][this.thread.y][this.thread.x];    this.color(pixel[0], pixel[1], pixel[2], pixel[3]);})  .setGraphical(true)  .setOutput([100, 100]);const image1 = document.createElement('img');image1.src = 'image1.png';image1.onload = onload;....//add another 2 images....const totalImages = 3;let loadedImages = 0;function onload() {  loadedImages++;  if (loadedImages === totalImages) {    kernel([image1, image2, image3]);     document.getElementsByTagName('body')[0].appendChild(kernel.canvas);  }};

Кроме вышеперечисленного, для экспериментов с GPU.js можно выполнять множество других интересных операций. Они описаны в документации библиотеки. Так как теперь вы знаете основы, давайте напишем функцию с использованием GPU.js и сравним её производительность.

Первая функция с использованием GPU.js


Скомбинировав всё вышеописанное, я написал небольшое angular-приложение для сравнения производительности вычислений на GPU и CPU на примере перемножения двух массивов из 1000 элементов.

Шаг 1 функция для генерации числовых массивов из 1000 элементов


Я сгенерирую 2D-массив с 1000 чисел для каждого элемента и использую их для вычислений на последующих этапах.

generateMatrices() { this.matrices = [[], []]; for (let y = 0; y < this.matrixSize; y++) {  this.matrices[0].push([])  this.matrices[1].push([])  for (let x = 0; x < this.matrixSize; x++) {   const value1 = parseInt((Math.random() * 10).toString())   const value2 = parseInt((Math.random() * 10).toString())   this.matrices[0][y].push(value1)   this.matrices[1][y].push(value2)  } }}

Шаг 2 -функция ядра


Это самое важное в данном приложении, поскольку все вычисления на GPU происходят внутри неё. Здесь мы видим функцию multiplyMatrix, получающую в качестве входных данных два массива чисел и размер матрицы. Функция перемножит два массива и вернёт общую сумму, а мы будем измерять время при помощи API производительности.

gpuMultiplyMatrix() {  const gpu = new GPU();  const multiplyMatrix = gpu.createKernel(function (a: number[][], b: number[][], matrixSize: number) {   let sum = 0;     for (let i = 0; i < matrixSize; i++) {    sum += a[this.thread.y][i] * b[i][this.thread.x];   }   return sum;  }).setOutput([this.matrixSize, this.matrixSize])  const startTime = performance.now();  const resultMatrix = multiplyMatrix(this.matrices[0],  this.matrices[1], this.matrixSize);    const endTime = performance.now();  this.gpuTime = (endTime - startTime) + " ms";    console.log("GPU TIME : "+ this.gpuTime);  this.gpuProduct = resultMatrix as number[][];}

Шаг 3 функция умножения на CPU


Это традиционная функция TypeScript для измерения времени вычисления для тех же массивов.

cpuMutiplyMatrix() {  const startTime = performance.now();  const a = this.matrices[0];  const b = this.matrices[1];  let productRow = Array.apply(null, new Array(this.matrixSize)).map(Number.prototype.valueOf, 0);  let product = new Array(this.matrixSize);    for (let p = 0; p < this.matrixSize; p++) {    product[p] = productRow.slice();  }    for (let i = 0; i < this.matrixSize; i++) {    for (let j = 0; j < this.matrixSize; j++) {      for (let k = 0; k < this.matrixSize; k++) {        product[i][j] += a[i][k] * b[k][j];      }    }  }  const endTime = performance.now();  this.cpuTime = (endTime  startTime) +  ms;  console.log(CPU TIME : + this.cpuTime);  this.cpuProduct = product;}

Полный демо-проект можно найти в моём аккаунте GitHub.

CPU против GPU сравнение производительности


Настало время проверить, справедлива ли вся эта шумиха вокруг GPU.js и вычислений на GPU. Так как в предыдущем разделе я создал Angular-приложение, я использовал его для измерения производительности.


CPU и GPU время выполнения

Как мы видим, программе на GPU потребовалось для вычислений всего 799 мс, а CPU потребовалось 7511 мс, почти в 10 раз дольше.

Я решил на этом не останавливаться и провёл те же тесты в течение ещё пары циклов, изменив размер массива.


CPU и GPU

Сначала я попробовал использовать массивы меньшего размера, и заметил, что CPU потребовалось меньше времени, чем GPU. Например, когда я снизил размер массива до 10 элементов, CPU потребовалось всего 0,14 мс, а GPU 108 мс.

Но с увеличением размера массивов возникала чёткая разница между временем, требуемым GPU и CPU. Как видно из показанного выше графика, GPU побеждает.

Вывод


Из моего эксперимента по использованию GPU.js можно сделать вывод, что он может значительно повышать производительность JavaScript-приложений.

Но стоит подходить с умом и использовать GPU только для сложных задач. В противном случае мы впустую потратим ресурсы, а в конечном итоге и снизим производительность приложений, что видно из представленного выше графика.



На правах рекламы


VDS для проектов и задач любых масштабов это про наши эпичные серверы! Новейшие технологии и оборудование, качественный сервис. Поспешите заказать!

Подписывайтесь на наш чат в Telegram.

Подробнее..

Перевод Как избавиться от разрыва кадров и задержки ввода в играх

18.03.2021 12:07:58 | Автор: admin
image

Разрыв кадров (screen tear) или задержка ввода (input lag)? Использовать ли vsync? Очень долгое время в мире игр для PC это был вопрос или-или. Можно добиться или картинки без разрыва кадров, или низкой задержки ввода. Но невозможно получить и то, и другое. Или можно?

Ответ на этот вопрос неоднозначен. Если у вас уже есть современный игровой монитор с поддержкой переменной частоты обновления (FreeSync или G-Sync), то вам эта статья вообще не нужна. Но если у вас обычный монитор с постоянной частотой обновления или если вы любите играть в игры на телевизоре, то данная статья поможет вам снизить разрыв кадров и задержку ввода.

Используя ограничение кадров с миллисекундной точностью в RTSS (Rivatuner Statistics Server), можно обеспечить vsync с низкой задержкой. Что мы получим в результате? Чёткую картинку без разрывов кадров и задержку ввода на 50 мс меньше, чем при обычном vsync.

Это одно из тех немногих улучшений PC, которые могут значительно повысить удобство в играх с минимальными компромиссами и совершенно бесплатно. Что же это такое? И как этого добиться? В этой статье мы расскажем всё подробно и шаг за шагом.


Ужасный разрыв кадров с отключенным vsync

Что такое задержка ввода?


Прежде чем приступать к решению проблемы, неплохо бы понять, что конкретно мы будем делать. Vsync с низкой задержкой это методика, позволяющая снизить задержку ввода. Что это означает? Когда вы печатаете на клавиатуре или перемещаете мышь, существует небольшая, почти неразличимая задержка между вашим действием и выводом на экран. Эта задержка настолько мала, что измеряется в миллисекундах. Если вы используете компьютер для чтения Интернета или казуальных игр, это не влияет на процесс ощутимым образом.

Однако в напряжённых ситуациях, например, в киберспортивных шутерах, важна каждая миллисекунда. Несколько миллисекунд задержки ввода могут решить судьбу хедшота или смерти вашего героя.

У всех мониторов (и телевизоров) по умолчанию добавляется определённая величина задержки ввода. Обычно она зависит от типа используемой панели. Панели IPS и TN с высокой частотой обновления по умолчанию обеспечивают наименьшую задержку ввода. У некоторых мониторов она составляет всего 0,5 мс. Панели VA обычно имеют задержку ввода побольше, у многих она достигает 8-10 мс. Телевизоры (в которых часто используют панели VA) обычно проявляют себя хуже всего, у некоторых задержка составляет до 30 мс или даже больше.

Когда vsync отключен, GPU компьютера отправляет отрендеренные кадры на дисплей с максимально возможной скоростью. Так как скорость вывода кадров на дисплей ограничена (у дисплеев с частотой 60 Гц это один кадр раз в 16,66 мс), разрыв кадров происходит, когда новый кадр прибывает до того, как с экрана пропал предыдущий.

Когда включен традиционный vsync, GPU больше не может заменять содержимое буфера монитора новым кадром, прежде чем старый кадр не получит свои 16,66 мс славы. Это означает, что каждый кадр удаётся отобразить полностью и устранить разрыв кадров. Однако это заставляет GPU составлять очередь из кадров, а не отправлять их максимально быстро.

Из-за создания очереди традиционный vsync может добавлять до 50 мс задержки вдобавок к стандартной задержке дисплея. Здесь на сцене появляется vsync с низкой задержкой.

С помощью vsync с низкой задержкой (low-lag vsync) мы, по сути, ограничиваем частоту кадров (скорость, с которой GPU передаёт кадры) числом, которое слегка ниже частоты обновления монитора. Это мешает GPU отправлять новые кадры до того, как монитор будет готов их выводить. Что мы получим в результате? Игру без разрывов кадров и почти такой же задержкой, как и при отключенном vsync. Теперь поговорим о том, как этого достичь

Что нам понадобится


Прежде чем приступать, вам нужно скачать последнюю версию Rivatuner Statistics Server (RTSS). Также вам понадобится подключение к Интернету, чтобы перейти на эти две страницы для запуска тестов:


В BIOS вашего компьютера должен быть включен HPET (High Precision Event Timer). Если вы по каким-то причинам его выключили, то включите.

Приступаем к работе


Первым делом нам нужно определить истинную частоту обновления монитора. Если у вас дисплей на 60 Гц, то она, вероятно, очень близка к 60, но отличается на несколько сотых секунды. Используйте или UFO Refresh Rate Test, или vsync Tester. Если у вас есть свободное время, то запустите оба и проверьте, совпадают ли значения.

Чтобы протестировать частоту обновления вашего монитора, закройте все остальные вкладки браузера и все фоновые процессы, а затем подождите от 30 секунд до 1 минуты. Тестовая страница покажет частоту обновления вашего дисплея с точностью до нескольких десятичных разрядов. Для следующего шага округлите их до трёх цифр.


Используем UFO Test для определения истинной частоты обновления

Установка и запуск Rivatuner


После установки Rivatuner запустите программу с правами администратора. Затем нажмите на зелёную кнопку Add в левом нижнем углу. Перейдите в папку, где установлена нужная игра. (Стоит учесть, что можно задать параметры и глобально, но мы предпочитаем настраивать их индивидуально для каждой игры).

Выберите исполняемый файл игры, а затем добавьте его в Rivatuner.


Добавляем новую игру в RTSS

Вычисляем величину ограничения кадров


Возьмите частоту обновления с тремя знаками после запятой и вычтите из неё 0,01. Например, если ваша частота обновления равна 60,001, то ограничение кадров будет равно 59,991.

В левой части интерфейса Rivatuner выберите игру. Затем введите значение ограничения частоты кадров в поле рядом с Frame rate limit. Так мы ограничили частоту кадров игры значением ниже частоты обновления монитора. Возможно, с этим значением придётся немного поэкспериментировать. Некоторые игры более чувствительны к ограничению кадров, чем другие: если вы замечаете сильное дрожание, то попытайтесь увеличивать ограничение частоты кадров с инкрементом 0,002.

Включение vsync и запуск


Запустите игру, а затем включите vsync в её настройках. Если вы не можете этого сделать, то включите принудительный vsync на уровне драйвера из панели управления AMD или Nvidia. Вот и всё!

После включения vsync с низкой задержкой вы получите значительно лучшую задержку ввода без разрыва кадров. Однако существуют тонкости, на которые стоит обратить внимание. Vsync с низкой задержкой лучше всего работает, если ваша система способна устойчиво работать с частотой выше частоты кадров монитора. Если она достигает отметки только в 60 FPS, то включение этой функции может вызвать дополнительные рывки при снижении частоты кадров.

Scanline sync: ещё более удобная альтернатива


Если вы не хотите экспериментировать с дробными ограничениями частоты кадров, то у RTSS есть альтернатива: scanline sync. Синхронизация строк развёртки (Scanline sync) позволяет управлять тем, где на экране происходит разрыв кадров с отключенным vsync.

Как это поможет? Разрыв кадра отображается как одна строка, которую мы сможем переместить на край экрана, в самый верх или низ, где он, по сути, исчезнет. Для включения scanline sync нужно отключить ограничение частоты кадров, задав в RTSS Framerate limit равным 0 и отключив внутриигровой или драйверный vsync.


Теперь решим, где мы хотим разместить строку развёртки. Можно с этим поэкспериментировать, но в идеале стоит взять вертикальное разрешение монитора (1440, если это монитор 1440p), а затем вычесть 10-20. Введите это число в поле Scanline Sync. S-Sync часто обеспечивает даже меньшую задержку ввода, чем vsync с низкой задержкой.

Однако для оптимальной работы потребуется мощная система (или не очень требовательная игра). В играх, где уровень загрузки GPU постоянно выше 80 процентов, S-Sync не имеет достаточной производительности для удерживания линии разрыва на одном месте, что может вызвать значительные рывки.

Эмпирическое правило: используйте S-Sync для не очень требовательных игр, в которых средняя частота кадров может быть значительно выше 60 FPS. Vsync с низкой задержкой следует использовать в играх, которые работают близко к 60 FPS.

Беспроблемная настройка


Некоторые способы настройки производительности PC могут обладать эффектом плацебо или иметь издержки, как, например, в случае с масштабированием разрешения. Но в случае vsync с низкой задержкой вы на самом деле получаете более качественный игровой процесс без всяких компромиссов. Если у вас есть дополнительный ресурс производительности, но вы играете не на игровом мониторе с VRR, то включенный low-lag vsync может изменить ощущения от шутеров и соревновательных игр, в то же время избавив от разрыва кадров.

Для этого не требуется специальное оборудование, а из ПО нужен только RTSS. Если последуете нашим инструкциям, то сможете заметить значительное снижение задержки ввода и повышение отзывчивости во всех ваших играх.



На правах рекламы


Поиграть всегда хорошо, но иногда и работать нужно. Эпичные серверы прекрасный вариант не только для работы, а и для размещения игровых серверов. Вы можете выбрать абсолютно любую ОС или установить систему со своего ISO.

Подробнее..

Собрать сервер для глубокого обучения за пол ляма может и ребенок. Или нет?

25.03.2021 22:22:00 | Автор: admin

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

Сетап

Однажды технический директор пришел на работу, вдохновленный статьей о том, как некий датасаинтист собрал себе мега сервер и экономит на облачной мощности. Он сказал, что нам в кратчайшие сроки нужно что-то такое.

Зачем вообще оно нужно? Если вы все знаете, то переходите сразу к фазе описания выбора мной компонентов. Или читайте дальше! Сервер такой же компьютер, как тот, что стоит у вас на столе, но рассчитанный на долгую нагрузку и собирают его обычно из других деталей. Разница примерно как с автомобилем массового автопрома и спецтехникой вроде грузовика. Он может не быть быстрее, но должен выдерживать большую нагрузку (количество пользователей) и дистанции (время работы под нагрузкой для серверов это могут быть годы). Зачем оно нам? Мы создаем высокополигональные (~1 млн) 3D модели для игр и кино на основе фото, и сейчас занимаемся разработкой инновационных алгоритмов на основе машинного обучения для этой задачи.

Изучив референс, который показал мне мой коллега, я понял, что человек там собрал не сервер, а просто мощный игровой компьютер (какой и вы можете завтра собрать или купить в магазине), но зачем-то вставил туда процессор для сервера. В общем дальше больше. Пока я думал, какая сборка была бы оптимальна, выяснилось, что неплохо бы вставить в наш будущий комп не одну, не две, а ВОСЕМЬ высокопроизводительных видеокарт. Такое обычно геймерам даже не снилось. Почти что майнинг ферма.

Что за задачи хотели мы решать, и каковы вообще требования к компьютеру для машинного обучения? Если обычный компьютер собирается вокруг процессора: главного и универсального вычислительного блока в нем, то для машинного обучения первостепенна видеокарта. Это такой еще один компьютер, который вставляется в ваш компьютер, чтобы помогать процессору решать специфические задачи. Например, строить красивую графику для современных компьютерных игр. Поэтому о видеокарте сейчас мечтает любой подросток (спросите, если у вас есть дети). Но также видеокарта может помогать процессору очень быстро умножать матрицы. Да, прямо как вы на первом курсе технического вуза, видеокарта на самом перемножает матрицы, только не 10 в час, а миллиарды в секунду. В этом плане процессор, как и вы, пользуется правилом строка на столбец, а видеокарта умеет выдавать ответ, как человек дождя, сразу. Если кто не помнит, там у героя талант выполнять мгновенные вычисления (спойлер). Но, как и герою фильма, все остальное дается видеокарте с трудом, и это делает процессор.

В общем, обычно в компьютере может не быть выделенной видеокарты, но тут их должно было быть несколько. Причем именно RTX 3090!? Это не такая простая задача, как кажется.

Изучив вопрос, я пришел к выводу, что невпихуемые восемь прожорливых видеокарт можно впихнуть только на серверной платформе (http://personeltest.ru/aways/www.gigabyte.com/Enterprise/GPU-Server) для GPU. Но даже если такие вообще можно будет найти в России, то стоить это будет ровно полмиллиона, просто за корпус и материнку (без карт и процессоров). Тогда я пораскинул мозгами и предложил три варианта, каждый содержал решение своей задачи.

Первая опция

Собрать просто игровой комп вокруг RTX3090. На обычном процессоре (со своими задачами он справляется не хуже, чем серверный, но в разы дешевле для нас).

Была выбрана такая связка процессор плюс материнка, а сама сборка вышла на 100 тысяч рублей, без учета цены видеокарты.

AMD Ryzen 7 Vermeer 5800X

Asus PRIME X570-P

Прежде чем я опишу более сложные варианты, нужно сказать об особенностях процессора. Для подключения видеокарты мы используем линию PCI Express. По сути это такой же интерфейс как USB, с которым все знакомы, но только высокоскоростной и внутри самого компьютера. Причем устроен он весьма забавно. Представьте себе автотрассу. У нее есть полосы и ограничение скорости. Вот линии PCI это один в один, как трасса, где количество машин, проезжающих в секунду, определяет скорость передачи информации. Если мы возьмем трассу в четыре полосы, то машин проедет в два раза быстрее, но то же самое произойдет, если мы сделаем каждую полосу ровно в два раза быстрее. За количество полос у PCI отвечает так называемое количество шин (проводников), а за скорость поколение PCI.

Таким образом фразу: PCI-E 3.0 4x написанную на устройстве нужно читать как данное устройство займет четыре полосы трассы с максимальной скоростью 3. Видеокарты могут занимать до 16 линий PCI, причем это число может быть и меньше. То есть чисто технически видеокарта может работать и от одной линии. Именно так поступают майнеры, когда подключают 16 видеокарт к одному слоту. Они просто разбивают огромную трассу на 16 полос, жертвуя скоростью, зато не приходится покупать 16 компов. Для их приложений скорость не так нужна. В целом, правило пальца такое. Допустим, если карта подключена в 16 линий то это 100% производительности, тогда как показывает практика, например, для игр, при использовании восьми линий, она теряет 5% производительности, а при использовании четырех уже около 20-30% или больше. Для разных приложений эти цифры немного отличаются. У предложенного процессора AMD Ryzen 7 Vermeer 5800X всего 24 линий PCI, что является стандартным числом для даже очень дорогих процессоров для настольных ПК. 24 линий более чем достаточно для подключения одной-двух видеокарт и еще какой-то периферии вроде звуковой карты и NVME накопителя. Сложно представить, чтобы их не хватило. Но вот воткнуть в него 4 видеокарты без особых потерь уже не получится. Машины просто начнут стоять в пробках. Тут на ум приходит вторая опция.

Вторая опция

Собрать компьютер вокруг серверного процессора. Теперь уже это кажется оправданным. У него количество линий PCI может измеряться не десятками, а сотнями (обычные смертные этим не пользуются, а вот серверное железо да). Таким образом, если найти подходящую материнскую плату, то можно будет гарантированно разместить туда много видеокарт. Был выбран пограничный вариант: AMD Ryzen Threadripper 2 2920X c аж 64 линиями PCI 3.0. Причем он так и позиционируется производителем как серверный процессор, но адаптированный для простых нормизов, которым нужна какая-то специфика промышленного железа. Например, для высокопроизводительных станций для видеомонтажа, где должно работать несколько человек и т. д. в материнскую плату, подобранную для него (ASRock X399 Taichi), влезало 4 видеокарты без адаптеров. Что уже лучше, чем обычный игровой комп, при стоимости такой сборки всего на 50 тысяч дороже обычной игровой (150 вместо примерно 100). Но и процессор тут уже совсем другой ценовой категории, пусть и довольно дешевый среди своих напарников по цеху. При цене в 60-70 тысяч этот монстр выдает аж 24 потока, что кажется и немного для его цены, но если добавить поддержку ECC памяти, много шин PCI, большой кэш, получается приятно, если учитывать то, ради чего мы его берем.

Третий и последний вариант

Купить сервер вроде такого. Отдать один раз 500 тысяч и доставлять в него карты до восьми максимальных. (Предыдущий вариант при достойной процессорной нагрузке оперирует до четырех видеокартразумеется, если постараться и обеспечить нормальное охлаждение).

Выбор

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

Итоговая сборка

Ниже приведу итоговую сборку как мы ее заказали:

CPU

AMD Ryzen Threadripper 2 2920X BOX

https://www.e-katalog.ru/AMD-2920X-BOX.htm

1

85

MB

ASRock X399 Taichi

https://www.e-katalog.ru/ASROCK-X399-TAICHI.htm

1

25

PSU1

Fractal Design Ion+ Platinum FD-PSU-IONP-860P-BK

https://www.e-katalog.ru/FRACTAL-DESIGN-FD-PSU-IONP-860P-BK.htm

1

14

CASE

Fractal Design MESHIFY S2

https://www.e-katalog.ru/FRACTAL-DESIGN-MESHIFY-S2.htm

1

12

SSD

Samsung 860 EVO MZ-76E2T0BW 2 ТБ

https://www.e-katalog.ru/SAMSUNG-MZ-76E2T0BW.htm

1

17

CPU cooler

Be quiet Dark Rock Pro TR4

https://www.e-katalog.ru/BE-QUIET-DARK-ROCK-PRO-TR4.htm

1

7

Coolers

140

https://www.e-katalog.ru/FRACTAL-DESIGN-DYNAMIC-X2-GP-14.htm

2

3

120

https://www.e-katalog.ru/ID-COOLING-PL-12025-W.htm

2

1

SUM:

164

Итого: 164 тысячи рублей. Вроде неплохо, учитывая что цена на RTX 3090 на этот момент стоили уже 220 тысяч, и я убедил, что, возможно, 4х видеокарт может и хватить. Теперь по компонентам отдельно, как я думал о них до сборки:

Процессор

2920X обычно не востребованный из-за разницы со своими старшими братьями постепенно вытеснялся 3м поколением тредрипперов как раз упал в цене, это был хороший выбор (как показалось). Отдельная тема это установка процессора "Threadripper". Самые важные моменты: отвертка, которая идет в комплекте не обычная, а заряженная пружиной, чтобы контролировать натяжение, поэтому вскрывать сокет и устанавливать процессор нужно ТОЛЬКО ей. И только в порядке, предписанном на крышке розетки процессора (сокета). На рисунке видно порядок установки.

Материнская плата

ASRock X399 Taichi, средний выбор для такого железа обладала всеми необходимыми приятностями: 8 слотов для памяти, зачем-то встроенный wifi...

Но с материнской платой вышло больше всего проблем. Представьте ваше лицо, когда вы на стенде собираете компоненты стоимостью 150К включаете их, а они не дают признаки жизни Но я не растерялся, понял что блок питания не подает питание на материнку. На плате работало служебное 3В питание, была исправна батарейка. Сброс CMOS не помог. Коротких замыканий ни на какой линии питания не было. Меня сбил сначала тот факт, что от служебного питания на ней запитывалась подсветка. Начал грешить на блок питания, но нет. Проверив его по методике ниже, оказалось, что материнская плата все же не подает сигнал на исправный блок питания. Моя интуиция подсказала, что скорее всего это неправильное поведение. В гарантийном отделе KNS меня стали уверять что дело в неправильной версии BIOS материнской платы, и я, не заметив на самой плате наклейку, утверждающую, что BIOS последний, поехал искать где его обновить. Возле гарантийного центра меня встретили только очень пугающие ребята. Один немолодой человек, увидев у меня материнскую плату с символикой AMD, начал буквально кричать на весь ТЦ: AMD для нас не компьютер, а другие предложили обновить его за 3000р., но при условии что у меня будет подходящий процессор. Как будто был бы у меня процессор, я бы не смог обновить его сам, при условии, что для таких плат для этого просто нужно вставить флешку с кодом. Кто не знает, код BIOS (базовая система ввода вывода) отвечает за процесс запуска и первичную настройку и тест процессора, еще до старта любой операционной системы. Проблема, что если версия биоса старая, то компьютер просто не понимает, что в него вообще вставлен процессор. Тогда самый простой вариант вставить процессор более старой серии и обновить BIOS. Проблема в том, что процессоров Ryzen Threadripper первого поколения в москве в сервисных центрах почти не найти, что добавляло сложность моим изысканиям. Была ли это попытка, чтобы я пролетел с двухнедельным сроком возврата бракованного товара или нет, я не знаю. В определенном сервисе на Савеловской мне совершенно бесплатно подтвердили, что BIOS на плате самый свежайший, и там повторно оно не завелось уже на их стенде, но с моим процессором. И вот в самый последний день я отвез это в KNS и, уже уверив их, что их гипотеза не верна (и было бы странно, ибо плата вообще не стартовала блок питания), я отдал плату на гарантию. Через две недели они дождались свой процессор, и оказалось, что моя теория верна и плата мертва. Еще через день мы получили новую и продолжили сборку!

Охлаждение процессора

Охлаждать процессор, выделяющий тепла почти как четверть бытового обогревателя, предложено было кулером Be quiet Dark Rock Pro TR4, специально созданного для такого горячего процессора. Из особенностей скажу, что обычно элитная фирма Be quiet!, в этот раз немного разочаровала: установка кулера очень не эргономична для того, чтобы его закрепить или снять, нужно сначала вынуть центральный кулер (у него их три), потом особой комплектной длинной отверткой через особые отверстия отвинтить болты, только после этого отпустит клемму, которая и держит процессор. Вы можете посмотреть про этот кулер тут.

Блок питания

Выбор блока питания. Самая мистифицированная деталь компьютера, а так же самая частая ошибка: экономия на блоке питания. Причем, как правило, людям либо кажется, что больше мощности равно лучше, кому-то кажется, что много мощности плохо предлагаю разобраться. Блок питания берет переменный ток из розетки и преобразовывает его в набор постоянных напряжений (3.3,5,12,-12 Вольт). Все эти стандарты питания важны для разных компонентов, но самая важная линия это 12 Вольт. Именно от нее будут питаться все самые прожорливые компоненты. Именно от 12В питается процессор и видеокарта. Что же такое амперы на блоке питания? Ну, вы можете думать, что вольты это просто тип питания, примерно, как октановое число бензина. Вы приезжаете на бензоколонку и ожидаете увидеть 92,95 бензин. Точно так же работает и блок питания. Он предоставляет разное топливо. Причем напряжение, как и бензин, может быть плохим. Например, если под нагрузкой 12 Вольт превратились в 11, (а карета в тыкву), то это сродни тому, как если бы в тяжелые дни на заправке из-за нехватки 95го бензина его начинают бадяжить водой. А вот ток или мощность можно сравнить с литрами в минуту, которые заправка может выдавать. То есть, если на зарядке вашего телефона написано 5В 2А, это значит, что она может выдать не больше 2А по линии 5В. При этом при приближении к этим 2А качество напряжения может начать портиться, а зарядка греться и потеть. Именно поэтому все так любят брать блоки питания пожирнее. Например, кто-то скажет что и 1000 Ватт мало для RTX3090, что очевидно неверно, ибо сама по себе RTX 3090 потребляет по заявлению производителя 350 Ватт. Откуда же требование к блоку питания в более чем 750 Ватт? Давайте посчитаем! Дабы узнать сколько ест компонент, достаточно посмотреть на его тепловыделение, оно же энергопотребление. Грубо говоря, каждый компонент потребляющий ток, похож на ту же лампочку накаливания: пропустить ток греется. Например, если написано, что TDP процессора 60Ватт, значит, он будет выделять это тепло потребляя амперы по 12В линии. Чтобы получить ватты, нужно умножить ток на напряжение (IU=P). Или же, чтобы найти ток, нужно поделить 60 на 12. То есть 60-ти ваттный процессор потребляет 5А по 12В линии. Наш процессор потребляет целых 250 Ватт и видеокарта 350. Итого: по 12ти вольтовой линии блок питания должен выдать аж 600 Ватт.

Требование на 750 появляется из двух соображений, во-первых, многие производители льстят себе и пишут значения, при которых их продукции становится уже очень плохо, а во-вторых, из-за потерь в тепло везде, кроме потребителей, сколько-то съедят вентиляторы (по 2 Ватта каждый), сколько-то диски. В общем, мощности в 860 Ватт при условии выбора хорошего блока питания должно было хватить с головой. Я взял Fractal Design Ion+ Platinum FD-PSU-IONP-860P-BK. Не самый дорогой, но и не дешевый модульный блок питания от известного бренда. Характеристики его максимальных токов указаны на обратной части. Вы спросите, почему же ты не взял сразу блок питания с запасом на 4 видеокарты? Ну, когда я посмотрел цены на качественные блоки питания от 1000 Ватт, оказалось, что цена на них соизмерима с ценой всего компьютера. Сисоник на 1000 Ватт стоил аж 80К рублей. Но я, будучи электронщиком, понимал, что мне ничего не мешает вставить туда еще один блок питания специально для остальных видеокарт. Можно даже использовать компактный серверный блок, важно только сделать систему, которая бы включала блок питания одновременно с первым, но это несложно. Блоки питания включаются, как только напряжение на контакте PS_ON (см. рисунок) падает до нуля. То есть если вам хочется самим проверить блок питания без материнской платы, достаточно булавкой или скрепкой замкнуть контакты PS_ON и COM, и на остальных линиях появятся напряжения (Хоть все блоки питания и оборудованы защитами, но соблюдайте осторожность при работе с питанием, не допускайте попадание металлических компонентов на контакты, не вскрывайте блок питания). До этого момента включения не работает. Именно эти контакты замыкает материнская плата. То есть нужно было просто спаять плату, чтобы замыкать один контакт с другим, и можно сэкономить более 50ти тысяч рублей и подключать сколько хочешь мощных видеокарт. Теперь переходим к корпусу, который позволил все это безумие.


Корпус

Fractal Design MESHIFY S2, один из самых удобных корпусов, что я видел. Огромный, все быстро снимается. Внутри есть разветвитель PWM, чтобы можно было натыкать десятки вентиляторов, при этом заняв один слот на материнской плате. Оптимистично в него можно вставить до 6ти карт. Реалистично около четырех полноразмерных турбовинтовых карт. И то, если убрать нижнюю корзину для дисков, и разместить одну карту боком. Но иначе есть смысл брать только серверный корпус с переходником PCI, но такие в России найти вообще в продаже мне не удалось, только если заказывать на сайте DELL в США. Поэтому по факту взяли самый удобный корпус для большой рабочей или игровой системы. Из минусов могу выделить только встроенные очень слабые вентиляторы, которых тут установлено аж 3. Для высокопроизводительной системы советую вынуть их и заменить на высоко оборотистые управляемые 4 pin кулеры. У стоковых фиксированная скорость в 1000 оборотов, что хорошо для тихого ПК, но не очень для корпуса, которому предстоит рассеивать 800 Ватт тепла.

Память

Как вы могли заметить в сборке нет памяти, потому, что у нас уже было закуплено 64 GB не ECC памяти, и в принципе раз мы не играем в игры, то кроме желательного ECC у нас не было требований. Можно использовать любую. Если бы я докупал бы память, то выбрал бы что, то такое.

Цели

Прежде всего нужно понимать, что собирался такой компьютер не для игр. Я работаю в компании Twin3D, и такой компьютер нужен для построения автоматической сборки 3D модели человека на основе десятков-сотен фото. Если вам интересно, вы можете уже завтра приехать к нам и сделать 3D модель своего лица и тела. В свою очередь мы сейчас работаем над более сложными алгоритмами о которых вы могли читать тут.

Тесты

Про производительность отдельных компонентов системы вы можете найти много информации в Интернете. Поскольку нас интересует продолжительная работа, не было смысла заниматься овеклоком (разгонять процессор или видеокарту), по крайней мере по началу этой производительности точно хватало. К тому же почти любой разгон не только сильно повышает нагрев системы, но и влияет на вероятность вылетов вследствие случайных повреждений памяти, а к серверу предъявляются, наоборот, двойные стандарты по надежности. Поэтому в первую очередь нас интересуют температурные характеристики. Тест проводился с одной видеокартой Gigabyte GeForce RTX 3090 TURBO 24G, которая показала отличные температурные характеристики. При работе в стресс тесте видеокарты и 12 ядер процессора на неделю, температура видеокарты не поднималась выше 63 градусов, а процессора выше 59, что достойный показатель для игровых и умеренный для серверных систем. Ниже тест sysbench, для сравнения на моем домашнем ryzen 2600X total number of events: 121178. Когда тут, как на скриншоте ниже, 259501. Что более чем в два раза больше. При ровно в два раза большем количестве потоков. Причем стоящий дома ryzen еще и быстрее.

Что касается производительности RTX3090, пока еще рано говорить о ее рабочем потенциале, ибо наш суперский код, который создаст ваших 3D аватаров по фотографиям из instagram, еще не дописан. Однако если кому интересно она выдает где-то 110 Мега Хешей в секунду, что смешно по сравнению с любым асиком при ее стоимости на момент покупки она окупилась бы в майне за 314 дней (в день приносила бы почти 700р). Мораль не покупайте карты, чтобы майнить. Покупайте карты, чтобы играть, или учить искусственный интеллект. Чтобы он был умнее и посоветовал вам купить для майна ASIC.

Выводы

Собирай я сейчас бы тот же компьютер, наверное, поменял бы не так много. Советовал бы, как я писал выше, немного другую память, ибо когда мы выбирали свою еще было непонятно, какой будет процессор в конечной машине. Поменял бы скорее всего кулер, может, есть какие-то более удобные варианты. Хотя и качеством охлаждения я доволен. В будущих статьях возможно расскажу про настройку сервера. И удаленный GUI для нескольких пользователей. У вас есть предложения и замечания? Делитесь в комментариях!

Подробнее..

Quantization Aware Training. Или как правильно использовать fp16 inference в TensorRT

21.05.2021 12:08:14 | Автор: admin

Low-precision inference в TensorRT сегодня - мастхэв, бест практис и прочие иностранные. Сконвертить из TensorFlow легко, запустить легко, использовать fp16 легко. Да и КПД выше, чем у pruning или distillation. На первый взгляд всё работает идеально. Но на самом деле всё ли так гладко? Рассказываем, как мы в TrafficData споткнулись об fp16, встали и написали статью.

Если ты читаешь эту статью ради подробного туториала о запуске TensorRT, то его тут нет. Он есть тут. Здесь же про опыт применения и несколько важных моментов, о которых не говорят в официальной документации.

Что за зверь ваш low-precision?

float16

И так, low-precision inference - запуск нейронных сетей в типе пониженной точности. Но зачем это нужно? По умолчанию все фреймворки учат и сохраняют модели в типе float32. Оказывается, что количество знаков во fp32 - часто избыточно. Ну а зачем нам эти сотни знаков после запятой? Можно просто скастовать fp32 веса во fp16, чтобы получить ускорение прямого прогона и уменьшение используемой памяти в 2 раза. При этом сохранив исходную точность модели. Единственное условие - наличие тензорных ядер в вашем GPU.

int8 и прочее

Кроме fp16 с простым кастованием есть много идей по более оптимальному использованию бит в 16-битном значении. Просто чтобы напомнить:

Но этого мало. Использование нейронных сетей в высоконагруженных системах и мобильных платформах заставляет еще сильнее ужимать сети и ускорять инференс. Добро пожаловать в мир int8 и int4. Да, в них квантуют. Да, в int8 всего 256 значений. Да, это работает. Со своими сложностями, конечно - здесь уже просто так не кастанёшь, как в случае с fp16. Нужно внимательно изучать распределения значений в слоях, чтобы эффективно использовать предоставленный небольшой диапазон значений.

Объясню, почему мы не смотрим на 8/4 битные квантизации. Дело в том, что здесь не обойтись без потери точности. Например, тут говорят как оптимально юзать int4 и радуются, что потеряли не 15%, а 8% точности. Или вот красноречивая табличка от Nvidia о западении точности при использовании int8:

Я слышал на конференциях, что на такую потерю точности нормально смотрят в мобильных решениях. Особенно, если это какой-то развлекательный контент типа переноса стилей на GANax и тд. Ну изменился стиль немного - ничего страшного.
В нашем решении каждый процент точности - наше золотце. И пока мы не научились не терять их в int8.

TensorRT

Если у вас мобильные решения или просто инференс на CPU, то попробуйте TensorFlow Lite. Но в основном, говоря про low-precision inference в проде, сегодня имеют ввиду TensorRT - кроссплатформенный SDK для супер-быстрой работы на GPU от Nvidia. TensorRT легко превращает ваши модели в оптимизированные Engines. Сконвертить можно из любого нейросетевого фреймворка через ONNX. Engine - очень важная сущность в TensorRT. При билде происходит оптимизация под текущий GPU - на других GPU engine либо не запустится, либо будет работать неоптимально. Короче говоря, есть ряд параметров, которые нужно знать или задать заранее:

  • GPU. На чём собрали Engine, на том пусть он и работает. Но допустим общий билд для карточек одного семейства - Turing или Ampere. Например, мы билдили Engine для RTX 2060 и он замечательно работает на RTX 2080 Super. Создание отдельного Engine для RTX 2080 Super существенного ускорения не создает.

  • BatchSize. Нужно задать максимальный - для него и будет соптимизирован Engine. В рантайме можно подавать батчи размером меньше максимального, но это будет неоптимально.

  • InputSize. Мы работаем с изображениями. И размер входного изображения иногда может меняться во время рантайма. Но TRT требует его задавать жестко, что логично. Да, есть возможность задать минимальный и максимальный размеры, а TRT создаст несколько профилей оптимизации. Но всё же это не так гибко, как в TensorFlow, а иногда нужно.

  • Precision. Собственно мы можем задать fp32/fp16/int8. Первые два различаются лишь выбором флага. С int8 я мало экспериментировал. Но судя по документации, отличие лишь в необходимости калибровочного датасета - набора картинок, на основании которого TRT определит распределения значений на разных слоях.

Ну и под конец еще добавлю, что в рантайме эти движки отжирают лишь необходимый минимум GPU RAM и замечательно работают параллельно (если правильно работать с TensorRT Context в вашем коде рантайма).

Контекст задачи

Окей, чтобы было понятнее, какие проблемы возникли, пара слов о нашем продукте. Мы пилим TrafficData - ПО для оценки трафика c камер и дронов, в рилтайме и постфактум, в дождь и снег. Нам важно, чтобы ночью детектилось вот так:

И не хуже.

На opentalks.ai2020 мы рассказывали, как, используя Pruning и физичность данных, ускорили обработку в 4 раза и не потеряли в точности. Статью про Pruning я уже выкладывал. Но сегодня давайте поговорим конкретно про low-precision inference.

Как мы запустились и потеряли нежные фичи

Скачивая либы TensorRT, бонусом вы получаете набор примеров с кодом для самых разных архитектур и ситуаций. Для билда движков мы использовали пример SampleUffSSD (UFF - универсальный формат описания сети, через который мы конвертили наши .pb), cлегка его закастомив под входной тензор от YOLO. И хотя TensorRT очень много обновляется и всё больше новых интересных слоев поддерживает, тогда мы запускались на версии, где не было реализации ResizeBilinear операции для Upsample слоя. И мы накостылили Conv2DTranspose вместо него, чтобы не писать кастомный слой. Первая сконверченная модель была радостью, как и её скорость работы.

Даже если перейти с fp32 из TF в fp32 TRT, то уже получается неслабое ускорение - на 15-20%. В конце концов TRT использует и много других оптимизаций, например горизонтальные, вертикальные и любые другие LayerFusion.

Для инференса мы закастомили пример trtExec, обернув его для использования в .NET коде. На вход - байты изображения, на выходе - нераспарсенные байты выхода YOLO. Здесь аккуратно работайте с CudaStream и ExecutionContext. Тогда ни память не утечет, ни потоки обработки не закорраптятся.

И так, мы реализовали TensorRT fp16 inference. Сбилдили движки для разных карточек. Прогнали основные тесты - колебания точности в пределах погрешности. И всё замечательно работало несколько месяцев. А дальше - история.
10:00. Звонок клиента:
- У нас тут на одном ролике TrafficData плохо работает - машинки двоятся.
- Окей, скиньте ролик разберемся.
Смотрим ролик - да, проблема есть. Ролик с тенями и на нём тени отмечаются, как второе авто.

13:00. Добрали изображения в основной датасет. Поставили доучиться с низким LR.

16:00. Тестим на версии с инференсом в TensorFlow - всё замечательно. Билдим новый Engine. Тестим на версии с инференсом в TensorRT - опять машины двоятся:

17:00. Идём домой.

Следующее утро началось с мема:

Стало очевидно, что проблема в TensorRT, а конкретно - в преобразовании весов во fp16. Мы проверили еще несколько других роликов со сложными условиями и увидели, что после преобразования во fp16 проблемы появились и в других местах. Стали появляться пропуски детекции на ночных видео, некоторые билборды стали определяться как авто. Короче вот так мы потеряли нежные, но важные фичи, про которые оригинальная сеть во fp32 знала, а вот во fp16 успешно забыла. Что делать?

Quntization Aware Training. Учи на том, на чем будет работать

Подсознательно мы сразу понимали, что если мы обучаем на fp32, а потом инференсим на fp16, то выйдет неприятная вещь. Вот эти жалкие циферки далеко после запятой потеряны и так влияют. Тогда зачем мы их учили на каждом батче? Идея Quntization Aware Training крайне проста - учи и помни о том типе, в котором будешь инференсить. Т.е. в типе fp16 должны быть все веса сверток, активаций и градиентов. Не удивляйтесь, если первые запуски в TensorFlow окажутся с NaN-лоссом. Просто внимательно инспектируйте происходящее. Мы потратили пару недель, переписали всё обучение на fp16 и проблема была решена.

Как в Tensorflow 2.0?

Тут небольшое отступление о том, как мы были рады обновлению TF2.0. Работая под TF1.15 мы кусали локти, заставляя запуститься обучение во fp16, переписывая слои. Но это заработало. А потом пришел TF2.0 - используешь tf.train.experimental.enable_mixed_precision_graph_rewrite над оптимизатором и всё заводится, как моя Lada Granta. Но всё же стоит обратить внимание на whitelist - не все ноды по умолчанию будут работать во fp16. Часть стоит поправить руками. Ну и дополнительный бонус - огромная экономия памяти, которой не получалось в TF1.15. Батч-сайз для нашей кастомной YOLOv4.5 увеличился в 2 раза - с 4 до 8. Больше батч - лучше градиенты.

Выводы

Fp16 inference - это здорово. Только не стоит забывать про Quntization Aware Training, если вы хотите сохранить точность оригинальной модели. Это позволило нам сделать еще шаг в сторону оптимизации наших и клиентских мощностей:

Что особенно важно в годы дефицита чипов и дорогих GPU. Я всё же за использование GPU в тех местах, где они приносят пользу людям, автоматизируя что-то. А не там, где они приносят прибыль, делая деньги из подогретого воздуха.

А вообще вся тематика ускорения инференса сетей сегодня - очень интересное поле для экспериментов. Хочется попробовать десятки новых способов Pruning, Distillation или квантования в int4, но всех Баксов Банни не догонишь. Пробуйте новое, но не забывайте отдыхать.

Подробнее..

Перевод Clustergram визуализация кластерного анализа на Python

28.05.2021 14:21:34 | Автор: admin

В этой статье, переводом которой мы решили поделиться специально к старту курса о Data Science, автор представляет новый пакет Python для генерации кластерограмм из решений кластеризации. Библиотека была разработана в рамках исследовательского проекта Urban Grammar и совместима со scikit-learn и библиотеками с поддержкой GPU, такими как cuML или cuDF в рамках RAPIDS.AI.


Когда мы хотим провести кластерный анализ для выявления групп в наших данных, мы часто используем алгоритмы типа метода k-средних, которые требуют задания количества кластеров. Но проблема в том, что мы обычно не знаем, сколько кластеров существует.

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

Маттиас Шонлау предложил другой подход кластерограмму. Кластерограмма это двухмерный график, отражающий потоки наблюдений между классами по мере добавления кластеров. Это говорит вам о том, как перетасовываются ваши данные и насколько хороши ваши сплиты. Тал Галили позже реализовал кластерограмму для k-средних в R. Я использовал реализацию Таля, перенёс ее на Python и создал clustergram пакет Python для создания кластерограмм.

clustergram в настоящее время поддерживает метод k-средних, использование scikit-learn (включая реализацию Mini-Batch) и RAPIDS.AI cuML (если у вас есть GPU с поддержкой CUDA), Gaussian Mixture Model (только scikit-learn) и иерархическую кластеризацию на основе scipy.hierarchy. В качестве альтернативы мы можем создать кластерограмму на основе меток и данных, полученных с помощью альтернативных пользовательских алгоритмов кластеризации. Пакет предоставляет API, подобный sklearn, и строит кластерные диаграммы с помощью matplotlib, что даёт ему широкий выбор вариантов оформления в соответствии со стилем вашей публикации.

Установка

Установить clustergram можно при помощи conda или pip:

conda install clustergram -c conda-forge

или

pip install clustergram

В любом случае вам нужно установить выбранный бэкенд (scikit-learn и scipy или cuML).

from clustergram import Clustergramimport urbangrammar_graphics as uggimport seaborn as snsimport matplotlib.pyplot as pltfrom sklearn.preprocessing import scalesns.set(style='whitegrid')

Давайте рассмотрим несколько примеров, чтобы понять, как выглядит кластерограмма и что с ней делать.

Набор данных о цветке ириса

Первый пример, который мы пытаемся проанализировать с помощью кластерограммы, это знаменитый набор данных о цветке ириса. Он содержит данные по трём видам цветков ириса с измерением ширины и длины чашелистиков, а также и ширины и длины лепестков. Мы можем начать с разведки:

iris = sns.load_dataset("iris")g = sns.pairplot(iris, hue="species", palette=ugg.COLORS[1:4])g.fig.suptitle("Iris flowers", y=1.01)

Похоже, что setosa относительно чётко определённая группа, тогда как разница между versicolor и virginica меньше, поскольку они частично перекрываются (или, в случае ширины чашелистика, полностью).

Итак, мы знаем, как выглядят данные. Теперь мы можем увидеть кластерограмму. Помните, мы знаем, что существует три кластера, и в идеале мы должны быть в состоянии распознать это по кластерограмме. Я говорю в идеале, потому что, даже если есть известные метки, это не значит, что наши данные или метод кластеризации способны различать эти классы.

Давайте начнём с кластеризации методом k-средних. Чтобы получить стабильный результат, мы можем запустить кластерную программу с 1000 инициализаций.

data = scale(iris.drop(columns=['species']))cgram = Clustergram(range(1, 10), n_init=1000)cgram.fit(data)ax = cgram.plot(    figsize=(10, 8),    line_style=dict(color=ugg.COLORS[1]),    cluster_style={"color": ugg.COLORS[2]},)ax.yaxis.grid(False)sns.despine(offset=10)ax.set_title('K-Means (scikit-learn)')

На оси x мы видим количество кластеров. Точки представляют собой центр каждого кластера (по умолчанию), взвешенный по первой главной компоненте (это помогает сделать диаграмму более читабельной). Линии, соединяющие точки, и их толщина представляют наблюдения, перемещающиеся между кластерами. Поэтому мы можем прочитать, когда новые кластеры образуются как расщепление одного существующего класса и когда они образуются на основе наблюдений из двух кластеров.

Мы ищем разделение, т. е. отвечаем на вопрос, принёс ли дополнительный кластер какое-либо значимое разделение? Шаг от одного кластера к двум большой хорошее и чёткое разделение. От двух до трёх свидетельство довольно хорошего раскола в верхней ветви. Но с 3 по 4 видимой разницы нет, потому что новый четвёртый кластер почти не отличается от существующей нижней ветви. Хотя сейчас она разделена на две части, это разделение не даёт нам много информации. Таким образом, можно сделать вывод, что идеальное количество кластеров для данных Iris три.

Мы также можем проверить некоторую дополнительную информацию, например оценку силуэта или оценку Калинского Харабазса.

fig, axs = plt.subplots(2, figsize=(10, 10), sharex=True)cgram.silhouette_score().plot(    xlabel="Number of clusters (k)",    ylabel="Silhouette score",    color=ugg.COLORS[1],    ax=axs[0],)cgram.calinski_harabasz_score().plot(    xlabel="Number of clusters (k)",    ylabel="Calinski-Harabasz score",    color=ugg.COLORS[1],    ax=axs[1],)sns.despine(offset=10)

По этим графикам можно предположить наличие 34 кластеров по аналогии с кластерограммой, но они не очень убедительны.

Набор данных о пингвинах со станции Палмера

Теперь попробуем другие данные, где кластеры оценить немного сложнее. Пингвины Палмера содержат данные, подобные тем, что в примере Iris, но в нём измеряются несколько признаков трёх видов пингвинов.

penguins = sns.load_dataset("penguins")g = sns.pairplot(penguins, hue="species", palette=ugg.COLORS[3:])g.fig.suptitle("Palmer penguins", y=1.01)

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

data = scale(penguins.drop(columns=['species', 'island', 'sex']).dropna())cgram = Clustergram(range(1, 10), n_init=1000)cgram.fit(data)ax = cgram.plot(    figsize=(10, 8),    line_style=dict(color=ugg.COLORS[1]),    cluster_style={"color": ugg.COLORS[2]},)ax.yaxis.grid(False)sns.despine(offset=10)ax.set_title("K-Means (scikit-learn)")

Мы ищем разделения, и эта кластерограмма показывает достаточное их количество. На самом деле определить оптимальное количество кластеров довольно сложно. Однако, поскольку мы знаем, что происходит между различными вариантами, мы можем поиграть с этим. Если у нас есть причина быть консервативными, мы можем обойтись 4 кластерами (я знаю, это уже больше, чем первоначальный вид). Но и дальнейшее разделение также разумно, а это указывает на то, что даже более высокая детализация может дать полезную информацию, что могут существовать значимые группы.

Можно ли сказать, что их три? Поскольку мы знаем, что их должно быть три... Ну, не совсем. Разница между разделениями 23 и 34 незначительна. Однако здесь виновником является метод K ближайших соседей, а не кластерограмма. Он просто не может правильно кластеризовать эти данные из-за наложений и общей структуры. Давайте посмотрим, как работает смешанная Гауссова модель (Gaussian Mixture).

cgram = Clustergram(range(1, 10), n_init=100, method="gmm")cgram.fit(data)ax = cgram.plot(    figsize=(10, 8),    line_style=dict(color=ugg.COLORS[1]),    cluster_style={"color": ugg.COLORS[2]},)ax.yaxis.grid(False)sns.despine(offset=10)ax.set_title("Gaussian Mixture Model (scikit-learn)")

Результат очень похож, хотя разница между третьим и четвёртым разделениями более выражена. Даже здесь я бы, вероятно, выбрал решение с четырьмя кластерами.

Подобная ситуация случается очень часто. Идеального случая не существует. В конечном счёте нам необходимо принять решение об оптимальном количестве кластеров. Clustergam даёт нам дополнительные сведения о том, что происходит между различными вариантами, как они расходятся. Можно сказать, что вариант с четырьмя кластерами в данных Iris не помогает. Также можно сказать, что пингвины Палмера могут быть сложными для кластеризации с помощью k-средних, что нет решающего правильного решения. Кластерограмма не даёт простого ответа, но она даёт нам лучшее понимание, и только от нас зависит, как мы её [кластерограмму] интерпретируем.

Установить clustergram можно с помощью conda install clustergram -c conda-forge или pip install clustergram. В любом случае вам всё равно придётся установить бэкенд кластеризации: либо scikit-learn, либо cuML. Документация доступна здесь, а исходный код здесь, он выпущен под лицензией MIT.

Если вы хотите поиграть с примерами из этой статьи, блокнот Jupyter находится на GitHub. Вы также можете запустить его в среде interactive binder в браузере. Более подробную информацию можно найти в блоге Тала Галили и оригинальных статьях Матиаса Шонлау.

Вполне понятно, что идеальной кластеризации не существует. И даже сегодня, с учётом всего прогресса искусственного интеллекта, для принятия сложных решений о данных по-прежнему нужен человек. Если вам интересна наука о данных область, в которой такие решения принимаются постоянно вы можете обратить внимание на наш курс о Data Science, где через подкреплённую теорией практику студенты учатся ориентироваться в данных, делать обоснованные выводы и действовать с открытыми глазами.

Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

Насколько Быстрой Можно Сделать Систему STT?

06.12.2020 14:23:35 | Автор: admin


Нам приходилось слышать абсолютно разные оценки скорости (ну или наоборот оценки потребности в железе) систем распознавания речи, отличающиеся даже на порядок. Особенно радует, когда указаны системные требования из которых следует, что метрики сильно лучше, чем лучшие state-of-the-art системы из bleeding edge статей, а на практике иногда оказывается, что метрики рассчитаны в надежде, что "покупают для галочки и никто пользоваться не будет и так сойдет". Также не помогает то, что некоторые системы работают на GPU, а некоторые нет, равно как и то, что ядра процессоров могут отличаться в разы по производительности (например старые серверные процессора с тактовой частотой 2 2.5 GHz против современных решений от AMD с 4+ GHz на ядро имеющие до 64 ядер). Давайте в этом вместе разберемся, на самом деле, все не так уж и сложно!


Как правило люди начинают задумываться о скорости в 3 случаях:


  • Когда ее не хватает или когда она является узким горлышком;
  • Когда со скоростью нет проблем, но есть проблемы с ценой железа;
  • Когда есть жесткое SLA по качеству сервиса от конечного заказчика;
  • Когда есть жесткие требования по скорости "первого ответа" от конечного заказчика;

В этой статье мы постараемся ответить на несколько вопросов:


  • Что вообще значит скорость?
  • Какой скорости можно добиться в теории?
  • Какой скорости можно добиться на практике и желательно без потери качества?

Определения


Но давайте для начала определимся с понятиями. Такой пример скорее является исключением в западном STT комьюнити, но лаборатория Facebook AI Research в последнее время активно наращивает свои позиции в распознавании речи и зачастую публикует интересные исследования, а в частности в качестве отправной точки по скорости интересна относительно недавняя статья, где они публикуют кроме всего прочего оценки скорости работы своих систем распознавания речи. Но как вы понимаете, обычно в таких статьях очень мало пишут про скорость и все всегда в духе "как все классно".


В частности, в статье приводятся 3 основные метрики, которыми обычно оценивается "скорость":


  • Throughput (пропускная способность) сколько потоков распознавания система может обрабатывать параллельно. Для простоты назовем это "потоками";
  • Real Time Factor (RTF) (на знаю как кратко перевести) насколько каждый поток распознавания распознается быстрее, чем реальное время. Давайте также для простоты определим Real Time Speed (RTS) как 1 / RTF, то есть количество секунд аудио, которое можно обработать за 1 секунду;
  • Latency (задержка) какую реальную задержку чувствует конечный пользователь прежде чем ему начинают приходить какие-то ответы системы;

Еще прежде чем оценивать скорость от FAIR, нужно понимать ряд вещей:


  • Все тесты FAIR гоняют на процессоре Intel Skylake c 18 физическими ядрами (информации о тактовой частоте и наличии 2 потоков на ядро нет, но по числу ядер попробую предположить это какой-то мощный топовый процессор);
  • Это результаты end-to-end алгоритма реализованного на C++ с "встроенным" декодингом;
  • Скорее всего вероятно используются кастомные низкоуровневые реализации из wav2letter++;
  • Важно понимать, что такие статьи это в первую очередь пиар и результаты тут пере-оптимизированы на маленькие чистые академические датасеты;


Интересные моменты:


  • Общая "скорость" (RTS * число потоков) быстро выходит на плато. Также видно, что для получения гарантий по скорости работы системы нужно снижать размер чанка;
  • FAIR потратили существенное время на оптимизацию своей нейросети, т.к. этой статьей они продолжают по сути целое направление своих исследований, где они пиарят так называемые TDS-слои;
  • В этой статье их ноу-хау по сути является несколько технических оптимизаций по скорости и квантизация;
  • С определенной натяжкой, можно сказать, что они сделали что-то близкое к state-of-the-art для быстрых и практичных сетей (конечно как обычно близко без гарантий, что вы сможете это повторить и что это пошло в реальный продакшен);
  • В статье FAIR пишут, что их "оптимальные" характеристики это 40 потоков, 0.26 RTF и задержка в районе одной секунды (вообще на самом деле можно выбрать любые точки на графиках выше). Понятное дело, всегда можно перенастроить такую систему допустим на больше потоков ценой задержки, ну или допустим на меньшую задержку ценой общей пропускной способности;
  • Быстро на коленке Пересчитаем 40 * 1 / 0.26 и разделим на 18 физических ядер процессора. Получаем, что за 1 секунду на 1 ядре серверного процессора они могут распознать где-то в районе 8-9 секунд аудио;

Выпишем теперь самое важное для сравнения:


  • Чанки: равные чанки длиной в районе 750 мс (оптимальное значение);
  • Пропускная способность: Оптимальные метрики 8-9 секунд аудио на ядро процессора, 40 потоков на 18 физических ядер процессора;
  • Задержка: от 500 мс до 1000 мс, для заявленного оптимального чанка в 750 мс скорее ближе к секунде;
  • Низкоуровневая реализация на C++ со встроенным пост-процессингом;

Скорость Других Решений


Возникает закономерный вопрос а какую скорость показывают другие системы на рынке? Мы давно не исследовали этот вопрос, т.к. в последних исследованиях качества мы использовали только облачные системы без гарантий по скорости и без указанных характеристик по железу. Тем не менее с некоторой натяжкой на коленке мы собирали вот такое сравнение. Оно не особо претендует на научность, скорее собрали что-то с миру по нитке. Провести качественное исследование даже своей системы и подобрать оптимальные внутренние параметры это очень трудоемкая работа, а с другими системами это сделать запретительно дорого, да и неблагодарная это работа.


Теоретические Лимиты


Наша лучшая система сейчас не является полностью end-to-end системой, как система от FAIR, потому что мы сначала поставили задачу достижения высоких показателей на реальных данных, а уже потом миниатюризации. Поэтому сначала мы озаботились оптимизацией акустической модели, потом всего сервиса в целом, и уже потом мы будем заниматься интеграцией всего end-2-end (желательно чтобы еще работало на мобильниках).


Наша методология тестирования скорости несколько отличается от FAIR, т.к. мы не считаем оправданной трату финансовых и кадровых ресурсов, чтобы писать свои кастомные фреймворки на C++ для проведения академических изысканий. В первую очередь методология отличается тем, что мы вынуждены подавать данные батчами в нашу систему.


Это и проклятие и благословение одновременно. Очевидно, что батчами все процессится быстрее, но это очень сильно усложняет архитектуру и требования к прямоте рук при проектировании сервиса. Я даже слышал мнения, что с батчами "непонятно как" или "невозможно" сделать нормальный продакшен (на самом деле просто нужны прямые руки). Тем не менее после всех изысканий у нас получилось получить вот такие цифры:


Размер батча FP32 FP32 + Fused FP32 + INT8 FP32 Fused + INT8 Full INT8 + Fused New Best
1 7.7 8.8 8.8 9.1 11.0 22.6
5 11.8 13.6 13.6 15.6 17.5 29.8
10 12.8 14.6 14.6 16.7 18.0 29.3
25 12.9 14.9 14.9 17.9 18.7 29.8

Тут не надо ходить к бабке, чтобы понять, что миниатюризация и квантизация модели очень сильно докидывает. Докидывает настолько, что задержка перестает быть критичной даже для CPU модели. Этого к сожалению нельзя сказать про пропускную способность. В сравнении с FAIR или другими системами может показаться, что последние цифры нереалистичны, но тут надо понять ряд вещей:


  • Это только одна часть пайплайна без пост-процессинга;
  • Это не включает потери в реальной жизни на транспорт, сериализацию, коммуникацию, итд итп;
  • Мы не знаем являются ли цифры FAIR сугубо теоретическими, или туда уже включены потери на оборачивание алгоритмов в продакшен сервис;


Посмотрим теперь, какие цифры можно будет получить для продакшен-дистрибутивов на реальном железе.


Практические Сайзинги


Мы потратили довольно много времени на оптимизацию гипер-параметров для продакшена и пришли к следующим цифрам.


Пара слов о методологии:


  • Метрики рассчитаны для файлов длиной 1 7 секунд, которые "кормятся" в сервис в 4 8 16 потоков;
  • Распределение длин файлов соответствует распределению длин файлов в реальных диалогах людей по телефону;
  • Метрики рассчитаны для многопоточного веб-сервиса, что немного абстрагируется от сценария реального использования. Ну то есть если мы можем держать условно 8 потоков с условной гарантией в latency в 500 мс, то это значит, что правильно настроив конечную бизнес-логику, можно обрабатывать сильно больше, чем 8 одновременных звонков;
  • Реальные люди не говорят одновременно, пока человек заканчивает вторую фразу мы уже успеваем обработать первую итд итп. Поэтому на реальном проекте можно опять же держать еще более высокую нагрузку. Но это уже сильно зависит от реального бизнес-кейса;

Сайзинги для GPU


Сайзинг Минимум Рекомендуется
Диск SSD, 256+ GB NVME, 256+ GB
RAM 32 GB 32 GB
Ядер процессора 8+ 12+
Тактовая частота ядра 3 GHz+ 3.5 GHz+
2 потока на ядро процессора Да Да
AVX2 инструкции процессора Не обязательно Не обязательно
Количество GPU 1 1
Метрики 8 "потоков" 16 "потоков"
Среднее время ответа, мс 280 320
95-я перцентиль, мс 430 476
99-я перцентиль, мс 520 592
Файлов за 1000 мс 25.0 43.4
Файлов за 500 мс 12.5 21.7
Секунд аудио в секунду (1 / RTF) 85.6 145.0
Секунд аудио в секунду на ядро 10.7 12.1

Есть 3 типа подходящих GPU:


  • Любые игровые GPU Nvidia выше чем 1070 8+GB RAM с турбиной;
  • Любые однослотовые GPU Nvidia серии Quadro 8+GB RAM (TDP 100 150W) с турбиной или пассивные;
  • Nvidia Tesla T4, пассивная, TDP 75W;

Мы часто сталкиваемся с тем, что заказчики не понимают и иррационально боятся использовать GPU в продакшене мотивируя это все разного рода отговорками (типичное "отдел закупок не одобрит"). Приведем топ мнений, которые мы слышали:


  • "Карты слишком мощные (300 ватт) и горячие". Это не так. У игровых и карт для исследований TDP реально такой. Но TDP решений для продакшена в пике от 75 до 150 ватт, а на практике с нашими сетями будет где-то 50-75% от пиковых значений;
  • "Карты очень греют сервер и серверную". Это конечно зависит от их количества, но с нашими сайзингами даже на крупные проекты хватит 2 карт (+ резерв);
  • "Карты нарушают идеально продуманную циркуляцию воздуха в серверной". В идеальном мире вообще для серверных "предназначены" только пассивные карты Tesla согласно SLA от Nvidia. Но понятно почему монополист в SLA указывает это, т.к. карты Tesla в 2-3 раза дороже. Но если вам так надо "гарантий" просто купите пассивные карты и оптимизируйте воздушные потоки сколько угодно;
  • "Карты занимают только 2+ слота и не влазят в серверные шасси". Это не так. Карты Quadro и T4 занимают 1 слот;
  • "Карты слишком дорогие". Топовые карты Tesla A100 действительно стоят US$12,500 в России. Но карты Quadro и T4 (я уже молчу про игровые) в рамках крупных проектов стоят уже вообще копейки;
  • "Карты недолговечные и ломаются". Как и любой "силикон" если карта не бракованная она будет служить 3-4 года, плюс никто не отменял гарантию. Если не хочется иметь точку отказа в виде охлаждения всегда есть пассивные карты. Тут отмечу, что карты Nvidia с пробегом купленные с Авито прекрасно служат несколько лет в режиме 24/7 и сказки про "майнеров" это просто сказки, майнеры очень бережно относятся к технике. Знакомый майнер давно купил 100 карт Nvidia и AMD и за 3 года из строя не вышла ни одна зеленая карта;

Одна из целей данной статьи развеять эти заблуждения. Забегая вперед деплой на GPU примерно в 2-3 раза дешевле.


Сайзинги для CPU


Сайзинг Минимум Рекомендуется
Диск SSD, 256+ GB SSD, 256+ GB
RAM 32 GB 32 GB
Ядер процессора 8+ 12+
Тактовая частота ядра 3.5 GHz+ 3.5 GHz+
2 потока на ядро процессора Да Да
AVX2 инструкции процессора Обязательно Обязательно
Метрики 4 "потока" 8 "потоков"
Среднее время ответа, мс 320 470
95-я перцентиль, мс 580 760
99-я перцентиль, мс 720 890
Файлов за 1000 мс 11.1 15.9
Файлов за 500 мс 5.6 8.0
Секунд аудио в секунду (1 / RTF) 37.0 53.0
Секунд аудио в секунду на ядро 4.6 4.4

Комментарии по Cайзингам


  • В реальности со всем фаршем даже у сервиса с GPU получается только 10 15 RTS на одно ядро процессора (хотя теоретический RTS самой модели на GPU находится где-то в районе 500 1,000). В теории число воркеров CPU на 1 GPU можно наращивать больше (тем самым наращивая нагрузку на карту и пропускную способность), чем мы пробовали, но мы упираемся в удорожание процессоров. В какой-то момент горизонтальное резервирование становится важнее;
  • CPU-версия сервиса показывает только в районе 5 честных RTS, что немало, но она скорее оптимизирована как баланс между гарантиями по latency и throughput;
  • Метрики настоящие и честные и подбор параметров стоил много боли и страданий. Если честно я вообще не видел, чтобы кто-то вообще показывал перцентили реальных систем;
  • Многие крупные проекты просят 50 одновременных разговоров, поэтому иметь возможность покрыть такой проект используя всего 2 GPU (+ резервирование) это довольно круто;
  • Использование GPU сервиса где-то в 2-3 раза дешевле, чем если считать все только на CPU;

Выводы


Если статья от FAIR показывание реальные продакшен показатели, то у нас получилось используя только открытые и свободные библиотеки достичь 50% их показателей. Но скорее всего конечно цифры там теоретические. Это конечно не 20-30 RTS как у акустической модели, но как правило после упаковки в дистрибутив где-то теряется 40-50% показателей. В таком случае мы показали ряд вещей:


  • Продакшен на GPU быстрее, удобнее и дешевле;
  • Мы как минимум приблизились к цифрам от FAIR;
  • Мы наглядно показали, что деплой на GPU с батчами не только возможен, но и прекрасно работает;
  • Если грамотно прикрутить бизнес-логику к такому распознаванию, то можно держать достаточную нагрузку даже для высоконагруженных реальных проектов;

А что дальше? У нас большие планы на релиз некоторых комплиментарных распознаванию голоса технологий под довольно свободной лицензией MIT.

Подробнее..

Включение гибридной графики в Ubuntu на ноутбуках Nvidia Intel (OpenGL, Vulkan)

07.05.2021 00:04:44 | Автор: admin

Введение

Это простая инструкция как включить гибридную графику intel-nvidia на ноутбуке. Чтобы определенные приложения запускались на дискретном чипе, а другие на встроенном. На свое удивление в интернете не нашел простую инструкцию того, как запускать определенные приложения, используя дискретную графику. Так что напишу так просто, на сколько считаю нужным

У меня система KDE Neon 5.21 - по большому счету - Ubuntu LTS с окружением рабочего стола KDE Plasma 5.21, видеочип GeForce MX150

1. Устанавливаем драйвер

a) Если у вас система на Qt (Как правило окружение KDE или LXQt), то с помощью данной команды через терминал загрузим программу для установки драйверов:

sudo apt install software-properties-qt

Если у вас система на GTK то с помощью это команды:

sudo apt install software-properties-gtk

Хотя разницы принципиальной нет

b) Затем запускаем ее с правами root

sudo software-properties-qt
Можно так же добавить ярлык для запуска в меню приложений

Инструкция для KDE

В папке ~/.local/share/applications/ создадим файл software properties qt.desktop с таким содержанием

[Desktop Entry]Categories=System;Settings;Comment[ru_RU]=driversComment=driversExec=konsole -e "~/.local/share/applications/software-properties-qt.sh"GenericName[ru_RU]=Установка драйверов\sGenericName=Установка драйверов\sIcon=systemsettingsMimeType=Name[ru_RU]=software properties qt\nName=software properties qt\nPath=StartupNotify=trueTerminal=falseTerminalOptions=Type=ApplicationX-DBUS-ServiceName=X-DBUS-StartupType=X-KDE-SubstituteUID=falseX-KDE-Username=

И файл software properties qt.sh в той же папке:

#! /bin/bashecho software-properties-qtsudo /usr/bin/software-properties-qt

После перезагрузки ярлык появится в меню

Но это далеко не обязательно, вполне достаточно запустить из консоли для наших целей настройки гибридной графики

c) Переходим на последнюю вкладку Additional drivers и устанавливаем нужный драйвер. Я выбрал самой последней версии, который не tested и не server

d) После установки перезагружаем устройство

2. Настраиваем видеокарту

a) Загружаем следующую программу:

sudo apt install nvidia-settings

И запускаем

b) Переходим в PRIME Profiles Здесь мы видим три пункта:

  1. NVIDIA (Performance Mode) - работать только на дискретной графике. Сильно потребляет батарею в несложных задачах, а так же ноутбук начинает греться. Зато система работает намного быстрее, но это того не стоит. У меня после установки драйвера этот пункт включился автоматически

  2. NVIDIA On-Demand - некоторые приложения будут использовать дискретную графику nvidia, но по-умолчанию встроенная intel. Как запустить конкретное приложение с дискретной графикой напишу дальше

  3. NVIDIA (Power Saving Mode) - отключение дискретной графики

Выбираем второй вариант - NVIDIA On-Demand, и перезагружаем систему

3. Запуск приложения с использованием дискретной графикой

Это то, что сложнее всего гуглилось...

Для запуска приложения с использованием графики nvidia нужно задать для OpenGL две переменные среды:

__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia

для Vulkan только:

__NV_PRIME_RENDER_OFFLOAD=1

Делать это надо перед командой для запуска приложения. Например, нам нужно запустить из терминала приложение program с использованием дискретной графики. Нужно вызвать его так:

__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia program

Соответственно, если у приложения есть ярлык (.desktop) в меню приложений, то надо изменить команду запуска в ярлыке. В KDE Plasma нужно нажать на него ПКМ, открыть свойства (или "изменить приложение..."), перейти во вкладку "приложение" и перед командой приписать данную приставку. В других средах похожего стола примерно так же

Пример: ярлык игры Wolfenstein - Blade of AgonyПример: ярлык игры Wolfenstein - Blade of Agony

Можно сделать это же действие через текстовый редактор. Открываем ярлык, находим Exec=, и приписываем перед коммандой данную приставку __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia

Например, Minecraft
__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia minecraft-launcher __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia minecraft-launcher

Заключение

Данный метод, как я понял, точно работают для програм, использующих библиотеки OpenGL и Vulkan. У меня, к сожалению, не получилось запустить так Windows приложение через Wine, которое использует DirectX, но это уже совсем другая история.

Подробнее..

Свобода для видео представлен открытый GPU на базе RISC-V

01.02.2021 22:18:17 | Автор: admin

Свободный GPU, для которого не требуется отчислений и отсутствуют условия на использование голубая мечта многих разработчиков. Сейчас представлен проект, который является началом большой работы по созданию полностью открытых GPU.

Речь идет о проекте, который развивает группа энтузиастов вместе с компанией Pixlica, сам проект называется RV64X. Основная задача команды создание дополнительного набора инструкций для 3D-графики и обработки мультимедийных данных. В итоге должен получиться свободно интегрируемый в процессор GPU на базе архитектуры RISC-V.

Проект базируется на основе векторных инструкций из RISC-V ISA. Они расширены поддержкой новых типов данных и расширений, которые специфичны для обработки графики. В частности, предложены дополнительные операции для обработки пикселей (RGBA), точек (XYZW), текстурных элементов (UVW-текселей), векторов (операции с 2-4 векторами), параметров материалов, расчёта освещения, трансцендентной математики, буферов глубины (Z-buffer) и кадровых буферов (Framebuffer).

Первый прототип, по словам разработчиков, рассчитан на использование лишь в микроконтроллерах, так что его поддержка ограничена лишь API Vulkan. А вот со временем разработчики добавят поддержку OpenGL и DirectX.

Идея, которая легла в основу нового проекта гибкость архитектуры, которая позволяет подключать расширения для решения разных специфических задач, включая двухфазовое усечение конусов, применение быстрых преобразований Фурье для произвольной глубины цвета и реализация аппаратных SLAM. У RV64X есть возможность реализации собственных стадий для вычислительного конвейера, а также геометрических, пиксельных и кадровых буферов. Также проект поддерживает создание собственных тесселяторов.

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

Концепция проекта гибридный CPU-GPU ISA, который позволяет создавать и специализированные графические микроконтроллеры, и многоядерные процессоры, которые комбинируют вычислительные ядра с блоками для выполнения графических операций. Процессор, интегрированный с GPU, будет выглядеть, как единый модуль, без выделения блока видео. Программируется он с использованием унифицированного набора 64-разрядных инструкций и модели SIMD для обеспечения параллелизма на уровне данных.


Можно также упомянуть такую особенность архитектуры нового GPU, как использование единой модели памяти как в CPU, так и в GPU, что дает возможность обойтись без дополнительных механизмов RPC/IPC для трансляции вызовов между памятью GPU и CPU при обработке операций 3D API. В этом случае стандартные графические операции можно реализовать на уровне микрокода. Поддерживается создание пользовательских шейдеров, растеризаторов и расширений для трассировки лучшей.

При необходимости разработчики смогут реализовать векторные операции для работы с задачами по симуляции, проектами компьютерного зрения и машинного обучения.

Что касается реализации архитектуры, то она включает 32KB кэш первого уровня для инструкций и данных, 8 KB памяти SRAM для микрокода, декодировщик инструкций, аппаратную реализацию наборов инструкций RV32V и RV64X, задаваемый через микрокод декодировщик расширенных инструкций, векторное арифметико-логическое устройство (ALU), 136-разрядный регистровый файл с 1024 элементами, блок для выполнения специальных операций (SFU, Special Function Unit), блок обработки текстур (Texture Unit) и настраиваемый локальный фреймбуфер.

Подробнее..

Перевод Реверс-инжиниринг GPU Apple M1

05.03.2021 10:06:07 | Автор: admin
image

Новая линейка компьютеров Apple Mac содержит в себе разработанную самой компанией SOC (систему на чипе) под названием M1, имеющую специализированный GPU. Это создаёт проблему для тех, кто участвует в проекте Asahi Linux и хочет запускать на своих машинах Linux: у собственного GPU Apple нет ни открытой документации, ни драйверов в open source. Кто-то предполагает, что он может быть потомком GPU PowerVR, которые использовались в старых iPhone, другие думают, что GPU полностью создан с нуля. Но слухи и домыслы неинтересны, если мы можем сами заглянуть за кулисы!

Несколько недель назад я купила Mac Mini с GPU M1, чтобы изучить набор инструкций и поток команд, а также разобраться в архитектуре GPU на том уровне, который ранее не был публично доступен. В конечном итоге я хотела ускорить разработку драйвера Mesa для этого оборудования. Сегодня я достигла своего первого важного этапа: теперь я достаточно понимаю набор команд, чтобы можно было дизассемблировать простые шейдеры при помощи свободного и open-source тулчейна, выложенного на GitHub.

Процесс декодирования набора команд и потока команд GPU аналогичен тому процессу, который я использовала для реверс-инжиниринга GPU Mali в проекте Panfrost, изначально организованном проектами свободных драйверов Lima, Freedreno и Nouveau. Обычно для реверс-инжиниринга драйвера под Linux или Android пишется небольшая библиотека-обёртка, инъектируемая в тестовое приложение при помощи LD_PRELOAD, подключающей важные системные вызовы типа ioctl и mmap для анализа взаимодействия пользователя и ядра. После вызова передать буфер команд библиотека может выполнить дамп всей общей памяти (расширенной) для её анализа.

В целом тот же процесс подходит и для M1, но в нём есть особенности macOS, которые нужно учитывать. Во-первых, в macOS нет LD_PRELOAD; её аналогом является DYLD_INSERT_LIBRARIES, имеющая дополнительные функции защиты, которые для выполнения нашей задачи можно достаточно легко отключить. Во-вторых, хотя в macOS существуют стандартные системные вызовы Linux/BSD, они не используются для графических драйверов. Вместо них для драйверов ядра и пространства пользователя используется собственный фреймворк Apple IOKit, критической точкой входа которого является IOConnectCallMethod (аналог ioctl). Такие различия достаточно просто устранить, но они добавляют слой дистанцирования от стандартного инструментария Linux.

Более серьёзной проблемой является ориентирование в мире IOKit. Так как Linux имеет лицензию copyleft, (законные) драйверы ядра выложены в open source, то есть интерфейс ioctl открыт, хотя и зависит от производителя. Ядро macOS (XNU) имеет либеральную лицензию, не обладающую такими обязательствами; интерфейс ядра в нём проприетарен и не задокументирован. Даже после обёртывания IOConnectCallMethod пришлось попотеть, чтобы найти три важных вызова: выделение памяти, создание буфера команд и передача буфера команд. Обёртывание вызовов выделения памяти и создания буфера необходимы для отслеживаемой видимой GPU памяти (а именно это мне было интересно исследовать), а обёртывание вызова передачи необходимо для подбора времени дампа памяти.

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

Открытия, сделанные в задокументированном процессе изучения при помощи свободного дизассемблера ПО, подтверждают наличие у GPU следующих особенностей:

Во-первых, архитектура скалярна. В отличие от некоторых GPU, которые являются скалярными для 32 бит, но векторизованными для 16 бит, GPU процессора M1 скалярен при всех битовых размерах. Хотя на ресурсах по оптимизации Metal написано, что 16-битная арифметика должна быть значительно быстрее, кроме снижения использования регистров она ведёт к повышению количества потоков (занятости процессора). Исходя из этого, можно предположить, что оборудование является суперскалярным и в нём больше 16-битных, чем 32-битных АЛУ, что позволяет получать большее преимущество от графических шейдеров низкой точности, чем у чипов конкурентов, одновременно значительно снижая сложность работы компилятора.

Во-вторых, архитектура, похоже, выполняет планирование аппаратно это часто встречается среди десктопных GPU, но менее распространено во встроенных системах. Это тоже упрощает компилятор ценой большего количества оборудования. Похоже, команды минимально тратят лишние ресурсы при кодировании, в отличие от других архитектур, вынужденных перегружать команды nop для того, чтобы уместиться в сильно ограниченные наборы инструкций.

В-третьих, поддерживаются различные модификаторы. АЛУ с плавающей запятой могут выполнять модификаторы clamp (насыщенность), операций НЕ и абсолютных значений бесплатно, без лишних затрат распространённая особенность архитектуры шейдеров. Кроме того, большинство (или все?) команды позволяют бесплатно выполнять преобразование типов между 16-битными и 32-битными значениями и для адресата, и для источника, что позволяет компилятору более агрессивно использовать 16-битные операции, не рискуя тратить ресурсы на преобразования. Что касается целочисленных значений, то для некоторых команд есть различные бесплатные побитовые отрицания и сдвиги. Всё это не уникально для оборудования Apple, но заслуживает упоминания.

Наконец, не все команды АЛУ имеют одинаковые тайминги. Команды типа imad (используется для перемножения двух целых чисел и прибавления третьего) по возможности избегаются и вместо них используются многократные команды целочисленного сложения iadd. Это тоже позволяет предположить наличие суперскалярной архитектуры; оборудование с программным планированием, с которым я взаимодействую на своей повседневной работе, не может использовать различия в длине конвейеров, непреднамеренно замедляя простые команды для соответствия скорости сложных.

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

Часть вторая


В первой части я начала изучать GPU Apple M1, надеясь разработать бесплатный драйвер с открытым исходным кодом. Теперь мне удалось достичь важного этапа: отрисовать треугольник с помощью собственного кода в open source. Вершинные и фрагментные шейдеры написаны вручную на машинном коде, а взаимодействие с оборудованием выполняется с помощью драйвера ядра IOKit, подобно тому, как это происходило в системном драйвере пользовательского пространства Metal.


Треугольник, отрендеренный на M1 кодом в open source

Основная часть нового кода отвечает за построение различных буферов команд и дескрипторов, находящихся в общей памяти и используемых для управления поведением GPU. Любое состояние, доступное из Metal, соответствует битам в этих буферах, поэтому следующей важной задачей будет их анализ. Пока меня больше интересует не содержимое, а связи между ними. В частности, структуры, содержащие указатели друг на друга, иногда встроенные на несколько слоёв вглубь. Процесс подготовки треугольника в моём проекте позволяет взглянуть с высоты птичьего полёта на то, как взаимодействуют все эти отдельные части в памяти.

Например, предоставляемые приложением данные вершин хранятся в собственных буферах. Внутренняя таблица в ещё одном буфере указывает на эти буферы вершин. Эта внутренняя таблица передаётся непосредственно на вход вершинного шейдера, заданного в другом буфере. На это описание вершинного шейдера, в том числе и на адрес кода в исполняемой памяти, указывает ещё один буфер, на который сам ссылается основной буфер команд, на который ссылается вызов IOKit на передачу буфера команд. Ого!

Другими словами, код демо пока не предназначен для демонстрации понимания мелких подробностей буферов команд, а скорее служит для демонстрации того, что ничто не упущено. Так как виртуальные адреса GPU меняются при каждом запуске, демо подтверждает, что идентифицированы все необходимые указатели и их можно свободно перемещать в памяти с помощью нашего собственного (тривиального) распределителя. Так как в macOS присутствует некоторая магия, связанная с распределением памяти и буферов команд, наличие этого работающего кода позволяет нам спокойно двигаться дальше.

Я использовала поэтапный процесс подготовки. Поскольку моя обёртка IOKit располагается в то же адресном пространстве, что и приложение Metal, обёртка способна модифицировать буферы команд непосредственно перед передачей в GPU. В качестве первого hello world я задала кодирование в памяти цвета очистки render target и показала, что могу изменять этот цвет. Аналогично, узнав о наборе инструкций для вывода дизассемблера, я заменила шейдеры написанными самостоятельно эквивалентами и убедилась, что могу исполнять код в GPU, доказать, что написала машинный код. Однако мы не обязаны останавливаться на этих нодах листьев системы; изменив код шейдера, я попыталась загрузить код шейдера в другую часть исполняемого буфера, модифицировав указатель командного буфера на код, чтобы компенсировать это. После этого я смогу попробовать самостоятельно загружать команды для шейдера. Проводя разработку таким образом, я смогу создать все необходимые структуры, тестируя каждую из них по отдельности.

Несмотря на затруднения, этот процесс оказался гораздо более успешным, чем попытка перейти непосредственно к построению буферов, например, при помощи воспроизведения. Я использовала этот альтернативный способ несколько лет назад для создания драйверов Mali, однако у него есть серьёзный недостаток чудовищно сложная отладка. Если в пяти сотнях строк магических чисел присутствует хотя бы одна опечатка, то никакой обратной связи, кроме ошибки GPU, вы не получите. Однако при последовательной работе можно выявлять причины ошибок и немедленно их исправлять, что оказывается быстрее и удобнее.

Однако затруднения всё-таки были! Моё временное ликование, вызванное возможностью изменения цветов очистки, пропало, когда я попыталась выделить буфер для цветов. Несмотря на то, что GPU кодировал те же биты, что и раньше, ему не удавалось корректно выполнить очистку. Думая, что где-то ошиблась в способе модификации указателя, я попыталась поместить цвет в неиспользованную часть памяти, уже созданную драйвером Metal, и это сработало. Содержимое осталось тем же, как и способ модификации указателей, но GPU почему-то не нравилось моё распределение памяти. Я думала, что как-то неправильно распределяю память, но использованные для вызова распределения памяти IOKit были побитово идентичны тем, что использовались Metal, что подтверждалось wrap. Моей последней отчаянной попыткой стала проверка, должна ли память GPU отображаться явным образом через какой-то побочный канал, например, через системный вызов mmap. У IOKit есть устройство-независимый вызов memory map, но никакие трассировки не позволили обнаружить свидетельств отображений через сторонние системные вызовы.

Появилась проблема. Утомившись от потраченного на устранение невозможного бага времени, я задалась вопросом, нет ли чего-то магического не в системном вызове, а в самой памяти GPU. Глупая теория, потому что если это так, то появляется серьёзная проблема курицы и яйца: если распределение памяти GPU должно быть одобрено другим распределением GPU, то кто одобряет первое распределение?

Чувствуя себя глупо и ощущая отчаяние, я решила протестировать теорию, вставив вызов распределения памяти посередине потока выполнения приложения, чтобы каждое последующее распределение находилось по другому адресу. Выполнив дамп памяти GPU до и после этого изменения и изучив их отличия, я обнаружила свой первый кошмар: наличие вспомогательного буфера в памяти GPU, отслеживающего все требуемые распределения. В частности, я заметила, что значения в этом буфере увеличиваются на единицу с предсказуемым смещением (через каждые 0x40 байт), и это намекает о содержании в буфере массива дескрипторов распределений. И в самом деле, эти значения точно соответствовали дескрипторам, возвращаемым из ядра при вызовах распределения памяти GPU.

Закрыв глаза на очевидные проблемы этой теории, я всё равно её протестировала, модифицировав эту таблицу и добавив в конец дескриптор моего нового распределения, а также изменив структуру данных заголовка так, чтобы увеличить количество элементов на единицу. Это не помогло. Несмотря на разочарование, это всё равно не позволяло полностью отказаться от теории. На самом деле, я заметила в элементах таблицы нечто любопытное: не все они соответствовали действительным дескрипторам. Действительными были все элементы, кроме последнего. Диспетчеры ядра имеют индексацию с 1, однако в каждом дампе памяти последний дескриптор всегда был 0, несуществующим. Вероятно, он используется как контрольное значение, аналогично NULL-terminated string в C. Однако при таком объяснении возникает вопрос: почему? Если заголовок уже содержит количество элементов, то контрольное значение избыточно.

Я продолжила разбираться дальше. Вместо добавления ещё одного элемента с моим дескриптором, я скопировал последний элемент n в дополнительный элемент n + 1 и переписала элемент n (теперь второй с конца) новым дескриптором.

Внезапно отобразился нужный мне цвет очистки.

Итак, загадка решена? Код заработал, так что в каком-то смысле да. Но едва ли это объяснение может нас удовлетворить; на каждом этапе непонятное решение будет создавать новые вопросы. Проблему курицы и яйца решить проще всего: эта таблица отображений вместе с корневым буфером команд распределяется специальным селектором IOKit, не зависящим от распределения общего буфера, а дескриптор таблицы отображений передаётся с селектором буфера команд. Более того, идея передачи требуемых дескрипторов вместе с передачей буфера команд не уникальна; подобный механизм используется в стандартных драйверах Linux. Тем не менее, обоснование для использования 64-байтных элементов таблицы в общей памяти вместо простого массива на стороне CPU остаётся совершенно непонятной.

Но даже оставив позади проблемы с распределением памяти, двигаться вперёд пришлось не без труда. Однако благодаря терпению мне удалось полностью воссоздать память GPU параллельно с Metal, используя проприетарное пространство пользователя только для инициализации устройства. Наконец, остался последний прыжок веры отказ от синхронизации с IOKit, после чего мне удалось получить свой первый треугольник.

Для второй части статьи пришлось внести в код изменения объёмом примерно 1700 строк кода, сам код выложен на GitHub. Я собрала простое демо, анимирующее на экране треугольник с помощью GPU. Интеграция с оконной системой на этом этапе практически отсутствует: требуется XQuartz, а в ПО с наивным скалярным кодом возникает detiling буфера кадров. Тем не менее, скорости CPU M1 с лихвой хватает, чтобы с этим справиться.

Теперь, когда готова начальная загрузка каждой части драйвера пространства пользователя, двигаясь дальше, мы сможем по отдельности работать над набором инструкций и буферами команд. Можно будет разобрать мелкие подробности и побитово преобразовать код из сотен необъяснимых магических констант в настоящий драйвер.
Подробнее..

Обновление списка Top50 курс на рост

08.04.2021 08:18:32 | Автор: admin


В конце марта вычислительный центр МГУ имени М.В. Ломоносова и Межведомственный Суперкомпьютерный Центр РАН в очередной, тридцать четвертый раз опубликовали рейтинг российских суперкомпьютеров, где представлена информация об отечественных машинах с наибольшими мощностями. Ниже вы найдете общую сводку изменений за прошедшие полгода.

Прежде всего, следует отметить, что негативная динамика, которая наблюдалась в прошлом выпуске, сменилась положительной: мощности снова стали расти. С зафиксированных в прошлый раз 19.8 PFlop/s на тесте Linpack суммарная производительность поднялась до 20.2 PFlop/s, тем самым превысив показатель не только тридцать третей, но и тридцать второй редакции. Суммарная пиковая производительность также повысилась: теперь она составляет 30.9 PFlop/s (в предыдущей редакции 29.9 PFlop/s). Наконец, порог вхождения в рейтинг установился на уровне 69.6 TFlop/s против 56.95 TFlop/s в предыдущей версии.

С точки зрения изменений в составе участников полугодие прошло довольно спокойно. Тройка лидеров осталась прежней:

  • Лидером рейтинга всё так же остаётся система Кристофари, разработка компаний SberCloud (ООО Облачные технологии) и NVIDIA, установленная в СберБанке (производительность на тесте Linpack 6.7 PFlop/s, пиковая производительность 8.8 PFlop/s).
  • На второй строчке укрепился суперкомпьютер Ломоносов-2 производства компании Т-Платформы из Московского государственного университета имени М.В. Ломоносова (производительность на тесте Linpack 2.5 PFlop/s, пиковая производительность 4.9 PFlop/s).
  • Третье место занимает суперкомпьютер, созданный компаниями T-Платформы и CRAY, который находится в Главном вычислительном центре Федеральной службы по гидрометеорологии и мониторингу окружающей среды (производительность на тесте Linpack 1.2 PFlop/s).

Вместе с тем, в первой десятке топа появился новый участник: апгрейд системы PetaNode 1.2 Cluster (разработчик ООО Компьютерные Экосистемы) позволил ей подняться с пятнадцатого места на девятое за счет сильного роста производительности с 211.6 TFlop/s до 420.1 TFlop/s. Продолжает свое движение вверх также суперкомпьютер cHARISMa, установленный в Высшей школе экономики: за предыдущие месяцы его мощности возросли с 568.5 TFlop/s до 653.7 TFlop/s, что обеспечило перемещение с седьмой позиции на шестую.

Дебютировали в рейтинге на этот раз две разработки. Система Лобачевский, сегмент A100 от группы компаний РСК, установленная в Нижегородском государственном университете им. Н.И. Лобачевского, стартовала с двадцать седьмого места. Суперкомпьютер Олег, созданный компанией Lenovo и находящийся в Сколковском Институте Науки и Технологий, занимает тридцать шестую строку.

Ряд небольших изменений можно отметить в техническом оснащении лучших суперкомпьютеров. Гибридных машин, использующих для вычислений ускорители, стало на одну больше теперь общее их число составляет 27. Напротив, число разработок на основе технологии Intel Omni-Path сократилось: их осталось 5 вместо прежних 6. Удерживают свои старые позиции процессоры Intel (используются в 48 системах), коммуникационные сети InfiniBand (используется в 32 системах) и Gigabit Ethernet (используется в 8 системах).

Основными создателями мощнейших вычислительных комплексов являются те же три компании, что и раньше: Hewlett-Packard Enterprise (13 позиций в рейтинге), группа компаний РСК (12 позиций в рейтинге) и Т-Платформы (10 позиций в рейтинге). При этом Hewlett-Packard Enterprise несколько ухудшила свои показатели по сравнению с предыдущей редакцией.

С точки зрения применения суперкомпьютеров наиболее популярной областью остаются наука и образование количество задействованных в них систем выросло с 26 до 28. В некоторых других сферах, напротив, наблюдается отток: число суперкомпьютеров, применяющихся в прикладных исследованиях, упало с 8 до 7, а число систем, ориентированных на промышленность с 2 до 1. Большая часть отраслей на данный момент представлена единичными специализированными разработками: так, моделирование климата осуществляет суперкомпьютер PetaNode 1.2 Cluster, на задачи, связанные с геофизикой, работают системы НОВАТЭК НТЦ, сейсмологическими расчетами занимается суперкомпьютер PTG-hpSeismic и так далее.
Подробнее..

Виртуальные машины А2 крупнейшие облачные образы с графическими процессорами NVIDIA A100 теперь доступны для всех

20.04.2021 12:16:22 | Автор: admin

Недавно, в нашем Google Cloud блоге, мы анонсировали, что в сервисе Compute Engine появились виртуальные машины A2 на базе графических процессоров NVIDIA Ampere A100 с тензорными ядрами. С их помощью пользователи смогут выполнятьмашинное обучениеивысокопроизводительные вычисленияна базе архитектуры NVIDIA CUDA, увеличивая рабочие нагрузки за меньшее время и цену.

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

Высочайшая производительность

Одна ВМ A2 поддерживает до 16графических процессоров NVIDIA A100. На сегодняшний день это самый производительный экземпляр графического процессора на одном узле среди всех конкурирующих решений от крупнейших поставщиков облачных услуг. В зависимости от масштабов рабочей нагрузкивы также можете выбрать виртуальные машины A2 с меньшим числом графических процессоров (1, 2, 4 и 8).

Конфигурации ВМ A2 доступные в сервисе Compute EngineКонфигурации ВМ A2 доступные в сервисе Compute Engine

Это позволяет исследователям, специалистам по обработке данных и разработчикам значительно увеличивать производительность масштабируемых рабочих нагрузок (например, машинное обучение, логический вывод и высокопроизводительные вычисления) на архитектуре CUDA. Семейство ВМ A2 на платформе Google Cloud Platform способно удовлетворить потребности самых требовательных приложений для высокопроизводительных вычислений, например при моделировании методами вычислительной гидродинамики вAltair ultraFluidX.

Для тех, кому нужны сверхпроизводительные системы, Google Cloud предлагает кластеры из тысяч графических процессоров для распределенного машинного обучения, а также оптимизированные библиотеки NCCL для горизонтального масштабирования. Версия ВМ с 16 графическими процессорами A100, объединенными через шинуNVIDIA NVLink, это уникальное предложение Google Cloud. Если вам нужно масштабировать требовательные рабочие нагрузки по вертикали, можно начать с одного графического процессора A100 и довести их число до 16 без настройки нескольких ВМ для машинного обучения на одном узле.

Новая ВМ A2-MegaGPU: 16 графических процессоров A100 со скоростью передачи данных 9,6 ТБ/с по интерфейсу NVIDIA NVLinkНовая ВМ A2-MegaGPU: 16 графических процессоров A100 со скоростью передачи данных 9,6 ТБ/с по интерфейсу NVIDIA NVLink

Чтобы удовлетворить потребности разных приложений, доступны и менее производительные конфигурации ВМ A2 с встроенным SSD-диском на 3ТБ, который ускоряет доставку данных в графический процессор. Так, графический процессор A100 в Google Cloud более чем в 10раз увеличивает скорость предварительного обучения модели BERT-Large по сравнению с NVIDIA V100 прошлого поколения. При этом в конфигурациях с числом графических процессоров от 8 до 16 наблюдается линейный рост производительности. Кроме того, разработчики могут использовать предварительно настроенное ПО в контейнерах из хранилища NVIDIANGCдля быстрого запуска экземпляров A100 в Compute Engine.

Отзывы пользователей

Мы стали предлагать ВМ A2 с графическими процессорами A100 нашим партнерам в июле 2020 года. Сегодня мы работаем со множеством организаций и помогаем им достигать новых высот в области машинного обучения, визуализации и высокопроизводительных вычислений. Вот что они говорят о виртуальных машинах А2:

КомпаниюDessaнедавно приобрел холдинг Square. Она занимается исследованиями в сфере ИИ и стала использовать ВМ A2 одной из первых. На базе ее экспериментов и инноваций Square разрабатывает персонализированные сервисы и умные инструменты для Cash App, которые с помощью ИИ помогают неспециалистампринимать более взвешенные финансовые решения.

"Благодаря Google Cloud мы получили необходимый контроль над своими процессами, говорит Кайл де Фрейтас, старший разработчик ПО в Dessa. Мы понимали, что предлагаемые в Compute Engine ВМ A2 на базе графических процессоровNVIDIA A100с тензорными ядрами способны радикально сократить время вычислений и значительно ускорить наши эксперименты. Процессоры NVIDIA A100, используемые в Google Cloud AI Platform, позволяют нам эффективно развивать инновации и воплощать в жизнь новые идеи для наших клиентов".

Hyperconnect это международная компания, занимающаяся видеотехнологиями в сфере коммуникаций (WebRTC) и ИИ. Hyperconnect стремится объединять людей во всем мире и для этого создает сервисы на базе различных технологий обработки видео и ИИ.

"Экземпляры A2 с новыми графическими процессорами NVIDIA A100 на платформе Google Cloud поднимают производительность на совершенно новый уровень при настройке моделей глубокого обучения. Мы легко перешли на них с прошлого поколения графических процессоров V100. Благодаря конфигурации ВМ A2-MegaGPU мы не только ускорили обучение более чем в два раза по сравнению с V100, но и получили возможность масштабировать по вертикали рабочие нагрузки с большими нейронными сетями в Google Cloud. Эти инновации помогут нам оптимизировать модели и повышать удобство использования сервисов Hyperconnect", говорит Ким Бемсу, исследователь по машинному обучению в Hyperconnect.

DeepMind(дочерняя компания Alphabet) это команда ученых, инженеров, специалистов по машинному обучению и других экспертов, которые развивают технологии ИИ.

"DeepMind занимается искусственным интеллектом. Наши исследователи проводят различные эксперименты в этой сфере с применением аппаратных ускорителей. Благодаря Google Cloud мы получили доступ к новому поколению графических процессоров NVIDIA, а виртуальная машина A2-MegaGPU-16G позволяет проводить обучение моделей быстрее, чем когда-либо. Мы с радостью продолжаем работать с платформой Google Cloud, которая поможет нам создавать будущую инфраструктуру машинного обучения и ИИ", Корай Кавукчуоглу (Koray Kavukcuoglu), вице-президент DeepMind по исследовательской деятельности.

AI2 это некоммерческий исследовательский институт, занимающийся перспективными исследованиями и разработками в сфере ИИ для общего блага.

"Наша основная миссия расширение возможностей компьютеров. В связи с этим мы сталкиваемся с двумя фундаментальными проблемами. Во-первых, современные алгоритмы ИИ требуют огромных вычислительных мощностей. Во-вторых, специализированное оборудование и ПО в этой области быстро меняются. И с этим нужно что-то делать. Процессоры A100 в GCP в четыре раза производительнее наших нынешних систем, и для их использования не требуется серьезно перерабатывать программный код. По большому счету достаточно минимальных изменений. Графический процессор A100 в Google Cloud позволяет значительно увеличить количество вычислений на доллар. Соответственно, мы можем проводить больше экспериментов и использовать больше данных", говорит Дирк Груневельд, старший разработчик Allen Institute for Artificial Intelligence.

OTOY это компания, которая занимается облачными графическими вычислениями. Она развивает инновационные технологии создания и доставки контента для средств массовой информации и индустрии развлечений.

"Уже около десяти лет мы расширяем границы возможного в сфере графической визуализации и облачных вычислений и стремимся устранить ограничения для художественного творчества. Благодаря процессорам NVIDIA A100 в Google Cloud с большим объемом видеопамяти и самым высоким рейтингом OctaneBench за всю историю мы первыми достигли уровня, когда художникам при реализации своих замыслов больше не нужно задумываться о сложности прорисовки. Система визуализации OctaneRender снизила стоимость спецэффектов. Она позволяет любому разработчику с графическим процессором NVIDIA создавать великолепную картинку кинематографического качества. Виртуальные машины с процессорами NVIDIA A100 в Google Cloud предоставляют пользователям OctaneRender и RNDR доступ к современным графическим процессорам NVIDIA, прежде доступным только для крупнейших голливудских студий", говорит Джулз Урбах, основатель и генеральный директор OTOY.

Цены и доступность графических процессоров

Экземпляры NVIDIA A100 теперь доступны в следующих регионах: us-central1, asia-southeast1 и europe-west4. В течение 2021года к ним добавятся дополнительные регионы. ВМ A2 в Compute Engine доступны по запросу со скидкой за вытесняемые экземпляры и обязательство по использованию, а также полностью поддерживаются в Google Kubernetes Engine (GKE), Cloud AI Platform и других сервисах Google Cloud. A100 предлагаются по цене всего 0,87доллара США за один графический процессор в вытесняемых ВМ A2. С полным прейскурантом можно ознакомитьсяздесь.

Начало работы

Вы можете быстро развернуть работу, приступить к обучению моделей и выполнять рабочие нагрузки с логическим выводом на графических процессорах NVIDIA A100 с помощьюобразов ВМ для глубокого обученияв доступных регионах. В этих образах собрано все необходимое ПО: драйверы, библиотеки NVIDIA CUDA-X AI и популярные фреймворки для ИИ, такие как TensorFlow и PyTorch. Оптимизированныеобразы TensorFlow Enterpriseтакже включают поддержку A100 для текущих и прошлых версий TensorFlow (1.15, 2.1 и 2.3). Вам не нужно беспокоиться об обновлении ПО, совместимости и настройке производительности всё это мы берем на себя. Наэтой страницеприводятся сведения о доступных в Google Cloud графических процессорах.


Напоминаем что при первой регистрации в Google Cloud: вам доступны бонусы на сумму 300 долларов США, а более 20 бесплатных продуктов доступны всегда. Подробнее поспециальной ссылке.

А так же выражаем благодарность за помощь в подготовке материала коллегам: Бхарат Партасарати, Крис Клебан и Звиад Кардава

Подробнее..

Самый большой процессор в мире Cerebras CS-1. Разбор

29.01.2021 18:07:40 | Автор: admin
Наверняка вы подумали, что это какой-то очередной кликбейт. Что это за самый большой процессор в мире? Похоже сейчас нам будут рассказывать о процессоре, который на 5 процентов больше других, и то если рассматривать этот процессор только с определенной стороны.И да просмотры и прочтения мы хотим собрать, но

Сегодня мы расскажем вам о процессоре компании Церебро, под названием Cerebras CS-1.И он действительно огромный!


Например, GPU, который считался самым большим раньше это процессор Nvidia V100, а вот новый процессор Церебро. Он почти в 57 раз больше!Площадь самого чипа 462 квадратных сантиметра это почти столько же сколько площадь всей Nvidia 3090, вместе с системой охлаждения и разъемами.







А что вы скажете на то, что этот монстр способен симулировать некоторые физические модели быстрее самих законов физики?Заинтриговали? Что ж тогда присаживайтесь, наливайте чаек. Сегодня будет разбор по-настоящему огромного однокристального процессора!

Итак, что же это за монстр такой и зачем он нужен?Давайте сразу ответим на второй вопрос этот процессор создан для машинного обучения и искусственного интеллекта. Кроме того он сильно расширит возможности для различного сложного моделирования и сможет заглядывать в будущее. Вообще, искусственный интеллект это невероятно интересная и актуальная тема, а ее главные ограничения это слабые вычислительные мощности.А если хотите узнать о реальных проектах с использованием искусственного интеллекта у Илона Маска есть такой в запасе Open UI.

Если вы думали, что закон Мура со своим увеличением количества транзисторов в процессоре каждые 1,5 года это быстро, то посмотрите на потребности в области ИИ, ведь спрос на эти вычисления удваивается каждые 3,5 месяца!

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

Скажем так если вы возьмете двигатель от Ferrari и запихнете ее в старые Жигули, то машина конечно поедет быстрее, но как Ferrari все равно не поедет.Поэтому тут нужен принципиально иной подход,ведь для того? чтобы получить настоящий гиперкар надо взять хорошие тормоза, подвеску, рассчитать аэродинамику; с компьютерами точно также.

Компания Церебро это и сделала они решили разработать свою систему с нуля, то есть вообще все от архитектуры самих процессоров, до системы охлаждения и питания.









Это огромная машина, потребляющая 20 килоВатт, и занимающая треть стандартной серверной стойки, то есть можно размещать по три таких компьютера в одной стойке! А сам чип, по своей сути и предназначению, напоминает серверные GPU от NVIDIA, так что давайте их и сравним. Возьмем Nvidia Tesla V100.





Цифр много, приготовьтесь! Кроме размеров самого кристалла, процессор Церебро обладает четырьмя сотнями тысяч ядер, что в 78 раз больше, чем число ядер на NVIDIA Tesla V100! Количество транзисторов взрывает мозг 1,2 триллиона, против 21 миллиарда у NVIDIA.

А сколько там памяти? 18 гигабайт l2 cache memory прямо на чипе! Это в три тысячи раз больше, чем у V100. Кстати у 3090 от той же NVIDIA, памяти на чипе тоже 6 мегабайт, прямо как у V100. Ну а про ширину полосы пропускания даже говорить страшно у V100 это 300 Гигабит в секунду, а у Церебро 100 ПЕТАбит в секунду. То есть разница в 33 тысячи раз!



А чтобы достичь схожей вычислительной мощности они заявляют, что нужна тысяча 100 карт NVIDIA, что суммарно будет потреблять в 50 раз больше мощности и занимать в 40 раз больше места это очень значительная экономия электроэнергии и свободного пространства.





Это конечно прекрасно цифры поражают. Но как удалось их достичь?

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

Однако, размер это одновременно и главный недостаток Церебро.

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









При потреблении 20 кВт, которые подаются через двенадцать разъемов питания, четыре уходит только на питание вентиляторов и насосов для системы охлаждения. Но в результате они достигли того, что чип работает при вдвое меньших температурах, чем стандартные GPU, что в конце концов повышает надежность всей системы.

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

Сам же чип собирает TSMC по, вы не поверите, 16 нанометровому техпроцессу. И тут вы можете справедливо возмутится. Как же так? Все уже делают чипы на 5 нм, какой смысл делать на древних 16 нм?

Тут то и скрывается вторая проблема.При производстве классических чипов, неизбежно бывает брак, который приводит к тому, что несколько чипов оказываются негодными и выкидываются или используются для других задач, и чем мельче тех процесс, тем выше процент брака. Но когда у тебя вся кремниевая подложка это один чип, то любая ошибка в производстве приводит к тому, что всю пластину можно выкидывать.А при условии что одна пластина может изготавливаться несколько месяцев и стоит около миллиона долларов, что ж.

Суть в том, что ребята решили, как бы, подстраховаться. Ведь 16 нм техпроцессу уже почти семь лет: детали и тонкости при его производстве отлично изучены. Так сказать уменьшают риски! Но стоит сказать, что уже ведется разработка и тестирование такого чипа на 7 нм, но его выход конечно будет зависеть от спроса на первое поколение! И там цифры просто огромные, только посмотрите на таблицу.





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

Национальная лаборатория энергетических технологий Министерства энергетики США заявила, что CS-1 первая система, которая смоделировала работу более миллиона топливных ячеек быстрее, чем в режиме реального времени.

Это означает, что когда CS-1 используется для моделирования, например, электростанции на основе данных о ее текущем состоянии, она может сказать, что произойдет в будущем быстрее, чем законы физики дадут такой же результат.Вы поняли? С помощью этого ПК можно заглянуть в будущее с высокой точностью, и если нужно подкорректировать и изменить его.И еще, например, в симуляции с 500 миллионами переменных Cerebras CS-1 уже обогнал суперкомпьютер Joule, занимающий 69-е место в рейтинге самых мощных суперкомпьютеров мира. Так что похоже со спросом проблем не ожидается.



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

Из открытых источников мы нашли только что в 2020 году в суперкомпьютерном центре Питтсбурга было куплено 2 компьютера Cerebras CS-1 за 5 миллионов долларов. Но система делается только под заказ и под каждого конкретного клиента, так что цена может варьироваться.

Выводы



Это явно уникальная система. И такого раньше никто не делал! Большинство производителей считают, что гораздо выгоднее и эффективнее наштамповать кучу маленьких процессоров, так как вероятность брака или поломки сильно падает и каждая ошибка сильно дешевле.Разработчики Церебро же решили пойти рискованным путем и, судя по тому, что процессор Cerebras CS-2 уже тестируют, их путь успешен.

И если все что они заявили сбудется, то нас ждет абсолютно новая эра серверных вычислений, невероятные возможности для создания компьютерных моделей, новые мощности искусственного интеллекта. Нет сомнений, что и гиганты рынка, такие как Nvidia, Intel, Google, посмотрев на удачный опыт Церебро займутся разработкой своих огромных однокристальных систем.А вы только представьте, что будет если совместить это с квантовыми вычислениями, о которых мы недавно делали разбор? Ух!

Будем следить за развитием технологий, и продолжим дальше делать для вас такие интересные обзорные материалы про самые современные достижения!



PS. Кстати, лайк если поняли пасхалку в Церебро ведь решетка радиатора выполнена в форме специальной сетки, которая используется в компьютерном моделировании для расчетов. Отсылка к предназначению Церебро!
Подробнее..

Собираем Свой Суперкомпьютер Недорого

16.03.2021 14:17:52 | Автор: admin

thumbnail


Нынче никого не удивишь достижениями искусственного интеллекта машинного обучения (ML) в самых разных областях. При этом доверчивые граждане редко задают два вопроса: (i) а какая собственно цена экспериментов и финальной системы и (ii) имеет ли сделанное хоть какую-то целесообразность? Самым важным компонентом такой цены являются как ни странно цена на железо и зарплаты людей. В случае если это все крутится в облаке, нужно еще умножать стоимость железа в 2-3 раза (маржа посредника).


И тут мы неизбежно приходим к тому, что несмотря на то, что теперь даже в официальные билды PyTorch добавляют бета-поддержку ROCm, Nvidia де-факто в этом цикле обновления железа (и скорее всего следующем) остается монополистом. Понятно, что есть TPU от Google и мифические IPU от Graphcore, но реальной альтернативы не в облаке пока нет и не предвидится (первая версия CUDA вышла аж 13 лет назад!).


Что делать и какие опции есть, когда зачем-то хочется собрать свой "суперкомпьютер", но при этом не хочется платить маржу, заложенную в продукты для ультра-богатых [мысленно вставить комментарий про госдолг США, майнинг, крах Бреттон-Вудсткой системы, цены на здравоохранение в странах ОЭСР]? Чтобы попасть в топ-500 суперкомпьютеров достаточно купить DGX Superpod, в котором от 20 до 100 с лишним видеокарт. Из своей практики де-факто серьезное машинное обучение сейчас подразумевает карточки Nvidia в количестве примерно 8-20 штук (понятно что карточки бывают разные).


Основная оговорка в этой статье мы поговорим про билд, в котором нужно делать много стандартных операций (для чего обычно используют видеокарты), но не нужно астрономически много RAM (вообще вроде как даже топовые Threadripper процессоры от AMD поддерживают много RAM, но материнских плат таких нет). Вообще все эти вещи довольно очевидны и просты, но я нигде не видел их собранными в одном месте без купюр.


Видеокарта


Итак нам стало понятно, что нам нужны карточки Nvidia для вычислений. Но не торопитесь покупать карты Quadro или Tesla или покупать официальные сборки, потому что зачастую в сборках заложена маржа в 50-60%. Обращаю внимание также на то, что все "метрики" в этой статье приведены весьма примерные и условные (скорее коррелирующие с нашей ежедневной работой, цены меняются постоянно, а тренды нет), потому что всегда найдется какой-то вид нейросетей на каком-то особом модном виде тензоров от Гугла, где все будет работать не так. Также опустим и то, что из-за короны и бума майнинга розничные цены неадекватны, но как говорится "This time is not different" и можно всегда будет закупиться на дне пузыря.


Как ни странно, с точки зрения потребителя с картами все просто. Вообще есть довольно популярная и длинная статья про выбор и сравнение карточек, она довольно неплохая, но автор явно в силу своего бекграунда упускает некоторые вопросы админства и сравнивает целесообразность опций только с точки зрения первичного рынка США (и очень много букв). Полезную выжимку этой статьи я уже писал тут а для целей этой статьи выжимка уже более подробная и такая:


  • Карточки для обучения:


    • По критерию цена / качество при прочих равных игровые карточки всегда лучше "специализированных". Например я лично сравнивал самые мощные из доступных карт 3090 против А100. А100 "быстрее" 3090 примерно в 2 раза но по официальной цене дороже в 5-6 раз;
    • Рассматривать стоит игровые карточки начиная с поколения "Pascal" (серия 10), серия 20 всеми была признана неуспешной и дорогой, даже базовые карточки же архитектуры Ampere (серия 30*) превзошли флагманы прошлого поколения (спасибо AMD, которая "почти" догнала Nvidia);
    • Лучшая карта всех времен и народов подержанная 1080 Ti с Авито. Не нужно пугаться отсутствия гарантии или годового пробега (два или три года постоянного майнинга я бы не стал брать, касательно игр тут все попроще). Просто грамотно осматривайте и тестируйте карты при покупке, погоняйте "пушистый бублик" хотя бы минут 20, осмотрите маркировку карты, банально прочитайте что выдают дрова и бенчмарки. При должном обращении ресурс карточки составляет примерно 3-4 года постоянного использования (в сухом прохладном помещении, периодически выдувая пыль);
    • На пальцах топовые карты Ampere примерно в 2 раза быстрее 1080 Ti (а иногда и в 3). Мы даже не рассматривали покупку 3080 по банальной причине, что Nvidia зажала для них памяти (вероятно мотивируя пользователей 4K мониторов или использовать DLSS или покупать 3090). Причем я слышал странные слухи про 3080 с 16 или 20 GB памяти (в ноутбуках?);
    • Также немаловажно что в поколении 20* появились тензорные ядра, и хоть в игровых картах они в первую очередь предназначены для таких вещей как DLSS и как-то обрезаны, но тем не менее на части задач вкупе с использованием AMP или APEX они позволяют получить ещё прирост в скорости в два раза. Это объемная тема, я описывал свои мысли тут, и конечно читайте доку от Nvidia;

    Screenshot 2021-03-12 114522


    Кто знает, уточните что это такое вообще? Какие-то секретные склады Nvidia?

    • C 3090 с "турбиной" правда вышел казус, она вышла настолько удачной, что по слухам из-за того что "серьезные" люди стали предпочитать ее дорогим картам Tesla под давлением от Nvidia несколько производителей сняли ее с производства;

  • Карточки для продакшена:


    • Я сталкивался с большим количеством заблуждений касательно деплоя на карточках и отразил большую часть тут;
    • Вообще если нет особых требований от админов (или система допустим собирается в super-tower корпусе который вставляется в стойку), то можно использовать те же игровые карты;
    • Но если по какой-то причине вам реально нужны карты с низким TDP или реально однослотовые или пассивные то есть интересные однослотовые решения линейки Quadro RTX и старая Tesla T4, цена которой хоть как-то адекватна (до пузыря). Минус Quadro состоит только в несколько завышенной референсной цене;

  • Охлаждение:


    • Карточки серии Ampere "холодные" 3-4 3090, стоящие рядом, без каких-либо настроек не греются выше 70-75 градусов, когда 80-85 это норма для 1080 Ti;
    • Если карты будут стоять на "уголках" (без корпуса) или в корпусе для майнинга то по сути неважно какая там система охлаждения;
    • Если карты будут стоять рядом то неизбежно обязательно покупать карточки с "турбиной" (центробежный вентилятор, выталкивающий воздух из корпуса);
    • Особняком стоят карточки такого форм-фактора гибрид водянки и воздуха, но их и раньше было почти невозможно купить. Я пользовался ими немного у знакомого, они реально особо не греются выше 50 градусов;
    • Отдельно стоит кастомные однослотовые версии версии обычных карт с водянкой (пример). Понятно, что их тоже практически невозможно купить. А если делать самому, то тут сборка сразу становится нетривиальной (я интересовался, кастомная вода, установка радиатора, зачем-то реболлинг, кастомная водянка, знатоки уточните болячки таких билдов);

  • PCIE lanes:


    • Чем больше, тем лучше, но насколько PCIE 4.0 помогает я пока не понял, вроде и так ничего не тормозило никогда;
    • До 4 карт в 1 сервере вам абсолютно точно достаточно PCIE 3.0 8x на 1 карту;
    • По рассказам людей, на 6-8 картах, этого тоже в принципе достаточно;
    • Я не собирал сервера с кастомной водой на 7-8 карточек, поэтому мне тут тяжело сказать;
    • Читайте документацию процессора и материнской платы;

  • Питание:


    • Это миф, что нет нормальных консьюмерских блоков питания на 4 3090. Есть блоки питания Super Flower и Platimax на 1500-2000 Ватт, прекрасно зарекомендовавшие себя. И если вы завтра не выбираете железо, чтобы обслуживать ML задачи уровня условного ВК, то высока вероятность что для продакшена вам вообще хватит 1 сервера (с исследованиями сложнее). Так же для исследований совсем не нужно двойное резервирование по питанию;
    • Если по какой-то причине вы не можете купить один блок на 2000 ватт, то можно просто купить плату для синхронизации двух блоков по 1000 ватт;
    • Вообще утилиты Nvidia позволяют настроить потребление карт, но можно просто рассчитывать мощность из расчета 300 Вт в пике на 1 карточку + 30% запаса мощности блока питания;


Диски


hdd_vs_flash_trends


Источник: WDC: No SSD/HDD Crossover

Вообще можно понятно привести старый график показывающий, что цены падают все еще и на SSD и на HDD, но никак не пересекутся. Но самое адекватное описание ситуации, которое я видел, можно глянуть тут.


Если коротко и немного с добавлением ML:


  • SSD скорее всего никогда не догонят по цене HDD;
  • Меньше какого-то размера нет смысла НЕ покупать NVME SSD;
  • Для медленной помойки и бекапов конечно нельзя НЕ использовать HDD (или даже внешнее хранилище);
  • Точка "перехода" из быстрого в медленное хранилище у всех будет разной, но на рынке сейчас есть довольно дешевые SATA3 SSD на 1-4 терабайта;

И раз уж мы собераем "дешевый" суперкомпьютер из нескольких нод, то можно к нему и собрать и сетевую помойку тоже недорого (раз, два, три). Дальше в принципе можно стандартными средствами Linux даже SSD подкачку сделать для RAID массива (я пока просто обходился десятым RAID на 10 Gbit сети для наших задач). Единственный момент нужно недорого найти 10 Gbit/s оборудование, с этим может быть сложнее, но многие топовые материнские платы сейчас имеют 2 10 Gbit/s порта и на рынке есть пара недорогих PCIE решений.


Материнская Плата, Шасси


Допустим с выбором карточек определились. И тут мы переходим к самом интересному к шасси, на котором предстоит сборка. Большими мазками для обычных граждан и не только условно легко доступны 4 основных типа систем:


  • Nvidia DGX и его аналоги от менее пафосных вендоров. Там все прекрасно, кроме цены. Если очень грубо прикидывать, там стоят самые дорогие компоненты, и сверху еще маржа примерно в два раза поверх цены этих компонентов;
  • Кастомные сборки от кастом шопов. Самый яркий пример это вот эта контора. По ним в принципе можно даже проектировать свои сборки (правда допустим в декстоп сегменте там могут быть старые материнские платы). Видно также, что более новые сборки там как раз доступны с 3080 и 3090. Минус такого подхода опять же такая компания хоть и на бумаге формально представляет "поддержку", но по анекдотам эта поддержка естественно не глобальная и решение проблем занимает время. Простым языком админить это все равно надо самому, никто не поедет решать вашу проблему в воскресенье именно в вашей стране. Единственная экспертиза таких ребят, которая не валяется на дороге, это взять на себя геморрой по сборке кастомной воды на 8 карт и дать на это гарантию, но опять же по анекдотам людей вода (а особенно в свете "холодных" Амперов) не стоит свеч. Появление таких кулеров как Ice Giant делает воду вообще менее привлекательной долгосрочно;
  • Сборки на основе серверных платформ от SuperMicro или Gigabyte (или любой крупной аналогичной фирмы). Раньше моя претензия к таким платформам была в том, что в разумных ценах там никогда не было NVME дисков и были сильно устаревшие сокеты процессоров Intel. Сейчас подтянулись новые серверные решения на базе AMD и минус по сути только в цене. Естественно "официально" поддерживаются только карты Tesla и нужна только ECC память и серверные процессоры (как правило дороже в 2-3 раза);
  • Сборки на основе "профессиональных" и "экстремальных" материнских плат на обычном консьюмерском железе. В качестве корпуса можно использовать просто любой качественный большой ATX корпус или даже корпус для майнинга;

Первую категорию мы смело отметаем, т.к. мы хотим все-таки экономить. Вторая и четвертая категории по сути идентичны, но мы не хотим платить 50% маржи за гарантию (которую при покупке новых деталей и так дает производитель) и "поддержку" (и какие-то детали проще купить подержанными, например те же 1080 Ti на первое время). Получается, что выбор на самом деле между специализированными серверными платформами и самостоятельной сборкой. Есть еще пятый вариант заколхолзить на основе Б/У или "пустого" серверного корпуса применив смекалку, но по сути этот вариант просто является адаптацией варианта четыре к установке в стойку, но нужно или иметь такие железки под рукой или знать где покупать и как проверять (мне пару раз предлагали по цене металлолома какие-то старые салазки но там всегда или не было посадочных мест под PCIE в нужном количестве, или было вопросы к питанию а колхозить не хотелось).


Если внимательно посмотреть на характеристики серверных шасси и "профессиональных" материнских плат, то можно найти несколько интересных закономерностей (по сути они и размер вашего бюджета будут диктовать ваш выбор):


  • В Intel сейчас любят кидаться камнями, но процессоры ThreadRipper от AMD по номинальной цене просто прекрасны и неплохо так внесли новую струю на рынок. Серверные решения на базе EPYC такой же процессорной мощности стоят просто в 2-3 раза дороже;
  • Существует много профессиональных материнских плат на 6-7 PCIE слотов или плат для энтузиастов с 4 двойными PCIE слотами. Но все современные интересные карточки (без кастомной воды) с турбиной занимают 2 слота. И производители карт (судя буквально по наличию только одной или двух таких карты за несколько лет) не заинтересованы делать однослотовые карты (а зачем? геймеру никогда не нужно больше 2-4 карт). Никто не запрещает взять материнскую плату на 6-7 слотов от ASUS, майнерский корпус (или просто уголки из Икеи) и собрать все аки майнер на райзерах (найти работающий на x8-x16 райзер это то еще развлечение). Но у такой системы будет несколько минусов нельзя вставить в стойку, райзеры у меня лично постоянно глючили и отваливались, опредленный колхоз, отсутствие удобной фурнитуры и повышенный уровень шума (при прочих равных). Далеко не все ДЦ принимают такие системы для хостинга;
  • Получается, что если совсем абстрагироваться от конкретных цен в моменте, то есть всего 3 интересных опции: (i) или полностью консьюмерская сборка желательно на не ушатанных картах со вторичного рынка реалистично тянущая 4-6 карт (вопрос готовы ли вы геморроиться на райзеры, уголки и / или корпуса для майнеров) (ii) очень похожая сборка, но допустим на базе super-tower от Gigabyte или SuperMicro (оно будет вставляться в стойку тут основная фишка в этом, но часть деталей будет дороже) (iii) сборка на основе серверной платформы;
  • Опция (i) максимально выгодна, если вы можете собрать N машин по 4-6 карт и может стоить в 3-5 раз дешевле опции (iii) за счет цены самого шасси, повышенной цены процессора и повышенной цены ECC RAM;
  • Опция (ii) или (iii) неизбежна, если у вас есть обязательные требования по установке в стойку (колхозные варианты с переделкой старых шасси тут опускаем, т.к. у меня нет опыта, но может кто-то из коммьюнити делала). В нагрузку вы получите скорее всего дублирование блока питания, но для исследований это просто не нужно;
  • Я бы предположил, что опция (iii) становится привлекательной, если почему-то вы хотите ставить сразу 8-12 видеокарт в один сервер;

Еще отдельно отмечу, что я не использовал однослотовые видеокарты Quadro RTX для обучения нейросетей, но чисто по характеристикам кажется, что две такие карты примерно эквивалентны одной 3090, было бы также интересно выслушать тех, кто пробовал, в комментариях.


basic_config_example


Просто пример базового конфига на базе серверного шасси. Обратите внимание, что только само шасси стоит столько же, сколько может стоить целый бокс, если карточки купить подержанные!

Процессор и Шасси


Тут на самом деле все просто. Процессор вы по сути выбираете выбирая материнскую плату (я описал основные моменты, которые кажутся мне важными).


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


Сеть


У меня пока не было потребности (ну или скажем так, мы всегда умудрялись оптимизировать свои расчеты), где нужно было бы соединять несколько нод для расчетов используя скажем DistributedDataParallel из PyTorch (на одной ноде все конечно прекрасно работает). Не могу оценить хватит ли для него "стандартных" 10 Gbit/s без установки дорогих сетевых карт на 40+ Gbit/s. Отдельный вопрос конечно что с этим делать, т.к. такая плата скорее всего займет еще один PCIE-слот.


Пока тут могу рассказать только про один хак в "профессиональных" и "экстремальных" материнках зачастую бывает 1-2 разъема по 10 Gbit/s (и иногда даже третий гигабитный). В совсем дешевом варианте (только цена патч-корда высокой категории, но на коротком расстоянии даже "плохие" патч-корды показывают 10 гигабит) две такие материнки можно соеденить напрямую друг с другом и получить "суперкомпьютер". Если таких разъема два, то можно в мастер ноду уже воткнуть два патч-корда. Но чтобы соединить сеть больше, уже придется найти 10 гигабитный свич (внезапно найти подержанный Mikrotik не проблема, но они обычно очень сложны в настройке).


Финальные Ремарки и Исправления Ошибок


Буду очень рад, если знающие люди, кто строил такие системы и сети поделятся в комментариях опытом, проблемами, результатами своих экспериментов и мотивацией при выборе своей платформы!


Об Авторе


Александр Вейсов основатель / владелец комании Силеро (silero.ai), небольшой независимой компании, которая занимается разработкой продуктов в сфере распознавания, синтеза речи и NLP. Публике Хабра Силеро может быть известна по датасету Open STT, моделям silero-models или VAD-у silero-vad. На российском рынке компания распространяет свои решения через прямые продажи / проекты и вендоров / системных интеграторов софта.

Подробнее..

Софт пожирает мир. Закат универсальных CPU

24.03.2021 12:04:07 | Автор: admin

Tesla по сравнению с другими автомобилями сегодня примерно как первый смартфон среди кнопочных телефонов в 2006 году

Десять лет назад Марк Андриссен опубликовал в WSJ статью Почему софт пожирает мир ("Why Software Is Eating The World"). Он утверждал, что произошёл фундаментальный сдвиг в важности программного обеспечения для человеческой цивилизации.

Раньше компьютерные компании IBM, Oracle или Microsoft продавали компьютеры и софт в качестве инструментов. Теперь появилось поколение компаний, которые создают программное обеспечение и используют его сами, чтобы войти в другую отрасль и изменить её. Uber и Airbnb не продают программное обеспечение таксопаркам и гостиничным компаниям, а используют его сами. Tesla и Amazon показывают удивительный рост скорее как софтверные компании, а не как магазин и производитель автомобилей. Трансформируя целые отрасли экономики, софт пожирает мир.

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

Понятие универсальной технологии


В экономике есть теория универсальных технологий (general-purpose technology, GPT). Это многоцелевые технологии, которые применяются сразу во многих отраслях и меняют всю экономику целиком, потенциально вызывая и социальные изменения в обществе. Примеры таких технологий паровой двигатель, железная дорога, электричество, электроника, автомобиль, компьютер, интернет. Подробнее о GPT см. научную работу "General purpose technologies Engines of growth?" (Journal of Econometrics, Volume 65, Issue 1, January 1995, pages 83-108).

Например, автомобиль. Целые отрасли экономики трансформировались под влиянием грузоперевозок и массовой автомобилизации. Скажем, сеть магазинов Walmart основана исходя из того факта, что у большинства людей есть личные автомобили. Бизнес полностью основан на двух технологиях: 1) грузоперевозки; 2) личные автомобили. И речь идёт о розничных магазинах, а не о транспортной компании.


Walmart

Или электричество. также сильно трансформировало целые отрасли экономики и изменило общественный уклад.

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

Софт пожирает мир


Интересно посмотреть на конкретные отрасли, которых были дестабилизированы программным обеспечением в прошлом и что произошло дальше. Одной из первых стала музыкальная индустрия, затем книгоиздательство. Хотя в фундаментальном смысле эти рынки по-прежнему контролируют музыкальные лейблы и книжные издательства, а не IT-компании, поскольку музыка, книги всё это слишком мелкие, нишевые рынки по сравнению с IT.

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

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

Закат универсальных процессоров


Согласно теории GPT, универсальная технология может столкнуться с проблемами в конце своего жизненного цикла: в процессе замедления прогресса другие технологии вытесняют её в определённых нишах. По мнению учёных Нейла Томпсона (MIT) и Свеньи Спануты (ETH Zurich), сейчас подобное происходит с универсальными компьютерами, см. статью "The Decline of Computers as a General Purpose Technology" (Communications of the ACM, March 2021, Vol. 64 No. 3, Pages 64-72, doi: 10.1145/3430936).

Сегодня мы наблюдаем такой переход. Прогресс в CPU замедляются, и поэтому приложения переходят на специализированные процессоры. Исследователи подчёркивают: речь не о том, что компьютеры в целом разучатся делать какие-то вычисления, а именно об окончании экономического цикла GPT. На его место приходит фрагментарный цикл, когда экономика подталкивает пользователей к специализированным вычислительным платформам на процессорах специального назначения. Этот процесс угрожает подкрепляющему циклу технологического развития (см. рис. 1).


Рис. 1. Исторический подкрепляющий цикл технологического развития (а) заменяется фрагментарным циклом (b)

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

Переход от универсальных к специализированным CPU может замедлить общие темпы совершенствования компьютеров, считают исследователи.

На протяжении десятилетий человечество извлекало пользу из этого благотворного экономического цикла GPT по мере прогресса универсальных процессоров. Рынок вырос от нескольких дорогостоящих мейнфреймов для военной, космической и других областей до более чем двух миллиардов универсальных компьютеров. Этот рост подпитывал увеличение инвестиций в улучшение процессоров. Например, Intel за последнее десятилетие потратила $183 млрд на НИОКР и новые производственные мощности. Это принесло огромные дивиденды: по некоторым оценкам, производительность процессоров с 1971 года увеличилась примерно в 400 000 раз.

Альтернатива специализированные процессоры. Поскольку универсальный CPU должен хорошо выполнять множество различных вычислений, это приводит к неоптимальным конструктивным компромиссам. Штраф за производительность от этого компромисса особенно высок для специализированных приложений, которые можно сильно распараллелить. Например, специализированные интегральные схемы ASIC или части гетерогенных микросхем показывают лучший результат для специализированных приложений, поскольку железо адаптировано к вычислениям.

Насколько сильно специализация отражается в конструкции процессора видно в сравнении типичных CPU и GPU.

Тип Модель Параллельных вычислений Скорость Полоса памяти Доступ к кэшу L1
CPU Intel Xeon E5-2690v4 28 2,63,5 Ггц 76,8 ГБ/с 512 тактовых циклов
GPU Nvidia P100 3584 1,1 ГГц 732 ГБ/с 80 тактовых циклов

GPU работает на меньшей тактовой частоте, но в каждом такте может выполнять в 100 раз больше параллельных вычислений, чем CPU. Это делает его намного быстрее для сильно распараллеленных задач. Например, приложения для машинного обучения (AlexNet и Caffe) выполняются в 35+ раз быстрее на GPU, чем на CPU, по данным Nvidia.

В то же время у специализированных процессоров существенные недостатки: они запускают только ограниченный набор программ, их труднее программировать и часто они требуют для управления универсального CPU. Для универсальных процессоров постоянные затраты (единовременные инженерные затраты, NRE) распределяются по большому количеству микросхем. В отличие от них, у специализированных процессоров гораздо меньшие рынки сбыта и, следовательно, более высокие постоянные затраты на каждый чип. Для понимания, общая стоимость разработки и производства специализированного CPU на передовых технологиях составляет около $80 млн, на технологиях более старого поколения $30 млн.

За последние десятилетия специализированные процессоры (кроме GPU) использовались только в узких нишах: военные приложения, игры, майнинг. Но ситуация начинает меняться. По мнению исследователей, на сегодняшний день все основные вычислительные платформы мобильные устройства, Интернет вещей и облачные/суперкомпьютерные вычисления переходят на специализированные процессоры. Разве что рынок ПК остаётся на более универсальных CPU.

Отраслевые эксперты группы International Technology Roadmap for Semiconductors (ITRS), которая координирует технологические усовершенствования для поддержания закона Мура, в своём докладе косвенно одобрили этот сдвиг в сторону специализации CPU. Они признали, что традиционный универсальный подход с уменьшением размера транзисторов больше не должен определять требования к конструкции, а её следует адаптировать к конкретным приложениям.

Для измерения темпов совершенствования процессоров можно рассмотреть два ключевых показателя: общая производительность и производительность на доллар. Исторически обе эти метрики быстро улучшались благодаря закону Мура и масштабированию Деннарда. К сожалению, масштабирование Деннарда закончилось в 20042005 гг из-за технических проблем, а закон Мура тоже подходит к концу, поскольку производители достигли физических пределов транзисторов в современных материалах.


Рис. 2. Ежегодное улучшение результата SPECInt в новых моделях CPU (a) и ежегодное снижение цен с поправкой на производительность (b), источники: 1, 2

Из-за коварных законов физики растёт стоимость производства микросхем. В 2017 году стоимость строительства и оснащения завода по производству микросхем последнего поколения превысила $7 млрд.


Рис. 3. Стоимость нового завода (a) и количество производителей, освоивших передовой техпроцесс по производству микросхем в данном году (b)

На пике закона Мура специализированным процессорам было трудно пробиться на рынок, потому что универсальные CPU слишком быстро развивались и инвестиции в специализированные процессоры были невыгодными даже при условии многократной разницы в производительности на начальном этапе.

Но с нынешней скоростью улучшения CPU в районе 8% в год ситуация кардинально изменяется: инвестиции в специализированные CPU становятся крайне выгодными.

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

  • становится сложнее финансировать инновации,
  • новые CPU не такие впечатляющие, по сравнению со старыми
  • меньше новых пользователей (многие пропускают апгрейд на новое поколение CPU, ожидая следующего)
К сожалению, депрессивные эффекты тоже подкрепляют друг друга, как и положительные эффекты в момент расцвета GPT.

Если текущие тенденции сохранятся, то к 20262032 годам (в зависимости от темпов роста рынка) передовые полупроводниковые производства сможет поддерживать только один производитель-монополист, а ежегодные постоянные затраты на строительство одного нового объекта для каждого размера узла будут равны ежегодному доходу отрасли. Чтобы предотвратить такой мрачный сценарий, уже через 10 лет производители будут вынуждены резко замедлить разработку новых технологических процессов и снизить финансирование, что ещё больше замедлит прогресс в универсальных CPU, считают исследователи.

Вывод


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

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

В любом случае, программное обеспечение это новая форма базовой грамотности современного человека. Если в стране или в компании низкий уровень грамотности, это невозможно компенсировать ничем другим. Всё теперь работает на софте.



На правах рекламы


Серверы для размещения сайтов и разработки это про наши эпичные! Все серверы из коробки защищены от DDoS-атак, скорость интернет-канала 500 Мегабит, автоматическая установка удобной панели управления VestaCP для размещения сайтов и даже автоматическая установка Windows Server на тарифах с 4 ГБ ОЗУ, 2 vCPU и 20 ГБ дискового пространства или выше. Лучше один раз попробовать ;)

Подробнее..

Играемся с Новыми GPU на базе Ampere от Nvidia и пробуем MIG

02.12.2020 16:10:54 | Автор: admin


Каждый раз, когда встает заветный вопрос, апгрейдить ли карточки в серверной или нет, я просматриваю подобные статьи и смотрю такие видосы (нет, маркетинговым материалам от Nvidia конечно верить нельзя, как показал недавний кейс с числом CUDA-ядер).


Канал "Этот Компьютер" очень сильно недооценен, но автор не занимается ML. А в целом при анализе сравнений акселераторов для ML в глаза как правило бросаются несколько вещей:


  • Авторы учитывают как правило только "адекватность" для рынка новых карт в США;
  • Рейтинги далеки от народа и делаются на весьма стандартных сетках (что наверное в целом хорошо) без деталей;
  • Популярная мантра тренировать все более гигантские сетки вносит свои коррективы в сравнения;

Не нужно быть семи пядей во лбу, чтобы знать очевидный ответ на вопрос "а какая карта лучше?": карточки серии 20* в массы не пошли, 1080 Ti с Авито до сих очень привлекательны (и не особо дешевеют как ни странно, вероятно по этой причине).


Все это прекрасно и вряд ли стандартные бенчмарки сильно врут, но недавно я узнал про существование технологии Multi-Intance-GPU для видеокарт А100 и нативную поддержку TF32 и мне пришла идея поделиться своим опытом реального тестирования карточек на архитектуре Ampere (3090 и А100). В этой небольшой заметке я постараюсь ответить на вопросы:


  • Стоит ли свеч обновление на Ampere? (спойлер для нетерпеливых да);
  • Стоят ли своих денег A100 (спойлер в общем случае нет);
  • Есть ли кейсы, когда A100 все-таки интересны (спойлер да);
  • Полезна ли технология MIG (спойлер да, но для инференса и для очень специфичных случаев для обучения);

За деталями прошу под кат.


Простые Вещи


Давайте сразу обратим внимание на слона в комнате. На момент написания этой заметки:


  • 3090 довольно сложно купить и продаются они примерно с 30-40% премией. Причем нехватки новых карт есть не только в СНГ;
  • A100 почти невозможно купить. Партнеры Nvidia говорили что в РФ наличии есть 1 штука, потом приедет еще несколько штук;
  • Я не особо искал, но с наскоку я не нашел информации насколько PCIE версия A100 совместима с обычными ATX платформами (именно на этот вопрос партнеры Nvidia не ответили, но я предполагаю, что в картах нет своего кулера и предполагается установка в серверное шасси с "громким" феном);
  • 3080 и более младшие модели (хотя они очень интересны по цене, а особенно для игр) не тестировали, т.к. у нас их нет, а не рассматривали их из-за размера памяти (я наивно предполагал, что получится крутить несколько сеток на 1 карте, но там все работает несколько иначе);

По понятным причинам холивор кормить или не кормить Амазон выносим за скобки. Уверен, что среди комментаторов найдутся свидетели церкви Амазона, но свой риг как правило "окупается" против облачных цен (особенно если собирать из дешевых компонентов) где-то за полгода-год использования.


Охлаждение


Если верить утилитам от Nvidia, то 3090 и А100 на 15-20 градусов холоднее, чем Maxwell и Pascal. Я не проводил точные замеры, но в среднем ситуация такая:


  • 4 * 1080 Ti (Pascal) с минимальными хаками по охладжению работают в диапазоне 75-80С под 100% нагрузкой;
  • 3 * Titan X (Maxwell) работали в районе 85С под 100% нагрузкой;
  • 3 * 3090 (Ampere) работают в диапазоне 60-70С под 100% нагрузкой;
  • Нигде не применялся ни разгон, ни ограничения по питанию карт или скорости кулеров, все "из коробки";
  • Все карты имеют "турбину", то есть выталкивают тепло из корпуса;

На вопрос "почему" есть 3 гипотезы:


  • Новый техпроцесс;
  • У 3090 немного другая форма самой карты, размер вентилятора заметно больше, размер отверстия на задней панельке сильно больше;
  • 3090 кажется тяжелее (может кто-то знает где найти точные цифры, карт нет под рукой сейчас);


Наглядная иллюстрация отличий карточек, может кто-то из комментариев подскажет диаметр вентилятора?

Наивные Метрики


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


Test GPU Gflop/s
./gpu_burn 120 Titan X (Maxwell) 4,300
./gpu_burn 120 1080 Ti (Pascal) 8,500
./gpu_burn 120 3090 (Ampere) 16,500
./gpu_burn 120 A100 (wo MIG) 16,700
./gpu-burn -tc 120 3090 (Ampere) 38,500
./gpu-burn -tc 120 A100 (wo MIG) 81,500

MIG не тестировался тут, дальше в статье увидите почему.


Цена Вопроса


Тут важно отметить, что 1080 Ti и Titan X мы покупали с рук условно "новые" (менее года использования). Не будем останавливаться лишний раз на холиворах про майнеров и политику ценообразования Nvidia, но если бережно использовать даже б/у игровые карты их срок службы где-то 3-4 года. Цены и характеристики указаны примерные. A100 по информации от партнеров Nvidia в России в продаже имеется до нового года одна. Когда 1080Ti были доступны новыми, цены колебались примерно от 50к до 100к рублей.


GPU Mem Цена
Titan X (Maxwell) 12G 10,000 рублей (Авито)
1080 Ti 11G 25,000 рублей (Авито)
3090 (Ampere) 24G 160,000+ рублей (новая)
A100 (wo MIG) 40G US$12,500 (новая)

Думаю очевидные выводы дальше читатели сделают сами.

Пробуем 3090 и A100 c MIG


Пробуем 3090


А теперь переходим к самому интересному к реальным тестам и собираем грабли на реальных задачах. В теории кажется, что если по памяти и вычислительным способностям 3090 или А100 в 2-3 раза превосходят 1080 Ti, то 1 такая карточка может заменить 2-3 1080 Ti и на стандартном сервере с 4 полноценными PCIE портами можно получить аналог сервера с 12 картами? Ну или можно ли взять допустим 3-4 PCIE версии A100 и получить очень мощный сервер, разделив каждую из них на несколько compute instance с использованием MIG?


Короткий ответ нет, более длинный ответ тоже нет, но с многочисленными оговорками.


Зачем спросите? Да просто серверные решения, которые полноценно поддерживают 8 16 видеокарт даже в минимальной разумной конфигурации по цене выходят в 4-5 раз дороже, чем стандартные ATX решения. А DGX Workstation или DGX продаются еще с примерно 50% премией к своей аналогичной сборке, если собирать на базе платформ от Mikrotik или Gigabyte.


Производители карт не торопятся выпускать полноценные однослотовые решения (кроме PNY c серией Quadro, но это отдельная история и скорее для дизайна или инференса). Конечно можно собрать кастомный водяной контур на 7 карточек (было несколько моделей материнских плат с 7 полноценными PCIE портами), но это "сложно" и неясно где такое размещать (да и игра не стоит свеч). С приходом PCIE 4.0 привлекательность таких решений по идее должна вырасти, но я пока не видел ничего интересного на рынке.


Пара огоровок про задачу на которой тестировали:


  • Задача тренировка Spech-to-Text сетки на украинском датасете;
  • Из-за самой задачи экспериментально оптимальный размер батча на один процесс 50 не получается увеличивать без потерь в скорости сходимости;
  • Именно на этой задаче AMP у нас не работает (хотя работает на других при прочих равных, мы пока не поняли почему), но это скорее оптимизация. То есть дело не в железе, а в задаче. На других задачах работает, поэтому вынесем за скобки;
  • Важая оговорка поскольку по сути эта задача это sequence-to-sequence, то в общем случае построение батчей тут не совсем тривиально. Файлы разной длины попадают в батч только с файлами примерно такой же длины (чтобы снизить впустую потраченные ресурсы на обработку падинга), но размер батча статический для упрощения сравнений и более быстрой сходимости;
  • Динамический размер батча и просто его увеличение тестировали, но это особо не влияет на скорость и скорость сходимости (или ухудшает);

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


И тут мы наталкиваемся на первый подводный камень Distributed Data Parallel из PyTorch (DDP, оптимальный способ масштабирования сетей на "много" видеокарт) из коробки по сути настроен только на 1 процесс на 1 карте. То есть 1 процесс может использовать 1+ карту. 2 процесса не могут использовать 1 карту, даже если там есть большой запас по IO / compute / RAM. В старых версиях драйверов явного ограничения нет и на 1080 Ti 2 процесса на 1 карта запускаются (но получется прирост по скорости всего на 5-10% вместо 40-50%). На новых картах туда уже впилили exception.


RuntimeError: NCCL error in: /opt/conda/conda-bld/pytorch_1603729096996/work/torch/lib/c10d/ProcessGroupNCCL.cpp:784, invalid usage, NCCL version 2.7.8

Но не все так печально и плохо. Может из-за какой-то низкоуровневой магии в драйверах, может из-за TF32 (надеюсь тут знатоки подскажут), может из-за наработок в MPS 3090 ведут себя немного иначе на нашем бенчмарке:


  • При прочих равных и неизменных параметрах они используют больше памяти чем Titan X и 1080 Ti (~16 GB вместо 7-8 GB);
  • Скорость примерно в 3 раза выше, чем с Titan X (Maxwell);
  • [Нужно еще точно замерить скорость на 1080 Ti];
  • Утилизация карт на высоком уровне более 90%;

При попытках запускать 2 DDP воркера на 1 карте мы просто получаем ошибку, при попытке тренировать 2 сетки "одновременно" мы получаем кратное замедление, при увеличении батча прирост по скорости незначительный. Тайминги на 2 * 3090 примерно такие:


| Epoch   time, m | Type | Workers | Batch   | Params               ||-----------------|------|---------|---------|----------------------|| exception       | DDP  | 4       | 50 * 4  |                      || 3.8             | DDP  | 2       | 50 * 2  |                      || 3.9             | DDP  | 2       | 50 * 2  | cudnn_benchmark=True || 3.6             | DDP  | 2       | 100 * 2 |                      |

Для полноты рассказа, важно еще отметить что у Nvidia есть MPS который якобы позволяет крутить 2 процесса на картах без переключения контекста а в PyTorch есть встроенный RPC-фреймворк. Но первый я просто не смог адекватно использовать без очень непонятных низкоуровневых ошибок, а второй требует радикального переписывания кода и радикально усложняет код для тренировки моделей (хотя очень интересен долгосрочно).


Так, с 3090 все понятно. Две карточки она не заменит конечно, но сама по себе, даже имея "лишнюю" память (повторюсь, мы тренируем маленькие сети), работает в 2-3 раза быстрее. Эквивалентно ли это наличию 2-3 карт, зависит от задачи.


TLDR:


  • Вы можете просто заменить карты с турбиной в своем риге на 3090 (единственный момент в 3090 2 8-пиновых коннектора для питания, но на рынке есть блоки питания по 2000-Ватт которые точно могут запитать 4-5 таких карт, опять же никто не отменял синхронизацию 2 блоков питания);
  • При это скорее всего температура карт снизится на 10-20 градусов Цельсия;
  • Эти карты сейчас стоят дорого и находятся в дефиците (и, наверное вряд ли пойдут в массы), но если для вас самый дорогой ресурс это время то это интересный вариант;
  • Если большой размер памяти для вас критичен у вас по сути нет выбора;

Пробуем A100 с MIG


Посмотрев на метрики, доступность и цену карт, А100 на первый взгляд вообще не кажется интересным вариантом, разве что в облаке на 3 дня натренировать 1 большую сетку на небольшом не сильно приватном датасете. Также если вашим алгоритмам сильно помогает AMP / FP16, то А100 может существенно добавить скорости.


Но в A100 есть интересная технология MIG (Multi Instance GPU). По сути она позволяет разбить одну "большую и мощную" карточку на набор маленьких "подкарточек" и дальше создать виртуальные Compute Instances, к которым можно обращаться как к отдельным картам.


Там довольно много деталей, за ними откройте документацию, но там доступны такие пресеты:


+--------------------------------------------------------------------------+| GPU instance profiles:                                                   || GPU   Name          ID    Instances   Memory     P2P    SM    DEC   ENC  ||                           Free/Total   GiB              CE    JPEG  OFA  ||==========================================================================||   0  MIG 1g.5gb     19     0/7        4.75       No     14     0     0   ||                                                          1     0     0   |+--------------------------------------------------------------------------+|   0  MIG 2g.10gb    14     0/3        9.75       No     28     1     0   ||                                                          2     0     0   |+--------------------------------------------------------------------------+|   0  MIG 3g.20gb     9     0/2        19.62      No     42     2     0   ||                                                          3     0     0   |+--------------------------------------------------------------------------+|   0  MIG 4g.20gb     5     0/1        19.62      No     56     2     0   ||                                                          4     0     0   |+--------------------------------------------------------------------------+|   0  MIG 7g.40gb     0     0/1        39.50      No     98     5     0   ||                                                          7     1     1   |+--------------------------------------------------------------------------+


Доступные конфигурации

Возникает вопрос, а что если наша сетка маленькая, и A100 в теории (хотя бы на FP16) должна быть в 2 раза мощнее чем 3090? Можно ли взять 4 A100 и сделать из них допустим 12 видеокарт аналогичных по памяти и мощности 1080 Ti? Можно ли на этих многочисленных "микро-картах" тренировать нейросети так же как на нескольких обычных?


Ответим на вопросы по одному. Тут нам поможет как сама документация, так и совсем свежий блог пост от самой Nvidia.


В документации есть такой абзац:


MIG supports running CUDA applications by specifying the CUDA device on which the application should be run. With CUDA 11, only enumeration of a single MIG instance is supported.CUDA applications treat a CI and its parent GI as a single CUDA device. CUDA is limited to use a single CI and will pick the first one available if several of them are visible. To summarize, there are two constraints:- CUDA can only enumerate a single compute instance- CUDA will not enumerate non-MIG GPU if any compute instance is enumerated on any other GPUNote that these constraints may be relaxed in future NVIDIA driver releases for MIG.

Сначала, когда я его прочитал, мне показалось, что он означал только что нельзя распилить 2 карты, а можно использовать только одну. После того, как я попробовал поиграться с реальной картой, оказалось, что фреймворк внутри контейнера видит только 1 "карту" (причем видимо выбирает он только "первую"). Причем если мы внимательно прочитаем те примеры, которые Nvidia приводит в своем блоге, они по сути все относятся к сценарию "1 контейнер 1 кусочек карты" или "тюнинг 7 маленьких моделей параллельно".


Еще там есть вот такой пассаж:


There is no GPU-to-GPU P2P (both PCIe and NVLINK) support in MIG mode, so MIG mode does not support multi-GPU or multi-node training. For large models or models trained with a large batch size, the models may fully utilize a single GPU or even be scaled to multi-GPUs or multi-nodes. In these cases, we still recommend using a full GPU or multi-GPUs, even multi-nodes, to minimize total training time.

Если использовать MIG по прямому назначению, то есть делить карту на физические кусочки (slices), назначать им Compute Instances и прокидывать их в изолированные контейнеры то все работает как надо. It just works.


Итоговые Замеры


Тут не совсем идеальные сравнения (на Титане у меня был DP а не DDP), да и на A100 в итоге я не стал гонять эксперименты на 10, 20, 30 часов и впустую (зачем греть атмосферу), но я замерил время на 1 эпохе.



Когда крутишь 1 сетку на A100 утилизация не достигает даже и половины ну то есть если бы ее можно было распилить на 2-3 карты, все было бы прекрасно

Avg epoch time, m Workers Batch GPUs CER @10 hours CER @20 h CER @30 h Comment
4.7 2, DDP 50 * 2 2 * 3090 14.4 12.3 11.44 Close to 100% utilization
15.3 1, DP 50 2 * Titan X 21.6 17.4 15.7 Close to 100% utilization
11.4 1, DDP 50 * 1 1 * A100 NA NA NA About 35-40% utilization
TBD 2, DDP 50 * 2 2 * 1080 Ti TBD TBD TBD

На 1080 Ti ресурсы были только чтобы прогнать 1 эпоху.


Выводы


Выводы про 3090:


  • Если вынести за скобки вопрос доступности, то апгрейд стоит делать. Вы получите минимум x2 по скорости. Если у вас работает AMP то может даже и все x3-x4;
  • С учетом роста производительности, цена кажется немного завышенной, но не заоблачной. Понижение цены где-то на 30-40% как мне кажется было бы адекватным;
  • Когда выходило новое поколение карт все беспокоились насчет охлаждения. Она на удивление холодная;
  • Единственная беда карточка просит 2 8-пиновых коннектора для питания;

Выводы про A100:


  • Если судить по цене деленной на производительность, карта не очень интересная (наценка в 2-3 раза против 3090);
  • То, что Nvidia сделала технологию для эффективного использования для инференса это круто, а то карты стали уж слишком большими и крутыми;
  • Если вы можете использовать обычные игровые карты (те же 1080 Ti или PNY Quadro) для инференса, то они представляют сильно больший value for money;
  • Есть большой нераскрытый потенциал в развитии технологии MIG;
  • Если вам нужно реально 40 GB памяти и много compute, то альтернатив особо нет;
  • Неясен вопрос с установкой PCIE версии в обычные ATX корпуса без кастома, "колхоза" или воды ;
Подробнее..

AES против осциллографа

14.12.2020 18:12:07 | Автор: admin

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

Введение

В 2007 году компания Nvidia представила первую версию CUDA программно-аппаратную архитектуру параллельных вычислений, позволяющую использовать графические ускорители для большего класса задач, нежели только рендеринг изображений. Переведя свои графические процессоры из разряда GPU в разряд GPGPU (General Purpose GPU), Nvidia сделала массивно-параллельные вычисления доступнее для широкого круга задач. В частности, видеопроцессоры оказались применимы к задачам шифрования, и разработчики криптографических библиотек воспользовались возможностью ускорить вычисления. К сожалению, как и любые электронные устройства, видеокарты излучают электромагнитные волны, и характер этого излучения зависит от конкретных действий графического процессора. Пристальное наблюдение за таким излучением позволило группе ученых из UCAS взломать шифр AES, узнав значение секретного ключа.

Краткое напоминание

Прежде чем перейти непосредственно к атаке, нелишним будет вспомнить основы CUDA и AES:

CUDA

CUDA (Compute Unified Device Architecture) это программно-аппаратная архитектура параллельных вычислений, предложенная компанией Nvidia для своих графических процессоров общего назначения. Давайте посмотрим на CUDA с двух различных ракурсов.

С точки зрения программиста

При написании программ, использующих CUDA, программист имеет дело со следующими сущностями:

  1. ядро (kernel) функция, исполняемая на GPGPU;

  2. сетка (grid) группа потоков, исполняющих код одного ядра;

  3. блок (block) составляющая сетки. Каждый блок --- это совокупность потоков и некоторого количества общей памяти;

  4. нить исполнения (поток, thread) составляющая блока.

Программист сам определяет число потоков в блоке и блоков в сетке, исходя из особенностей решаемой задачи. Подробнее про программирование с использованием CUDA можно узнать здесь и тут.

Для эффективного управления описанными сущностями необходимо понимать, как они связаны с аппаратной реализацией GPGPU.

С точки зрения CUDA

С точки зрения CUDA, GPGPU выглядит следующим образом (на этот раз движемся снизу вверх):

  1. Скалярный процессор (Scalar Processor, SP) ядро, исполняющее единомоментно один поток;

  2. Потоковый мультипроцессор (Streaming Multiprocessor, SM) совокупность нескольких SP, разделяемой памяти, нескольких 32-байтных регистров и общего блока формирования команд (Instruction Unit). Также SM обладает L1-кэшем, общим для всех SP. При назначении работ планировщиком каждому SM достается свой набор блоков сетки, исполняемых по очереди;

  3. GPU массив из SM, по которому распределяются блоки.

Ещё одна важная особенность работы GPGPU, не выраженная столь явно, связана с исполнением блоков. Каждый блок исполняется группами по 32 нити (warp). Внутри такой группы все потоки выполняют одну инструкцию над разными данными, то есть реализуют так называемую SIMT-архитектуру (Single Instruction Multiple Threads).

Более полное описание архитектуры GPGPU можно найти в Белой книге, на Вики и в официальной документации. Полезным может показаться и это обсуждение.

Для понимания атаки предоставленного описания должно быть достаточно.

AES

Advanced Encryption Standard (AES), также известный как Rijndael популярный симметричный алгоритм блочного шифрования. Он оперирует блоками данных длины 128 бит при длине ключа 128, 192 или 256 бит. Так как атака демонстрировалась на шифровании с длиной ключа 128 бит, пока уберем прочие размеры из рассмотрения и сфокусируемся на алгоритме для длины ключа 128 бит.

AES-128 представляет входной блок текста в виде матрицы S размером 4 на 4 байта, называемой состоянием (state), и 11 раз последовательно применяет к нему следующие операции:

  1. SubBytes замена каждого из байтов в матрице состояния на значения, указанные в таблице замен SBox. Это таблица размером 16 на 16, в ячейках которой записаны новые значения байтов. Замена производится по простому правилу: представляя байт b в виде \{x, y\} , где x и y шестнадцатеричные цифры, мы заменяем его на значение, лежащее на перечесении x -ой строки и y -ого столбца таблицы SBox. В частности, при построчном хранении таблицы в памяти (Row-Major Ordering) искомое значение будет смещено на b позиций от начала таблицы.

    Нам не обязательно понимать, как именно строится таблица замен, поскольку значения в ней постоянны и уже вычислены и явно указаны в стандарте. В целях сокращения общего времени шифрования часто используется уже готовая таблица SBox, которую мы будем называть SBoxLUT (Look Up Table).

  2. ShiftRows циклический сдвиг строк матрицы состояния. Первая строка не сдвигается, вторая сдвигается на одну позицию, третья на две и четвертая на три.

  3. MixColumns умножение на фиксированную матрицу, осуществляющее линейные преобразования над стоблцами сложения столбцов и умножение столбца на константу. Как и в случае с SBox, принцип получения матрицы мы оставим за кадром, поскольку вычислять каждый раз ее не нужно.

  4. AddRoundKey поэлементное прибавление матрицы RounKey того же размера 4 на 4, содержащей раундовый ключ. Перед началом шифрования алгоритм AES генерирует так называемое "расписание ключей" набор из 11 матриц, называемых раундовыми ключами, по одной на каждый этап шифрования. Процесс генерации расписания описывается вспомогательной операцией KeyExpansion на основе изначального секретного ключа.

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

AddRoundKey(0)for (i = 1; i <= 10; i += 1) {    SubBytes()    ShiftRows()    MixColumns()    AddRoundKey(i)}SubBytes()ShiftRows()AddRoundKey(11)

В качестве финального замечания необходимо отметить, что все сложения и умножения производятся в конечном поле GF(2^8) . Простыми словами, сложение двух байтов эквивалентно применению к ним операции ИСКЛЮЧАЮЩЕЕ-ИЛИ, которую мы будем обозначать символом \oplus .

Приведение всех тонкостей и нюансов, равно как и подробного разбора каждого из шагов алгоритма, выходит за рамки данной статьи, однако исчерпывающее описание может быть найдено в стандарте. Альтернативные объяснения с примерами, а также множество программных реализаций могут быть найдены в на Хабре здесь и здесь.

Говоря об AES, нельзя не упомянуть пьесу про AES, в частности акт третий, сцена вторая.

Описание атаки

Будем рассматривать процесс шифрования сообщения длины 32x16 байтов, при котором задача является чрезвычайно параллельной (Embarrassingly Parallel): для шифрования будет зайдествована единственная группа потоков, каждый из которых будет заниматься шифрованием собственного блока данных. Предположим, что злоумышленник может шифровать любой текст и читать полученный шифротекст, а также обладает физическим доступом к атакуемой видеокарте.

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

  1. Локализовать точку над видеокартой, испускающей информативный сигнал;

  2. Подготовить текст для шифрования;

  3. Запустить процедуру шифрования, измерить поле в выбранной точке;

  4. Определить значение секретного ключа, используемого на финальном раунде шифрования, вычисляя по очереди каждый из 16 байтов:

    1. Выбрать байт с номером l ;

    2. Перебрать возможные 256 значений k^{guess}_l :

      1. Рассчитать промежуточные значения r_l^1 и r_l^2 для каждого k^{guess}_l ;

      2. Разделить полученные в пункте 3 измерения на две группы в соответствии с r_l^1 и r_l^2 ;

      3. Рассчитать величину \Delta , соответствующую данному k^{guess}_l ;

    3. Определить искомое значение байта как k_l^{guess} , на котором достигается наибольшее значение \Delta ;

  5. Зная все байты последнего раундового ключа, восстановить изначальный секретный ключ.

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

Физические основы

В основе атаки лежит наблюдение за ближним полем электромагнитным излучением в области, удаленной от источника не более, чем на 1/2\pi длины волны. Авторы заметили, что существует явная связь между операциями, выполняемыми GPGPU, и видом электромагнитного поля, излучаемого видеокартой. Результатом одного измерения является набор точек, снятых с электронного осциллографа и характеризующих зависимость напряжения исследуемого поля от времени для последнего раунда шифрования. Каждое такое измерение имеет одинаковое число точек, синхронизированных по времени. В дальнейшем мы будем называть эти точки отсчетами.

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

Кэш-коллизии

В качестве операции, надежно генерирующей различимые сигналы, авторы рассматривают одновременную кэш-коллизию (Simultaneous Cache Collision, SCC). В процессе исполнения все потоки, принадлежащие одной warp-группе, могут обратиться к данным, находящимся в одной (происходит SCC) или различных (SCC не происходит) кэш-линиях. При этом генерируемый электромагнитный сигнал будет различаться.

Заметим, что длина кэш-линии GPGPU архитектуры Fermi, рассматриваемой в данной работе, составляет 128 байтов. Размер же таблицы SBoxLUT, используемой на этапе SubBytes, составляет 256 байтов, то есть для размещения таблицы в памяти требуется две кеш-линии, по одной на первую и вторую половину. Отсюда же видно, что наличие SCC говорит об обращении всеми потоками к SBoxLUT по индексам либо из диапазона D_1 = \{0~..~127\} , либо из D_2 = \{128~..~255\} .

Атака

Обработка данных утечки

Рассмотрим последний раунд шифрования текста. Он описывается следующим уравнением:

c_l = SBox(r_l) \oplus k_l, ~l \in \{0, 1, ..., 15\},

где c_{l} и k_{l} l -ый байт шифротекста и l -ый байт последнего раундового ключа, соответственно, а r_{l} некоторое промежуточное значение. Злоумышленник может предположить, что использовался ключ k^{guess} . В таком случае, зная c_{l} , можно найти величину промежуточного байта r_{l} :

r_l = InvSBox(c_l \oplus k^{guess}_l),~l \in \{0, 1, ..., 15\},


где InvSBox таблица обратной замены, известная из стандарта и обладающая свойством InvSBox( SBox(i) ) = i , а k^{guess}_l l -ый байт предполагаемого ключаk^{guess}. Мы предположили, что злоумышленник может шифровать любой текст. В частности, он может заготовить текст, состоящий всего из двух типов блоков. При шифровании такого текста значения l -го байта r_{l} , полученные каждым из потоков, будут принимать всего два различных значения: r_{l}^1 и r_{l}^2 . Будучи использованными в качестве индексов для обращения к таблице SBoxLUT, они либо приведут к кэш-коллизии, либо нет. Зная r_{l}^1 и r_{l}^2 , отличить эти случаи несложно: коллизия происходит только когда обе величины принадлежат одному диапазону: D_1 или D_2 .

Следующим шагом злоумышленника будет разделение полученных измерений ЭМ-поля на две группы G_1 и G_2 согласно вычисленным r_l^1 и r_l^2 : где коллизии были и где их не было. Формально это можно записать так:

G_1 = \{ \vec{T_i}~|~(r_l^1 \in D_1~\text{и}~r_l^2 \in D_1)~\text{или}~(r_l^1 \in D_2~\text{и}~r_l^2 \in D_2) \},G_2 = \{ \vec{T_i}~|~(r_l^1 \in D_1~\text{и}~r_l^2 \in D_2)~\text{или}~(r_l^1 \in D_2~\text{и}~r_l^2 \in D_1) \},

где под \vec{T_i} понимается набор точек, соответствующих одному раунду шифрования.

Авторы заметили, что сигналы, соответствующие наличию коллизии, похожи между собой, но сильно отличаются от сигналов в её отсутствие, и наоборот. Соответственно, можно рассмотреть величину

\vec{\Delta} = \left| \frac{1}{n_1}\sum_{\vec{T_i} \in G_1} \vec{T_i} - \frac{1}{n_2}\sum_{\vec{T_i} \in G_2} \vec{T_i} \right|,


показывающую, насколько сильно отличаются средние значения сигналов, помещенных в множества G_1 и G_2 . Под операцией суммирования здесь понимается сложение соответствующих отсчетов сигналов, а под переменными n_1 и n_2 мощности множеств G_1 и G_2 , соответственно. Здесь необходимо отметить, что, поскольку разбиение сигналов на группы зависит от k^{guess}_l , то и \vec{\Delta} является функцией от k^{guess}_l : \vec{\Delta} = \vec{\Delta}(k^{guess}_l) .

Восстановление ключа

Если предполагаемый ключ k^{guess} совпал с ключом, использованным для шифрования, то восстановленные значения r_l^1 и r_l^2 совпадут с действительно использованными при шифровании, и злоумышленник верно распределит сигналы по группам. Наоборот, при ошибочном выборе k_{guess} разделение на группы по вычисленным промежуточным значениям r_l^1 и r_l^2 приведет к равномерно перемешанным сигналам. При этом значения компонент \vec{\Delta}(k^{guess}_l) в первом случае будут заметно превосходить соответствующие компоненты во втором. Таким образом, для вычисления l -го байта секретного ключа злоумышленнику достаточно будет перебрать 256 возможных значений и выбрать то, при котором \vec{\Delta}(k^{guess}_l) принимает наибольшее значение. Делать это авторы предлагают следующим образом:

\DeclareMathOperator*{\argmax}{argmax} k_l^{correct} = \argmax_k \left( \max_{k\in\{0~..~255\}} \left( \max_{i} \Delta_i \right) \right),


где \Delta_i i -я координата вектора \vec{\Delta} . Формула легко интерпретируется: каждому из значений k соответствует вектор \vec{\Delta}(k) с наибольшей i -ой координатой. Запомнив абсолютное значение этой координаты, из полученных 256 значений нужно снова выбрать наибольшее. Соответствующее ему k принимается за искомый байт ключа k^{correct}_l . Повторив описанную процедуру для каждого l \in \{ 0~..~15 \} , злоумышленник сможет восстановить полное значение последнего раундового ключа в расписании. Алгоритм восстановления исходного секретного ключа, используемого при генерации расписания, из последнего раундового ключа для алгоритма AES-128 известен и уже обсуждался здесь или здесь.

В работе авторы показывают, что для успешного восстановления ключа таким методом достаточно собрать данные порядка 1000 шифрований, что требует порядка 100 миллисекунд. Дополнительное использование алгоритма перечисления ключей KEA позволяет сократить число измерений до 600.

Сейчас, изучив атаку в деталях, стоит ещё раз посмотреть на её план теперь он будет гораздо понятнее.

Вместо заключения

На данный момент известно лишь об одной успешной атаке, проведенной данным способом. Эту атаку провели сами авторы оригинальной статьи. В качестве атакуемой видеокарты была выбрана Nvidia GeForce GT 620 с объемом видеопамяти 454MiB. Библиотека, реализующая шифрование PolarSSL. Для детектирования электромагнитных следов авторами использовался осциллограф Agilent KeySight DSO9104A с пробником магнитного поля Rohde&Schwarz RF B.

Данная атака позволяет узнать значение последнего раундового ключа. В случае шифрования AES-128 этого достаточно, чтобы восстановить исходное значение секретного ключа, однако версии AES-192 и AES-256 остаются устойчивыми к взлому данным образом. Например, знание последнего раундового ключа AES-256 лишь сужает область возможных значений исходного с 2256 до 2128, и дальнейший подбор остается вычислительно неосуществим.

Атака впервые применяет изучение ЭМ-утечек информации к взлому шифрования на GPGPU и во многом превосходит другие известные атаки по стороннему каналу. Так, например, она требует на три порядка меньше измерений, чем атака, описанная в похожей работе.

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


P.S. На данный момент отличия в форматировании формул в редакторе и при просмотре поста несколько удивиляют, в ближайшее время постараюсь с этим разобраться.

Подробнее..

Перевод Когда дефицита GPU ещё не было

09.04.2021 12:18:12 | Автор: admin


Большую часть времени GPU были не важны


Как, наверно, понимает большинство людей, компьютеры считают числа. Обычно интуитивным способом работы с компьютерами является взаимодействие с какой-нибудь графикой. Или, что более важно, с более красивым отображением чисел.


Реклама Tektronix Interactive Graphics, предполагаемого предшественника технологий GPU. Но так ли это на самом деле?

Пока Windows и Apple приучали публику к своим заточенным под мышь интерфейсам, хардкорным пользователям компьютеров, то есть геймерам, нужно было, чтобы действия мыши регистрировались намного быстрее. А ещё они хотели, чтобы графика была более реалистичной. Затем они стали просить такие функции, как онлайн-мультиплеер, мгновенный обмен сообщениями и множество других возможностей, которые сегодня воспринимаются как должное, но в первой половине 90-х казались чем-то значительным.

Можно было бы заявить, что технически сложному геймплею мы обязаны классическому Doom 1993 года, а также его потомку Quake, вызвавшему интерес пользователей к специализированным графическим картам. Однако пообщавшись со специалистом, наблюдавшим за развитием этой отрасли с самого начала, можно прийти к выводу, что история GPU не была такой уж простой.

Доктор Джон Педди впервые занялся компьютерной графикой в 1960-х. Он находился в составе команды, создававшей топографические 3D-карты по снимкам аэрофотографии, что в дальнейшем привело к созданию его собственной компании Data Graphics. К началу 1980-х он задумался об уходе на пенсию и карьере писателя научной фантастики, но заметил в этой отрасли бум, который сложно было игнорировать. Практическое применение высокопроизводительной графики изначально развивали компании, занимавшиеся CAD и GIS, однако взрывной рост популярности видеоигр в 80-х изменил эту ситуацию.

Игры были (и остаются) локомотивом отрасли благодаря количеству потребителей, сообщил мне Педди в электронном письме. Среди пользователей 3D и GPU были инженерные компании (CAD и молекулярное моделирование), а также киноиндустрия. Но в 80-х и 90-х на этом рынке было примерно 100 тысяч покупателей. А рынок потребительского 3D исчислялся миллионами пользователей. Однако рынок профессионалов платил больше тысячи или десятки тысяч долларов, в то время как потребители платили всего несколько сотен. То есть задача заключалась в том, чтобы встроить достаточную мощь в чип, который в готовом продукте продавался бы за сотни долларов.

На этом этапе истории компьютеров в техническом лексиконе появилась аббревиатура GPU. В статье в журнале Computerworld за 1983 год подробно описывается линейка графических терминалов Tektronix. Но если приглядеться, GPU пока расшифровывается не как graphic processing unit, а как graphic processor unit. Есть ли какая-то разница? На самом деле, GPU не существовало до 1997 года, пусть даже и использовалась похожая аббревиатура. Оказывается, для настоящего GPU обязателен движок трансформации и освещения (transform and lighting, T&L).

Почему термином GPU нельзя называть графический чип или плату, разработанную до 1997 года? Он отрисовывает графику (хоть и только в 2D-пространстве). Обрабатывает ли он графику? Да, в каком-то смысле. Он отрисовывает отрезки и окружности это и есть обработка (processing). Важное отличие заключается в том, что GPU должен быть способен на истинное 3D (а для этого требуется T&L).


Графический 3D-чип Glint компании 3Dlabs, по мнению некоторых, первой создавшей истинный GPU. Он был выпущен в ноябре 1994 года и активно применялся в "мощных 3D-приложениях CAD" (по-прежнему не первый настоящий GPU, но всё равно интересный графический чип). Несмотря на то, что 3Dlabs первой появилась на рынке, она не смогла воспользоваться экономическими масштабами, доступными для её конкурентов, например, Nvidia.

Право первопроходца забирают себе победители


Давайте для начала разберём распространённую ошибку. Оборудование первой PlayStation не было первым GPU на массовом рынке. Такое мнение возникло благодаря мощному маркетингу Sony и Toshiba. Как говорит Педди, У первой PlayStation был движок трансформации геометрии (geometry transformation engine, GTE), являвшийся сопроцессором 2D-чипа, и ошибочно названый (маркетологами) GPU.

Маркетинг был важным элементом той эпохи, то есть незадолго до того, как GPU впервые начали появляться. Создание истинного GPU для 3D было далёким горизонтом, и многие компании хотели добраться до него первыми. Однако эту честь первой получила небольшая контора из Великобритании под названием 3Dlabs. Инновацией, давшей продукту 3Dlabs титул первого настоящего GPU, стала разработка графического процессора из двух чипов, содержавшего обработчик геометрии, называемый движком трансформации и освещения (T&L). В отличие от своих конкурентов, 3Dlabs делала упор на рынок CAD, хоть и пыталась вторгнуться на крупный потребительский рынок, заключив партнёрское соглашение с Creative Labs.


Технологическое демо с показом возможностей чипсета 3Dlabs Glint.

Малый размер 3Dlabs и её специализация на профессиональном рынке означали, что на рынке потребительских GPU появится множество первопроходцев.

Сектор графических карт в тот период был невероятно активен, за благосклонность игроков в Quake сражались такие крупные компании, как Matrox, S3 и 3Dfx.

Но историю пишут победители, и в этот период возник лидер рынка. К концу 1999 года Nvidia была готова выпустить свой первый массовый потребительский GPU с интегрированным T&L, называвшийся GeForce 256.

Так, по мифологии Nvidia, появился GPU, и компания утверждает, что именно она изобрела его, говорит Педди. То есть историю можно перекраивать, как тебе угодно. Nvidia стоит 10 миллиардов долларов и на пути к 50 миллиардам, а о 3Dlabs никто не помнит.

Примечание: название Nvidia всегда было и является существительным, а не сокращением, несмотря на распространённое заблуждение.

Довольно скоро рынок заполнился конкурирующими GPU, каждый из которых стремился занять собственную рыночную нишу. Канадский производитель ATI Technologies, которого позже приобрёл крупнейший конкурент Nvidia компания AMD, попытался обособить свою продукцию на рынке, назвав свои GPU аббревиатурой VPU (video processor unit), хотя на практике они ничем не различались. Но это название не прижилось.

ATI сдалась, она не могла противостоять превосходящим маркетинговым навыкам, масштабам, привлекательности и безжалостному напору Nvidia, рассказывает Педди.

К началу 2000-х на потребительском рынке начали доминировать крупные игроки наподобие Nvidia, быстро ставшие злодеями в глазах геймеров всего мира. Любопытно, что именно эта консолидация рынка позволяет объяснить, почему сегодня так трудно найти и купить мощные графические карты.


Узрите! Один из самых желанных продуктов в мире. И это ведь даже не самая мощная карта в линейке.

Так кого же винить в этом дефиците GPU?


Если вы так далеко углубились в статью об истории и названиях GPU, то вам наверняка интересно, когда я доберусь до Великого дефицита GPU 2020 года (который, вероятно, будет длиться и дальше).

Вкратце для тех, кто не понимает, о чём я говорю: за последние месяцы цена мощных GPU взлетела до небес и их даже невозможно найти в продаже.

Например, у Nvidia есть три модели графических карт, которые обычно стремятся приобрести геймеры:

  • RTX 3090: рекомендуемая производителем розничная цена 1499 долларов
  • RTX 3080: рекомендуемая цена 699 долларов
  • RTX 3070: рекомендуемая цена 499 долларов

Можно спорить о соотношении цены и производительности этих моделей. Однако дефицит вызвал рост стоимости этих GPU на рынке перепродажи. На данный момент цена средней по мощности из трёх карт RTX 3080 равна 1499 долларов, в то время как 3090 и 3070 практически невозможно найти. Один из лотов 3090 продаётся на eBay за более чем 3000 долларов.

Здесь также стоит упомянуть линейку графических карт AMD. Несмотря на не столь высокий спрос, поскольку традиционно они были не такими мощными, на карты AMD тоже повлияли ограничения цепочки поставок производства GPU. Как и в случае с линейкой Nvidia, модели AMD RX 6700, 6800 и 6900 тоже выросли в цене на вторичном рынке в два с лишним раза.

Немного забавного контекста в моём старом Xeon установлена refurbished-версия AMD RX 570, за которую я в середине 2019 года заплатил чуть больше 100 долларов. Та же самая карта, которая, по сути, является бюджетной моделью и уже слегка устарела на момент моей покупки, сейчас продаётся за 599 долларов.

Очевидно, что существует огромный спрос, и капитализм обычно неплохо справляется с устранением таких пробелов. Как и за многие другие проблемы 2020 года, большую часть вины можно возложить на COVID-19. Производственные хабы в Китае и Тайване, как и почти весь остальной мир, были вынужденно закрыты. Хотя многие операции в производстве оборудования можно автоматизировать, тонкая природа GPU требует определённой степени вмешательства человека.


График, описывающий текущее состояние отрасли GPU. (Автор Джон Педди)

Тем не менее, такое объяснение слишком упрощает тенденции процессов, начавшихся в отрасли графических карт ещё задолго до COVID-19. Послушаем доктора Педди:

Примерно пятнадцать лет назад сложился конвейер производства GPU: разрезание кремниевых пластин, тестирование, упаковка в корпуса, повторное тестирование и доставка заказчику. Все компании в этом конвейере, а также ниже по потоку (OEM-клиенты, имевшие похожий конвейер), искали способы более быстрого реагирования и в то же время минимизации своих материально-технических ресурсов. Так была разработана модель производства JIT (just in time, точно в срок). Она предполагала, что все в цепочке поставок дают точные прогнозы, а значит, и делают точные заказы. Если сломается одно звено цепи, то пострадают и все последующие Когда правительства объявили карантин в своих странах, всё производство остановилось, перестали поставляться детали, конвейер был сломан. И когда (если) производство восстановится, то для полной синхронизации потребуется ещё несколько месяцев.

В то же время людей отправили работать из дома, а у них не оказалось необходимых для этого инструментов. Так возник спрос на PC, и в особенности на ноутбуки. В 30-40% PC установлено два GPU, то есть спрос на GPU увеличился ещё сильнее.

А затем начался рост стоимости криптовалют Теперь майнеры (люди, использующие GPU для зарабатывания крипто) стремились скупить каждый доступный им GPU. Это вызвало спекуляции люди покупали все графические карты и продавали их по как можно более высокой цене.

То есть по цепочке поставок ударил спрос, а предложение не увеличивалось.

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

Ещё одним фактором разочарования стало время появления в 2020 году нового поколения видеоигровых консолей, а значит, и нового поколения видеоигр. Долгожданная PlayStation 5 вместе с Cyberpunk 2077 встретились в момент выпуска со множеством технических проблем и проблем с поставками. Игроки в Cyberpunk жаловались на то, что производительность игры сильно зависела от оборудования, на котором она была запущена. О различиях игрового процесса на PS4 и на PS5 один ютубер сказал так: По крайней мере, на PS5 она играбельна.

Хотя доктор Педди ожидает, что проблема дефицита разрешится к первому кварталу 2022 года (ура), он не особо оптимистичен относительно того, будет ли отрасль избегать подобных накладок в будущем.

Ещё одной проблемой будет происходящее сейчас удвоение заказов, которое в перспективе приведёт к огромному падению спроса на рынке полупроводников из-за избыточного предложения, заключает он.

Многому научиться можно даже у относительно новой истории. Хотя можно обвинить в неудовлетворении спроса ошибки рынка, очевидно, в целом ситуация намного сложнее. Несмотря на то, что GPU внезапно стали необходимы миллиардам людей для повседневной работы, высокопроизводительные устройства нужны только малой их доле, обладающей нишевыми интересами.

Тем не менее, рынок в целом должен уделить внимание разочарованным геймерам. Именно их потребности толкают отрасль к инновациям, которые становятся стандартом в более широко распространённых устройствах. С каждой итерацией устройства получают всё больше расширенных графических возможностей, которые постепенно достигают людей, не знавших о них, а теперь считающих их обязательными.

В конце концов, сегодня устройство, не обладающее реалистичной 3D-графикой, и телефоном-то мало кто назовёт.



На правах рекламы


VDSina предлагает эпичные серверы это виртуальные серверы с новейшими CPU AMD EPYC. Огромный выбор операционных систем для автоматической установки, есть возможность установить любую ОС с собственного образа. Обязательно попробуйте!

Подробнее..

Перевод Самые ожидаемые игровые ноутбуки 2021 года

09.02.2021 14:04:30 | Автор: admin
Источник

От игровых ноутбуков на новых GPU от Nvidia до компьютеров с двумя экранами составили список геймерских лэптопов, которые мы хотим протестировать в 2021 году больше всего.

PS5 и Xbox серии X вышли всего несколько месяцев назад, но их уже нельзя назвать новейшими игровыми консолями. Современные игры становятся все более требовательны, и даже последние версии приставок для гостиной быстро теряют актуальность. С другой стороны, есть игровые ПК, которые постоянно развиваются, их программное обеспечение и аппаратная начинка обновляются несколько раз в год, а не раз в семь лет.

На выставке CES 2021 уже были представлены новые GPU для ноутбуков от Nvidia и новые процессоры от Intel и AMD. Не обошлось и без релизов игровых ноутбуков как со скромными обновлениями, так и с совершенно фантастическими экспериментами с внешними графическими ускорителями и двойными экранами.

Ниже несколько игровых ноутбуков, которые я очень хочу проверить в деле.

Asus ROG Flow X13



Один из самых заметных игровых ноутбуков, о котором все говорили в начале 2021 года. Asus ROG Flow X13 тонкий и очень легкий 13-дюймовый ноутбук, в котором установлена достойная видеокарта Nvidia GeForce GTX 1650 и новый процессор AMD Ryzen 9. Весит чуть меньше 1,5 кг.

В чем же трюк? Лэптоп поставляется с аксессуаром, который Asus называет XG Mobile. Это внешний блок GPU размером с небольшую книжку в мягкой обложке, который весит около килограмма. Внутри новый мобильный графический процессор Nvidia RTX 3080 и блок питания мощностью 280 Вт.

Соединив их, вы получаете очень производительную систему. Также внешнюю видеокарту можно оставить дома, а с собой взять только легкий ноутбук. Но даже в этом случае вы сможете раскатать партию какой-нибудь игры с помощью Nvidia GeForce GTX 1650. В общем, это интересный (хоть и недешевый от $2 800) способ получить лучшее от двух графических ускорителей.

Acer Predator Triton 300 SE



Иногда вам нужен ноутбук, который не похож на игровой, но при этом может полноценно его заменить. Перспективным игроком на этом поле может стать Predator Triton 300 SE от Acer за $1 399.

Линия Predator в течение многих лет была немного агрессивной из-за нарочито геймерского дизайна, поэтому мне нравится, что новый ноутбук сбалансированный и тонкий. Его толщина составляет около 18 мм, и он немного похож на старый алюминиевый MacBook. Поскольку это своего рода игровой ноутбук под прикрытием, внутри новая видеокарта Nvidia GeForce RTX 3060.

Lenovo Legion 7



Удивительно, но факт: Lenovo производит действительно хорошие игровые ноутбуки. Legion 7, новинка 2021 года, привлек мое внимание. У него 16-дюймовый экран больше, чем у прошлой модели, и он немного выше соотношение сторон 16:10.

Как и многие новые игровые ноутбуки, он включает комбинацию процессора AMD Ryzen 5000 с новым видеочипом линейки Nvidia 3000. Кроме того, Legion 7 оснащен дисплеем G-Sync с HDR. Весит он около 2,5 кг, толщина около 24 мм, что довольно неплохо для его параметров.

Asus Zephyrus Duo 15 SE



Вторые экраны на ноутбуках еще не прижились. Touch Bar от Apple это, по сути, очень маленький второй экран, и у него что-то пока немного поклонников. Asus, однако, активно продвигает идею второго экрана, добавляя очень большие вторичные дисплеи к ZenBook Duo и Zephyrus Duo. У Asus уже была система с двумя экранами в прошлом году, но дизайн и поддержка приложений в версиях 2021 года выглядят лучше.

Мне удалось познакомиться с ZenBook Duo во время выставки CES 2021. Понравился угол наклона вторичного дисплея. Это решение дает возможность рассматривать его как продолжение главного экрана. Также второй дисплей предлагает настраиваемые сенсорные элементы управления для программного обеспечения Adobe, такого как Photoshop и Premiere.

Zephyrus Duo это игровое воплощение той же концепции, и я надеюсь, что второй экран станет хорошим дополнением для игр. Хотя, конечно, история с двумя экранами это всегда тяжелая битва.

Razer Blade 15 Advanced Edition



Я и так думаю, что Razer производит одни из лучших игровых ноутбуков, которые только можно купить. Хорошие компоненты, отличный дизайн и множество опций подсветки, если вам такое нравится. В 2021 году обновилась премиальная версия 15-дюймового Blade, и там есть несколько важных фишек.

Во-первых, он оснащен новыми видеокартами для ноутбуков Nvidia GeForce RTX 3070 и 3080. Этого следовало ожидать. Кроме того, у него кастомизируемый экран. Вы можете выбирать частоту обновления экрана и разрешение, и вариаций тут больше, чем обычно.

Так, вы можете настроить стандартный экран Full HD с частотой обновления 360 Гц, что очень важно для киберспорта. Либо выбрать золотую середину с QHD, экран с разрешением 2,560x1,440 и частотой 240 Гц. Или даже перейти на экран OLED 4K частота обновления всего 60 Гц, но это все еще один из немногих игровых ноутбуков с OLED, которые вы можете купить.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru