Skip to content

Commit 0049437

Browse files
mzegladtrawins
authored andcommitted
Versions scans wrapped in try-except (#80)
* try-except on versions scan * exit if no models could be accessed * fixing bug for wrong list of available versions * exit if no models for config file option * documentation update
1 parent 6649085 commit 0049437

File tree

3 files changed

+89
-14
lines changed

3 files changed

+89
-14
lines changed

README.md

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,54 @@ docker logs ie-serving
141141

142142

143143
### Model import issues
144-
OpenVINO™ model server will fail to start when any of the defined model cannot be loaded successfully. The root cause of
145-
the failure can be determined based on the collected logs on the console or in the log file.
144+
OpenVINO™ Model Server loads all defined models versions according
145+
to set [version policy](docs/docker_container.md#model-version-policy).
146+
A model version is represented by a numerical directory in a model path,
147+
containing OpenVINO model files with .bin and .xml extensions.
148+
149+
Below are examples of incorrect structure:
150+
```bash
151+
models/
152+
├── model1
153+
│   ├── 1
154+
│   │   ├── ir_model.bin
155+
│   │   └── ir_model.xml
156+
│   └── 2
157+
│   ├── somefile.bin
158+
│   └── anotherfile.txt
159+
└── model2
160+
├── ir_model.bin
161+
├── ir_model.xml
162+
└── mapping_config.json
163+
```
164+
165+
In above scenario, server will detect only version `1` of `model1`.
166+
Directory `2` does not contain valid OpenVINO model files, so it won't
167+
be detected as a valid model version.
168+
For `model2`, there are correct files, but they are not in a numerical directory.
169+
The server will not detect any version in `model2`.
170+
171+
When new model version is detected, the server will loads the model files
172+
and starts serving new model version. This operation might fail for the following reasons:
173+
- there is a problem with accessing model files (i. e. due to network connectivity issues
174+
to the remote storage or insufficient permissions)
175+
- model files are malformed and can not be imported by the Inference Engine
176+
- model requires custom CPU extension
177+
178+
In all those situations, the root cause is reported in the server logs or in the response from a call
179+
to GetModelStatus function.
180+
181+
Detected but not loaded model version will not be served and will report status
182+
`LOADING` with error message: `Error occurred while loading version`.
183+
When model files becomes accessible or fixed, server will try to
184+
load them again on the next [version update](docs/docker_container.md#updating-model-versions)
185+
attempt.
186+
187+
At startup, the server will enable gRPC and REST API endpoint, after all configured models and detected model versions
188+
are loaded successfully (in AVAILABLE state).
189+
190+
The server will fail to start if it can not list the content of configured model paths.
146191

147-
The following problem might occur during model server initialization and model loading:
148-
* Missing model files in the location specified in the configuration file.
149-
* Missing version sub-folders in the model folder.
150-
* Model files require custom CPU extension.
151192

152193
### Client request issues
153194
When the model server starts successfully and all the models are imported, there could be a couple of reasons for errors

ie_serving/main.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ def parse_config(args):
7676
'base_path'],
7777
batch_size=batch_size,
7878
model_version_policy=model_ver_policy)
79-
models[config['config']['name']] = model
79+
if model is not None:
80+
models[config['config']['name']] = model
8081
except ValidationError as e_val:
8182
logger.warning("Model version policy for model {} is invalid. "
8283
"Exception: {}".format(config['config']['name'],
@@ -85,6 +86,10 @@ def parse_config(args):
8586
logger.warning("Unexpected error occurred in {} model. "
8687
"Exception: {}".format(config['config']['name'],
8788
e))
89+
if not models:
90+
logger.info("Could not access any of provided models. Server will "
91+
"exit now.")
92+
sys.exit()
8893
if args.rest_port > 0:
8994
process_thread = threading.Thread(target=start_web_rest_server,
9095
args=[models, args.rest_port])
@@ -112,7 +117,13 @@ def parse_one_model(args):
112117
logger.error("Unexpected error occurred. "
113118
"Exception: {}".format(e))
114119
sys.exit()
115-
models = {args.model_name: model}
120+
models = {}
121+
if model is not None:
122+
models[args.model_name] = model
123+
else:
124+
logger.info("Could not access provided model. Server will exit now.")
125+
sys.exit()
126+
116127
if args.rest_port > 0:
117128
process_thread = threading.Thread(target=start_web_rest_server,
118129
args=[models, args.rest_port])

ie_serving/models/model.py

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,20 @@ def build(cls, model_name: str, model_directory: str, batch_size,
5858
logger.info("Server start loading model: {}".format(model_name))
5959
version_policy_filter = cls.get_model_version_policy_filter(
6060
model_version_policy)
61-
versions_attributes, available_versions = cls.get_version_metadata(
62-
model_directory, batch_size, version_policy_filter)
61+
62+
try:
63+
versions_attributes, available_versions = cls.get_version_metadata(
64+
model_directory, batch_size, version_policy_filter)
65+
except Exception as error:
66+
logger.error("Error occurred while getting versions "
67+
"of the model {}".format(model_name))
68+
logger.error("Failed reading model versions from path: {} "
69+
"with error {}".format(model_directory, str(error)))
70+
return None
71+
6372
versions_attributes = [version for version in versions_attributes
6473
if version['version_number']
6574
in available_versions]
66-
available_versions = [version_attributes['version_number'] for
67-
version_attributes in versions_attributes]
6875
versions_statuses = dict()
6976
for version in available_versions:
7077
versions_statuses[version] = ModelVersionStatus(model_name,
@@ -73,6 +80,9 @@ def build(cls, model_name: str, model_directory: str, batch_size,
7380
engines = cls.get_engines_for_model(versions_attributes,
7481
versions_statuses)
7582

83+
available_versions = [version_attributes['version_number'] for
84+
version_attributes in versions_attributes]
85+
7686
model = cls(model_name=model_name, model_directory=model_directory,
7787
available_versions=available_versions, engines=engines,
7888
batch_size=batch_size,
@@ -81,10 +91,23 @@ def build(cls, model_name: str, model_directory: str, batch_size,
8191
return model
8292

8393
def update(self):
84-
versions_attributes, available_versions = self.get_version_metadata(
85-
self.model_directory, self.batch_size, self.version_policy_filter)
94+
try:
95+
versions_attributes, available_versions = \
96+
self.get_version_metadata(
97+
self.model_directory,
98+
self.batch_size,
99+
self.version_policy_filter)
100+
except Exception as error:
101+
logger.error("Error occurred while getting versions "
102+
"of the model {}".format(self.model_name))
103+
logger.error("Failed reading model versions from path: {} "
104+
"with error {}".format(self.model_directory,
105+
str(error)))
106+
return
107+
86108
if available_versions == self.versions:
87109
return
110+
88111
logger.info("Server start updating model: {}".format(self.model_name))
89112
to_create, to_delete = self._mark_differences(available_versions)
90113
logger.debug("Server will try to add {} versions".format(to_create))

0 commit comments

Comments
 (0)