2013-09-09 1 views
0

С потрясающей версией 1.0.0, с которой я играл с параллельным интерфейсом iPython. Я пытаюсь создать асинхронную стохастическую систему спуска градиента. Как я вижу это, я хочу отправить функцию ко всем узлам и получить результаты по мере их выхода. Из того, что я смог реализовать и взглянуть на документацию, стандартные реализованные представления не поддерживают это. Метод get(timeout) сделает это, но вы не можете пропустить каждую запись в объекте <ASync_result> с использованием тайм-аута. Как мне удалось получить это работает была следующаяАсинхронная оценка в параллельном ipython

c = Client() 
calls = [] 
for i,j in enumerate(args): 
    calls.append(c[ i % len(c.ids) ].apply(f, j)) 

while condition: 
    dels = [] 
    for i,j in enumerate(calls): 
     try: 
      print j.get(0.01) #or some other timeout 
      dels.append(i) #I keep track of the calls that have been called 
      #do something with the last result, throw a new call 
      calls.append(c[ i % len(c.ids) ].apply(f, argument) 
     except: 
      pass 

    for i,d in enumerate(dels): 
     del calls[ d - i ] #delete gotten calls 

    #evaluate stopping condition 

Теперь, прежде чем вы идете кричать, что это ужасный код и глупый способ сделать это, я это знаю. Я мог бы сделать этот особый способ сделать это лучше, но мне просто интересно, есть ли встроенный способ сделать что-то подобное в IPython.parallel.

Заранее благодарю всех, кто принимает время.

Best, Al.

+0

Какой смысл делать это асинхронно, когда у вас есть цикл while, который ждет выполнения всех задач? Вы просто внедрили выполнение синхронизации поверх асинхронного API :) –

+0

Правда, но в итоге я хотел бы реализовать цикл, который продолжает бросать новые вызовы и получать их по мере их выхода. Я обновлю это в примере. –

+0

Моя цель - реализовать асинхронный sgd для нейронной сети. Таким образом, вызовы могут быть несколько не синхронизированы с текущими параметрами. И я буду называть их до тех пор, пока ошибка не изменится меньше определенной суммы как скользящей средней или чего-то подобного. И, черт возьми, Виктор, ты уверен, что быстро на ярлыке ipython! Большое спасибо! –

ответ

1

Вы можете создать несколько асинхронных вызовов, а затем выполнить итерацию по ним.

c = Client() 
dview = c[:] 
asyncs = [dview.map_async(f, [arg]) for arg in args] 
while asyncs: 
    for async in asyncs[:]: 
     if async.ready(): 
      asyncs.remove(async) 
      print async.result[0]