|
|
|
@ -23,6 +23,13 @@ namespace {
|
|
|
|
|
constexpr size_t kSparseApplyFtrlInputSize = 5;
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
void SparseApplyFtrlCPUKernel::InitInputOutputSize(const CNodePtr &kernel_node) {
|
|
|
|
|
CPUKernel::InitInputOutputSize(kernel_node);
|
|
|
|
|
MS_EXCEPTION_IF_NULL(kernel_node);
|
|
|
|
|
workspace_size_list_.emplace_back(indices_size_ * var_outer_dim_size_ * sizeof(float));
|
|
|
|
|
workspace_size_list_.emplace_back(indices_size_ * sizeof(int));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SparseApplyFtrlCPUKernel::InitKernel(const CNodePtr &kernel_node) {
|
|
|
|
|
MS_EXCEPTION_IF_NULL(kernel_node);
|
|
|
|
|
std::vector<size_t> var_shape = AnfAlgo::GetPrevNodeOutputInferShape(kernel_node, 0);
|
|
|
|
@ -72,7 +79,7 @@ void SparseApplyFtrlCPUKernel::InitKernel(const CNodePtr &kernel_node) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool SparseApplyFtrlCPUKernel::Launch(const std::vector<kernel::AddressPtr> &inputs,
|
|
|
|
|
const std::vector<kernel::AddressPtr> & /*workspace*/,
|
|
|
|
|
const std::vector<kernel::AddressPtr> &workspace,
|
|
|
|
|
const std::vector<kernel::AddressPtr> & /*outputs*/) {
|
|
|
|
|
if (inputs.size() < kSparseApplyFtrlInputSize) {
|
|
|
|
|
MS_LOG(EXCEPTION) << "error input output size!";
|
|
|
|
@ -83,14 +90,11 @@ bool SparseApplyFtrlCPUKernel::Launch(const std::vector<kernel::AddressPtr> &inp
|
|
|
|
|
auto linear = reinterpret_cast<float *>(inputs[2]->addr);
|
|
|
|
|
auto grad = reinterpret_cast<float *>(inputs[3]->addr);
|
|
|
|
|
auto indices = reinterpret_cast<int *>(inputs[4]->addr);
|
|
|
|
|
|
|
|
|
|
std::vector<float> new_grad;
|
|
|
|
|
new_grad.reserve(indices_size_ * var_outer_dim_size_);
|
|
|
|
|
std::vector<int> new_indices;
|
|
|
|
|
new_indices.reserve(indices_size_);
|
|
|
|
|
SparseGradient unique_sparse_grad({new_grad.data(), new_indices.data(), indices_size_});
|
|
|
|
|
DeduplicateIndexedSlices(SparseGradient({grad, indices, indices_size_}), &unique_sparse_grad, var_first_dim_size_,
|
|
|
|
|
var_outer_dim_size_);
|
|
|
|
|
auto new_grad = reinterpret_cast<float *>(workspace[0]->addr);
|
|
|
|
|
auto new_indices = reinterpret_cast<int *>(workspace[1]->addr);
|
|
|
|
|
SparseGradient unique_sparse_grad({new_grad, new_indices, indices_size_});
|
|
|
|
|
ReduceSparseGradient(SparseGradient({grad, indices, indices_size_}), &unique_sparse_grad, var_first_dim_size_,
|
|
|
|
|
var_outer_dim_size_);
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < unique_sparse_grad.indices_size_; ++i) {
|
|
|
|
|
int index = unique_sparse_grad.indices_[i];
|
|
|
|
|