10 #include "../Cifar10Database.hpp" 11 #include "../InferenceTest.hpp" 12 #include "../InferenceModel.hpp" 14 #include <cxxopts/cxxopts.hpp> 26 int main(
int argc,
char* argv[])
39 std::vector<armnn::BackendId> computeDevice;
43 const std::string backendsMessage =
"Which device to run layers on by default. Possible choices: " 46 cxxopts::Options in_options(
"MultipleNetworksCifar10",
47 "Run multiple networks inference tests using Cifar-10 data.");
52 in_options.add_options()
53 (
"h,help",
"Display help messages")
54 (
"m,model-dir",
"Path to directory containing the Cifar10 model file",
55 cxxopts::value<std::string>(modelDir))
56 (
"c,compute", backendsMessage.c_str(),
57 cxxopts::value<std::vector<armnn::BackendId>>(computeDevice)->default_value(
"CpuAcc,CpuRef"))
58 (
"d,data-dir",
"Path to directory containing the Cifar10 test data",
59 cxxopts::value<std::string>(dataDir));
61 auto result = in_options.parse(argc, argv);
63 if(result.count(
"help") > 0)
65 std::cout << in_options.help() << std::endl;
70 std::string mandatorySingleParameters[] = {
"model-dir",
"data-dir"};
71 for (
auto param : mandatorySingleParameters)
73 if(result.count(param) > 0)
75 std::string dir = result[param].as<std::string>();
81 std::cerr <<
"Parameter \'--" << param <<
"\' is required but missing." << std::endl;
86 catch (
const cxxopts::OptionException& e)
88 std::cerr << e.what() << std::endl << in_options.help() << std::endl;
92 fs::path modelPath = fs::path(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 = mapbox::util::get<std::vector<float>>(outputs[0]);
204 for (
unsigned int k = 1; k < networksCount; ++k)
206 std::vector<float> outputK = mapbox::util::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;
static IRuntimePtr Create(const CreationOptions &options)
void ConfigureLogging(bool printToStandardOutput, bool printToDebugOutput, LogSeverity severity)
Configures the logging behaviour of the ARMNN library.
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
virtual const char * what() const noexcept override
#define ARMNN_LOG(severity)
BackendRegistry & BackendRegistryInstance()
std::string GetBackendIdsAsString() const
armnn::InputTensors MakeInputTensors(const std::vector< armnn::BindingPointInfo > &inputBindings, const std::vector< TContainer > &inputDataContainers)
IOptimizedNetworkPtr Optimize(const INetwork &network, const std::vector< BackendId > &backendPreferences, const IDeviceSpec &deviceSpec, const OptimizerOptions &options=OptimizerOptions(), Optional< std::vector< std::string > &> messages=EmptyOptional())
Create an optimized version of the network.
static ICaffeParserPtr Create()
int main(int argc, char *argv[])
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
std::unique_ptr< ICaffeParser, void(*)(ICaffeParser *parser)> ICaffeParserPtr
armnn::OutputTensors MakeOutputTensors(const std::vector< armnn::BindingPointInfo > &outputBindings, std::vector< TContainer > &outputDataContainers)
Base class for all ArmNN exceptions so that users can filter to just those.
bool ValidateDirectory(std::string &dir)
std::unique_ptr< TTestCaseData > GetTestCaseData(unsigned int testCaseId)
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr