5#define _GLIBCXX_USE_CXX11_ABI 0
9#include <torch/torch.h>
10#include <torch/script.h>
11#include <torchscatter/scatter.h>
12#include <torchcluster/cluster.h>
13#include <torch/csrc/jit/passes/tensorexpr_fuser.h>
14#include <c10/cuda/CUDACachingAllocator.h>
29 std::ostringstream ss;
30 std::cout <<
"cuda version " << cluster::cuda_version() << std::endl;
31 std::cout <<
"cuda version " << scatter::cuda_version() << std::endl;
40 at::Tensor particles_position_tensor =
42 {wheel.num_particles, 3}, torch::kFloat32);
45 at::Tensor particles_velocity_tensor =
47 {wheel.num_particles, 3}, torch::kFloat32);
50 at::Tensor wheel_positions_tensor =
52 {3}, torch::kFloat32);
54 at::Tensor wheel_oritentation_tensor =
56 {4}, torch::kFloat32);
59 at::Tensor wheel_linear_velocity_tensor =
61 {3}, torch::kFloat32);
64 at::Tensor wheel_angular_velocity_tensor =
66 {3}, torch::kFloat32);
68 std::vector<torch::jit::IValue> Tuple
69 {particles_position_tensor, particles_velocity_tensor, wheel_positions_tensor,
70 wheel_oritentation_tensor, wheel_linear_velocity_tensor, wheel_angular_velocity_tensor};
71 return torch::ivalue::Tuple::create(Tuple);
75 const at::Tensor &particle_forces,
76 const at::Tensor &wheel_forces ) {
79 const float* wheel_forces_data = wheel_forces.data_ptr<
float>();
88 const float* particle_forces_data = particle_forces.data_ptr<
float>();
90 int num_dimensions = 3;
92 int num_particles = particle_forces.sizes()[0];
96 for (
int i = 0; i < num_particles; i++) {
98 particle_forces_data[i*num_dimensions + 0]);
100 particle_forces_data[i*num_dimensions + 1]);
102 particle_forces_data[i*num_dimensions + 2]);
108 const at::Tensor &particle_forces,
109 const at::Tensor &wheel_forces) {
111 const float* wheel_forces_data = wheel_forces.data_ptr<
float>();
117 const float* particle_forces_data = particle_forces.data_ptr<
float>();
118 int num_dimensions = 3;
119 int num_particles = particle_forces.sizes()[0];
121 for (
int i = 0; i < num_particles; i++) {
123 particle_forces_data[i*num_dimensions + 0]);
125 particle_forces_data[i*num_dimensions + 1]);
127 particle_forces_data[i*num_dimensions + 2]);
154 at::Tensor particles_position_tensor =
156 {wheel.num_particles, 3}, torch::kFloat32);
158 at::Tensor particles_velocity_tensor =
160 {wheel.num_particles, 3}, torch::kFloat32);
162 at::Tensor wheel_positions_tensor =
164 {3}, torch::kFloat32);
166 at::Tensor wheel_oritentation_tensor =
168 {4}, torch::kFloat32);
170 at::Tensor wheel_linear_velocity_tensor =
172 {3}, torch::kFloat32);
174 at::Tensor wheel_angular_velocity_tensor =
176 {3}, torch::kFloat32);
178 std::vector<torch::jit::IValue> Tuple
179 {particles_position_tensor.cuda(), particles_velocity_tensor.cuda(), wheel_positions_tensor.cuda(),
181 wheel_oritentation_tensor.cuda(), wheel_linear_velocity_tensor.cuda(), wheel_angular_velocity_tensor.cuda(),
184 return torch::ivalue::Tuple::create(Tuple);
187 NeuralModel::NeuralModel() {
189 Model = std::make_unique<NeuralModelImpl>();
191 void NeuralModel::LoadModel(
char* filename,
int device) {
193 torch::jit::setTensorExprFuserEnabled(
false);
195 std::string filename_str(filename);
197 std::cout <<
"loading " << filename_str << std::endl;
200 Model->module = torch::jit::load(filename_str);
202 std::string cuda_str =
"cuda:" + std::to_string(device);
206 }
catch (
const c10::Error& e) {
208 std::cout <<
"Error loading model: " << e.msg() << std::endl;
211 std::cout <<
"loaded " << filename_str << std::endl;
214 void NeuralModel::SetInputs(
Inputs input) {
219 void NeuralModel::Forward() {
221 std::vector<torch::jit::IValue> TorchInputs;
228 auto drv_inputs = torch::tensor(
229 {_input.steering, _input.throttle, _input.braking}, torch::kFloat32);
230 TorchInputs.push_back(drv_inputs);
232 if (_input.terrain_type >= 0) {
233 TorchInputs.push_back(_input.terrain_type);
236 TorchInputs.push_back(_input.verbose);
238 torch::jit::IValue Output;
241 Output = Model->module.forward(TorchInputs);
242 }
catch (
const c10::Error& e) {
244 std::cout <<
"Error running model: " << e.msg() << std::endl;
247 std::vector<torch::jit::IValue> Tensors = Output.toTuple()->elements();
250 Tensors[0].toTensor().cpu(), Tensors[4].toTensor().cpu() );
252 Tensors[1].toTensor().cpu(), Tensors[5].toTensor().cpu() );
254 Tensors[2].toTensor().cpu(), Tensors[6].toTensor().cpu() );
256 Tensors[3].toTensor().cpu(), Tensors[7].toTensor().cpu() );
259 void NeuralModel::ForwardDynamic() {
262 std::vector<torch::jit::IValue> TorchInputs;
267 auto drv_inputs = torch::tensor(
269 {_input.steering, _input.throttle, _input.braking}, torch::kFloat32);
271 TorchInputs.push_back(drv_inputs);
272 if (_input.terrain_type >= 0) {
273 TorchInputs.push_back(_input.terrain_type);
275 TorchInputs.push_back(_input.verbose);
277 torch::jit::IValue Output;
280 Output = Model->module.forward(TorchInputs);
281 }
catch (
const c10::Error& e) {
283 std::cout <<
"Error running model: " << e.msg() << std::endl;
286 std::vector<torch::jit::IValue> Tensors = Output.toTuple()->elements();
289 Tensors[0].toTensor().cpu(), Tensors[4].toTensor().cpu());
292 Tensors[1].toTensor().cpu(), Tensors[5].toTensor().cpu());
295 Tensors[2].toTensor().cpu(), Tensors[6].toTensor().cpu());
298 Tensors[3].toTensor().cpu(), Tensors[7].toTensor().cpu());
302 c10::cuda::CUDACachingAllocator::emptyCache();
306 void NeuralModel::ForwardCUDATensors()
309 std::vector<torch::jit::IValue> TorchInputs;
311 TorchInputs.push_back(Model->GetWheelTensorInputsCUDA(_input.wheel0, 0));
312 TorchInputs.push_back(Model->GetWheelTensorInputsCUDA(_input.wheel1, 1));
313 TorchInputs.push_back(Model->GetWheelTensorInputsCUDA(_input.wheel2, 2));
314 TorchInputs.push_back(Model->GetWheelTensorInputsCUDA(_input.wheel3, 3));
316 auto drv_inputs = torch::tensor(
317 {_input.steering, _input.throttle, _input.braking}, torch::kFloat32);
318 TorchInputs.push_back(drv_inputs.cuda());
320 if (_input.terrain_type >= 0) {
322 TorchInputs.push_back(_input.terrain_type);
324 TorchInputs.push_back(_input.verbose);
326 torch::jit::IValue Output;
329 Output = Model->module.forward(TorchInputs);
330 }
catch (
const c10::Error& e) {
331 std::cout <<
"Error running model: " << e.msg() << std::endl;
334 std::vector<torch::jit::IValue> Tensors = Output.toTuple()->elements();
337 Tensors[0].toTensor().cpu(), Tensors[4].toTensor().cpu() );
339 Tensors[1].toTensor().cpu(), Tensors[5].toTensor().cpu() );
341 Tensors[2].toTensor().cpu(), Tensors[6].toTensor().cpu() );
343 Tensors[3].toTensor().cpu(), Tensors[7].toTensor().cpu() );
350 NeuralModel::~NeuralModel() {}
WheelOutput GetWheelTensorOutputDynamic(const at::Tensor &particle_forces, const at::Tensor &wheel_forces)
WheelOutput GetWheelTensorOutput(const at::Tensor &particle_forces, const at::Tensor &wheel_forces)
torch::jit::IValue GetWheelTensorInputs(WheelInput &wheel)
void add_mark(const std::string &text)
torch::jit::script::Module module
std::vector< at::Tensor > particles_velocity_tensors
std::vector< at::Tensor > particles_position_tensors
torch::jit::IValue GetWheelTensorInputsCUDA(WheelInput &wheel, int wheel_idx)
std::vector< float > _particle_forces