У меня есть существующая модель, в которой я загружаю предварительно подготовленные веса, а затем делаю вывод (по одному изображению за раз) в pytorch. Я пытаюсь в основном преобразовать его в модуль молнии pytorch и запутался в нескольких вещах.
Так что в настоящее время мой __init__
метод для модели выглядит следующим образом:
self._load_config_file(cfg_file)
# just creates the pytorch network
self.create_network()
self.load_weights(weights_file)
self.cuda(device=0) # assumes GPU and uses one. This is probably suboptimal
self.eval() # inference mode
Что я могу почерпнуть из документации по молнии, я могу сделать то же самое, за исключением того, чтобы не делать звонок cuda()
. Итак, что-то вроде:
self.create_network()
self.load_weights(weights_file)
self.freeze() # inference mode
Итак, мой первый вопрос: правильный ли это способ использования молнии? Как бы молния узнала, нужно ли ей использовать графический процессор? Я предполагаю, что это должно быть где-то указано.
Теперь для вывода у меня есть следующая настройка:
def infer(frame):
img = transform(frame) # apply some transformation to the input
img = torch.from_numpy(img).float().unsqueeze(0).cuda(device=0)
with torch.no_grad():
output = self.__call__(Variable(img)).data.cpu().numpy()
return output
Это бит, который меня смутил. Какие функции мне нужно переопределить, чтобы сделать вывод, совместимый с молнией?
Кроме того, на данный момент вход поступает в виде массива numpy. Это что-то, что было бы возможно из модуля молнии, или для вещей всегда нужно использовать какой-то загрузчик данных?
В какой-то момент я хочу расширить реализацию этой модели, чтобы также проводить обучение, поэтому хочу убедиться, что я делаю это правильно, но в то время как большинство примеров сосредоточены на обучающих моделях, простой пример простого выполнения вывода на производстве время на одном изображении / точке данных может быть полезным.
Я использую 0.7.5 с pytorch 1.4.0 на GPU с cuda 10.1