Сейчас это делается вывод по одному запросу за раз, я думаю, что внутри libtorch есть некоторая оптимизация процессора, такая как SIMD, которая может сделать пакетный вывод более оптимальным
здесь простой код C++, который я тестирую с игрушечной моделью (модель, которая имитирует евклидово расстояние) с эталоном для каждого номера партии
Код: Выделить всё
#include // One-stop header.
#include
#include
#include
#include // Required for get_num_threads and set_num_threads
#include
std::vector batch_infer_distance(torch::jit::Module& model, const std::vector& point_pairs) {
int batch_size = point_pairs.size();
torch::Tensor input_tensor = torch::empty({batch_size, 4});
for (int i = 0; i < batch_size; ++i) {
input_tensor[i] = torch::tensor(point_pairs[i]);
}
torch::Tensor output = model.forward({input_tensor}).toTensor();
std::vector distances(output.data_ptr(), output.data_ptr() + output.numel());
return distances;
}
std::vector generate_random_points(int batch_size) {
std::vector point_pairs;
point_pairs.reserve(batch_size);
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution dis(0.0, 100.0); // Uniform distribution between 0 and 100
for (int i = 0; i < batch_size; ++i) {
float x1 = dis(gen);
float y1 = dis(gen);
float x2 = dis(gen);
float y2 = dis(gen);
point_pairs.push_back({x1, y1, x2, y2});
}
return point_pairs;
}
int main(int argc, const char* argv[]) {
int num_threads = at::get_num_threads();
// Print the number of threads
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79105641/how-do-you-optimize-inference-batch-size-in-c-pytorch-libtorch[/url]
Мобильная версия