некоторой непонятной мне особенностью. Есть две строки кода:
> predicted_values = self.class_model(**model_args)
> predicted_values = predicted_values.cpu().numpy().tolist()
Первая делает непосредственно прогон модели, а вторая берёт результат с предыдущего шага и просто перегоняет его в системную память в виде питоновского списка. Перегоняет он немного, там всего лишь батч из 128 семплов по одному флоту на каждый семпл (бинарная классификация).
Однако в ходе профилирования открылось следущее:
Первая строка отнимает всего 5% затраченного скриптом времени, тогда как вторая = 25%. В первом шаге по детализации видны вызовы pytorch, вторая строка не выдаёт вообще никакой детализации по вызовам.
Вопрос - как простой перегон небольшого вектора из ГПУ в ОЗУ занимает больше времени чем вычисления в модели?
У меня есть предположение что там под капотом pytorch идут какие-то отложенные вычисления, но я хз что и в каких количествах нужно перелопатить, чтоб найти подтверждения этого в какой-то документации.
Так это же известная проблема. Передача данных от ГПУ к ЦПУ и обратно - бутылочное горлышко. По этому все пытаются свести обмен к минимуму. Считать как можно больше на ГПУ и один раз вернуть ответ
Обсуждают сегодня