#include #include #include #include #include #include #include #include #include #include #include "softmax.hpp" auto read_cifar10_images(const std::string& full_path) { std::ifstream file(full_path, std::ios::binary); const size_t nimages = 10; const size_t nbytes_per_image = 3072; std::vector raw_data(nimages * (nbytes_per_image + 1)); std::vector labels(nimages); std::vector data(nimages * nbytes_per_image); if(file.is_open()) { file.read(reinterpret_cast(raw_data.data()), (nbytes_per_image + 1) * nimages * sizeof(uint8_t)); uint8_t* pimage = raw_data.data(); for(size_t i = 0; i < nimages; i++, pimage += nbytes_per_image) { labels[i] = *pimage++; for(size_t j = 0; j < nbytes_per_image; j++) { float v = *(pimage + j) / 255.0f; data[i * nbytes_per_image + j] = v; } } return std::make_pair(labels, data); } else { throw std::runtime_error("Cannot open file `" + full_path + "`!"); } } int main(int argc, char const* argv[]) { if(argc < 4) { throw std::runtime_error("Usage: cifar10 [gpu | cpu] "); } std::string gpu_cpu = argv[1]; std::string file = argv[2]; std::string datafile = argv[3]; auto prog = migraph::parse_onnx(file); std::cout << prog << std::endl; auto imageset = read_cifar10_images(datafile); if(gpu_cpu == "gpu") { // GPU target prog.compile(migraph::gpu::target{}); migraph::program::parameter_map m; auto s = migraph::shape{migraph::shape::float_type, {1, 3, 32, 32}}; for(auto&& x : prog.get_parameter_shapes()) { m[x.first] = migraph::gpu::to_gpu(migraph::generate_argument(x.second)); } auto labels = imageset.first; auto input = imageset.second; auto ptr = input.data(); for(int i = 0; i < 10; i++) { std::cout << "label: " << static_cast(labels[i]) << " ----> "; m["0"] = migraph::gpu::to_gpu(migraph::argument{s, &ptr[3072 * i]}); auto result = migraph::gpu::from_gpu(prog.eval(m)); std::vector logits; result.visit([&](auto output) { logits.assign(output.begin(), output.end()); }); std::vector probs = softmax(logits); for(auto x : probs) std::cout << x << " "; std::cout << std::endl << std::endl; } } else { // CPU target prog.compile(migraph::cpu::target{}); auto s = migraph::shape{migraph::shape::float_type, {1, 3, 32, 32}}; auto labels = imageset.first; auto input = imageset.second; auto ptr = input.data(); for(int i = 0; i < 10; i++) { std::cout << "label: " << static_cast(labels[i]) << " ----> "; auto input3 = migraph::argument{s, &ptr[3072 * i]}; auto result = prog.eval({{"0", input3}}); std::vector logits; result.visit([&](auto output) { logits.assign(output.begin(), output.end()); }); std::vector probs = softmax(logits); for(auto x : probs) std::cout << x << " "; std::cout << std::endl; } } }