Take VPUX out of AUTO default candidate device list (#16037)
* 1. Add device blacklist for AUTO plugin. 2. Update the logic to parse out the device candidate list from the inputting config MULTI_DEVICE_PRIORITIES. 3. Update the corresponding mock test cases. 4. Ignore the GTEST warning for the test cases. Signed-off-by: Wang, Yang <yang4.wang@intel.com> * Update. * Update. * Update. * Add description about blacklist. * Apply suggestions from code review Update. Co-authored-by: yanlan song <bell.song@intel.com> * Update. * Apply suggestions from code review Updated. Co-authored-by: yanlan song <bell.song@intel.com> Co-authored-by: River Li <river.li@intel.com> * Update test case. * Update test case. * Update test case. * Update. * Update. --------- Signed-off-by: Wang, Yang <yang4.wang@intel.com> Co-authored-by: yanlan song <bell.song@intel.com> Co-authored-by: River Li <river.li@intel.com> Co-authored-by: Shen, Wanglei <wanglei.shen@intel.com>
This commit is contained in:
4 files changed
+162
-111
No files matched your search
+76
-67
@@ -850,83 +850,92 @@ std::string MultiDeviceInferencePlugin::GetDeviceList(const std::map<std::string
|
||||
std::string allDevices;
|
||||
auto deviceList = GetCore()->GetAvailableDevices();
|
||||
auto deviceListConfig = config.find(ov::device::priorities.name());
|
||||
if (deviceListConfig->second.empty()) {
|
||||
for (auto&& device : deviceList) {
|
||||
// filter out the supported devices
|
||||
if (!_pluginConfig.isSupportedDevice(device))
|
||||
continue;
|
||||
allDevices += device + ",";
|
||||
}
|
||||
} else {
|
||||
for (auto&& device : deviceList) {
|
||||
// filter out the supported devices
|
||||
if (!_pluginConfig.isSupportedDevice(device))
|
||||
continue;
|
||||
allDevices += device + ",";
|
||||
}
|
||||
std::vector<std::string> devicesMerged;
|
||||
if (deviceListConfig != config.end() && !deviceListConfig->second.empty()) {
|
||||
auto priorities = deviceListConfig->second;
|
||||
// parsing the string and splitting the comma-separated tokens
|
||||
std::vector<std::string> deviceVec = _pluginConfig.ParsePrioritiesDevices(priorities);
|
||||
std::vector<std::string> devicesToBeDeleted;
|
||||
auto updateDeviceVec = [&](const std::string& delPattern = "") {
|
||||
auto iter = deviceVec.begin();
|
||||
while (iter != deviceVec.end()) {
|
||||
if (delPattern.empty()) {
|
||||
if ((*iter).find("-") == 0) {
|
||||
devicesToBeDeleted.push_back((*iter).erase(0, 1));
|
||||
iter = deviceVec.erase(iter);
|
||||
} else {
|
||||
iter++;
|
||||
}
|
||||
} else {
|
||||
if ((*iter).find(delPattern) != std::string::npos)
|
||||
iter = deviceVec.erase(iter);
|
||||
else
|
||||
iter++;
|
||||
}
|
||||
}
|
||||
std::vector<std::string> devicesToBeMerged = _pluginConfig.ParsePrioritiesDevices(priorities);
|
||||
std::vector<std::string> devicesToBeDeleted(devicesToBeMerged.size());
|
||||
const auto& iterDel = std::copy_if(devicesToBeMerged.begin(),
|
||||
devicesToBeMerged.end(),
|
||||
devicesToBeDeleted.begin(),
|
||||
[](const std::string& item) {
|
||||
return item.front() == '-';
|
||||
});
|
||||
devicesToBeDeleted.resize(std::distance(devicesToBeDeleted.begin(), iterDel));
|
||||
const auto& iterMerge =
|
||||
std::remove_if(devicesToBeMerged.begin(), devicesToBeMerged.end(), [](const std::string& item) {
|
||||
return item.front() == '-';
|
||||
});
|
||||
devicesToBeMerged.resize(std::distance(devicesToBeMerged.begin(), iterMerge));
|
||||
for (auto&& device : devicesToBeDeleted)
|
||||
LOG_INFO_TAG("remove %s from device candidate list", device.c_str());
|
||||
auto isAnyDev = [](std::string& device, const std::vector<std::string>& devices) {
|
||||
auto iter = std::find_if(devices.begin(), devices.end(), [device](const std::string& devItem) {
|
||||
return devItem.find(device) != std::string::npos;
|
||||
});
|
||||
return iter != devices.end();
|
||||
};
|
||||
updateDeviceVec();
|
||||
if (devicesToBeDeleted.size() == 0) {
|
||||
allDevices = deviceListConfig->second;
|
||||
} else {
|
||||
auto deviceNeedToMerge = [&](const std::string& devicename) {
|
||||
for (auto&& iter : devicesToBeDeleted) {
|
||||
if (iter.find(devicename) != std::string::npos)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
auto mergeDeviceList = [&]() {
|
||||
std::vector<std::string> mergedList;
|
||||
auto prevSize = mergedList.size();
|
||||
for (auto&& iter : deviceVec) {
|
||||
for (auto&& viter : deviceList) {
|
||||
if (viter.find(iter) != std::string::npos && deviceNeedToMerge(iter))
|
||||
mergedList.push_back(std::move(viter));
|
||||
}
|
||||
// if virtual devices or mock devices
|
||||
if (mergedList.size() == prevSize)
|
||||
mergedList.push_back(std::move(iter));
|
||||
prevSize = mergedList.size();
|
||||
}
|
||||
return mergedList;
|
||||
};
|
||||
|
||||
deviceVec = deviceVec.size() == 0 ? deviceList : mergeDeviceList();
|
||||
for (auto& iter : devicesToBeDeleted) {
|
||||
LOG_INFO_TAG("remove %s from device candidate list", iter.c_str());
|
||||
updateDeviceVec(iter);
|
||||
}
|
||||
for (auto&& device : deviceVec) {
|
||||
if (!_pluginConfig.isSupportedDevice(device))
|
||||
auto deviceWithDefaultID = [](std::string& device) {
|
||||
// AUTO assume the default device ID will be "0" for the single device.
|
||||
return device.find(".") == std::string::npos ? device + ".0" : device;
|
||||
};
|
||||
if (devicesToBeMerged.empty()) {
|
||||
for (auto&& device : deviceList) {
|
||||
if (isAnyDev(device, devicesToBeDeleted) || !_pluginConfig.isSupportedDevice(device))
|
||||
continue;
|
||||
allDevices += device + ",";
|
||||
devicesMerged.push_back(device);
|
||||
}
|
||||
} else {
|
||||
for (auto&& device : devicesToBeMerged) {
|
||||
if (!isAnyDev(device, deviceList)) {
|
||||
DeviceIDParser parsed{device};
|
||||
auto iter = std::find(devicesMerged.begin(), devicesMerged.end(), parsed.getDeviceName());
|
||||
if (iter != devicesMerged.end() && parsed.getDeviceName() != device && parsed.getDeviceID() == "0")
|
||||
// The device is the device with default device ID (eg. GPU.0) and
|
||||
// its wide name (eg. GPU) has been in device candidate list.
|
||||
continue;
|
||||
// Add user specified device into candidate list
|
||||
devicesMerged.push_back(device);
|
||||
} else {
|
||||
// Update device name if supported device with id existed
|
||||
for (auto&& item : deviceList) {
|
||||
auto realDevice = deviceWithDefaultID(item);
|
||||
if (isAnyDev(realDevice, devicesToBeDeleted) || item.find(device) == std::string::npos)
|
||||
continue;
|
||||
auto iter = std::find(devicesMerged.begin(), devicesMerged.end(), deviceWithDefaultID(item));
|
||||
// Remove the device with default device id from candidate device list (eg. GPU.0)
|
||||
// if its wide name is a single device (eg. GPU).
|
||||
DeviceIDParser parsed{item};
|
||||
if (parsed.getDeviceName() == item && iter != devicesMerged.end())
|
||||
devicesMerged.erase(iter);
|
||||
// continue if targe device has been in the candidate device list.
|
||||
if (std::find(devicesMerged.begin(), devicesMerged.end(), item) != devicesMerged.end())
|
||||
continue;
|
||||
devicesMerged.push_back(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// remove the last ',' if exist
|
||||
if (allDevices.back() == ',')
|
||||
allDevices.pop_back();
|
||||
|
||||
if (devicesMerged.size()) {
|
||||
allDevices.clear();
|
||||
std::for_each(devicesMerged.begin(), devicesMerged.end(), [&allDevices](const std::string& device) {
|
||||
allDevices += device + ",";
|
||||
});
|
||||
}
|
||||
if (allDevices.empty()) {
|
||||
IE_THROW() << "Please, check environment due to no supported devices can be used";
|
||||
}
|
||||
// remove the last ',' if exist
|
||||
if (allDevices.back() == ',')
|
||||
allDevices.pop_back();
|
||||
|
||||
return allDevices;
|
||||
}
|
||||
|
||||
@@ -5,6 +5,10 @@
|
||||
|
||||
namespace MultiDevicePlugin {
|
||||
const std::set<std::string> PluginConfig::_availableDevices = {"AUTO", "CPU", "GPU", "TEMPLATE", "NVIDIA", "VPUX", "MULTI", "HETERO", "mock"};
|
||||
// AUTO will enable the blocklist if
|
||||
// 1.No device priority passed to AUTO/MULTI.(eg. core.compile_model(model, "AUTO", configs);)
|
||||
// 2.No valid device parsed out from device priority (eg. core.compile_model(model, "AUTO:-CPU,-GPU", configs);).
|
||||
const std::set<std::string> PluginConfig::_deviceBlocklist = {"VPUX", "GNA"};
|
||||
|
||||
PluginConfig::PluginConfig() {
|
||||
set_default();
|
||||
|
||||
@@ -205,7 +205,7 @@ public:
|
||||
if ((realEndPos = realDevName.find('(')) != std::string::npos) {
|
||||
realDevName = realDevName.substr(0, realEndPos);
|
||||
}
|
||||
if (_availableDevices.end() == std::find(_availableDevices.begin(), _availableDevices.end(), realDevName)) {
|
||||
if (_deviceBlocklist.end() != std::find(_deviceBlocklist.begin(), _deviceBlocklist.end(), realDevName)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -217,17 +217,13 @@ public:
|
||||
std::string::size_type endpos = 0;
|
||||
while ((endpos = priorities.find(separator, pos)) != std::string::npos) {
|
||||
auto subStr = priorities.substr(pos, endpos - pos);
|
||||
if (!isSupportedDevice(subStr)) {
|
||||
IE_THROW() << "Unavailable device name: " << subStr;
|
||||
}
|
||||
devices.push_back(subStr);
|
||||
if (!subStr.empty())
|
||||
devices.push_back(subStr);
|
||||
pos = endpos + 1;
|
||||
}
|
||||
auto subStr = priorities.substr(pos, priorities.length() - pos);
|
||||
if (!isSupportedDevice(subStr)) {
|
||||
IE_THROW() << "Unavailable device name: " << subStr;
|
||||
}
|
||||
devices.push_back(subStr);
|
||||
if (!subStr.empty())
|
||||
devices.push_back(subStr);
|
||||
return devices;
|
||||
}
|
||||
|
||||
@@ -239,5 +235,6 @@ private:
|
||||
std::map<std::string, BaseValidator::Ptr> property_validators;
|
||||
BaseValidator::Ptr device_property_validator;
|
||||
static const std::set<std::string> _availableDevices;
|
||||
static const std::set<std::string> _deviceBlocklist;
|
||||
};
|
||||
} // namespace MultiDevicePlugin
|
||||
Reference in new issue
Block a user