mirror of
https://github.com/storytold/artcraft.git
synced 2026-11-12 04:42:16 +00:00
don't doubly decode polymorphic args for each job detail
This commit is contained in:
1 parent
64c990b66e
commit
53bbcee54d
15 files changed
+75
-63
No files matched your search
+5
-4
@@ -23,10 +23,11 @@ use mysql_queries::queries::generic_inference::web::job_status::GenericInference
|
||||
use redis_common::redis_keys::RedisKeys;
|
||||
use tokens::tokens::generic_inference_jobs::InferenceJobToken;
|
||||
use tokens::tokens::media_files::MediaFileToken;
|
||||
|
||||
use crate::http_server::endpoints::inference_job::common_responses::live_portrait::JobDetailsLivePortraitRequest;
|
||||
use crate::http_server::endpoints::inference_job::utils::estimate_job_progress::estimate_job_progress;
|
||||
use crate::http_server::endpoints::inference_job::utils::extract_live_portrait_details::extract_live_portrait_details;
|
||||
use crate::http_server::endpoints::inference_job::utils::extract_polymorphic_inference_args::extract_polymorphic_inference_args;
|
||||
use crate::http_server::endpoints::inference_job::utils::estimates::estimate_job_progress::estimate_job_progress;
|
||||
use crate::http_server::endpoints::inference_job::utils::extractors::extract_live_portrait_details::extract_live_portrait_details;
|
||||
use crate::http_server::endpoints::inference_job::utils::extractors::extract_polymorphic_inference_args::extract_polymorphic_inference_args;
|
||||
use crate::http_server::endpoints::media_files::get::batch_get_media_files_handler::BatchGetMediaFilesQueryParams;
|
||||
use crate::http_server::web_utils::filter_model_name::maybe_filter_model_name;
|
||||
use crate::http_server::web_utils::response_error_helpers::to_simple_json_error;
|
||||
@@ -264,7 +265,7 @@ fn db_record_to_response_payload(
|
||||
.ok()
|
||||
.flatten();
|
||||
|
||||
let progress_percentage = estimate_job_progress(&record);
|
||||
let progress_percentage = estimate_job_progress(&record, maybe_polymorphic_args.as_ref());
|
||||
|
||||
BatchInferenceJobStatusResponsePayload {
|
||||
job_token: record.job_token,
|
||||
|
||||
+5
-4
@@ -20,10 +20,11 @@ use mysql_queries::queries::generic_inference::web::get_inference_job_status::ge
|
||||
use mysql_queries::queries::generic_inference::web::job_status::GenericInferenceJobStatus;
|
||||
use redis_common::redis_keys::RedisKeys;
|
||||
use tokens::tokens::generic_inference_jobs::InferenceJobToken;
|
||||
|
||||
use crate::http_server::endpoints::inference_job::common_responses::live_portrait::JobDetailsLivePortraitRequest;
|
||||
use crate::http_server::endpoints::inference_job::utils::estimate_job_progress::estimate_job_progress;
|
||||
use crate::http_server::endpoints::inference_job::utils::extract_live_portrait_details::extract_live_portrait_details;
|
||||
use crate::http_server::endpoints::inference_job::utils::extract_polymorphic_inference_args::extract_polymorphic_inference_args;
|
||||
use crate::http_server::endpoints::inference_job::utils::estimates::estimate_job_progress::estimate_job_progress;
|
||||
use crate::http_server::endpoints::inference_job::utils::extractors::extract_live_portrait_details::extract_live_portrait_details;
|
||||
use crate::http_server::endpoints::inference_job::utils::extractors::extract_polymorphic_inference_args::extract_polymorphic_inference_args;
|
||||
use crate::http_server::web_utils::filter_model_name::maybe_filter_model_name;
|
||||
use crate::http_server::web_utils::response_error_helpers::to_simple_json_error;
|
||||
use crate::state::server_state::ServerState;
|
||||
@@ -254,7 +255,7 @@ fn record_to_payload(
|
||||
.ok()
|
||||
.flatten();
|
||||
|
||||
let progress_percentage = estimate_job_progress(&record);
|
||||
let progress_percentage = estimate_job_progress(&record, maybe_polymorphic_args.as_ref());
|
||||
|
||||
InferenceJobStatusResponsePayload {
|
||||
job_token: record.job_token,
|
||||
|
||||
+4
-4
@@ -26,9 +26,9 @@ use tokens::tokens::media_files::MediaFileToken;
|
||||
use tokens::tokens::users::UserToken;
|
||||
|
||||
use crate::http_server::endpoints::inference_job::common_responses::live_portrait::JobDetailsLivePortraitRequest;
|
||||
use crate::http_server::endpoints::inference_job::utils::estimate_job_progress::estimate_job_progress;
|
||||
use crate::http_server::endpoints::inference_job::utils::extract_live_portrait_details::extract_live_portrait_details;
|
||||
use crate::http_server::endpoints::inference_job::utils::extract_polymorphic_inference_args::extract_polymorphic_inference_args;
|
||||
use crate::http_server::endpoints::inference_job::utils::estimates::estimate_job_progress::estimate_job_progress;
|
||||
use crate::http_server::endpoints::inference_job::utils::extractors::extract_live_portrait_details::extract_live_portrait_details;
|
||||
use crate::http_server::endpoints::inference_job::utils::extractors::extract_polymorphic_inference_args::extract_polymorphic_inference_args;
|
||||
use crate::http_server::web_utils::filter_model_name::maybe_filter_model_name;
|
||||
use crate::http_server::web_utils::response_error_helpers::to_simple_json_error;
|
||||
use crate::state::server_state::ServerState;
|
||||
@@ -329,7 +329,7 @@ fn db_record_to_response_payload(
|
||||
.ok()
|
||||
.flatten();
|
||||
|
||||
let progress_percentage = estimate_job_progress(&record);
|
||||
let progress_percentage = estimate_job_progress(&record, maybe_polymorphic_args.as_ref());
|
||||
|
||||
ListSessionJobsItem {
|
||||
job_token: record.job_token,
|
||||
|
||||
+10
-5
@@ -1,10 +1,10 @@
|
||||
use std::cmp::max;
|
||||
|
||||
use mysql_queries::payloads::generic_inference_args::generic_inference_args::PolymorphicInferenceArgs;
|
||||
use mysql_queries::payloads::generic_inference_args::workflow_payload::WorkflowArgs;
|
||||
use mysql_queries::queries::generic_inference::web::job_status::GenericInferenceJobStatus;
|
||||
|
||||
use crate::http_server::endpoints::inference_job::utils::extract_comfy_workflow_args::extract_comfy_workflow_args;
|
||||
use crate::http_server::endpoints::inference_job::utils::percent::percent;
|
||||
use crate::http_server::endpoints::inference_job::utils::estimates::percent::percent;
|
||||
use crate::http_server::endpoints::inference_job::utils::extractors::extract_comfy_workflow_args::extract_comfy_workflow_args;
|
||||
|
||||
const COMFY_JOB_DEFAULT_VIDEO_LENGTH_SECONDS : u64 = 3;
|
||||
|
||||
@@ -16,8 +16,13 @@ const COMFY_JOB_AVERAGE_FACE_FUSION_EXECUTION_SECONDS_PER_SECOND: u64 = 40;
|
||||
// TODO: These numbers are made up. We should measure the average job durations.
|
||||
const COMFY_FALLBACK_AVERAGE_JOB_DURATION_SECONDS: u64 = 60 * 5;
|
||||
|
||||
pub fn comfy_workflow_estimate(job: &GenericInferenceJobStatus, job_duration_seconds: u64) -> u8 {
|
||||
let args = match extract_comfy_workflow_args(job) {
|
||||
pub fn comfy_workflow_estimate(maybe_args: Option<&PolymorphicInferenceArgs>, job_duration_seconds: u64) -> u8 {
|
||||
let args = match maybe_args {
|
||||
Some(args) => args,
|
||||
None => return percent(job_duration_seconds, COMFY_FALLBACK_AVERAGE_JOB_DURATION_SECONDS),
|
||||
};
|
||||
|
||||
let args = match extract_comfy_workflow_args(args) {
|
||||
Some(args) => args,
|
||||
None => return percent(job_duration_seconds, COMFY_FALLBACK_AVERAGE_JOB_DURATION_SECONDS),
|
||||
};
|
||||
+11
-10
@@ -2,17 +2,18 @@ use std::cmp::min;
|
||||
|
||||
use enums::by_table::generic_inference_jobs::inference_category::InferenceCategory;
|
||||
use enums::common::job_status_plus::JobStatusPlus;
|
||||
use mysql_queries::payloads::generic_inference_args::generic_inference_args::PolymorphicInferenceArgs;
|
||||
use mysql_queries::queries::generic_inference::web::job_status::GenericInferenceJobStatus;
|
||||
|
||||
use crate::http_server::endpoints::inference_job::utils::comfy_workflow_estimate::comfy_workflow_estimate;
|
||||
use crate::http_server::endpoints::inference_job::utils::percent::percent;
|
||||
use crate::http_server::endpoints::inference_job::utils::estimates::comfy_workflow_estimate::comfy_workflow_estimate;
|
||||
use crate::http_server::endpoints::inference_job::utils::estimates::percent::percent;
|
||||
|
||||
// TODO: These numbers are made up. We should measure the average job durations.
|
||||
const LIPSYNC_JOB_AVERAGE_SECONDS : u64 = 60 * 3;
|
||||
const TTS_JOB_AVERAGE_SECONDS : u64 = 7;
|
||||
const VC_JOB_AVERAGE_SECONDS : u64 = 90;
|
||||
|
||||
pub fn estimate_job_progress(job: &GenericInferenceJobStatus) -> u8 {
|
||||
pub fn estimate_job_progress(job: &GenericInferenceJobStatus, maybe_args: Option<&PolymorphicInferenceArgs>) -> u8 {
|
||||
match job.status {
|
||||
// Jobs that haven't started
|
||||
JobStatusPlus::Pending
|
||||
@@ -53,7 +54,7 @@ pub fn estimate_job_progress(job: &GenericInferenceJobStatus) -> u8 {
|
||||
InferenceCategory::VoiceConversion => percent(duration_seconds, VC_JOB_AVERAGE_SECONDS),
|
||||
|
||||
// TODO: Better estimate using video duration, params, etc.
|
||||
InferenceCategory::Workflow => comfy_workflow_estimate(job, duration_seconds),
|
||||
InferenceCategory::Workflow => comfy_workflow_estimate(maybe_args, duration_seconds),
|
||||
|
||||
// NB: We don't run these job types anymore.
|
||||
InferenceCategory::FormatConversion => 0,
|
||||
@@ -75,20 +76,20 @@ mod tests {
|
||||
use enums::common::job_status_plus::JobStatusPlus;
|
||||
use mysql_queries::queries::generic_inference::web::job_status::GenericInferenceJobStatus;
|
||||
|
||||
use crate::http_server::endpoints::inference_job::utils::estimate_job_progress::estimate_job_progress;
|
||||
use crate::http_server::endpoints::inference_job::utils::estimates::estimate_job_progress::estimate_job_progress;
|
||||
|
||||
#[test]
|
||||
fn test_pending() {
|
||||
let mut job = GenericInferenceJobStatus::default();
|
||||
job.status = JobStatusPlus::Pending;
|
||||
assert_eq!(0, estimate_job_progress(&job));
|
||||
assert_eq!(0, estimate_job_progress(&job, None));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_complete_success() {
|
||||
let mut job = GenericInferenceJobStatus::default();
|
||||
job.status = JobStatusPlus::CompleteSuccess;
|
||||
assert_eq!(100, estimate_job_progress(&job));
|
||||
assert_eq!(100, estimate_job_progress(&job, None));
|
||||
}
|
||||
|
||||
mod running_jobs {
|
||||
@@ -101,7 +102,7 @@ mod tests {
|
||||
job.created_at = Utc::now();
|
||||
job.maybe_first_started_at = Some(Utc::now());
|
||||
job.database_clock = Utc::now();
|
||||
assert_eq!(0, estimate_job_progress(&job));
|
||||
assert_eq!(0, estimate_job_progress(&job, None));
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -111,7 +112,7 @@ mod tests {
|
||||
job.created_at = Utc::now() - Duration::seconds(10);
|
||||
job.maybe_first_started_at = Some(Utc::now() - Duration::seconds(10));
|
||||
job.database_clock = Utc::now();
|
||||
assert_eq!(5, estimate_job_progress(&job));
|
||||
assert_eq!(5, estimate_job_progress(&job, None));
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -121,7 +122,7 @@ mod tests {
|
||||
job.created_at = Utc::now() - Duration::days(10);
|
||||
job.maybe_first_started_at = Some(Utc::now() - Duration::days(10));
|
||||
job.database_clock = Utc::now();
|
||||
assert_eq!(95, estimate_job_progress(&job));
|
||||
assert_eq!(95, estimate_job_progress(&job, None));
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
pub mod comfy_workflow_estimate;
|
||||
pub mod estimate_job_progress;
|
||||
mod percent;
|
||||
File renamed without changes.
-26
@@ -1,26 +0,0 @@
|
||||
use anyhow::anyhow;
|
||||
|
||||
use errors::AnyhowResult;
|
||||
use mysql_queries::payloads::generic_inference_args::generic_inference_args::PolymorphicInferenceArgs;
|
||||
use mysql_queries::payloads::generic_inference_args::workflow_payload::WorkflowArgs;
|
||||
use mysql_queries::queries::generic_inference::web::job_status::GenericInferenceJobStatus;
|
||||
|
||||
use crate::http_server::endpoints::inference_job::utils::extract_polymorphic_inference_args::extract_polymorphic_inference_args;
|
||||
|
||||
pub fn extract_comfy_workflow_args(job: &GenericInferenceJobStatus) -> Option<WorkflowArgs> {
|
||||
extract_comfy_workflow_args_fallible(job).ok().flatten()
|
||||
}
|
||||
|
||||
pub fn extract_comfy_workflow_args_fallible(job: &GenericInferenceJobStatus) -> AnyhowResult<Option<WorkflowArgs>> {
|
||||
let maybe_args = extract_polymorphic_inference_args(job)?;
|
||||
|
||||
match maybe_args {
|
||||
Some(args) => match args {
|
||||
PolymorphicInferenceArgs::Cu(workflow_args) => Ok(Some(workflow_args.clone())),
|
||||
_ => return Err(anyhow!("wrong inner args for job!")),
|
||||
},
|
||||
None => {
|
||||
return Err(anyhow!("no args for job!"));
|
||||
}
|
||||
}
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
use anyhow::anyhow;
|
||||
|
||||
use errors::AnyhowResult;
|
||||
use mysql_queries::payloads::generic_inference_args::generic_inference_args::PolymorphicInferenceArgs;
|
||||
use mysql_queries::payloads::generic_inference_args::workflow_payload::WorkflowArgs;
|
||||
|
||||
pub fn extract_comfy_workflow_args(args: &PolymorphicInferenceArgs) -> Option<WorkflowArgs> {
|
||||
extract_comfy_workflow_args_fallible(args).ok().flatten()
|
||||
}
|
||||
|
||||
pub fn extract_comfy_workflow_args_fallible(args: &PolymorphicInferenceArgs) -> AnyhowResult<Option<WorkflowArgs>> {
|
||||
match args {
|
||||
PolymorphicInferenceArgs::Cu(workflow_args) => Ok(Some(workflow_args.clone())),
|
||||
_ => return Err(anyhow!("wrong inner args for job!")),
|
||||
}
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
+3
@@ -0,0 +1,3 @@
|
||||
pub mod extract_comfy_workflow_args;
|
||||
pub mod extract_live_portrait_details;
|
||||
pub mod extract_polymorphic_inference_args;
|
||||
+2
-6
@@ -1,6 +1,2 @@
|
||||
mod comfy_workflow_estimate;
|
||||
mod extract_comfy_workflow_args;
|
||||
mod percent;
|
||||
pub mod estimate_job_progress;
|
||||
pub mod extract_live_portrait_details;
|
||||
pub mod extract_polymorphic_inference_args;
|
||||
pub mod estimates;
|
||||
pub mod extractors;
|
||||
+8
-2
@@ -24,7 +24,8 @@ use redis_schema::keys::inference_job::style_transfer_progress_key::StyleTransfe
|
||||
use redis_schema::payloads::inference_job::style_transfer_progress_state::{InferenceProgressDetailsResponse, InferenceStageDetails};
|
||||
use tokens::tokens::generic_inference_jobs::InferenceJobToken;
|
||||
|
||||
use crate::http_server::endpoints::inference_job::utils::estimate_job_progress::estimate_job_progress;
|
||||
use crate::http_server::endpoints::inference_job::utils::estimates::estimate_job_progress::estimate_job_progress;
|
||||
use crate::http_server::endpoints::inference_job::utils::extractors::extract_polymorphic_inference_args::extract_polymorphic_inference_args;
|
||||
use crate::http_server::web_utils::filter_model_name::maybe_filter_model_name;
|
||||
use crate::http_server::web_utils::response_error_helpers::to_simple_json_error;
|
||||
use crate::state::server_state::ServerState;
|
||||
@@ -212,7 +213,12 @@ fn record_to_payload(
|
||||
) -> InferenceJobStatusResponsePayload {
|
||||
let inference_category = record.request_details.inference_category;
|
||||
|
||||
let progress_percentage = estimate_job_progress(&record);
|
||||
// NB: Fail open. We don't want to fail the request if we can't extract the args.
|
||||
let maybe_polymorphic_args = extract_polymorphic_inference_args(&record)
|
||||
.ok()
|
||||
.flatten();
|
||||
|
||||
let progress_percentage = estimate_job_progress(&record, maybe_polymorphic_args.as_ref());
|
||||
|
||||
InferenceJobStatusResponsePayload {
|
||||
job_token: record.job_token,
|
||||
|
||||
+8
-2
@@ -30,7 +30,8 @@ use redis_schema::keys::inference_job::style_transfer_progress_key::StyleTransfe
|
||||
use redis_schema::payloads::inference_job::style_transfer_progress_state::{InferenceProgressDetailsResponse, InferenceStageDetails};
|
||||
use tokens::tokens::generic_inference_jobs::InferenceJobToken;
|
||||
|
||||
use crate::http_server::endpoints::inference_job::utils::estimate_job_progress::estimate_job_progress;
|
||||
use crate::http_server::endpoints::inference_job::utils::estimates::estimate_job_progress::estimate_job_progress;
|
||||
use crate::http_server::endpoints::inference_job::utils::extractors::extract_polymorphic_inference_args::extract_polymorphic_inference_args;
|
||||
use crate::http_server::endpoints::workflows::enqueue::{progress_tracker_server, progress_tracker_session};
|
||||
use crate::http_server::web_utils::filter_model_name::maybe_filter_model_name;
|
||||
use crate::http_server::web_utils::response_error_helpers::to_simple_json_error;
|
||||
@@ -221,7 +222,12 @@ fn record_to_payload(
|
||||
) -> InferenceJobStatusResponsePayload {
|
||||
let inference_category = record.request_details.inference_category;
|
||||
|
||||
let progress_percentage = estimate_job_progress(&record);
|
||||
// NB: Fail open. We don't want to fail the request if we can't extract the args.
|
||||
let maybe_polymorphic_args = extract_polymorphic_inference_args(&record)
|
||||
.ok()
|
||||
.flatten();
|
||||
|
||||
let progress_percentage = estimate_job_progress(&record, maybe_polymorphic_args.as_ref());
|
||||
|
||||
InferenceJobStatusResponsePayload {
|
||||
job_token: record.job_token,
|
||||
|
||||
Reference in new issue
Block a user