-
Notifications
You must be signed in to change notification settings - Fork 5.7k
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
Feature/global context #6537
Feature/global context #6537
Changes from all commits
33421d8
2edc21d
fb1cefe
cc4c9a5
0e2f127
36be6a9
2d0c8b4
790dee0
2540a05
1202bc1
3c8f073
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
/* 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 <algorithm> | ||
#include <string> | ||
|
||
#include "paddle/framework/executor.h" | ||
#include "paddle/framework/init.h" | ||
#include "paddle/platform/place.h" | ||
#include "paddle/string/piece.h" | ||
|
||
namespace paddle { | ||
namespace framework { | ||
|
||
std::once_flag gflags_init_flag; | ||
|
||
// TODO(qijun) move init gflags to init.cc | ||
void InitGflags(std::vector<std::string> &argv) { | ||
std::call_once(gflags_init_flag, [&]() { | ||
int argc = argv.size(); | ||
char **arr = new char *[argv.size()]; | ||
std::string line; | ||
for (size_t i = 0; i < argv.size(); i++) { | ||
arr[i] = &argv[i][0]; | ||
line += argv[i]; | ||
line += ' '; | ||
} | ||
google::ParseCommandLineFlags(&argc, &arr, true); | ||
VLOG(1) << "Init commandline: " << line; | ||
}); | ||
} | ||
|
||
bool InitDevices(const std::vector<std::string> &devices) { | ||
// device format | ||
// CPU | ||
// GPU:1 | ||
// TODO(dzhwinter) : add device format annotation for users. | ||
std::vector<platform::Place> places; | ||
for (auto &device : devices) { | ||
auto p = string::Piece(device); | ||
if (string::Find(p, ':', 0) == string::Piece::npos) { | ||
places.emplace_back(platform::CPUPlace()); | ||
} else if (string::HasPrefix(p, "GPU")) { | ||
#ifdef PADDLE_WITH_CUDA | ||
auto pos = string::RFind(p, ':', string::Piece::npos); | ||
auto number = device.substr(pos + 1); | ||
places.emplace_back(platform::GPUPlace(std::stoi(number))); | ||
#else | ||
LOG(WARNING) | ||
<< "'GPU' is not supported, Please re-compile with WITH_GPU option"; | ||
#endif | ||
} else { | ||
return false; | ||
} | ||
} | ||
|
||
if (std::find_if(places.begin(), places.end(), | ||
[&](const platform::Place &place) { | ||
return platform::is_cpu_place(place); | ||
}) == places.end()) { | ||
places.emplace_back(platform::CPUPlace()); | ||
LOG(WARNING) << "Not specified any device, use CPU by Default."; | ||
} | ||
DeviceContextPool::Create(places); | ||
return true; | ||
return true; | ||
} | ||
|
||
} // namespace framework | ||
} // namespace paddle |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
/* 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 <mutex> | ||
|
||
#include "gflags/gflags.h" | ||
#include "glog/logging.h" | ||
|
||
namespace paddle { | ||
namespace framework { | ||
|
||
void InitGflags(std::vector<std::string> &argv); | ||
|
||
bool InitDevices(const std::vector<std::string> &devices); | ||
|
||
} // namespace framework | ||
} // namespace paddle |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
/* 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 "gtest/gtest.h" | ||
|
||
#include "paddle/framework/init.h" | ||
|
||
TEST(Init, InitDevices) { | ||
using paddle::framework::InitDevices; | ||
std::vector<std::string> ds1 = {"CPU"}; | ||
ASSERT_EQ(InitDevices(ds1), true); | ||
|
||
#ifdef PADDLE_WITH_CUDA | ||
std::vector<std::string> ds2 = {"CPU", "GPU:0", "GPU:1"}; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please document the format of place strings, or add a TODO There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It is documented in the init.cc function definition part. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I mean, for users. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It only means one CPUDeviceContext, our multi-CPU design is not complete at the current stage, so I think that specify the number of CPU cores is useless. |
||
ASSERT_EQ(InitDevices(ds2), true); | ||
#endif | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can create if
nullptr
here. So theCreate
function is not neded.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, a singleton ONLY always mix these two function together, but here we have a slightly problem.
Create will create the all the devices. But when we need get always only need create part of it.
For example, Init function create all the available GPU, CPU devices, when we want to create two or more executors, then Get() happens part may not have all the device information.
In previous implementation, we definitly have one and only one executor, but now it is different since executor does not contain resources, we may have two or more executors.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That makes sense.