web-dev-qa-db-ja.com

ダスク:ダスク遅延でコードを並列化するにはどうすればよいですか?

これは並列処理への私の最初のベンチャーであり、Daskを検討していましたが、実際にコーディングするのに苦労しています。

私は彼らの例とドキュメントを見てきましたが、dask.delayedが最適だと思います。関数をdelay(function_name)でラップするか、@ delayedデコレータを追加しようとしましたが、正しく機能していないようです。他のメソッドよりもDaskの方がpythonで作成されており、その(想定される)単純さのために。)daskはforループでは機能しないことを知っていますが、 。

私のコードは、他の関数への入力を含む関数を介してファイルを渡し、次のようになります。

from dask import delayed
filenames = ['1.csv', '2.csv', '3.csv', etc. etc. ]
for count, name in enumerate(filenames)"
    name = name.split('.')[0]
    ....

次にいくつかの前処理を行いますex:

    preprocess1, preprocess2 = delayed(read_files_and_do_some_stuff)(name)

次に、コンストラクターを呼び出して、関数呼び出しにpre_resultsを渡します。

    fc = FunctionCalls()
    Daily = delayed(fc.function_runs)(filename=name, stringinput='Daily',
                             input_data=pre_result1, model1=pre_result2)

ここで行うことは、ファイルをforループに渡し、いくつかの前処理を行ってから、ファイルを2つのモデルに渡します。

これを並列化する方法についての考えやヒントはありますか?奇妙なエラーが発生し始め、コードを修正する方法がわかりませんでした。コードはそのまま機能します。私はpandasデータフレーム、シリーズ、およびnumpy配列の束を使用します。dask.dataframesなどで動作するように戻ってすべてを変更したくないです。

私のコメントのコードは読みにくいかもしれません。ここでは、よりフォーマットされた方法です。

以下のコードでは、print(mean_squared_error)と入力すると、単にDelayed( 'mean_squared_error-3009ec00-7ff5-4865-8338-1fec3f9ed138')が表示されます。

from dask import delayed
import pandas as pd
from sklearn.metrics import mean_squared_error as mse
filenames = ['file1.csv']

for count, name in enumerate(filenames):
    file1 = pd.read_csv(name)
    df = pd.DataFrame(file1)
    prediction = df['Close'][:-1]
    observed = df['Close'][1:]
    mean_squared_error = delayed(mse)(observed, prediction)
20
Monty

最終的に結果を計算するには、dask.computeを呼び出す必要があります。 dask.delayed documentation を参照してください。

シーケンシャルコード

import pandas as pd
from sklearn.metrics import mean_squared_error as mse
filenames = [...]

results = []
for count, name in enumerate(filenames):
    file1 = pd.read_csv(name)
    df = pd.DataFrame(file1)  # isn't this already a dataframe?
    prediction = df['Close'][:-1]
    observed = df['Close'][1:]
    mean_squared_error = mse(observed, prediction)  
    results.append(mean_squared_error)

並列コード

import dask
import pandas as pd
from sklearn.metrics import mean_squared_error as mse
filenames = [...]

delayed_results = []
for count, name in enumerate(filenames):
    df = dask.delayed(pd.read_csv)(name)
    prediction = df['Close'][:-1]
    observed = df['Close'][1:]
    mean_squared_error = dask.delayed(mse)(observed, prediction)
    delayed_results.append(mean_squared_error)

results = dask.compute(*delayed_results)
28
MRocklin

このスニペットは、受け入れられている答えよりもはるかに明確なソリューション、IMOです。

from dask import compute, delayed
import pandas as pd
from sklearn.metrics import mean_squared_error as mse
filenames = [...]

def compute_mse(file_name):
    df = pd.read_csv(file_name)
    prediction = df['Close'][:-1]
    observed = df['Close'][1:]
    return mse(observed, prediction)

delayed_results = [delayed(compute_mse)(file_name) for file_name in filenames]
mean_squared_errors = compute(*delayed_results, scheduler="processes")
4
Vitalis