在PopART中,损失张量被从图中删除



我使用C++接口编写了一个非常简单的PopART程序,但每次我试图将其编译为在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示例相同的结构。

当传递给TrainingSessionInferenceSession对象的模型原型不包含损失张量时,通常会发生此错误。一个常见的原因是在将损失张量添加到图之前调用builder->getModelProto()。为了确保您的损失张量是原型的一部分,您的呼叫应按以下顺序进行:

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

关键是getModelProto()调用应该是在设置PopART会话之前来自builder接口的最后一个调用。

最新更新