Линейная регрессия Python параллельно - Scoop - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь запустить параллельную линейную регрессию для 10000000 точек данных (4 функции, 1 целевая переменная), случайно сгенерированных из нормального распределения с использованием библиотеки Scoop Python.Вот код:

import pandas as pd
import numpy as np
import random
from scoop import futures
import statsmodels.api as sm
from time import time

def linreg(vals):
    global model
    model = sm.OLS(y_vals,X_vals).fit()
    return model
    print(model.summary())    

if __name__ == '__main__':

random.seed(42)
vals = pd.DataFrame(np.random.normal(loc = 3, scale = 100, size =(10000000,5)))
vals.columns = ['dep', 'ind1', 'ind2', 'ind3', 'ind4']
y_vals = vals['dep']
X_vals = vals[['ind1', 'ind2', 'ind3', 'ind4']]

bt = time()
model_vals = list(map(linreg, [1,2,3]))
mval = model_vals[0]
print(mval.summary())
serial_time = time() - bt

bt1 = time()
model_vals_1 = list(futures.map(linreg, [1,2,3]))
mval_1 = model_vals_1[0]
print(mval_1.summary())
parallel_time = time() - bt1

print(serial_time, parallel_time)`

Однако после этого сводная регрессия действительно создается в последовательном порядке - с помощью стандартной функции отображения Python - ошибка:

Traceback (самая последняявызовите последний): файл "C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ runpy.py", строка 193, в _run_module_as_main "main", mod_spec), файл "C: \Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ runpy.py ", строка 85, в файле _run_code exec (code, run_globals)" C: \ Users \ niccolo.gentile \ AppData \ Local\ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages \ scoop \ bootstrap__main __. Py ", строка 302, в файле b.main ()" C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ "envs \ tenorenviron \ lib \ site-packages \ scoop \ bootstrap__main __. py ", строка 92, в основном файле self.run () Файл" C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ "lib \ site-packages \ scoop \ bootstrap__main __. py ", строка 290, в файле futures_startup () запускается" C: ​​\ U "sers \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages \ scoop \ bootstrap__main __. py ", строка 271, в файле futures_startup run_name =" main ", файл C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages \ scoop \ futures.py ", строка 64, в _startup result = _controller.switch (rootFuture, * args, ** kargs) Файл" C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages \ scoop_control.py ", строка 253, в runController поднять файл future.exceptionValue файла C: \ Users \ niccolo.gentile\ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages \ scoop_control.py ", строка 127, в файле runFuture future.resultValue = future.callable (* файл future.args, ** future.kargs)"C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ runpy.py ", строка 263, в run_path pkg_name = pkg_name, script_name = fname) Файл" C: \ Users \ niccolo.нееврей \ AppData \ Local \ Continuum \ anaconda3 \ envs \ tensorenviron \ Lib \ RUnpy.py ", строка 96, в _run_module_code имя_модуля, mod_spec, pkg_name, имя_скрипта) Файл" C: \ Users \ niccolo.gentile \ AppData \ Local \ Continuum \ anaconda3 \ envs \ тензорная среда \ lib \ runpy.py ", строка 85, в файле _run_code exec (code, run_globals) "Scoop_map_linear_regression1.py", строка 33, в файле model_vals_1 = list (futures.map (linreg, [1,2,3]))) файл "C: \ Users \ niccolo.gentile \AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages \ scoop \ futures.py ", строка 102, в _mapGenerator для будущего в _waitAll (* futures): файл" C: \ Users \ niccolo.gentile \AppData \ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages \ scoop \ futures.py ", строка 358, в _waitAll для f в _waitAny (в будущем): файл" C: \ Users \ niccolo.gentile \ AppData\ Local \ Continuum \ anaconda3 \ envs \ tenorenviron \ lib \ site-packages \ scoop \ futures.py ", строка 335, в _waitAny повышение childFuture.exceptionValue NameError: имя 'y_vals' не определено

производится впоследствии.Это означает, что код останавливается на model_vals_1 = list(futures.map(linreg, [1,2,3]))

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

python -m scoop Scoop_map_linear_regression1.py

Действительно, если он будет запущен без параметра -m scoop, он не будет распараллелен и действительно будет работать, а просто использует два раза встроенную в Python функцию map (следовательно, запускает двараз в сериале), как, как вы будете сообщены в предупреждениях.То есть, без указания параметра -m scoop при его запуске, futures.map будет заменен на map, тогда как цель - запустить его параллельно с использованием futures.map.

Это пояснение сделано для того, чтобы люди не отвечали, что они решили проблему, просто запустив код без параметра -m scoop, как уже произошло здесь:

Python Parallel Computing - Scoop

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

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

1 Ответ

0 голосов
/ 12 февраля 2019

Решение состоит в том, чтобы передать в качестве второго аргумента futures.map (но не обязательно map) только [1].

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

def welcome(x):
    print('Hello world!')

if __name__ == '__main__':
    a = list(map(welcome, [1,2]))

Функция приветствия на самом деле не нуждается ни в каком аргументе, но все равно выходные данные будут

Hello world!
Hello world!

повторяться два раза, чтодлина списка, передаваемого в качестве второго аргумента.

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

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

NameError: name 'y_vals'не определено

, брошенный в конце трассировки.Это должно быть видно при переходе по: исходному коду scoop.futures

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...