我正在使用芹菜工作者从我的机器学习模型中获取结果。
我正在做的是从客户端向芹菜任务发送大块numpy数组(几兆字节)并返回。
目前,我将客户端numpy数组序列化为base64。当我在客户端或芹菜工作者上直接从/向Redis存储/获取数据时,系统的性能比/当我让celery完成所有参数传递(numpy的base64)时快得多。
我想使用celery(带有' redis' broker)来传递args / numpy数组而不是直接在客户端中使用redis。你知道哪里有问题吗?如何设置芹菜的配置以更有效地执行此操作(在客户端 - > broker-> worker之间传递数据并返回到客户端)。
serialized = np.asarray(images).reshape((number_of_records, size)).ravel().tostring()
serialized = base64.b64encode(serialized)
#self.redis.set(key, serialized)
print('calling celery processor')
result = self.celery.send_task('process', args=[number_of_records, serialized], kwargs={})
returncode, result = result.get(timeout=1000, interval=0.1)
vs(这是更快,直接使用redis存储):
serialized = np.asarray(images).reshape((number_of_records, size)).ravel().tostring()
serialized = base64.b64encode(serialized)
self.redis.set(key, serialized)
print('calling celery processor')
result = self.celery.send_task('process', args=[number_of_records, key], kwargs={})
returncode, result = result.get(timeout=1000, interval=0.1)
resultc= self.redis.get(key)
有关芹菜的序列化,配置设置,......的任何提示?我希望这个系统快速而简单。我应该直接使用redis,就像在第二个例子中那样吗?
答案 0 :(得分:1)
Celery使用JSON或cPickle来序列化消息。所以可能发生的事情是你要两次序列化 - 首先是base64(效率低下),然后是JSON或cPickle。
您是否尝试完全跳过base64编码并让Celery处理它?</ p>
您可以使用此代码告诉Celery使用cPickle(更高效)而不是JSON(默认值):
app.conf.task_serializer = 'pickle'
app.conf.result_serializer = 'pickle'