-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_kml.cu
More file actions
156 lines (114 loc) · 4.75 KB
/
Copy pathtest_kml.cu
File metadata and controls
156 lines (114 loc) · 4.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include <xtensor/xarray.hpp>
#include <tiny-cuda-nn/common.h>
#include <tiny-cuda-nn/config.h>
#include <nlohmann/json.hpp>
// #include "src/defs.h"
#include "src/common.h"
#include "src/data_generator.h"
using json = nlohmann::json;
using namespace tcnn;
const uint32_t batch_size = 512; // 1 << 16;
const uint32_t n_epochs = 150;
const uint32_t n_input_dims_to_encode = 9; // (timesteps, cols, timeframes)
const uint32_t n_input_dims_to_pass_through = 2; // TODO 2?
//const uint32_t n_input_dims = 3; // TODO pass through dims?
const uint32_t n_row_size = 127458; // TODO ? 127458=73*291*6
const uint32_t n_output_dims = 1;
bool generate_training_batch(DataGenerator& data_gen, GPUMatrix<float>& inputs, GPUMatrix<float>& outputs)
{
xt::xarray<float> a_inputs;
xt::xarray<float> a_outputs;
if (!data_gen.next(a_inputs, a_outputs))
return false; // no more data
//std::cout << "Inputs shape: " << a_inputs.shape() << std::endl;
//std::cout << "Outputs shape: " << a_outputs.shape() << std::endl;
//std::cout << "sizeof(a_inputs): " << a_inputs.size() * sizeof(float) << std::endl;
//std::cout << "sizeof(a_outputs): " << a_outputs.size() * sizeof(float) << std::endl;
//std::cout << "sizeof(inputs): " << inputs.n_bytes() << std::endl;
//std::cout << "sizeof(outputs): " << outputs.n_bytes() << std::endl;
CUDA_CHECK_THROW(cudaMemcpy(inputs.data(), a_inputs.data(), a_inputs.size() * sizeof(float), cudaMemcpyHostToDevice));
CUDA_CHECK_THROW(cudaMemcpy(outputs.data(), a_outputs.data(), a_outputs.size() * sizeof(float), cudaMemcpyHostToDevice));
//std::cout << "Copied..." << std::endl;
return true;
}
bool generate_pred_inputs(DataGenerator& data_gen, GPUMatrix<float>& inputs)
{
// data_gen.reset(); // TODO fix reset
xt::xarray<float> a_inputs;
xt::xarray<float> a_outputs;
if (!data_gen.next(a_inputs, a_outputs))
return false; // no more data
std::cout << "Prediction inputs shape: " << a_inputs.shape() << std::endl;
//std::cout << "sizeof(a_inputs): " << a_inputs.size() * sizeof(float) << std::endl;
//std::cout << "sizeof(inputs): " << inputs.n_bytes() << std::endl;
CUDA_CHECK_THROW(cudaMemcpy(inputs.data(), a_inputs.data(), a_inputs.size() * sizeof(float), cudaMemcpyHostToDevice));
std::cout << "Prediction copied..." << std::endl;
return true;
}
int main(int argc, char* argv[])
{
json config = {
{"loss", {
{"otype", "MAPE"}
}},
{"optimizer", {
{"otype", "Adam"},
{"learning_rate", 1e-3},
}},
{"encoding", {
{"otype", "OneBlob"},
{"n_bins", 32},
}},
{"network", {
{"otype", "FullyFusedMLP"},
{"n_neurons", 128},
{"n_hidden_layers", 5},
{"activation", "ReLU"},
{"output_activation", "Sigmoid"},
}},
};
auto tpl = create_from_config(n_input_dims_to_encode, n_input_dims_to_pass_through, n_output_dims, config);
auto losses = std::get<0>(tpl);
auto optimizer = std::get<1>(tpl);
auto network = std::get<2>(tpl);
auto trainer = std::get<3>(tpl);
// Prepare data generator
// Train the model
GPUMatrix<float> training_batch_inputs(n_row_size, batch_size); // TODO n_input_dims?
GPUMatrix<float> training_batch_targets(n_output_dims, batch_size); // TODO n_output_dims?
training_batch_inputs.initialize_constant(0);
training_batch_targets.initialize_constant(0);
/*cudaMemset(&training_batch_inputs, 0, sizeof training_batch_inputs);
cudaMemset(&training_batch_targets, 0, sizeof training_batch_targets);*/
//DataGenerator data_gen(batch_size, "pyfiles", "TRAIN.*.merged.npy");
//generate_training_batch(data_gen, training_batch_inputs, training_batch_targets);
//return 0;
// create a cuda stream
cudaStream_t stream1;
cudaStreamCreate(&stream1);
int epoch = 0;
for (int i = 0; i < n_epochs; ++i) {
std::cout << "load file..." << std::endl;
DataGenerator data_gen(batch_size, "pyfiles", "TRAIN.*.merged.npy");
std::cout << "loaded file." << std::endl;
while (generate_training_batch(data_gen, training_batch_inputs, training_batch_targets))
{
float loss;
trainer->training_step(stream1, training_batch_inputs, training_batch_targets, &loss);
std::cout << "epoch=" << epoch << " iteration=" << i << " loss=" << loss << std::endl;
}
epoch++;
}
// wait until all cuda operations are complete
cudaStreamSynchronize(stream1);
DataGenerator data_gen_eval(batch_size, "pyfiles", "EVAL.*.merged.npy");
// Use the model
GPUMatrix<float> inference_inputs(n_row_size, batch_size);
training_batch_inputs.initialize_constant(0);
generate_pred_inputs(data_gen_eval, inference_inputs);
GPUMatrix<float> inference_outputs(n_output_dims, batch_size);
network->inference(stream1, inference_inputs, inference_outputs);
// wait until all cuda operations are complete
cudaStreamSynchronize(stream1);
//std::cout << "inference_outputs[0]: " << *inference_outputs.data() << std::endl;
}