From 5bf98f70d9bb06d85d5534cd3f8529e80f518835 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Mon, 22 May 2023 00:52:49 -0700 Subject: [PATCH] rework where temp storage lives: download vs workspace --- .../src/semi_persistent_cache_dir.rs | 4 +- .../job_loop/determine_dependency_status.rs | 2 + .../src/job/job_loop/main_loop.rs | 2 +- .../src/job/job_loop/process_single_job.rs | 2 +- .../tacotron2_v2_early_fakeyou/process_job.rs | 20 +++--- .../src/job/job_types/tts/vits/process_job.rs | 4 +- .../job_types/vc/so_vits_svc/process_job.rs | 8 +-- .../job/inference_job/src/job_dependencies.rs | 23 ++++++- crates/service/job/inference_job/src/main.rs | 63 +++++++++++-------- 9 files changed, 78 insertions(+), 50 deletions(-) diff --git a/crates/lib/jobs_common/src/semi_persistent_cache_dir.rs b/crates/lib/jobs_common/src/semi_persistent_cache_dir.rs index 752fb016eb..29dc860ab8 100644 --- a/crates/lib/jobs_common/src/semi_persistent_cache_dir.rs +++ b/crates/lib/jobs_common/src/semi_persistent_cache_dir.rs @@ -29,8 +29,8 @@ impl SemiPersistentCacheDir { Self::configured_root("/file_cache/") } - pub fn configured_root(root_path: &str) -> Self { - let cache_root = PathBuf::from(root_path); + pub fn configured_root>(root_path: P) -> Self { + let cache_root = root_path.as_ref().to_path_buf(); Self { cache_root: cache_root.clone(), diff --git a/crates/service/job/inference_job/src/job/job_loop/determine_dependency_status.rs b/crates/service/job/inference_job/src/job/job_loop/determine_dependency_status.rs index 549b9e30b6..715f4f0f31 100644 --- a/crates/service/job/inference_job/src/job/job_loop/determine_dependency_status.rs +++ b/crates/service/job/inference_job/src/job/job_loop/determine_dependency_status.rs @@ -42,6 +42,7 @@ pub async fn determine_dependency_status(job_dependencies: &JobDependencies, job TtsModelType::Tacotron2 => { maybe_model_token = Some(model.model_token.to_string()); Some(job_dependencies + .fs .semi_persistent_cache .tts_synthesizer_model_path(model.model_token.as_str())) } @@ -58,6 +59,7 @@ pub async fn determine_dependency_status(job_dependencies: &JobDependencies, job VoiceConversionModelType::SoVitsSvc => { maybe_model_token = Some(model.token.to_string()); Some(job_dependencies + .fs .semi_persistent_cache .voice_conversion_model_path(model.token.as_str())) } diff --git a/crates/service/job/inference_job/src/job/job_loop/main_loop.rs b/crates/service/job/inference_job/src/job/job_loop/main_loop.rs index bc01d8dbf2..d7e5e965b6 100644 --- a/crates/service/job/inference_job/src/job/job_loop/main_loop.rs +++ b/crates/service/job/inference_job/src/job/job_loop/main_loop.rs @@ -123,7 +123,7 @@ async fn process_job_batch(job_dependencies: &JobDependencies, jobs: Vec { warn!("Clearing full filesystem..."); - clear_full_filesystem(&job_dependencies.semi_persistent_cache)?; + clear_full_filesystem(&job_dependencies.fs.semi_persistent_cache)?; } // No-op ProcessSingleJobError::Other(_) => {} diff --git a/crates/service/job/inference_job/src/job/job_loop/process_single_job.rs b/crates/service/job/inference_job/src/job/job_loop/process_single_job.rs index 70dddf6ff0..9d218a58d6 100644 --- a/crates/service/job/inference_job/src/job/job_loop/process_single_job.rs +++ b/crates/service/job/inference_job/src/job/job_loop/process_single_job.rs @@ -124,7 +124,7 @@ pub async fn process_single_job( // ==================== SETUP TEMP DIRS ==================== // let temp_dir = format!("temp_{}", job.id.0); - let temp_dir = job_dependencies.scoped_temp_dir_creator.new_tempdir(&temp_dir) + let temp_dir = job_dependencies.fs.scoped_temp_dir_creator.new_tempdir(&temp_dir) .map_err(|err| ProcessSingleJobError::Other(anyhow!("filesystem error: {:?}", err)))?; let _p = temp_dir.path(); // TODO: Just so the build doesn't complain about unused. Remove. diff --git a/crates/service/job/inference_job/src/job/job_types/tts/tacotron2_v2_early_fakeyou/process_job.rs b/crates/service/job/inference_job/src/job/job_types/tts/tacotron2_v2_early_fakeyou/process_job.rs index 02364eb2ce..1475431184 100644 --- a/crates/service/job/inference_job/src/job/job_types/tts/tacotron2_v2_early_fakeyou/process_job.rs +++ b/crates/service/job/inference_job/src/job/job_types/tts/tacotron2_v2_early_fakeyou/process_job.rs @@ -53,7 +53,7 @@ pub async fn process_job(args: ProcessJobArgs<'_>) -> Result) -> Result) -> Result) -> Result) -> Result) -> Result) -> Result None, Some(vocoder) => { - let custom_vocoder_fs_path = args.job_dependencies.semi_persistent_cache.custom_vocoder_model_path(&vocoder.vocoder_token); + let custom_vocoder_fs_path = args.job_dependencies.fs.semi_persistent_cache.custom_vocoder_model_path(&vocoder.vocoder_token); let custom_vocoder_object_path = args.job_dependencies.bucket_path_unifier.vocoder_path(&vocoder.vocoder_private_bucket_hash); maybe_download_file_from_bucket( @@ -128,7 +128,7 @@ pub async fn process_job(args: ProcessJobArgs<'_>) -> Result) -> Result) -> Result) -> Result) -> Result) -> Result) -> Result) -> Result AnyhowResult<()> { @@ -116,13 +112,35 @@ async fn main() -> AnyhowResult<()> { Some(bucket_timeout), )?; - let temp_directory = easyenv::get_env_string_or_default( - "DOWNLOAD_TEMP_DIR", - DEFAULT_TEMP_DIR); + // Where we download models and resources to (typically a shared NFS volume in prod). + let temp_directory_downloads = easyenv::get_env_pathbuf_or_default( + "TEMP_DIR_DOWNLOADS", + PathBuf::from("/tmp/downloads") + ); - let temp_directory = PathBuf::from(temp_directory); + // Where we store scratch files for workloads (temporary processing). + let temp_directory_work = easyenv::get_env_pathbuf_or_default( + "TEMP_DIR_WORK", + PathBuf::from("/tmp/work") + ); - check_directory_exists(&temp_directory)?; + if !container_environment.server_environment.is_deployed_in_production() { + warn!("Creating temporary directories for non-production / development only!"); + create_dir_all_if_missing(&temp_directory_downloads)?; + create_dir_all_if_missing(&temp_directory_work)?; + } + + check_directory_exists(&temp_directory_downloads)?; + check_directory_exists(&temp_directory_work)?; + + let semi_persistent_cache = + SemiPersistentCacheDir::configured_root(&temp_directory_downloads); + + info!("Creating pod semi-persistent cache dirs..."); + semi_persistent_cache.create_custom_vocoder_model_path()?; + semi_persistent_cache.create_tts_pretrained_vocoder_model_path()?; + semi_persistent_cache.create_tts_synthesizer_model_path()?; + semi_persistent_cache.create_voice_conversion_model_path()?; let db_connection_string = easyenv::get_env_string_or_default( @@ -138,18 +156,6 @@ async fn main() -> AnyhowResult<()> { let common_env = CommonEnv::read_from_env()?; - let persistent_cache_path = easyenv::get_env_string_or_default( - ENV_SEMIPERSISTENT_CACHE_DIR, - "/tmp"); - - let semi_persistent_cache = - SemiPersistentCacheDir::configured_root(&persistent_cache_path); - - info!("Creating pod semi-persistent cache dirs..."); - semi_persistent_cache.create_tts_synthesizer_model_path()?; - semi_persistent_cache.create_tts_pretrained_vocoder_model_path()?; - semi_persistent_cache.create_custom_vocoder_model_path()?; - let waveglow_vocoder_model_filename = easyenv::get_env_string_or_default( "TTS_WAVEGLOW_VOCODER_MODEL_FILENAME", "waveglow.pth"); @@ -217,8 +223,12 @@ async fn main() -> AnyhowResult<()> { }; let job_dependencies = JobDependencies { - scoped_temp_dir_creator: ScopedTempDirCreator::for_directory(&temp_directory), - download_temp_directory: temp_directory, + fs: FileSystemDetails { + temp_directory_downloads: temp_directory_downloads.clone(), + temp_directory_work, + scoped_temp_dir_creator: ScopedTempDirCreator::for_directory(&temp_directory_downloads), + semi_persistent_cache, + }, mysql_pool, maybe_redis_pool: None, // TODO(bt, 2023-01-11): See note in JobDependencies maybe_keepalive_redis_pool, @@ -254,7 +264,6 @@ async fn main() -> AnyhowResult<()> { cold_filesystem_cache_starvation_threshold: easyenv::get_env_num("COLD_FILESYSTEM_CACHE_STARVATION_THRESHOLD", 3)?, bucket_path_unifier: BucketPathUnifier::default_paths(), - semi_persistent_cache, firehose_publisher, job_batch_wait_millis: common_env.job_batch_wait_millis, job_max_attempts: common_env.job_max_attempts as u16,