Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactoring of function RNNForwardTrainingPackedTensors #2750

Draft
wants to merge 28 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
13da580
Added RNN_RELU and RNN_TANH forward training refactored functions
kikimych Jun 14, 2023
c3d8ab4
Added RNNForwardTrainingGRU method
kikimych Jul 25, 2023
263c278
Merge branch 'develop' of https://github.com/ROCmSoftwarePlatform/MIO…
kikimych Jul 26, 2023
f247d7d
Added RNN Backward Data refactor
kikimych Aug 31, 2023
7bb3be5
Added bidirection support for RNNBackwardData
kikimych Sep 15, 2023
3c889de
Unified relu and gru offset interfaces
kikimych Sep 15, 2023
cf96713
Lstm minor refactoring
kikimych Sep 27, 2023
c2bfee2
Lstm minor refactoring
kikimych Sep 27, 2023
cdce2f5
Reverted back RNNForwardTraining_MS method
kikimych Oct 27, 2023
b114b9b
Merge branch 'rnn_training_forward_refactor' of https://github.com/ki…
kikimych Oct 27, 2023
12e4a43
Rnn relu bidirectional support draft
kikimych Nov 3, 2023
d2a166b
Refactored Relu forward
kikimych Nov 9, 2023
f0d1d0a
RNNBackwardDataPackedTensorsRelu refactor
kikimych Nov 11, 2023
e8de935
Simplified RNNBackwardDataPackedTensorsRelu
kikimych Nov 15, 2023
ee524b6
Relu forward minor refactor
kikimych Nov 15, 2023
5cc2e09
Removed hidden_size from offset helpers
kikimych Nov 17, 2023
7ca8c32
Enabled RNNForwardTrainingTanhRelu by default
kikimych Nov 17, 2023
25dc932
Merge branch 'develop' into rnn_training_forward_refactor
kikimych Nov 17, 2023
26d7373
Extracted GRU code from RNNForwardTrainingPackedTensors to RNNForward…
kikimych Nov 20, 2023
96883eb
temporary working commit
kikimych Nov 24, 2023
dec2542
Merge branch 'develop' into gru_refactor_bidirectional
kikimych Dec 11, 2023
aca2181
working draft
kikimych Dec 22, 2023
6b687de
Small fixes
kikimych Feb 6, 2024
e39d149
Added RnnSkip mode support
kikimych Feb 10, 2024
17aa218
Merge branch 'develop' into gru_refactor_bidirectional
kikimych Feb 12, 2024
2a15377
Merge branch 'develop' into gru_refactor_bidirectional
kikimych Feb 16, 2024
ee24469
Added reserveBuffer clearing at the start of RNNForwardTrainingGRU
kikimych Feb 16, 2024
db5e199
quick fix
kikimych Feb 23, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions src/include/miopen/rnn.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,21 @@ struct RNNDescriptor : miopenRNNDescriptor
Data_t reserveSpace,
size_t reserveSpaceSize) const;

void RNNForwardTrainingGRU(Handle& handle,
std::vector<int>& seq_array,
const TensorDescriptor& xDesc,
ConstData_t x,
const TensorDescriptor& hxDesc,
ConstData_t hx,
const TensorDescriptor& wDesc,
ConstData_t w,
const TensorDescriptor& yDesc,
Data_t y,
Data_t hy,
const TensorDescriptor& hyDesc,
Data_t reserveSpace,
size_t reserveSpaceSize) const;

void RNNForwardInference(Handle& handle,
int seqLen,
c_array_view<const miopenTensorDescriptor_t> xDesc,
Expand Down
205 changes: 205 additions & 0 deletions src/include/miopen/rnn_util.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,60 @@

namespace miopen {

enum rnn_direction
{
Forward = 0,
Backward = 1
};

enum class RnnDirection
{
Forward = 0,
Backward = 1
};

struct RnnBatches
{
int at(int time, RnnDirection direction) const { return batches.at(cur_time(time, direction)); }

int next(int time, RnnDirection direction) const
{
return batches.at(next_time(time, direction));
}

int prev(int time, RnnDirection direction) const
{
return batches.at(prev_time(time, direction));
}

void push_back(int batch) { batches.push_back(batch); }

RnnBatches(std::vector<int>& input) : batches(input){};
RnnBatches(){};

int back() const { return batches.back(); }

private:
int cur_time(int time, RnnDirection direction) const
{
return direction == RnnDirection::Forward ? time : batches.size() - time - 1;
}

int next_time(int time, RnnDirection direction) const
{
return direction == RnnDirection::Forward ? cur_time(time, direction) + 1
: cur_time(time, direction) - 1;
}

int prev_time(int time, RnnDirection direction) const
{
return direction == RnnDirection::Forward ? cur_time(time, direction) - 1
: cur_time(time, direction) + 1;
}

std::vector<int> batches;
};

#if MIOPEN_BACKEND_HIP
inline void RNNProfilingBegin(const miopen::Handle& handle,
miopen::HipEventPtr& start,
Expand Down Expand Up @@ -121,6 +175,157 @@ void LSTMBackwardHiddenStateUpdate(const Handle& handle,
std::size_t dhidden_offset,
std::size_t f_offset_pre);

struct GruWeightOffsets
{
GruWeightOffsets(int input_vector_sz, int hidden_vec_sz, int layers_cnt, int bias_cnt, int bi)
: weight_stride(matrixes::Count * hidden_vec_sz),
bi_stride(matrixes::Count * hidden_vec_sz * bi),
in_vec_sz(input_vector_sz),
h_vec_sz(hidden_vec_sz),
num_layers(layers_cnt),
bi_scale(bi),
bias_count(bias_cnt)
{
}

int input_offset(int layer) const
{
return layer == 0 ? 0
: static_cast<size_t>(in_vec_sz + h_vec_sz +
(h_vec_sz + h_vec_sz * bi_scale) * (layer - 1)) *
bi_stride;
}

int hidden_offset(int layer, RnnDirection direction) const
{
return static_cast<size_t>((in_vec_sz + (h_vec_sz + h_vec_sz * bi_scale) * (layer)) *
bi_stride) +
static_cast<size_t>(direction) * weight_stride * h_vec_sz;
}

size_t bias_stride() const { return (size_t)matrixes::Count * h_vec_sz * bi_scale; }

int bias_off() const
{
return (in_vec_sz + h_vec_sz + (bi_scale * h_vec_sz + h_vec_sz) * (num_layers - 1)) *
bi_stride;
}

int
bias_off(int layer_id, int bias_id = 0, RnnDirection direction = RnnDirection::Forward) const
{
return bias_off() + layer_id * bias_count * bi_stride + bias_id * bias_stride() +
static_cast<size_t>(direction) * h_vec_sz;
}
int weight_stride;
int bi_stride;

private:
const int in_vec_sz, h_vec_sz;
const int num_layers;
[[maybe_unused]] const int bi_scale = 1;
const int bias_count = 0;
enum matrixes
{
Z = 0,
R = 1,
C = 2,
Count = 3
};
};

struct GRUOffsets
{
public:
GRUOffsets(int h_vec_size, int layers_cnt, int total_batch_size, int bidirec_scale)
: hidden_size(h_vec_size),
save_point_size(h_vec_size * bidirec_scale),
batches_per_layer(total_batch_size),
num_layers(layers_cnt)
{
}

size_t layer_offset(int layer_id) const { return layer_id * layer_stride(); }

size_t layer_stride() const { return gemm_write_stride() * batches_per_layer; }

int gemm_write_size() const { return save_point_size; }

size_t gemm_write_stride() const { return (size_t)save_point::Count * gemm_write_size(); }

size_t gemm_write_offset(int layer_id, int batch_num, RnnDirection direction) const
{
return layer_offset(layer_id) + batch_num * gemm_write_stride() +
static_cast<size_t>(direction) * (size_t)save_point::Ht * hidden_size;
}

size_t ht_offset(int layer, int batch_num, RnnDirection direction) const
{
return gemm_write_offset(layer, batch_num, RnnDirection::Forward) + ht_offset() +
static_cast<size_t>(direction) * hidden_size;
}
size_t ht_act_offset(int layer, int batch_num, RnnDirection direction) const
{
return ht_offset(layer, batch_num, direction) + activated_offset();
}

private:
const int hidden_size;
const int save_point_size;

public:
const int batches_per_layer;

int r_offset(int layer, int batch_num, RnnDirection direction) const
{
return gemm_write_offset(layer, batch_num, direction) + r_offset();
}

int r_act_offset(int layer, int batch_num, RnnDirection direction) const
{
return r_offset(layer, batch_num, direction) + activated_offset();
}

int z_act_offset(int layer, int batch_num, RnnDirection direction) const
{
return z_offset(layer, batch_num, direction) + activated_offset();
}

int z_offset(int layer, int batch_num, RnnDirection direction) const
{
return gemm_write_offset(layer, batch_num, direction) + z_offset();
}

size_t c_offset(int layer, int batch_num, RnnDirection direction) const
{
return gemm_write_offset(layer, batch_num, direction) + c_offset();
}

size_t c_act_offset(int layer, int batch_num, RnnDirection direction) const
{
return c_offset(layer, batch_num, direction) + activated_offset();
}

private:
int activated_offset() const { return layer_stride() * num_layers; }
size_t network_stride() const { return layer_stride() * num_layers; }
int c_offset() const { return save_point::C * hidden_size; }
int z_offset() const { return save_point::Z * hidden_size; }
int r_offset() const { return save_point::R * hidden_size; }
size_t ht_offset() const { return (size_t)save_point::Ht * gemm_write_size(); }

int num_layers;

enum save_point
{
Z = 0,
R = 1,
C = 2,
Ht = 3,
Count = 4
};
};

struct RNNTensorPaddingConverter
{
static void ConvertTensorData(const Handle& handle,
Expand Down
Loading