1. Return a TfLiteApplicationError instead of TfLiteError when trying to apply a delegate that doesn't allow dynamic tensors on a graph with dynamic tensors.
2. Add comments on error statuses defined in TfLiteStatus. PiperOrigin-RevId: 337802774 Change-Id: Ieb828b04b9cb46c692210cd2786fed77adb80ecc
This commit is contained in:
parent
861f63a327
commit
6f440e215d
@ -46,8 +46,17 @@ extern "C" {
|
|||||||
|
|
||||||
typedef enum TfLiteStatus {
|
typedef enum TfLiteStatus {
|
||||||
kTfLiteOk = 0,
|
kTfLiteOk = 0,
|
||||||
|
|
||||||
|
// Generally referring to an error in the runtime (i.e. interpreter)
|
||||||
kTfLiteError = 1,
|
kTfLiteError = 1,
|
||||||
|
|
||||||
|
// Generally referring to an error from a TfLiteDelegate itself.
|
||||||
kTfLiteDelegateError = 2,
|
kTfLiteDelegateError = 2,
|
||||||
|
|
||||||
|
// Generally referring to an error in applying a delegate due to
|
||||||
|
// incompatibility between runtime and delegate, e.g., this error is returned
|
||||||
|
// when trying to apply a TfLite delegate onto a model graph that's already
|
||||||
|
// immutable.
|
||||||
kTfLiteApplicationError = 3
|
kTfLiteApplicationError = 3
|
||||||
} TfLiteStatus;
|
} TfLiteStatus;
|
||||||
|
|
||||||
|
@ -1526,7 +1526,7 @@ TfLiteStatus Subgraph::ModifyGraphWithDelegate(TfLiteDelegate* delegate) {
|
|||||||
ReportError(
|
ReportError(
|
||||||
"Attempting to use a delegate that only supports static-sized "
|
"Attempting to use a delegate that only supports static-sized "
|
||||||
"tensors with a graph that has dynamic-sized tensors.");
|
"tensors with a graph that has dynamic-sized tensors.");
|
||||||
return kTfLiteError;
|
return kTfLiteApplicationError;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -567,7 +567,8 @@ class Subgraph {
|
|||||||
// delegate*. The Subgraph has been restored to its pre-delegation state.
|
// delegate*. The Subgraph has been restored to its pre-delegation state.
|
||||||
// NOTE: This reverts all delegates previously applied to the Subgraph.
|
// NOTE: This reverts all delegates previously applied to the Subgraph.
|
||||||
// 3. kTfLiteApplicationError : Delegation failed to be applied due to the
|
// 3. kTfLiteApplicationError : Delegation failed to be applied due to the
|
||||||
// state that the TfLite runtime is in. However, the Subgraph is still in a
|
// incompatibility with the TfLite runtime, e.g., the model graph is already
|
||||||
|
// immutable when applying the delegate. However, the Subgraph is still in a
|
||||||
// invokable state.
|
// invokable state.
|
||||||
// 4. kTfLiteError: Unexpected/runtime failure.
|
// 4. kTfLiteError: Unexpected/runtime failure.
|
||||||
TfLiteStatus ModifyGraphWithDelegate(TfLiteDelegate* delegate);
|
TfLiteStatus ModifyGraphWithDelegate(TfLiteDelegate* delegate);
|
||||||
|
@ -412,7 +412,11 @@ class Interpreter {
|
|||||||
/// 2. kTfLiteDelegateError: Delegation failed due to an error in the
|
/// 2. kTfLiteDelegateError: Delegation failed due to an error in the
|
||||||
/// delegate. The Interpreter has been restored to its pre-delegation state.
|
/// delegate. The Interpreter has been restored to its pre-delegation state.
|
||||||
/// NOTE: This undoes all delegates previously applied to the Interpreter.
|
/// NOTE: This undoes all delegates previously applied to the Interpreter.
|
||||||
/// 3. kTfLiteError: Unexpected/runtime failure.
|
/// 3. kTfLiteApplicationError : Delegation failed to be applied due to the
|
||||||
|
/// incompatibility with the TfLite runtime, e.g., the model graph is already
|
||||||
|
/// immutable when applying the delegate. However, the interpreter could still
|
||||||
|
/// be invoked.
|
||||||
|
/// 4. kTfLiteError: Unexpected/runtime failure.
|
||||||
/// WARNING: This is an experimental API and subject to change.
|
/// WARNING: This is an experimental API and subject to change.
|
||||||
TfLiteStatus ModifyGraphWithDelegate(TfLiteDelegate* delegate);
|
TfLiteStatus ModifyGraphWithDelegate(TfLiteDelegate* delegate);
|
||||||
|
|
||||||
|
@ -49,6 +49,13 @@ class InterpreterTest : public ::testing::Test {
|
|||||||
protected:
|
protected:
|
||||||
TfLiteContext* GetInterpreterContext() { return interpreter_.context_; }
|
TfLiteContext* GetInterpreterContext() { return interpreter_.context_; }
|
||||||
|
|
||||||
|
std::vector<Interpreter::TfLiteDelegatePtr>*
|
||||||
|
mutable_lazy_delegate_providers() {
|
||||||
|
return &interpreter_.lazy_delegate_providers_;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HasDelegates() { return interpreter_.HasDelegates(); }
|
||||||
|
|
||||||
Interpreter interpreter_;
|
Interpreter interpreter_;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1782,6 +1789,63 @@ TEST_F(TestCustomAllocation, ResizeTensorsWithEnoughMemory) {
|
|||||||
VerifyInvoke();
|
VerifyInvoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tests related to lazy delegate providers that are primarily used for applying
|
||||||
|
// TfLite delegates by default.
|
||||||
|
class TestLazyDelegateProvider : public InterpreterTest {
|
||||||
|
protected:
|
||||||
|
struct DummyLazyDelegateProvider : public TfLiteDelegate {
|
||||||
|
explicit DummyLazyDelegateProvider(int64_t support_flags) {
|
||||||
|
data_ = static_cast<void*>(this);
|
||||||
|
flags = support_flags;
|
||||||
|
Prepare = [](TfLiteContext*, TfLiteDelegate* delegate) -> TfLiteStatus {
|
||||||
|
return kTfLiteOk;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void InitWithLazyDelegate(int64_t delegate_flags,
|
||||||
|
bool create_dyanmic_tensor = false) {
|
||||||
|
TfLiteRegistration reg = {nullptr, nullptr, nullptr, nullptr};
|
||||||
|
ASSERT_EQ(interpreter_.AddTensors(2), kTfLiteOk);
|
||||||
|
interpreter_.SetInputs({0});
|
||||||
|
interpreter_.SetOutputs({1});
|
||||||
|
interpreter_.AddNodeWithParameters({0}, {1}, nullptr, 0, nullptr, ®);
|
||||||
|
|
||||||
|
Interpreter::TfLiteDelegatePtr delegate(
|
||||||
|
new DummyLazyDelegateProvider(delegate_flags),
|
||||||
|
[](TfLiteDelegate* delegate) {
|
||||||
|
auto* dummy =
|
||||||
|
static_cast<DummyLazyDelegateProvider*>(delegate->data_);
|
||||||
|
delete dummy;
|
||||||
|
});
|
||||||
|
mutable_lazy_delegate_providers()->push_back(std::move(delegate));
|
||||||
|
|
||||||
|
if (create_dyanmic_tensor) {
|
||||||
|
// Mark the output as dynamic tensor.
|
||||||
|
interpreter_.tensor(1)->data.raw = nullptr;
|
||||||
|
interpreter_.tensor(1)->allocation_type = kTfLiteDynamic;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(TestLazyDelegateProvider, ApplicationSuccess) {
|
||||||
|
InitWithLazyDelegate(kTfLiteDelegateFlagsNone);
|
||||||
|
EXPECT_EQ(kTfLiteOk, interpreter_.AllocateTensors());
|
||||||
|
// We clear Interpreter::lazy_delegate_providers_ after they are tried out.
|
||||||
|
EXPECT_TRUE(mutable_lazy_delegate_providers()->empty());
|
||||||
|
EXPECT_TRUE(HasDelegates());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(TestLazyDelegateProvider, ApplicationSkipped) {
|
||||||
|
InitWithLazyDelegate(kTfLiteDelegateFlagsNone,
|
||||||
|
true /* create_dyanmic_tensor */);
|
||||||
|
EXPECT_EQ(kTfLiteOk, interpreter_.AllocateTensors());
|
||||||
|
EXPECT_TRUE(mutable_lazy_delegate_providers()->empty());
|
||||||
|
// As the delegate doesn't allow dynamic tensor, the delegate won't be applied
|
||||||
|
// and the interpreter doesn't have any delegate applied.
|
||||||
|
EXPECT_FALSE(HasDelegates());
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace tflite
|
} // namespace tflite
|
||||||
|
|
||||||
|
@ -46,8 +46,17 @@ extern "C" {
|
|||||||
|
|
||||||
typedef enum TfLiteStatus {
|
typedef enum TfLiteStatus {
|
||||||
kTfLiteOk = 0,
|
kTfLiteOk = 0,
|
||||||
|
|
||||||
|
// Generally referring to an error in the runtime (i.e. interpreter)
|
||||||
kTfLiteError = 1,
|
kTfLiteError = 1,
|
||||||
|
|
||||||
|
// Generally referring to an error from a TfLiteDelegate itself.
|
||||||
kTfLiteDelegateError = 2,
|
kTfLiteDelegateError = 2,
|
||||||
|
|
||||||
|
// Generally referring to an error in applying a delegate due to
|
||||||
|
// incompatibility between runtime and delegate, e.g., this error is returned
|
||||||
|
// when trying to apply a TfLite delegate onto a model graph that's already
|
||||||
|
// immutable.
|
||||||
kTfLiteApplicationError = 3
|
kTfLiteApplicationError = 3
|
||||||
} TfLiteStatus;
|
} TfLiteStatus;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user