mirror of
https://github.com/blakeblackshear/frigate.git
synced 2025-12-06 21:44:13 +03:00
Add failed training type
This commit is contained in:
parent
6c47a131e4
commit
03b9b05d17
@ -23,6 +23,7 @@ class ModelStatusTypesEnum(str, Enum):
|
|||||||
error = "error"
|
error = "error"
|
||||||
training = "training"
|
training = "training"
|
||||||
complete = "complete"
|
complete = "complete"
|
||||||
|
failed = "failed"
|
||||||
|
|
||||||
|
|
||||||
class TrackedObjectUpdateTypesEnum(str, Enum):
|
class TrackedObjectUpdateTypesEnum(str, Enum):
|
||||||
|
|||||||
@ -306,13 +306,13 @@ def kickoff_model_training(
|
|||||||
logger.error(
|
logger.error(
|
||||||
f"Training subprocess failed for {model_name} (exit code: {training_process.exitcode})"
|
f"Training subprocess failed for {model_name} (exit code: {training_process.exitcode})"
|
||||||
)
|
)
|
||||||
# mark training as complete (not failed) so UI doesn't stay in training state
|
# mark training as failed so UI shows error state
|
||||||
# but don't reload the model since it failed
|
# don't reload the model since it failed
|
||||||
requestor.send_data(
|
requestor.send_data(
|
||||||
UPDATE_MODEL_STATE,
|
UPDATE_MODEL_STATE,
|
||||||
{
|
{
|
||||||
"model": model_name,
|
"model": model_name,
|
||||||
"state": ModelStatusTypesEnum.complete,
|
"state": ModelStatusTypesEnum.failed,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -35,7 +35,8 @@
|
|||||||
"deleteCategoryFailed": "Failed to delete class: {{errorMessage}}",
|
"deleteCategoryFailed": "Failed to delete class: {{errorMessage}}",
|
||||||
"deleteModelFailed": "Failed to delete model: {{errorMessage}}",
|
"deleteModelFailed": "Failed to delete model: {{errorMessage}}",
|
||||||
"categorizeFailed": "Failed to categorize image: {{errorMessage}}",
|
"categorizeFailed": "Failed to categorize image: {{errorMessage}}",
|
||||||
"trainingFailed": "Failed to start model training: {{errorMessage}}",
|
"trainingFailed": "Model training failed. Check Frigate logs for details.",
|
||||||
|
"trainingFailedToStart": "Failed to start model training: {{errorMessage}}",
|
||||||
"updateModelFailed": "Failed to update model: {{errorMessage}}",
|
"updateModelFailed": "Failed to update model: {{errorMessage}}",
|
||||||
"renameCategoryFailed": "Failed to rename class: {{errorMessage}}"
|
"renameCategoryFailed": "Failed to rename class: {{errorMessage}}"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -87,7 +87,8 @@ export type ModelState =
|
|||||||
| "downloaded"
|
| "downloaded"
|
||||||
| "error"
|
| "error"
|
||||||
| "training"
|
| "training"
|
||||||
| "complete";
|
| "complete"
|
||||||
|
| "failed";
|
||||||
|
|
||||||
export type EmbeddingsReindexProgressType = {
|
export type EmbeddingsReindexProgressType = {
|
||||||
thumbnails: number;
|
thumbnails: number;
|
||||||
|
|||||||
@ -103,6 +103,11 @@ export default function ModelTrainingView({ model }: ModelTrainingViewProps) {
|
|||||||
});
|
});
|
||||||
setWasTraining(false);
|
setWasTraining(false);
|
||||||
refreshDataset();
|
refreshDataset();
|
||||||
|
} else if (modelState == "failed") {
|
||||||
|
toast.error(t("toast.error.trainingFailed"), {
|
||||||
|
position: "top-center",
|
||||||
|
});
|
||||||
|
setWasTraining(false);
|
||||||
}
|
}
|
||||||
// only refresh when modelState changes
|
// only refresh when modelState changes
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
@ -188,7 +193,7 @@ export default function ModelTrainingView({ model }: ModelTrainingViewProps) {
|
|||||||
error.response?.data?.detail ||
|
error.response?.data?.detail ||
|
||||||
"Unknown error";
|
"Unknown error";
|
||||||
|
|
||||||
toast.error(t("toast.error.trainingFailed", { errorMessage }), {
|
toast.error(t("toast.error.trainingFailedToStart", { errorMessage }), {
|
||||||
position: "top-center",
|
position: "top-center",
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -437,9 +442,9 @@ export default function ModelTrainingView({ model }: ModelTrainingViewProps) {
|
|||||||
<Button
|
<Button
|
||||||
className="flex justify-center gap-2"
|
className="flex justify-center gap-2"
|
||||||
onClick={trainModel}
|
onClick={trainModel}
|
||||||
variant="select"
|
variant={modelState == "failed" ? "destructive" : "select"}
|
||||||
disabled={
|
disabled={
|
||||||
modelState != "complete" ||
|
(modelState != "complete" && modelState != "failed") ||
|
||||||
(trainingMetadata?.new_images_count ?? 0) === 0
|
(trainingMetadata?.new_images_count ?? 0) === 0
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
@ -462,7 +467,7 @@ export default function ModelTrainingView({ model }: ModelTrainingViewProps) {
|
|||||||
</Button>
|
</Button>
|
||||||
</TooltipTrigger>
|
</TooltipTrigger>
|
||||||
{((trainingMetadata?.new_images_count ?? 0) === 0 ||
|
{((trainingMetadata?.new_images_count ?? 0) === 0 ||
|
||||||
modelState != "complete") && (
|
(modelState != "complete" && modelState != "failed")) && (
|
||||||
<TooltipPortal>
|
<TooltipPortal>
|
||||||
<TooltipContent>
|
<TooltipContent>
|
||||||
{modelState == "training"
|
{modelState == "training"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user