1

svm予測モデルの実装では、関数の実行をsvmutil.svm_trainマルチスレッドにしたいです。マルチスレッドプログラムの実装は初めてですが、並列プログラミングの概念についてある程度の知識があり、異なるパラメータセットを使用して複数のモデルを同時にトレーニングすることは理論的には可能であると考えています。

設定:

import svmutil
import multiprocessing as mp

problem = svm_util.svm_read_problem('my_problem')
# I have a list of svm_param objects I want to train
params = myCode.svm_param_list()

# Calculate the number of worker threads
processes = mp.cpu_count() * 2

トレーニングを複数の実行スレッドに分割します。

pool = mp.Pool(processes)
for param in params:
    pool.apply(svmutil.svm_train, args=(problem, param,))

pool.close()
pool.join()

しかし、私が抱えている問題svmutil.svm_trainは、c-typeポインターが含まれているため、ピクルスにできないことです。Pythonインタープリターは私にエラーを出します:

ValueError: ctypes objects containing pointers cannot be pickled

モジュール内の関数をどうにかしてピクルスにするよりも、実装を調整したいと思います。したがって、私は知りたいのですが、この関数をピクルスにすることなく並列化できる方法はありますか?

また、関数の結果を収集するにはどうすればよいですか?理想的には、これはトレーニングされたモデルのリストです(関数svmutil.svm_trainを呼び出すたびに関数が出力されます)。

4

1 に答える 1

1

上記のコメントにリンクされている質問のトップアンサーを使用して、ソリューションを構築することができました。パイプとプロセスを生成し、結果をリッスンすることで、外部モジュールのpython関数の呼び出しを並列化することができました。パイプに渡す関数は次のとおりです。pipe.send(svmutil.svm_train(problem,param)))

于 2013-02-15T23:28:24.423 に答える