Подача живого vowpal wabbit процесса через Python's subprocess
в порядке (быстро). пока вы не запускаете новый процесс на пример и избегаете чрезмерных контекстных переключателей. По моему опыту, в этой настройке вы можете ожидать пропускную способность ~ 500 тыс. Функций в секунду на типичном двухъядерном оборудовании. Это не так быстро, как (10x быстрее) ~ 5M features/sec vw обычно обрабатывается, когда не взаимодействует с каким-либо другим программным обеспечением (чтение из файла/кеша), но достаточно подходит для большинства практических целей. Обратите внимание, что узкое место в этом параметре, скорее всего, будет обрабатываться дополнительным процессом, а не vowpal-wabbit.
Рекомендуется подавать вау-паб волов в партии (по одному примеру за раз, а не по одному) как на входе (питание vw), так и на выходе (чтение vw-ответов). Если вы используете subprocess.Popen
для подключения к процессу, обязательно передайте большой bufsize
, иначе по умолчанию итератор Popen будет буферизирован по строке (по одному примеру за раз), что может привести к примеру контекстного переключения между производителем примеров и потребителей (vowpal wabbit).
Предполагая командную строку Vw в vw_cmd
, это было бы что-то вроде:
vw_proc = subprocess.Popen(vw_cmd,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
bufsize=1048576)
Вообще, медлительность может исходить от:
- Слишком много переключений контекста (генерации и обработки один пример в a)
- Слишком много обработки вне vw (например, генерация примеров в первую очередь, преобразование объектов)
- Накладные расходы при запуске (например, чтение модели) на пример.
Таким образом, избегая всех вышеперечисленных ошибок, вы должны обеспечить максимальную пропускную способность при обстоятельствах, связанных с необходимостью взаимодействия с дополнительными процессами.