Тензор потерь вырезается из графика в PopART

#ipu #popart

#ipu #popart

Вопрос:

Я написал очень простую программу PopART, используя интерфейс C , но каждый раз, когда я пытаюсь скомпилировать ее для запуска на устройстве IPU, я получаю следующую ошибку:

 terminate called after throwing an instance of ‘popart::error’ 
  what(): Could not find loss tensor ‘L1:0’ in main graph tensors 
  

Я определяю потери в своей программе следующим образом:

 auto loss = builder->aiGraphcoreOpset1().l1loss({outputs[0]}, 0.1f, popart::ReductionType::Sum, “l1LossVal”); 
  

Что-то не так с моим определением потерь, в результате чего оно удаляется из графика? Я следовал той же структуре, что и один из приведенных здесь примеров Graphcore.

Ответ №1:

Эта ошибка обычно возникает, когда прототип модели, который вы передаете объектам TrainingSession или InferenceSession , не содержит тензор потерь. Распространенной причиной этого является вызов builder->getModelProto() перед добавлением тензора потерь в график. Чтобы убедиться, что ваш тензор потерь является частью protobuf, ваши вызовы должны быть в следующем порядке:

 ... 
auto loss = builder->aiGraphcoreOpset1().l1loss(...); 
auto proto = builder->getModelProto(); 
auto session = popart::TrainingSession::createFromOnnxModel(...); 
... 
  

Ключевым моментом является то, что getModelProto() вызов должен быть последним вызовом из builder интерфейса перед настройкой сеанса PopART.