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
を呼び出すたびに関数が出力されます)。