From 033306439c7fec3eac99917c9ac43b2d37c30037 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Tue, 8 Jul 2025 16:40:38 +0900 Subject: [PATCH] fix(train): cannot extract feature on non-cuda devices (fix #123) --- configs/config.py | 27 +++++++++ infer/lib/rvcmd.py | 8 +-- infer/modules/train/extract_feature_print.py | 18 +++--- web.py | 64 ++------------------ 4 files changed, 43 insertions(+), 74 deletions(-) diff --git a/configs/config.py b/configs/config.py index 3fb3410..9db1126 100644 --- a/configs/config.py +++ b/configs/config.py @@ -53,6 +53,7 @@ class Config(metaclass=Singleton): self.instead = "" self.preprocess_per = 3.7 self.x_pad, self.x_query, self.x_center, self.x_max = self.device_config() + self.default_batch_size = self.get_default_batch_size() @staticmethod def load_config_json() -> dict: @@ -136,6 +137,32 @@ class Config(metaclass=Singleton): logging.warning("Using insecure weight loading for fairseq dictionary") except AttributeError: pass + + @staticmethod + def get_default_batch_size() -> int: + if not torch.cuda.is_available(): + #TODO: add non-cuda multicards + return 1 + # 判断是否有能用来训练和加速推理的N卡 + ngpu = torch.cuda.device_count() + if not ngpu: + return 1 + mem = [] + if_gpu_ok = False + + for i in range(ngpu): + if_gpu_ok = True # 至少有一张能用的N卡 + mem.append( + int( + torch.cuda.get_device_properties(i).total_memory + / 1024 / 1024 / 1024 + 0.4 + ) + ) + if if_gpu_ok: + default_batch_size = min(mem) // 2 + else: + default_batch_size = 1 + return default_batch_size def use_fp32_config(self): for config_file in version_config_list: diff --git a/infer/lib/rvcmd.py b/infer/lib/rvcmd.py index 32b87d3..b49ffd4 100644 --- a/infer/lib/rvcmd.py +++ b/infer/lib/rvcmd.py @@ -194,11 +194,11 @@ def download_all_assets(tmpdir: str, version="0.2.5"): if not architecture: logger.error(f"architecture {architecture} is not supported") exit(1) + BASE_URL = "https://github.com/fumiama/RVC-Models-Downloader/releases/download/" + suffix = "zip" if is_win else "tar.gz" + RVCMD_URL = BASE_URL + f"v{version}/rvcmd_{system_type}_{architecture}.{suffix}" + cmdfile = os.path.join(tmpdir, "rvcmd") try: - BASE_URL = "https://github.com/fumiama/RVC-Models-Downloader/releases/download/" - suffix = "zip" if is_win else "tar.gz" - RVCMD_URL = BASE_URL + f"v{version}/rvcmd_{system_type}_{architecture}.{suffix}" - cmdfile = os.path.join(tmpdir, "rvcmd") if is_win: download_and_extract_zip(RVCMD_URL, tmpdir) cmdfile += ".exe" diff --git a/infer/modules/train/extract_feature_print.py b/infer/modules/train/extract_feature_print.py index 1c3ec9a..ef6fb6a 100644 --- a/infer/modules/train/extract_feature_print.py +++ b/infer/modules/train/extract_feature_print.py @@ -10,19 +10,17 @@ from infer.lib.audio import load_audio os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1" os.environ["PYTORCH_MPS_HIGH_WATERMARK_RATIO"] = "0.0" +if len(sys.argv) != 8: + sys.exit(0) + device = sys.argv[1] n_part = int(sys.argv[2]) i_part = int(sys.argv[3]) -if len(sys.argv) == 7: - exp_dir = sys.argv[4] - version = sys.argv[5] - is_half = sys.argv[6].lower() == "true" -else: - i_gpu = sys.argv[4] - exp_dir = sys.argv[5] - os.environ["CUDA_VISIBLE_DEVICES"] = str(i_gpu) - version = sys.argv[6] - is_half = sys.argv[7].lower() == "true" +i_gpu = sys.argv[4] +os.environ["CUDA_VISIBLE_DEVICES"] = str(i_gpu) +exp_dir = sys.argv[5] +version = sys.argv[6] +is_half = sys.argv[7].lower() == "true" import fairseq import numpy as np diff --git a/web.py b/web.py index c929930..c493ec4 100644 --- a/web.py +++ b/web.py @@ -78,63 +78,6 @@ if config.dml == True: i18n = I18nAuto() logger.info(i18n) -# 判断是否有能用来训练和加速推理的N卡 -ngpu = torch.cuda.device_count() -gpu_infos = [] -mem = [] -if_gpu_ok = False - -if torch.cuda.is_available() or ngpu != 0: - for i in range(ngpu): - gpu_name = torch.cuda.get_device_name(i) - if any( - value in gpu_name.upper() - for value in [ - "10", - "16", - "20", - "30", - "40", - "A2", - "A3", - "A4", - "P4", - "A50", - "500", - "A60", - "70", - "80", - "90", - "M4", - "T4", - "TITAN", - "4060", - "L", - "6000", - ] - ): - # A10#A100#V100#A40#P40#M40#K80#A4500 - if_gpu_ok = True # 至少有一张能用的N卡 - gpu_infos.append("%s\t%s" % (i, gpu_name)) - mem.append( - int( - torch.cuda.get_device_properties(i).total_memory - / 1024 - / 1024 - / 1024 - + 0.4 - ) - ) -if if_gpu_ok and len(gpu_infos) > 0: - gpu_info = "\n".join(gpu_infos) - default_batch_size = min(mem) // 2 -else: - gpu_info = i18n( - "Unfortunately, there is no compatible GPU available to support your training." - ) - default_batch_size = 1 -gpus = "-".join([i[0] for i in gpu_infos]) - weight_root = os.getenv("weight_root") weight_uvr5_root = os.getenv("weight_uvr5_root") @@ -314,6 +257,7 @@ def extract_f0_feature(n_p, f0method, if_f0, exp_dir, version19): exp_dir=sys.argv[4] os.environ["CUDA_VISIBLE_DEVICES"]=str(i_gpu) """ + gpus = [config.device] leng = len(gpus) ps = [] for idx, n_g in enumerate(gpus): @@ -1201,7 +1145,7 @@ with gr.Blocks(title="RVC WebUI") as app: with gr.Column(): gpu_info9 = gr.Textbox( label=i18n("GPU Information"), - value=gpu_info, + value=config.device, ) f0method8 = gr.Radio( label=i18n( @@ -1254,7 +1198,7 @@ with gr.Blocks(title="RVC WebUI") as app: maximum=40, step=1, label=i18n("Batch size per GPU"), - value=default_batch_size, + value=config.default_batch_size, interactive=True, ) if_save_latest13 = gr.Radio( @@ -1296,7 +1240,7 @@ with gr.Blocks(title="RVC WebUI") as app: label=i18n( "Enter the GPU index(es) separated by '-', e.g., 0-1-2 to use GPU 0, 1, and 2" ), - value=gpus, + value="0", interactive=True, ) sr2.change(