我使用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示例相同的结构。
当传递给TrainingSession
或InferenceSession
对象的模型原型不包含损失张量时,通常会发生此错误。一个常见的原因是在将损失张量添加到图之前调用builder->getModelProto()
。为了确保您的损失张量是原型的一部分,您的呼叫应按以下顺序进行:
...
auto loss = builder->aiGraphcoreOpset1().l1loss(...);
auto proto = builder->getModelProto();
auto session = popart::TrainingSession::createFromOnnxModel(...);
...
关键是getModelProto()
调用应该是在设置PopART会话之前来自builder
接口的最后一个调用。