cuDF низкая загрузка графического процессора

У меня есть задача, которая включает выполнение множества запросов к фреймворку данных. Я сравнил производительность выполнения этих запросов на процессоре Xeon (Pandas) и RTX 2080 (CUDF). Для кадра данных из 100 тыс. Строк графический процессор работает быстрее, но ненамного. Если посмотреть на вывод nvidia-smi, загрузка графического процессора составляет около 3-4% при выполнении запросов.

У меня вопрос: что я могу сделать, чтобы ускорить задачу cuDF и добиться высокой загрузки графического процессора?

Например, я могу запустить 8 из этих запросов на 8 ядрах ЦП параллельно для варианта использования ЦП.

NUM_ELEMENTS = 100000

df = cudf.DataFrame()
df['value1'] = cp.random.sample(NUM_ELEMENTS)
df['value2'] = cp.random.sample(NUM_ELEMENTS)
df['value3'] = cp.random.sample(NUM_ELEMENTS)


c1 = np.random.random()
c2 = np.random.random()
c3 = np.random.random()
res = df.query('((value1 < @c1) & (value2 > @c2) & (value3 < @c3))')

Вот пример кода, который не занимает много циклов графического процессора, однако я хочу запускать тысячи таких запросов к данным, и я не хочу запускать их последовательно. Есть ли способ запустить несколько вызовов query () в кадре данных cuDF параллельно, чтобы максимизировать использование графического процессора?


person Yuriy S    schedule 28.12.2020    source источник
comment
Чтобы повысить скорость выполнения задач cudf, мне нужна дополнительная информация о функциях и используемом коде. Предоставьте фрагмент кода и / или способ использования в нем функций cudf вместе с информацией о наборе данных (размеры, типы данных и т. Д.)   -  person saloni    schedule 29.12.2020
comment
ваш фрагмент кода немного трудно читать. Пожалуйста, используйте `` '' в начале и в конце вашего кода, чтобы сделать его более читабельным.   -  person saloni    schedule 29.12.2020
comment
Обновил исходный вопрос. благодарю вас!   -  person Yuriy S    schedule 29.12.2020
comment
Предполагая, что для вызова query () в моем cudf.Dataframe требуется 3% использования графического процессора (и я понимаю, что это не совсем то же самое, что и использование процессора), я смогу выполнить не менее 20 таких запросов параллельно, это справедливо предположение?   -  person Yuriy S    schedule 29.12.2020


Ответы (1)


Мы работаем над тем, чтобы включить это в cudf, но в настоящее время это ограничение библиотеки cuDF. Механизм параллелизма, который вы ищете, использует потоки CUDA (https://developer.nvidia.com/blog/gpu-pro-tip-cuda-7-streams-simplify-concurrency/). Мы еще не поддерживаем потоки CUDA в библиотеке cuDF Python, но мы активно над этим работаем.

Вы можете обойти это, используя комбинацию cupy и numba вместе с их поддержкой потоков CUDA (https://docs.cupy.dev/en/stable/reference/generated/cupy.cuda.Stream.html, https://numba.pydata.org/numba-doc/dev/cuda-reference/host.html#stream-management), но это будет очень экспериментальная область.

person Keith Kraus    schedule 30.12.2020
comment
Спасибо за указатели, Кейт. Это полезно. Продолжайте в том же духе работать над CUDA и всем остальным, ребята, молодцы. - person Yuriy S; 31.12.2020