2017-01-31 20 views
4

Я использую работника сельдерея для получения результатов от моих моделей обучения. Как передать большой кусок данных сельдерею

Что я делаю, это отправка больших массивов numpy (несколько мегабайт) из задачи клиента в сельдерей и обратно.

В настоящее время я сериализую в массивах numpy клиента как base64. Когда я храню/получаю данные непосредственно из/в Redis на клиенте или работнике сельдерея, производительность системы намного быстрее, чем /, когда я позволяю сельдерейу делать все прохождение аргументов (base64 of numpy).

Я хотел бы использовать сельдерей (с брокером 'redis') также для передачи массивов args/numpy и не перерисовывать непосредственно в клиенте. Вы знаете, где могут быть проблемы? Как я могу настроить конфигурацию сельдерея, чтобы сделать это более эффективно (выполнять передачу данных между клиентом-> брокер-> рабочим и обратно клиенту).

 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) 

против (это быстрее, непосредственно использование хранения 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

Вы решили эту проблему? – luanbuingoc

ответ

0

Сельдерей использует JSON или cPickle для сериализации сообщений. Итак, что может произойти, вы дважды сериализуете - сначала на base64 (что неэффективно), затем на JSON или cPickle.

Вы пробовали полностью пропустить кодировку base64 и просто разрешить сельдерей?

Вы можете сказать, сельдерей использовать cPickle (более эффективный) вместо JSON (по умолчанию), с помощью этого кода:

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