Я делаю Монте-Карло для модели и решил, что Даск может быть весьма полезен для этой цели.Первые 35 часов или около того все шло довольно «гладко» (кроме шума вентилятора, дающего ощущение, что компьютер взлетел).Каждый запуск модели занимал около 2 секунд, и параллельно работали 8 разделов.Монитор активности показывал 8 экземпляров python3.6.
Однако компьютер стал «бесшумным», и загрузка ЦП (как показано в Spyder) едва превышает 20%.Модели запускаются последовательно (не параллельно) и занимают около 4 секунд каждый.Это случилось сегодня в какой-то момент, когда я работал над другими вещами.Я понимаю, что в зависимости от последовательности действий, Dask не будет использовать все ядра одновременно.Однако в этом случае на самом деле нужно выполнить только одну задачу (см. Ниже), поэтому можно ожидать, что все разделы будут выполняться и завершаться более или менее одновременно. Редактировать: в прошлом вся установка была успешно выполнена для 10.000 симуляций, с той разницей, что теперь есть около 500.000 симуляций для запуска .
Редактировать 2: теперь она имеетперешел на создание 2 разделов параллельно (вместо предыдущего 1 и исходного 8).Похоже, что-то заставляет меня изменить количество одновременно обрабатываемых разделов.
Редактировать 3: Следуя рекомендациям, я использовал dask.distributed.Client
для отслеживания происходящего и запускал его дляпервые 400 строк.Иллюстрация того, как это выглядит после завершения, приведена ниже.Я изо всех сил пытаюсь понять метки оси X, зависание над прямоугольниками показывает около 143 с.
Поэтому возникают некоторые вопросы:
- Есть ли какая-либо связь между бегом другое программное обеспечение (Chrome, MS Word) и заставление компьютера «забирать» некоторый процессор из python?
- Или вместо этого это может быть связано с тем, что в какой-то момент я запустил второй экземпляр Spyder ?
- Или даже может ли компьютер каким-то образом исчерпать память ?Но тогда бы команда перестала работать?
- ... есть ли другие возможные объяснения?
- Можно ли «сказать» Даску, чтобы он продолжил тяжелую работу и вернулся к использованию?вся мощность процессора, пока он еще выполняет исходную команду?
- Можно ли прервать выполнение и сохранить те вычисления, которые уже были выполнены?Я заметил, что остановка текущей команды, похоже, мало что дает.
- Можно ли узнать об общем ходе вычислений во время их выполнения?Я хотел бы знать, сколько осталось моделей, чтобы иметь представление о том, сколько времени потребуется для завершения в этом медленном темпе.Я пытался использовать ProgressBar в прошлом, но он зависает на 0% за несколько секунд до окончания вычислений.
Для ясности, загрузка модели инеобходимые данные будут очень сложными.Я не создал воспроизводимый пример из-за боязни усугубить проблему (на данный момент модель все еще работает, по крайней мере ...) и потому, что - как вы, вероятно, можете сказать к настоящему времени - я очень мало представляю, что можетбыть причиной, и я не ожидаю, что кто-нибудь сможет воспроизвести это.Я знаю, что это не лучшая практика, и заранее прошу прощения.Тем не менее, я был бы очень признателен за некоторые мысли о том, что может происходить, и о возможных путях решения этой проблемы, если кто-то до этого делал что-то подобное и / или имел опыт работы с Dask.
Запуск: - macOS 10.13.6 (Память: 16 ГБ | Процессор: 2,5 ГГц Intel Core i7 | 4 ядра) - Spyder 3.3.1 - dask 0.19.2 - pandas 0.23.4
Пожалуйста, дайте мне знать, если что-то нужно прояснить
Если вы считаете, что это может быть актуально, основная идея сценария:
# Create a pandas DataFrame where each column is a parameter and each row is a possible parameter combination (cartesian product). At the end of each row some columns to store the respective values of some objective functions are pre-allocated too.
# Generate a dask dataframe that is the DataFrame above split into 8 partitions
# Define a function that takes a partition and, for each row:
# Runs the model with the coefficient values defined in the row
# Retrieves the values of objective functions
# Assigns these values to the respective columns of the current row in the partition (columns have been pre-allocated)
# and then returns the partition with columns for objective functions populated with the calculated values
# map_partitions() to this function in the dask dataframe
Есть мысли?Это показывает, насколько прост скрипт:
Панель инструментов:
Обновление: я выбрал следующий подход:
- Установить большое количество разделов (
npartitions=nCores*200
).Это значительно облегчило визуализацию прогресса.Я не уверен, что установка такого количества разделов - хорошая практика, но она работала без особых замедлений. - Вместо того, чтобы пытаться получить один огромный панду DataFrame в конце к
.compute()
, Я получил dask dataframe для записи в Parquet (таким образом, каждый раздел был записан в отдельный файл).Позже, чтение всех файлов в dask dataframe и compute
передача его в pandas DataFrame не составило труда, и если что-то пойдет не так в середине, по крайней мере, я не потеряю разделы, которые были успешно обработаны и записаны.
Вот как это выглядело в данный момент: