Skip to content

Commit b96266e

Browse files
authored
Stress tests for DAG runtime modifications (#382)
TODO: -> add other API calls -> getModelStatus, getModelMetadata *Made: -> checkResponse -> stringError as test_utils functions. *Rename function checkResponse to checkDummyResponse *Remove unnecessary includes *Return to old wait multiplier factor *Make loadConfig & loadConfigurationWithoutConfigFile protected to enable using them in test without explicit sleep. *Minor log improvements in model management. JIRA:CVS-41787
1 parent 56a7b71 commit b96266e

10 files changed

+796
-70
lines changed

src/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ cc_test(
176176
"test/ensemble_tests.cpp",
177177
"test/ensemble_mapping_config_tests.cpp",
178178
"test/ensemble_metadata_test.cpp",
179+
"test/ensemble_config_change_stress.cpp",
179180
"test/get_model_metadata_response_test.cpp",
180181
"test/get_pipeline_metadata_response_test.cpp",
181182
"test/get_model_metadata_signature_test.cpp",

src/dl_node.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ Status DLNode::setInputsForInference(InferenceEngine::InferRequest& infer_reques
8989
for (const auto& kv : this->inputBlobs) {
9090
std::string realModelInputName;
9191
if (!getRealInputName(kv.first, &realModelInputName).ok()) {
92-
SPDLOG_WARN("DLNode::fetchResults (Node name {}); cannot find real model input name for ali{}", getName(), kv.first);
92+
SPDLOG_WARN("DLNode::{} [Node name: {}]; cannot find real model input name for alias: {}", __FUNCTION__, getName(), kv.first);
9393
return StatusCode::INTERNAL_ERROR;
9494
}
9595
infer_request.SetBlob(realModelInputName, kv.second);

src/entry_node.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ Status EntryNode::deserialize(const tensorflow::TensorProto& proto, InferenceEng
8989
}
9090

9191
// description.setLayout(); // Layout info is stored in model instance. If we find out it is required, then need to be set right before inference.
92-
9392
try {
9493
switch (proto.dtype()) {
9594
case tensorflow::DataType::DT_FLOAT:

src/modelmanager.cpp

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,14 @@ void ModelManager::retireModelsRemovedFromConfigFile(const std::set<std::string>
442442
}
443443
}
444444

445+
void ModelManager::updateConfigurationWithoutConfigFile() {
446+
SPDLOG_LOGGER_DEBUG(modelmanager_logger, "Checking if something changed with model versions");
447+
for (auto& [name, config] : servedModelConfigs) {
448+
reloadModelWithVersions(config);
449+
}
450+
pipelineFactory.revalidatePipelines(*this);
451+
}
452+
445453
void ModelManager::watcher(std::future<void> exit) {
446454
SPDLOG_LOGGER_INFO(modelmanager_logger, "Started config watcher thread");
447455
int64_t lastTime;
@@ -456,10 +464,7 @@ void ModelManager::watcher(std::future<void> exit) {
456464
lastTime = statTime.st_ctime;
457465
loadConfig(configFilename);
458466
}
459-
for (auto& [name, config] : servedModelConfigs) {
460-
reloadModelWithVersions(config);
461-
}
462-
pipelineFactory.revalidatePipelines(*this);
467+
updateConfigurationWithoutConfigFile();
463468
SPDLOG_LOGGER_DEBUG(modelmanager_logger, "Watcher thread check cycle end");
464469
}
465470
SPDLOG_LOGGER_ERROR(modelmanager_logger, "Exited config watcher thread");
@@ -484,9 +489,9 @@ void ModelManager::getVersionsToChange(
484489
std::shared_ptr<model_versions_t>& versionsToRetireIn) {
485490
std::sort(requestedVersions.begin(), requestedVersions.end());
486491
model_versions_t registeredModelVersions;
487-
SPDLOG_DEBUG("Currently registered versions count: {}", modelVersionsInstances.size());
492+
SPDLOG_LOGGER_DEBUG(modelmanager_logger, "Currently registered model: {} versions count: {}", newModelConfig.getName(), modelVersionsInstances.size());
488493
for (const auto& [version, versionInstance] : modelVersionsInstances) {
489-
SPDLOG_DEBUG("version: {} state: {}", version, ovms::ModelVersionStateToString(versionInstance->getStatus().getState()));
494+
SPDLOG_LOGGER_DEBUG(modelmanager_logger, "model: {} version: {} state: {}", newModelConfig.getName(), version, ovms::ModelVersionStateToString(versionInstance->getStatus().getState()));
490495
registeredModelVersions.push_back(version);
491496
}
492497

@@ -648,6 +653,7 @@ Status ModelManager::reloadModelVersions(std::shared_ptr<ovms::Model>& model, st
648653
}
649654

650655
Status ModelManager::reloadModelWithVersions(ModelConfig& config) {
656+
SPDLOG_LOGGER_DEBUG(modelmanager_logger, "Started applying config changes to model: {}", config.getName());
651657
auto model = getModelIfExistCreateElse(config.getName());
652658
if (model->isAnyVersionSubscribed() && config.isDynamicParameterEnabled()) {
653659
SPDLOG_LOGGER_ERROR(modelmanager_logger, "Requested setting dynamic parameters for model {} but it is used in pipeline. Cannot reload model configuration.", config.getName());
@@ -661,11 +667,9 @@ Status ModelManager::reloadModelWithVersions(ModelConfig& config) {
661667
return blocking_status;
662668
}
663669
requestedVersions = config.getModelVersionPolicy()->filter(requestedVersions);
664-
665670
std::shared_ptr<model_versions_t> versionsToStart;
666671
std::shared_ptr<model_versions_t> versionsToReload;
667672
std::shared_ptr<model_versions_t> versionsToRetire;
668-
669673
// first reset custom loader name to empty string so that any changes to name can be captured
670674
model->resetCustomLoaderName();
671675

src/modelmanager.hpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,7 @@ class ModelManager {
6262
*/
6363
ModelManager(const ModelManager&) = delete;
6464

65-
/**
66-
* @brief Reads models from configuration file
67-
*
68-
* @param jsonFilename configuration file
69-
* @return Status
70-
*/
71-
Status loadConfig(const std::string& jsonFilename);
65+
Status cleanupModelTmpFiles(ModelConfig& config);
7266
Status reloadModelVersions(std::shared_ptr<ovms::Model>& model, std::shared_ptr<FileSystem>& fs, ModelConfig& config, std::shared_ptr<model_versions_t>& versionsToReload);
7367
Status addModelVersions(std::shared_ptr<ovms::Model>& model, std::shared_ptr<FileSystem>& fs, ModelConfig& config, std::shared_ptr<model_versions_t>& versionsToStart);
7468
Status loadModelsConfig(rapidjson::Document& configJson, std::vector<ModelConfig>& gatedModelConfigs);
@@ -297,6 +291,20 @@ class ModelManager {
297291
std::shared_ptr<model_versions_t>& versionsToStartIn);
298292

299293
static std::shared_ptr<FileSystem> getFilesystem(const std::string& basePath);
294+
295+
protected:
296+
/**
297+
* @brief Reads models from configuration file
298+
*
299+
* @param jsonFilename configuration file
300+
* @return Status
301+
*/
302+
Status loadConfig(const std::string& jsonFilename);
303+
304+
/**
305+
* @brief Updates OVMS configuration with cached configuration file. Will check for newly added model versions
306+
*/
307+
void updateConfigurationWithoutConfigFile();
300308
};
301309

302310
} // namespace ovms

src/status.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,8 @@ enum class StatusCode {
186186
CUSTOM_LOADER_NOT_PRESENT,
187187
CUSTOM_LOADER_INIT_FAILED,
188188
CUSTOM_LOADER_ERROR,
189+
190+
STATUS_CODE_END
189191
};
190192

191193
class Status {

0 commit comments

Comments
 (0)