|
|
|
@ -25,6 +25,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
#include <ThreadPool.h>
|
|
|
|
#include <ThreadPool.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "paddle/fluid/platform/enforce.h"
|
|
|
|
|
|
|
|
|
|
|
|
namespace paddle {
|
|
|
|
namespace paddle {
|
|
|
|
namespace operators {
|
|
|
|
namespace operators {
|
|
|
|
namespace distributed {
|
|
|
|
namespace distributed {
|
|
|
|
@ -62,11 +64,12 @@ class AsyncSparseParamUpdateRecorder {
|
|
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
public:
|
|
|
|
AsyncSparseParamUpdateRecorder(
|
|
|
|
AsyncSparseParamUpdateRecorder(
|
|
|
|
const std::unordered_map<std::string, std::string>& grad_to_param,
|
|
|
|
int trainer_num,
|
|
|
|
int trainer_num)
|
|
|
|
const std::unordered_map<std::string, std::string>& grad_to_param)
|
|
|
|
: grad_to_param_(grad_to_param) {
|
|
|
|
: trainer_num_(trainer_num), grad_to_param_(grad_to_param) {
|
|
|
|
for (auto iter = grad_to_param.begin(); iter != grad_to_param.end();
|
|
|
|
for (auto iter = grad_to_param.begin(); iter != grad_to_param.end();
|
|
|
|
iter++) {
|
|
|
|
iter++) {
|
|
|
|
|
|
|
|
param_to_grad_[iter->second] = iter->first;
|
|
|
|
auto& param_name = iter->second;
|
|
|
|
auto& param_name = iter->second;
|
|
|
|
param_to_updated_rows_[param_name] = TrainerToRows();
|
|
|
|
param_to_updated_rows_[param_name] = TrainerToRows();
|
|
|
|
auto& trainer_to_rows = param_to_updated_rows_[param_name];
|
|
|
|
auto& trainer_to_rows = param_to_updated_rows_[param_name];
|
|
|
|
@ -76,31 +79,35 @@ class AsyncSparseParamUpdateRecorder {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
~AsyncSparseParamUpdateRecorder() {}
|
|
|
|
~AsyncSparseParamUpdateRecorder() = default;
|
|
|
|
|
|
|
|
|
|
|
|
void Update(const std::string& grad_name,
|
|
|
|
void Update(const std::string& grad_name,
|
|
|
|
const std::vector<int64_t>& update_rows) {
|
|
|
|
const std::vector<int64_t>& update_rows) {
|
|
|
|
auto& param_name = grad_to_param_.at(grad_name);
|
|
|
|
auto& param_name = grad_to_param_.at(grad_name);
|
|
|
|
auto& trainer_to_rows = param_to_updated_rows_.at(param_name);
|
|
|
|
auto& trainer_to_rows = param_to_updated_rows_.at(param_name);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<std::future<void>> futures;
|
|
|
|
|
|
|
|
for (auto& set : trainer_to_rows) {
|
|
|
|
for (auto& set : trainer_to_rows) {
|
|
|
|
futures.push_back(set->Update(update_rows));
|
|
|
|
// no need to wait here because GetAndClear will wait.
|
|
|
|
}
|
|
|
|
set->Update(update_rows);
|
|
|
|
for (auto& f : futures) {
|
|
|
|
|
|
|
|
f.wait();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void GetAndClear(const std::string& param_name, int trainer_id,
|
|
|
|
void GetAndClear(const std::string& param_name, int trainer_id,
|
|
|
|
std::vector<int64_t>* result) {
|
|
|
|
std::vector<int64_t>* result) {
|
|
|
|
|
|
|
|
PADDLE_ENFORCE_LT(trainer_id, trainer_num_);
|
|
|
|
param_to_updated_rows_.at(param_name)[trainer_id]
|
|
|
|
param_to_updated_rows_.at(param_name)[trainer_id]
|
|
|
|
->GetAndClear(result)
|
|
|
|
->GetAndClear(result)
|
|
|
|
.wait();
|
|
|
|
.wait();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool HasParam(const std::string& param_name) {
|
|
|
|
|
|
|
|
return param_to_grad_.find(param_name) != param_to_grad_.end();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
private:
|
|
|
|
|
|
|
|
const int trainer_num_;
|
|
|
|
std::unordered_map<std::string, std::string> grad_to_param_;
|
|
|
|
std::unordered_map<std::string, std::string> grad_to_param_;
|
|
|
|
|
|
|
|
std::unordered_map<std::string, std::string> param_to_grad_;
|
|
|
|
std::unordered_map<std::string, TrainerToRows> param_to_updated_rows_;
|
|
|
|
std::unordered_map<std::string, TrainerToRows> param_to_updated_rows_;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|