前提・実現したいこと
ray
という並列分散処理のライブラリを用いています。pickle
を用いてクラスを並列化し、ray
によって並列処理を行いたいのですが、そこで、@ray.remote
デコレータをつけた関数内でpickle.load
をしようとすると、エラーが起きてしまいます(attribution error
)。何が間違っているのか検討がつかないので、もしわかる方がいましたら、そもそもの設計があっているのかどうかも含めて、少しでも教えていただけるとありがたいです。
発生している問題・エラーメッセージ
RayTaskError(AttributeError): [36mray::output()[39m (pid=62562, ip=133.34.30.175) File "python/ray/_raylet.pyx", line 484, in ray._raylet.execute_task File "<ipython-input-12-539c228b28bd>", line 12, in output AttributeError: Can't get attribute 'encoding' on <module '__main__' from '/Users/masayukikaneko/.pyenv/versions/3.7.10/lib/python3.7/site-packages/ray/workers/default_worker.py'> --------------------------------------------------------------------------- RayTaskError(AttributeError) Traceback (most recent call last) <ipython-input-12-539c228b28bd> in <module> 15 16 result=output.remote(dumped) ---> 17 codeword=ray.get(result) 18 print(codeword.shape) ~/.pyenv/versions/3.7.10/lib/python3.7/site-packages/ray/worker.py in get(object_refs, timeout) 1424 worker.core_worker.dump_object_store_memory_usage() 1425 if isinstance(value, RayTaskError): -> 1426 raise value.as_instanceof_cause() 1427 else: 1428 raise value RayTaskError(AttributeError): ray::output() (pid=62562, ip=133.34.30.175) File "python/ray/_raylet.pyx", line 484, in ray._raylet.execute_task File "<ipython-input-12-539c228b28bd>", line 12, in output AttributeError: Can't get attribute 'encoding' on <module '__main__' from '/Users/masayukikaneko/.pyenv/versions/3.7.10/lib/python3.7/site-packages/ray/workers/default_worker.py'>
該当のソースコード
クラスencoding
のメソッドを呼び出して、結果を出力することを試してみています。
python
1ec=encoding() 2#普通にクラス内の関数を呼び出してみる 3information,codeword=ec.encode()#NO ERROR 4print(codeword.shape)#(1000,) 5 6#一度dumpしてからloadし、関数を呼び出してみる 7dumped=pickle.dumps(ec) 8a=pickle.loads(dumped) 9information,codeword=a.encode()#NO ERROR 10print(codeword.shape)#(1000,) 11 12#ray 内の関数でloadし、関数を呼び出してみる 13@ray.remote 14def output(dumped): 15 b=pickle.loads(dumped) 16 information,codeword=b.encode()#ERROR!!! 17 return codeword 18 19result=output.remote(dumped) 20codeword=ray.get(result) 21print(codeword.shape)
一応、クラスencoding
を以下に示しておきます。(簡略化しております)
import pickle import numpy as np import ray if __name__=="__main__": ray.init() class coding(): def __init__(self,tG): self.N=1000 self.K=500 #self.K=self.N*(self.Wr-self.Wc)//self.Wr self.Wc=3 self.Wr=6 self.tG=tG class encoding(coding): def generate_information(self): #generate information information=np.random.randint(0,2,self.K) return information def encode(self): information=self.generate_information() codeword=self.tG@information%2 return information,codeword
試したこと
pickle
の代わりにdill
を用いたところ、name 'np' is not defined
とでた@ray.remote
デコレータのついた関数は、別ファイルの扱いになる?かもしれない?と考察したが、よくわからなかった。
補足情報(FW/ツールのバージョンなど)
- VScodeのjupyterで記述(python 3.7.10 64-bit)
- ray 0.9.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/27 12:17