Skip to content

Commit 86976fe

Browse files
authored
Merge pull request #702 from Labelbox/ms/mea-to-mal-warnings
update docstring and add warnings to mea to mal logic
2 parents 84e9b6c + 50ec566 commit 86976fe

File tree

1 file changed

+56
-22
lines changed

1 file changed

+56
-22
lines changed

labelbox/schema/model_run.py

Lines changed: 56 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -132,49 +132,83 @@ def upsert_predictions_and_send_to_project(
132132
project_id: str,
133133
priority: Optional[int] = 5,
134134
) -> 'MEAPredictionImport': # type: ignore
135-
""" Upload predictions and create a batch import to project.
135+
"""
136+
Provides a convenient way to execute the following steps in a single function call:
137+
1. Upload predictions to a Model
138+
2. Create a batch from data rows that had predictions assocated with them
139+
3. Attach the batch to a project
140+
4. Add those same predictions to the project as MAL annotations
141+
142+
Note that partial successes are possible.
143+
If it is important that all stages are successful then check the status of each individual task
144+
with task.errors. E.g.
145+
146+
>>> mea_import_job, batch, mal_import_job = upsert_predictions_and_send_to_project(name, predictions, project_id)
147+
>>> # handle mea import job successfully created (check for job failure or partial failures)
148+
>>> print(mea_import_job.status, mea_import_job.errors)
149+
>>> if batch is None:
150+
>>> # Handle batch creation failure
151+
>>> if mal_import_job is None:
152+
>>> # Handle mal_import_job creation failure
153+
>>> else:
154+
>>> # handle mal import job successfully created (check for job failure or partial failures)
155+
>>> print(mal_import_job.status, mal_import_job.errors)
156+
157+
136158
Args:
137159
name (str): name of the AnnotationImport job as well as the name of the batch import
138160
predictions (Iterable):
139161
iterable of annotation rows
140162
project_id (str): id of the project to import into
141163
priority (int): priority of the job
142164
Returns:
143-
(MEAPredictionImport, Batch, MEAToMALPredictionImport)
165+
Tuple[MEAPredictionImport, Batch, MEAToMALPredictionImport]
166+
If any of these steps fail the return value will be None.
167+
144168
"""
145169
kwargs = dict(client=self.client, model_run_id=self.uid, name=name)
146170
project = self.client.get_project(project_id)
147171
import_job = self.add_predictions(name, predictions)
148172
prediction_statuses = import_job.statuses
149-
mea_to_mal_data_rows_set = set([
150-
row['dataRow']['id']
151-
for row in prediction_statuses
152-
if row['status'] == 'SUCCESS'
153-
])
154173
mea_to_mal_data_rows = list(
155-
mea_to_mal_data_rows_set)[:DATAROWS_IMPORT_LIMIT]
156-
157-
if len(mea_to_mal_data_rows) >= DATAROWS_IMPORT_LIMIT:
174+
set([
175+
row['dataRow']['id']
176+
for row in prediction_statuses
177+
if row['status'] == 'SUCCESS'
178+
]))
179+
180+
if not mea_to_mal_data_rows:
181+
# 0 successful model predictions imported
182+
return import_job, None, None
158183

184+
elif len(mea_to_mal_data_rows) >= DATAROWS_IMPORT_LIMIT:
185+
mea_to_mal_data_rows = mea_to_mal_data_rows[:DATAROWS_IMPORT_LIMIT]
159186
logger.warning(
160-
f"Got {len(mea_to_mal_data_rows_set)} data rows to import, trimmed down to {DATAROWS_IMPORT_LIMIT} data rows"
187+
f"Exeeded max data row limit {len(mea_to_mal_data_rows)}, trimmed down to {DATAROWS_IMPORT_LIMIT} data rows."
161188
)
162-
if len(mea_to_mal_data_rows) == 0:
163-
return import_job, None, None
164189

165190
try:
166191
batch = project.create_batch(name, mea_to_mal_data_rows, priority)
167-
try:
168-
mal_prediction_import = Entity.MEAToMALPredictionImport.create_for_model_run_data_rows(
169-
data_row_ids=mea_to_mal_data_rows,
170-
project_id=project_id,
171-
**kwargs)
172-
return import_job, batch, mal_prediction_import
173-
except:
174-
return import_job, batch, None
175-
except:
192+
except Exception as e:
193+
logger.warning(f"Failed to create batch. Messsage : {e}.")
194+
# Unable to create batch
176195
return import_job, None, None
177196

197+
try:
198+
mal_prediction_import = Entity.MEAToMALPredictionImport.create_for_model_run_data_rows(
199+
data_row_ids=mea_to_mal_data_rows,
200+
project_id=project_id,
201+
**kwargs)
202+
mal_prediction_import.wait_until_done()
203+
except Exception as e:
204+
logger.warning(
205+
f"Failed to create MEA to MAL prediction import. Message : {e}."
206+
)
207+
# Unable to create mea to mal prediction import
208+
return import_job, batch, None
209+
210+
return import_job, batch, mal_prediction_import
211+
178212
def add_predictions(
179213
self,
180214
name: str,

0 commit comments

Comments
 (0)