so-vits-svc/cluster/train_cluster.py

85 lines
3.0 KiB
Python
Raw Normal View History

2023-05-18 12:52:17 +00:00
import time,pdb
import tqdm
from time import time as ttime
2023-03-10 10:11:04 +00:00
import os
from pathlib import Path
import logging
import argparse
2023-05-18 13:09:47 +00:00
from kmeans import KMeansGPU
2023-03-10 10:11:04 +00:00
import torch
import numpy as np
2023-05-18 12:52:17 +00:00
from sklearn.cluster import KMeans,MiniBatchKMeans
2023-03-10 10:11:04 +00:00
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
2023-05-18 12:52:17 +00:00
from time import time as ttime
import pynvml,torch
2023-03-10 10:11:04 +00:00
2023-05-18 12:52:17 +00:00
def train_cluster(in_dir, n_clusters, use_minibatch=True, verbose=False,use_gpu=False):#gpu_minibatch真拉虽然库支持但是也不考虑
2023-03-10 10:11:04 +00:00
logger.info(f"Loading features from {in_dir}")
features = []
nums = 0
for path in tqdm.tqdm(in_dir.glob("*.soft.pt")):
2023-05-18 12:52:17 +00:00
# for name in os.listdir(in_dir):
# path="%s/%s"%(in_dir,name)
features.append(torch.load(path,map_location="cpu").squeeze(0).numpy().T)
2023-03-10 10:11:04 +00:00
# print(features[-1].shape)
features = np.concatenate(features, axis=0)
print(nums, features.nbytes/ 1024**2, "MB , shape:",features.shape, features.dtype)
features = features.astype(np.float32)
logger.info(f"Clustering features of shape: {features.shape}")
t = time.time()
2023-05-18 12:52:17 +00:00
if(use_gpu==False):
if use_minibatch:
kmeans = MiniBatchKMeans(n_clusters=n_clusters,verbose=verbose, batch_size=4096, max_iter=80).fit(features)
else:
kmeans = KMeans(n_clusters=n_clusters,verbose=verbose).fit(features)
2023-03-10 10:11:04 +00:00
else:
2023-05-18 12:52:17 +00:00
kmeans = KMeansGPU(n_clusters=n_clusters, mode='euclidean', verbose=2 if verbose else 0,max_iter=500,tol=1e-2)#
features=torch.from_numpy(features)#.to(device)
labels = kmeans.fit_predict(features)#
2023-03-10 10:11:04 +00:00
print(time.time()-t, "s")
x = {
2023-05-18 12:52:17 +00:00
"n_features_in_": kmeans.n_features_in_ if use_gpu==False else features.shape[0],
"_n_threads": kmeans._n_threads if use_gpu==False else 4,
"cluster_centers_": kmeans.cluster_centers_ if use_gpu==False else kmeans.centroids.cpu().numpy(),
2023-03-10 10:11:04 +00:00
}
print("end")
return x
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--dataset', type=Path, default="./dataset/44k",
help='path of training data directory')
parser.add_argument('--output', type=Path, default="logs/44k",
help='path of model output directory')
2023-05-18 13:09:47 +00:00
parser.add_argument('--gpu',action='store_true', default=False ,
2023-05-18 12:52:17 +00:00
help='to use GPU')
2023-03-10 10:11:04 +00:00
args = parser.parse_args()
checkpoint_dir = args.output
dataset = args.dataset
2023-05-18 13:09:47 +00:00
use_gpu = args.gpu
2023-05-18 12:52:17 +00:00
n_clusters = 1000
2023-03-10 10:11:04 +00:00
ckpt = {}
for spk in os.listdir(dataset):
if os.path.isdir(dataset/spk):
print(f"train kmeans for {spk}...")
in_dir = dataset/spk
2023-05-18 12:52:17 +00:00
x = train_cluster(in_dir, n_clusters,use_minibatch=False,verbose=False,use_gpu=use_gpu)
2023-03-10 10:11:04 +00:00
ckpt[spk] = x
checkpoint_path = checkpoint_dir / f"kmeans_{n_clusters}.pt"
checkpoint_path.parent.mkdir(exist_ok=True, parents=True)
torch.save(
ckpt,
checkpoint_path,
)
2023-05-18 12:52:17 +00:00