如何将大块数据传递给芹菜



我正在使用芹菜工人从我的机器学习模型中获得结果。

我正在做的是将大的numpy数组(几兆字节)从客户端发送到芹菜任务并返回。

目前,我正在客户端numpy数组中序列化为base64。当我将数据直接从Redis存储/获取到客户端或芹菜工作者时,系统的性能比我让芹菜完成所有参数传递(numpy的base64)时快得多。

我还想使用芹菜(带有"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吗?

Celery使用JSON或cPickle来序列化消息。因此,可能发生的情况是,您要序列化两次——首先是base64(这是低效的),然后是JSON或cPickle。

你有没有试过完全跳过base64编码,让Celery来处理它?

您可以告诉Celery使用cPickle(更高效)而不是JSON(默认),代码如下:

app.conf.task_serializer = 'pickle'
app.conf.result_serializer = 'pickle'

相关内容

  • 没有找到相关文章

最新更新