14 #include "../Cifar10Database.hpp" 15 #include "../InferenceTest.hpp" 16 #include "../InferenceModel.hpp" 22 int main(
int argc,
char* argv[])
34 namespace po = boost::program_options;
36 std::vector<armnn::BackendId> computeDevice;
41 const std::string backendsMessage =
"Which device to run layers on by default. Possible choices: " 44 po::options_description desc(
"Options");
49 (
"help",
"Display help messages")
50 (
"model-dir,m", po::value<std::string>(&modelDir)->required(),
51 "Path to directory containing the Cifar10 model file")
52 (
"compute,c", po::value<std::vector<armnn::BackendId>>(&computeDevice)->default_value(defaultBackends),
53 backendsMessage.c_str())
54 (
"data-dir,d", po::value<std::string>(&dataDir)->required(),
55 "Path to directory containing the Cifar10 test data");
57 catch (
const std::exception& e)
62 BOOST_ASSERT_MSG(
false,
"Caught unexpected exception");
63 std::cerr <<
"Fatal internal error: " << e.what() << std::endl;
71 po::store(po::parse_command_line(argc, argv, desc), vm);
75 std::cout << desc << std::endl;
83 std::cerr << e.what() << std::endl << std::endl;
84 std::cerr << desc << std::endl;
92 string modelPath = modelDir +
"cifar10_full_iter_60000.caffemodel";
100 std::string invalidBackends;
103 ARMNN_LOG(fatal) <<
"The list of preferred devices contains invalid backend IDs: " 113 const std::pair<armnn::LayerBindingId, armnn::TensorInfo>& in,
114 const std::pair<armnn::LayerBindingId, armnn::TensorInfo>& out)
116 , m_InputBindingInfo(in)
117 , m_OutputBindingInfo(out)
121 std::pair<armnn::LayerBindingId, armnn::TensorInfo> m_InputBindingInfo;
122 std::pair<armnn::LayerBindingId, armnn::TensorInfo> m_OutputBindingInfo;
124 std::vector<Net> networks;
128 const int networksCount = 4;
129 for (
int i = 0; i < networksCount; ++i)
132 armnn::INetworkPtr network = parser->CreateNetworkFromBinaryFile(modelPath.c_str(), {}, {
"prob" });
138 optimizedNet =
armnn::Optimize(*network, computeDevice, runtime->GetDeviceSpec());
142 std::stringstream message;
143 message <<
"armnn::Exception ("<<e.
what()<<
") caught from optimize.";
150 status = runtime->LoadNetwork(networkId, std::move(optimizedNet));
153 ARMNN_LOG(fatal) <<
"armnn::IRuntime: Failed to load network";
157 networks.emplace_back(networkId,
158 parser->GetNetworkInputBindingInfo(
"data"),
159 parser->GetNetworkOutputBindingInfo(
"prob"));
169 for (
unsigned int i = 0; i < 3; ++i)
172 std::unique_ptr<Cifar10Database::TTestCaseData> testCaseData = cifar10.
GetTestCaseData(i);
175 std::vector<TContainer> outputs;
176 outputs.reserve(networksCount);
178 for (
unsigned int j = 0; j < networksCount; ++j)
180 outputs.push_back(std::vector<float>(10));
183 for (
unsigned int k = 0; k < networksCount; ++k)
185 std::vector<armnn::BindingPointInfo> inputBindings = { networks[k].m_InputBindingInfo };
186 std::vector<armnn::BindingPointInfo> outputBindings = { networks[k].m_OutputBindingInfo };
188 std::vector<TContainer> inputDataContainers = { testCaseData->m_InputImage };
189 std::vector<TContainer> outputDataContainers = { outputs[k] };
191 status = runtime->EnqueueWorkload(networks[k].m_Network,
196 ARMNN_LOG(fatal) <<
"armnn::IRuntime: Failed to enqueue workload";
202 std::vector<float> output0 = boost::get<std::vector<float>>(outputs[0]);
204 for (
unsigned int k = 1; k < networksCount; ++k)
206 std::vector<float> outputK = boost::get<std::vector<float>>(outputs[k]);
208 if (!std::equal(output0.begin(), output0.end(), outputK.begin(), outputK.end()))
210 ARMNN_LOG(error) <<
"Multiple networks inference failed!";
216 ARMNN_LOG(info) <<
"Multiple networks inference ran successfully!";
224 std::cerr <<
"Armnn Error: " << e.
what() << std::endl;
227 catch (
const std::exception& e)
230 std::cerr <<
"WARNING: MultipleNetworksCifar10: An error has occurred when running the " 231 "multiple networks inference tests: " << e.what() << std::endl;
armnn::OutputTensors MakeOutputTensors(const std::vector< armnn::BindingPointInfo > &outputBindings, std::vector< TContainer > &outputDataContainers)
std::string GetBackendIdsAsString() const
IOptimizedNetworkPtr Optimize(const INetwork &network, const std::vector< BackendId > &backendPreferences, const IDeviceSpec &deviceSpec, const OptimizerOptions &options=OptimizerOptions(), Optional< std::vector< std::string > &> messages=EmptyOptional())
void ConfigureLogging(bool printToStandardOutput, bool printToDebugOutput, LogSeverity severity)
std::unique_ptr< TTestCaseData > GetTestCaseData(unsigned int testCaseId)
std::unique_ptr< ICaffeParser, void(*)(ICaffeParser *parser)> ICaffeParserPtr
armnn::InputTensors MakeInputTensors(const std::vector< armnn::BindingPointInfo > &inputBindings, const std::vector< TContainer > &inputDataContainers)
static ICaffeParserPtr Create()
#define ARMNN_LOG(severity)
virtual const char * what() const noexcept override
int main(int argc, char *argv[])
BackendRegistry & BackendRegistryInstance()
Base class for all ArmNN exceptions so that users can filter to just those.
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
CPU Execution: Reference C++ kernels.
static IRuntimePtr Create(const CreationOptions &options)
CPU Execution: NEON: ArmCompute.
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
armnn::Runtime::CreationOptions::ExternalProfilingOptions options
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
std::vector< armnn::BackendId > defaultBackends
bool ValidateDirectory(std::string &dir)