From 32b28c6429451b4ea7b91e002b139919491ea3a3 Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Tue, 27 Dec 2016 11:50:06 +0800 Subject: [PATCH 1/5] add remote updater in api and swig --- paddle/api/Paddle.swig | 1 + paddle/api/PaddleAPI.h | 2 ++ paddle/api/ParameterUpdater.cpp | 18 +++++++++++++++--- paddle/trainer/RemoteParameterUpdater.h | 4 ++-- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/paddle/api/Paddle.swig b/paddle/api/Paddle.swig index 3365927f9b5993..068ba286c07d88 100644 --- a/paddle/api/Paddle.swig +++ b/paddle/api/Paddle.swig @@ -178,6 +178,7 @@ namespace std { %newobject ParameterOptimizer::create; %newobject ParameterOptimizer::needSpecialTraversal; %newobject ParameterUpdater::createLocalUpdater; +%newobject ParameterUpdater::createRemoteUpdater; %feature("director") UpdateCallback; %feature("autodoc", 1); // To generate method stub, for code hint in ide diff --git a/paddle/api/PaddleAPI.h b/paddle/api/PaddleAPI.h index 0a273f9f6f942a..f70a8ce26b165f 100644 --- a/paddle/api/PaddleAPI.h +++ b/paddle/api/PaddleAPI.h @@ -797,6 +797,8 @@ class ParameterUpdater { public: static ParameterUpdater* createLocalUpdater(OptimizationConfig* config); + static ParameterUpdater* createRemoteUpdater(OptimizationConfig* config, + int passCount); ~ParameterUpdater(); /** diff --git a/paddle/api/ParameterUpdater.cpp b/paddle/api/ParameterUpdater.cpp index 7cd8ed7e390748..e84bb63866094d 100644 --- a/paddle/api/ParameterUpdater.cpp +++ b/paddle/api/ParameterUpdater.cpp @@ -15,15 +15,27 @@ limitations under the License. */ #include "PaddleAPI.h" #include "PaddleAPIPrivate.h" +#include "paddle/trainer/RemoteParameterUpdater.h" #include "paddle/trainer/ThreadParameterUpdater.h" ParameterUpdater::ParameterUpdater() : m(new ParameterUpdaterPrivate()) {} ParameterUpdater *ParameterUpdater::createLocalUpdater( OptimizationConfig *config) { - auto param = new ParameterUpdater(); - param->m->updater.reset(new paddle::SgdThreadUpdater(config->m->getConfig())); - return param; + auto updater = new ParameterUpdater(); + updater->m->updater.reset( + new paddle::SgdThreadUpdater(config->m->getConfig())); + return updater; +} + +ParameterUpdater *ParameterUpdater::createRemoteUpdater( + OptimizationConfig *config, int passCount) { + auto updater = new ParameterUpdater(); + std::unique_ptr localUpdater; + localUpdater.reset(new paddle::SgdThreadUpdater(config->m->getConfig())); + updater->m->updater.reset(new paddle::ConcurrentRemoteParameterUpdater( + config->m->getConfig(), passCount, std::move(localUpdater))); + return updater; } ParameterUpdater::~ParameterUpdater() { delete m; } diff --git a/paddle/trainer/RemoteParameterUpdater.h b/paddle/trainer/RemoteParameterUpdater.h index 7794b209009a34..5e82c944751629 100644 --- a/paddle/trainer/RemoteParameterUpdater.h +++ b/paddle/trainer/RemoteParameterUpdater.h @@ -56,7 +56,7 @@ class RemoteParameterUpdater : public ParameterUpdater { public: RemoteParameterUpdater( const OptimizationConfig& config, - int expectedPpassCount, + int expectedPassCount, std::unique_ptr&& localUpdater = nullptr); ~RemoteParameterUpdater() { if (controllerThread_) { @@ -146,7 +146,7 @@ class RemoteParameterUpdater : public ParameterUpdater { BatchStatus batchStatus_; /// controller thread for sync-sgd std::unique_ptr controllerThread_; - /// passed alread finished + /// passed already finished int64_t passCount_; /// expected passes to finished int64_t expectedPassCount_; From 647f9a0f4e076121012633c33067febb96038284 Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Wed, 28 Dec 2016 00:35:08 +0800 Subject: [PATCH 2/5] do not init localUpdater --- paddle/api/ParameterUpdater.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/paddle/api/ParameterUpdater.cpp b/paddle/api/ParameterUpdater.cpp index e84bb63866094d..33aa11850cc597 100644 --- a/paddle/api/ParameterUpdater.cpp +++ b/paddle/api/ParameterUpdater.cpp @@ -32,8 +32,7 @@ ParameterUpdater *ParameterUpdater::createRemoteUpdater( OptimizationConfig *config, int passCount) { auto updater = new ParameterUpdater(); std::unique_ptr localUpdater; - localUpdater.reset(new paddle::SgdThreadUpdater(config->m->getConfig())); - updater->m->updater.reset(new paddle::ConcurrentRemoteParameterUpdater( + updater->m->updater.reset(new paddle::RemoteParameterUpdater( config->m->getConfig(), passCount, std::move(localUpdater))); return updater; } From cee99447fd8fbb20244a9cb73c9b48d0c2facc50 Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Wed, 28 Dec 2016 14:29:47 +0800 Subject: [PATCH 3/5] udw nullptr as localUpdater --- paddle/api/ParameterUpdater.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/paddle/api/ParameterUpdater.cpp b/paddle/api/ParameterUpdater.cpp index 33aa11850cc597..75b0ae7cb6cc8c 100644 --- a/paddle/api/ParameterUpdater.cpp +++ b/paddle/api/ParameterUpdater.cpp @@ -31,9 +31,8 @@ ParameterUpdater *ParameterUpdater::createLocalUpdater( ParameterUpdater *ParameterUpdater::createRemoteUpdater( OptimizationConfig *config, int passCount) { auto updater = new ParameterUpdater(); - std::unique_ptr localUpdater; updater->m->updater.reset(new paddle::RemoteParameterUpdater( - config->m->getConfig(), passCount, std::move(localUpdater))); + config->m->getConfig(), passCount, nullptr)); return updater; } From 801517184efc679b198d4c692c4a6132d581a6e6 Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Thu, 29 Dec 2016 23:37:50 +0800 Subject: [PATCH 4/5] add PserverUtil --- paddle/api/CMakeLists.txt | 3 +- paddle/api/PaddleAPI.h | 23 ++++++++ paddle/api/PaddleAPIPrivate.h | 5 ++ paddle/api/ParameterServer.cpp | 10 ++++ paddle/pserver/CMakeLists.txt | 6 +- paddle/pserver/PServerUtil.cpp | 77 +++++++++++++++++++++++++ paddle/pserver/PServerUtil.h | 33 +++++++++++ paddle/pserver/ParameterServer2Main.cpp | 57 ++---------------- paddle/trainer/TrainerMain.cpp | 51 ++-------------- 9 files changed, 163 insertions(+), 102 deletions(-) create mode 100644 paddle/api/ParameterServer.cpp create mode 100644 paddle/pserver/PServerUtil.cpp create mode 100644 paddle/pserver/PServerUtil.h diff --git a/paddle/api/CMakeLists.txt b/paddle/api/CMakeLists.txt index da6dad10cd8076..c060865764c4ea 100644 --- a/paddle/api/CMakeLists.txt +++ b/paddle/api/CMakeLists.txt @@ -10,7 +10,8 @@ set(API_SOURCES SequenceGenerator.cpp Trainer.cpp Util.cpp - Vector.cpp) + Vector.cpp + ParameterServer.cpp) set(API_HEADER PaddleAPI.h Internal.h) diff --git a/paddle/api/PaddleAPI.h b/paddle/api/PaddleAPI.h index 81c9eed0bccd5a..04ebe6044dd47e 100644 --- a/paddle/api/PaddleAPI.h +++ b/paddle/api/PaddleAPI.h @@ -868,6 +868,29 @@ class ParameterUpdater { ParameterUpdaterPrivate* m; }; +struct ParameterServerPrivate; +class ParameterServer { +private: + ParameterServer(); + +public: + static ParameterServer* createParameterServer(); + + ~ParameterServer(); + + /** + * @brief initialize Parameter Server. + * @param gm + */ + void init(); + void start(); + void join(); + void stop(); + +private: + ParameterServerPrivate* m; +}; + struct EvaluatorPrivate; class Evaluator { private: diff --git a/paddle/api/PaddleAPIPrivate.h b/paddle/api/PaddleAPIPrivate.h index f41352bfec7c33..d5149ec10d10f1 100644 --- a/paddle/api/PaddleAPIPrivate.h +++ b/paddle/api/PaddleAPIPrivate.h @@ -17,6 +17,7 @@ limitations under the License. */ #include "paddle/gserver/evaluators/Evaluator.h" #include "paddle/gserver/gradientmachines/GradientMachine.h" #include "paddle/parameter/ParameterUpdaterBase.h" +#include "paddle/pserver/ParameterServer2.h" #include "paddle/trainer/TrainerConfigHelper.h" struct GradientMachinePrivate { @@ -72,6 +73,10 @@ struct ParameterUpdaterPrivate { std::unique_ptr updater; }; +struct ParameterServerPrivate { + std::unique_ptr pServer; +}; + struct ParameterPrivate { std::shared_ptr sharedPtr; paddle::Parameter* rawPtr; // rawPtr only used in ParameterUpdater, diff --git a/paddle/api/ParameterServer.cpp b/paddle/api/ParameterServer.cpp new file mode 100644 index 00000000000000..84cf5206c3e4e1 --- /dev/null +++ b/paddle/api/ParameterServer.cpp @@ -0,0 +1,10 @@ +// +// Created by qiaolongfei on 16/12/29. +// +#include "PaddleAPI.h" + +#include "PaddleAPIPrivate.h" + +ParameterServer::ParameterServer() : m(new ParameterServerPrivate()) {} + +ParameterServer::~ParameterServer() { delete m; } diff --git a/paddle/pserver/CMakeLists.txt b/paddle/pserver/CMakeLists.txt index 1c1e1964b8d3fd..9bc48294f06b8a 100644 --- a/paddle/pserver/CMakeLists.txt +++ b/paddle/pserver/CMakeLists.txt @@ -24,13 +24,15 @@ set(PSERVER_SOURCES BaseClient.cpp ParameterClient2.cpp ParameterServer2.cpp - SparseParameterDistribution.cpp) + SparseParameterDistribution.cpp + PServerUtil.cpp) set(PSERVER_HEADERS BaseClient.h ParameterClient2.h ParameterServer2.h - SparseParameterDistribution.h) + SparseParameterDistribution.h + PServerUtil.h) add_library(paddle_pserver STATIC ${PSERVER_SOURCES}) diff --git a/paddle/pserver/PServerUtil.cpp b/paddle/pserver/PServerUtil.cpp new file mode 100644 index 00000000000000..d293e112ab471d --- /dev/null +++ b/paddle/pserver/PServerUtil.cpp @@ -0,0 +1,77 @@ +/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ + +#include "PServerUtil.h" + +namespace paddle { + +void PServerUtil::init() { + // round robin to load balance RDMA server ENGINE + std::vector devices; + int rdmaCpu = 0; + int onlineCpus = rdma::numCpus(); + int numPorts = FLAGS_ports_num + FLAGS_ports_num_for_sparse; + + if (FLAGS_nics.empty()) { + pservers_.resize(numPorts); + for (int i = 0; i < numPorts; ++i) { + if (FLAGS_rdma_tcp == "rdma") { + pservers_[i].reset( + new ParameterServer2(std::string(), FLAGS_port + i, rdmaCpu++)); + rdmaCpu = rdmaCpu % onlineCpus; + } else { + pservers_[i].reset(new ParameterServer2(std::string(), FLAGS_port + i)); + } + CHECK(pservers_[i]->init()) << "Fail to initialize parameter server" + << FLAGS_port + i; + } + } else { + str::split(FLAGS_nics, ',', &devices); + pservers_.resize(devices.size() * numPorts); + for (int i = 0; i < numPorts; ++i) { + for (size_t j = 0; j < devices.size(); ++j) { + if (FLAGS_rdma_tcp == "rdma") { + pservers_[i * devices.size() + j].reset(new ParameterServer2( + getIpAddr(devices[j]), FLAGS_port + i, rdmaCpu++)); + rdmaCpu = rdmaCpu % onlineCpus; + } else { + pservers_[i * devices.size() + j].reset( + new ParameterServer2(getIpAddr(devices[j]), FLAGS_port + i)); + } + CHECK(pservers_[i * devices.size() + j]->init()) + << "Fail to initialize parameter server" << devices[j] + << FLAGS_port + i; + } + } + } +} + +void PServerUtil::start() { + LOG(INFO) << "pserver sizes : " << pservers_.size(); + int i = 0; + for (const auto &pserver : pservers_) { + LOG(INFO) << "pserver started : " << i; + pserver->start(); + i++; + } +} + +void PServerUtil::join() { + LOG(INFO) << "pserver sizes : " << pservers_.size(); + for (const auto &pserver : pservers_) { + pserver->join(); + } +} + +} // namespace paddle diff --git a/paddle/pserver/PServerUtil.h b/paddle/pserver/PServerUtil.h new file mode 100644 index 00000000000000..f451e62e45e5b3 --- /dev/null +++ b/paddle/pserver/PServerUtil.h @@ -0,0 +1,33 @@ +/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ + +#pragma once + +#include "ParameterServer2.h" +#include "RDMANetwork.h" +#include "paddle/utils/StringUtil.h" + +namespace paddle { + +class PServerUtil { +public: + void init(); + void start(); + void join(); + +private: + std::vector> pservers_; +}; + +} // namespace paddle diff --git a/paddle/pserver/ParameterServer2Main.cpp b/paddle/pserver/ParameterServer2Main.cpp index ffc521f2c143d9..d0428eee43c260 100644 --- a/paddle/pserver/ParameterServer2Main.cpp +++ b/paddle/pserver/ParameterServer2Main.cpp @@ -16,63 +16,16 @@ limitations under the License. */ #include "paddle/utils/StringUtil.h" #include "paddle/utils/Util.h" -#include "ParameterServer2.h" -#include "RDMANetwork.h" -#include "paddle/utils/Flags.h" +#include "PServerUtil.h" using namespace paddle; // NOLINT int main(int argc, char** argv) { initMain(argc, argv); - - std::vector devices; - std::vector> pservers; - - // round robin to loadbalance RDMA server ENGINE - int rdmaCpu = 0; - int onlineCpus = rdma::numCpus(); - int numPorts = FLAGS_ports_num + FLAGS_ports_num_for_sparse; - if (FLAGS_nics.empty()) { - pservers.resize(numPorts); - for (int i = 0; i < numPorts; ++i) { - if (FLAGS_rdma_tcp == "rdma") { - pservers[i].reset( - new ParameterServer2(std::string(), FLAGS_port + i, rdmaCpu++)); - rdmaCpu = rdmaCpu % onlineCpus; - } else { - pservers[i].reset(new ParameterServer2(std::string(), FLAGS_port + i)); - } - CHECK(pservers[i]->init()) << "Fail to initialize parameter server" - << FLAGS_port + i; - LOG(INFO) << "pserver started : " << FLAGS_port + i; - pservers[i]->start(); - } - } else { - str::split(FLAGS_nics, ',', &devices); - pservers.resize(devices.size() * numPorts); - for (int i = 0; i < numPorts; ++i) { - for (size_t j = 0; j < devices.size(); ++j) { - if (FLAGS_rdma_tcp == "rdma") { - pservers[i * devices.size() + j].reset(new ParameterServer2( - getIpAddr(devices[j]), FLAGS_port + i, rdmaCpu++)); - rdmaCpu = rdmaCpu % onlineCpus; - } else { - pservers[i * devices.size() + j].reset( - new ParameterServer2(getIpAddr(devices[j]), FLAGS_port + i)); - } - CHECK(pservers[i * devices.size() + j]->init()) - << "Fail to initialize parameter server" << devices[j] - << FLAGS_port + i; - LOG(INFO) << "pserver started : " << devices[j] << ":" - << FLAGS_port + i; - pservers[i * devices.size() + j]->start(); - } - } - } - - for (auto& pserver : pservers) { - pserver->join(); - } + PServerUtil* pserverUtil = new PServerUtil(); + pserverUtil->init(); + pserverUtil->start(); + pserverUtil->join(); return 0; } diff --git a/paddle/trainer/TrainerMain.cpp b/paddle/trainer/TrainerMain.cpp index 947f9cadcc983d..5fea8962b00e99 100644 --- a/paddle/trainer/TrainerMain.cpp +++ b/paddle/trainer/TrainerMain.cpp @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #include +#include #include "paddle/pserver/ParameterServer2.h" #include "paddle/utils/Excepts.h" #include "paddle/utils/PythonUtil.h" @@ -39,54 +40,10 @@ int main(int argc, char** argv) { initMain(argc, argv); initPython(argc, argv); - std::vector> pservers; - std::vector devices; - if (FLAGS_start_pserver) { - // round robin to loadbalance RDMA server ENGINE - int rdmaCpu = 0; - int onlineCpus = rdma::numCpus(); - int numPorts = FLAGS_ports_num + FLAGS_ports_num_for_sparse; - if (FLAGS_nics.empty()) { - pservers.resize(numPorts); - for (int i = 0; i < numPorts; ++i) { - if (FLAGS_rdma_tcp == "rdma") { - pservers[i].reset( - new ParameterServer2(std::string(), FLAGS_port + i, rdmaCpu++)); - rdmaCpu = rdmaCpu % onlineCpus; - } else { - pservers[i].reset( - new ParameterServer2(std::string(), FLAGS_port + i)); - } - - CHECK(pservers[i]->init()) << "Fail to initialize parameter server" - << FLAGS_port + i; - LOG(INFO) << "pserver started : " << FLAGS_port + i; - pservers[i]->start(); - } - } else { - str::split(FLAGS_nics, ',', &devices); - pservers.resize(devices.size() * numPorts); - for (int i = 0; i < numPorts; ++i) { - for (size_t j = 0; j < devices.size(); ++j) { - if (FLAGS_rdma_tcp == "rdma") { - pservers[i * devices.size() + j].reset(new ParameterServer2( - getIpAddr(devices[j]), FLAGS_port + i, rdmaCpu++)); - rdmaCpu = rdmaCpu % onlineCpus; - } else { - pservers[i * devices.size() + j].reset( - new ParameterServer2(getIpAddr(devices[j]), FLAGS_port + i)); - } - - CHECK(pservers[i * devices.size() + j]->init()) - << "Fail to initialize parameter server" << devices[j] - << FLAGS_port + i; - LOG(INFO) << "pserver started : " << devices[j] << ":" - << FLAGS_port + i; - pservers[i * devices.size() + j]->start(); - } - } - } + PServerUtil* pserverUtil = new PServerUtil(); + pserverUtil->init(); + pserverUtil->start(); } Trainer trainer; auto config = TrainerConfigHelper::createFromFlags(); From eaf19f5ce4b7727649d3ad2f1b3c18bbcbd419b1 Mon Sep 17 00:00:00 2001 From: qiaolongfei Date: Fri, 30 Dec 2016 10:40:23 +0800 Subject: [PATCH 5/5] add pserver.py that can work --- demo/quick_start/cluster/pserver.py | 30 +++++++++++++++++++++++++++++ paddle/api/Paddle.swig | 2 ++ paddle/api/PaddleAPI.h | 1 - paddle/api/PaddleAPIPrivate.h | 4 ++-- paddle/api/ParameterServer.cpp | 29 +++++++++++++++++++++++++--- 5 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 demo/quick_start/cluster/pserver.py diff --git a/demo/quick_start/cluster/pserver.py b/demo/quick_start/cluster/pserver.py new file mode 100644 index 00000000000000..fe10a771335785 --- /dev/null +++ b/demo/quick_start/cluster/pserver.py @@ -0,0 +1,30 @@ +# Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from py_paddle import swig_paddle as api + +#import pudb;pudb.set_trace() + + +def main(): + api.initPaddle("--nics=lo0", "--port=7164", "--ports_num=1", + "--num_gradient_servers=1", "--comment=paddle_pserver") + pserver = api.ParameterServer.createParameterServer() + pserver.init() + pserver.start() + pserver.join() + + +if __name__ == '__main__': + main() diff --git a/paddle/api/Paddle.swig b/paddle/api/Paddle.swig index 068ba286c07d88..84c50c30add877 100644 --- a/paddle/api/Paddle.swig +++ b/paddle/api/Paddle.swig @@ -179,6 +179,7 @@ namespace std { %newobject ParameterOptimizer::needSpecialTraversal; %newobject ParameterUpdater::createLocalUpdater; %newobject ParameterUpdater::createRemoteUpdater; +%newobject ParameterServer::createParameterServer; %feature("director") UpdateCallback; %feature("autodoc", 1); // To generate method stub, for code hint in ide @@ -197,5 +198,6 @@ namespace std { %ignore ParameterConfigPrivate; %ignore OptimizationConfigPrivate; %ignore ParameterTraverseCallbackPrivate; +%ignore ParameterServerPrivate; %include "utils/GlobalConstants.h" %include "api/PaddleAPI.h" diff --git a/paddle/api/PaddleAPI.h b/paddle/api/PaddleAPI.h index 04ebe6044dd47e..04bc850ff8500b 100644 --- a/paddle/api/PaddleAPI.h +++ b/paddle/api/PaddleAPI.h @@ -885,7 +885,6 @@ class ParameterServer { void init(); void start(); void join(); - void stop(); private: ParameterServerPrivate* m; diff --git a/paddle/api/PaddleAPIPrivate.h b/paddle/api/PaddleAPIPrivate.h index d5149ec10d10f1..74c96b8acef9c9 100644 --- a/paddle/api/PaddleAPIPrivate.h +++ b/paddle/api/PaddleAPIPrivate.h @@ -17,7 +17,7 @@ limitations under the License. */ #include "paddle/gserver/evaluators/Evaluator.h" #include "paddle/gserver/gradientmachines/GradientMachine.h" #include "paddle/parameter/ParameterUpdaterBase.h" -#include "paddle/pserver/ParameterServer2.h" +#include "paddle/pserver/PServerUtil.h" #include "paddle/trainer/TrainerConfigHelper.h" struct GradientMachinePrivate { @@ -74,7 +74,7 @@ struct ParameterUpdaterPrivate { }; struct ParameterServerPrivate { - std::unique_ptr pServer; + std::unique_ptr pServerUtil; }; struct ParameterPrivate { diff --git a/paddle/api/ParameterServer.cpp b/paddle/api/ParameterServer.cpp index 84cf5206c3e4e1..140028e0fbfc88 100644 --- a/paddle/api/ParameterServer.cpp +++ b/paddle/api/ParameterServer.cpp @@ -1,10 +1,33 @@ -// -// Created by qiaolongfei on 16/12/29. -// +/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ + #include "PaddleAPI.h" #include "PaddleAPIPrivate.h" ParameterServer::ParameterServer() : m(new ParameterServerPrivate()) {} +ParameterServer* ParameterServer::createParameterServer() { + auto pServer = new ParameterServer(); + pServer->m->pServerUtil.reset(new paddle::PServerUtil()); + return pServer; +} + ParameterServer::~ParameterServer() { delete m; } + +void ParameterServer::init() { m->pServerUtil->init(); } + +void ParameterServer::start() { m->pServerUtil->start(); } + +void ParameterServer::join() { m->pServerUtil->join(); }