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

Юлия параллельные вычисления в IPython Jupyter

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

Это в основном расчет Монте-Карло Пи, описанный здесь

Проблема в том, что я не могу заставить его работать параллельно внутри IPython (Jupyter) Notebook, он использует только один.

Я начал Юлию как: julia -p 4

Если я определяю функции внутри REPL и запускаю их там, все работает нормально.

@everywhere function compute_pi(N::Int)
    """
    Compute pi with a Monte Carlo simulation of N darts thrown in [-1,1]^2
    Returns estimate of pi
    """
    n_landed_in_circle = 0  
    for i = 1:N
        x = rand() * 2 - 1  # uniformly distributed number on x-axis
        y = rand() * 2 - 1  # uniformly distributed number on y-axis

        r2 = x*x + y*y  # radius squared, in radial coordinates
        if r2 < 1.0
            n_landed_in_circle += 1
        end
    end
    return n_landed_in_circle / N * 4.0    
end

 

function parallel_pi_computation(N::Int; ncores::Int=4)
    """
    Compute pi in parallel, over ncores cores, with a Monte Carlo simulation throwing N total darts
    """
    # compute sum of pi's estimated among all cores in parallel
    sum_of_pis = @parallel (+) for i=1:ncores
        compute_pi(int(N/ncores))
    end

    return sum_of_pis / ncores  # average value
end

 

julia> @time parallel_pi_computation(int(1e9))
elapsed time: 2.702617652 seconds (93400 bytes allocated)
3.1416044160000003

Но когда я сделаю:

 using IJulia
 notebook()

И попробуйте сделать то же самое внутри Ноутбука, он использует только 1 ядро:

In [5]:  @time parallel_pi_computation(int(10e8))
elapsed time: 10.277870808 seconds (219188 bytes allocated)

Out[5]:  3.141679988

Итак, почему Jupyter не использует все ядра? Что я могу сделать, чтобы он заработал?

Спасибо.


  • Вы пробовали изменить соответствующий файл kernel.json и добавить туда переключатель -p? 23.06.2015
  • Что произойдет, если в записной книжке первым будет выдано addprocs(4)? 24.06.2015
  • @ rickhg12hs, я думаю, это должно сработать, и если да, то это гораздо более приятное решение, чем мой уродливый хакерский файл ядра. 24.06.2015
  • @ rickhg12hs Спасибо. Это сработало отлично. 24.06.2015
  • Я конвертирую свой комментарий в ответ, чтобы другим было легче его найти. 25.06.2015

Ответы:


1

Использование addprocs(4) в качестве первой команды в вашей записной книжке должно предоставить четырех рабочих для выполнения параллельных операций из вашей записной книжки.

25.06.2015

2

Один из способов решить эту проблему - создать ядро, которое всегда использует 4 ядра. Для этого потребуется некоторая ручная работа. Я предполагаю, что вы находитесь на машине unix.

В папке ~/.ipython/kernels/julia-0.x вы найдете следующий kernel.json файл:

{
  "display_name": "Julia 0.3.9",
  "argv": [
    "/usr/local/Cellar/julia/0.3.9_1/bin/julia",
    "-i",
    "-F",
    "/Users/ch/.julia/v0.3/IJulia/src/kernel.jl",
    "{connection_file}"
  ],
  "language": "julia"
}

Если вы скопируете всю папку cp -r julia-0.x julia-0.x-p4 и измените только что скопированный kernel.json файл:

{
  "display_name": "Julia 0.3.9 p4",
  "argv": [
    "/usr/local/Cellar/julia/0.3.9_1/bin/julia",
    "-p",
    "4",
    "-i",
    "-F",
    "/Users/ch/.julia/v0.3/IJulia/src/kernel.jl",
    "{connection_file}"
  ],
  "language": "julia"
}

Пути, вероятно, будут для вас другими. Обратите внимание, что я только дал ядру новое имя и добавил аргумент командной строки `-p 4.

Вы должны увидеть новое ядро ​​с именем Julia 0.3.9 p4, которое всегда должно использовать 4 ядра.

Также обратите внимание, что этот файл ядра не будет обновляться при обновлении IJulia, поэтому вам придется обновлять его вручную при каждом обновлении julia или IJulia.

23.06.2015
  • Спасибо за ответ. Я не пробовал этого, но думаю, что это может сработать для более постоянного решения. Решение @ rickhg12hs пока работало нормально. 24.06.2015
  • Когда я уже нахожусь в сеансе Julia на Jupyter ... Есть ли какая-нибудь команда, которая может сказать мне, сколько процессов было включено? 19.07.2017
  • @skan есть функция procs(), которая возвращает идентификаторы всех процессов. Если вы вызовете его после запуска julia с -p 4, вы получите массив длиной 5: один - это главный процесс, а остальные четыре - рабочие, запрошенные -p. 20.07.2017
  • Новые материалы

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

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

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

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

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

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

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