Nano Hash - криптовалюты, майнинг, программирование

Серверная часть Numba `nogil` + dask threading не приводит к ускорению (вычисления медленнее!)

Я пытаюсь использовать Numba и Dask для ускорения медленных вычислений, аналогичных вычислению ядра оценка плотности огромного набора точек. Мой план состоял в том, чтобы написать вычислительно затратную логику в функции jited, а затем разделить работу между ядрами ЦП, используя dask. Я хотел использовать функцию nogil функции numba.jit, чтобы я мог использовать бэкэнд dask threading, чтобы избежать ненужных копий памяти входных данных (которые очень велики).

К сожалению, Dask не приведет к ускорению, если я не использую планировщик 'processes'. Если вместо этого я использую ThreadPoolExector, то я вижу ожидаемое ускорение.

Вот упрощенный пример моей проблемы:

import os
import numpy as np
import numba
import dask

CPU_COUNT = os.cpu_count()

def render_internal(size, mag):
    """mag is the magnification to apply
    generate coordinates internally
    """
    coords = np.random.rand(size, 2)
    img = np.zeros((mag, mag), dtype=np.int64)
    for i in range(len(coords)):
        y0, x0 = coords[i] * mag
        y1, x1 = int(y0), int(x0)
        m = 1
        img[y1, x1] += m

jit_render_internal = numba.jit(render_internal, nogil=True, nopython=True)

args = 10000000, 100

print("Linear time:")
%time linear_compute = [jit_render_internal(*args) for i in range(CPU_COUNT)]

delayed_jit_render_internal = dask.delayed(jit_render_internal)

print()
print("Threads time:")
%time dask_compute_threads = dask.compute(*[delayed_jit_render_internal(*args) for i in range(CPU_COUNT)])

print()
print("Processes time:")
%time dask_compute_processes = dask.compute(*[delayed_jit_render_internal(*args) for i in range(CPU_COUNT)], scheduler="processes")

И вот вывод на моей машине:

Linear time:
Wall time: 1min 17s

Threads time:
Wall time: 1min 47s

Processes time:
Wall time: 7.79 s

Как для обработки, так и для обработки потоков я вижу полное использование всех ядер ЦП, как и ожидалось. Но нет ускорения для многопоточного бэкэнда. Я почти уверен, что джиттинговая функция jit_render_internal на самом деле не выпускает GIL.

Мои два вопроса:

  1. Если ключевое слово nogil передается в numba.jit и GIL не может быть освобожден, почему не возникает ошибка?
  2. Почему код, как я его написал, не выпускает GIL? Все вычисления встроены в функцию, и нет возвращаемого значения.

  • Хотите уточнить? 02.07.2019
  • Когда я смотрю на использование моего ЦП для процесса python, при запуске threads я вижу, что он использует все мои ядра, но на данный момент я не уверен, почему он работает медленно. Я могу воспроизвести, используя пул потоков concurrent.futures, так что это просто не dask 02.07.2019
  • Здесь происходит что-то странное. на моем ноутбуке это результаты синхронизации: Linear 8.63s, Threads 11s, Process 2.1s 02.07.2019
  • да примерно так и вижу 02.07.2019

Ответы:


1

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

def render_internal(size, mag):
    """mag is the magnification to apply
    generate coordinates internally
    """
    coords = np.random.rand(size, 2)
    img = np.zeros((mag, mag), dtype=np.int64)
    for i in range(len(coords)):
        #y0, x0 = coords[i] * mag
        y0 = coords[i,0] * mag
        x0 = coords[i,1] * mag
        y1, x1 = int(y0), int(x0)
        m = 1
        img[y1, x1] += m

Я разделил вычисление x0 и y0 выше. На моей машине решение на основе потоков на самом деле быстрее, чем процессы после изменения.

02.07.2019
  • Почему это имеет значение? 02.07.2019
  • Любые мысли об этом: stackoverflow.com/questions/56926880/ 08.07.2019
  • Новые материалы

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

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

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

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..