Error en el state dict del modelo.
vocab : Emilia_ZH_EN
tokenizer : pinyin
model : C:\Users\Win10.cache\huggingface\hub\models--SWivid--F5-TTS\snapshots\995ff41929c08ff968786b448a384330438b5cb6\F5TTS_Base\model_1200000.safetensors
Traceback (most recent call last):
File "J:\F5-TTS\gradio_app.py", line 47, in
F5TTS_ema_model = load_model(
File "J:\F5-TTS\model\utils_infer.py", line 135, in load_model
model = load_checkpoint(model, ckpt_path, device, use_ema=use_ema)
File "J:\F5-TTS\model\utils.py", line 614, in load_checkpoint
model.load_state_dict(checkpoint["model_state_dict"])
File "J:\F5-TTS\venv\lib\site-packages\torch\nn\modules\module.py", line 2153, in load_state_dict
raise RuntimeError('Error(s) in loading state_dict for {}:\n\t{}'.format(
RuntimeError: Error(s) in loading state_dict for CFM:
Missing key(s) in state_dict: "mel_spec.mel_stft.spectrogram.window", "mel_spec.mel_stft.mel_scale.fb".
¿Quizás haga falta que nos compatas también el vocab de tu modelo en español?
Gracias!
Buenas, el vocab es el mismo que el original. Igualmente, lo subo por claridad. La forma más sencilla de cargar el modelo es como lo puse en el README, aunque también se puede cambiando el modelo en el código (F5-TTS\src\f5_tts\infer\infer_gradio.py, línea 46, poner "DiT, F5TTS_model_cfg, str(cached_path("hf://jpgallegoar/F5-Spanish/model_1200000.safetensors"))", o usar este otro repositorio que viene preparado: https://github.com/jpgallegoar/Spanish-F5)
Hola, gracias por tu aporte. Me gustaría saber que has tardado en entrenar / finetunear y que gráfica utilizaste para ello?
Buenas, utilicé una RTX 4090 durante 72h aproximadamente.
Te agradezco por los datos. Has utilizado la UI que facilitan para entrenar? Si es así, me podrías indicar los parametros y si es posible una breve explicación de los pasos que seguiste. Me disculpo si te pido mucho, simplemente estoy recien iniciando.
Muchas gracias, directamente lo instalé desde tu repositorio dedicado y funcionó sin problemas. Ahora me dispongo a hacer un fine tuning sobre tu modelo en español, veremos que sale!
No te disculpes, asi te ahorras todo el tiempo que yo invertí, para eso está la comunidad! Si, utilicé la app finetune_gradio, y los parámeteos que vienen predeterminado cuando le des al botón de auto. Lo único que cambié fue los valores de pasos a los que se guarda un nuevo modelo y el Model Last. El warmup lo puse en 40k pasos me parece
Muchas gracias, directamente lo instalé desde tu repositorio dedicado y funcionó sin problemas. Ahora me dispongo a hacer un fine tuning sobre tu modelo en español, veremos que sale!
Genial! Muy interesado en tus resultados, compartelos por aquí cuando tengas algo :)
Me salta error al seleccionar el modelo pre entrenado y su vocab :(
finetune_cli.py: error: unrecognized arguments: --file_checkpoint_train J:\Spanish-F5\spanish_model_tokenizer\model_1200000.safetensors
Traceback (most recent call last):
File "C:\Users\Win10\anaconda3\envs\f5-tts\lib\runpy.py", line 196, in _run_module_as_main
return _run_code(code, main_globals, None,
File "C:\Users\Win10\anaconda3\envs\f5-tts\lib\runpy.py", line 86, in run_code
exec(code, run_globals)
File "C:\Users\Win10\anaconda3\envs\f5-tts\Scripts\accelerate.exe_main.py", line 7, in
sys.exit(main())
File "C:\Users\Win10\anaconda3\envs\f5-tts\lib\site-packages\accelerate\commands\accelerate_cli.py", line 48, in main
args.func(args)
File "C:\Users\Win10\anaconda3\envs\f5-tts\lib\site-packages\accelerate\commands\launch.py", line 1168, in launch_command
simple_launcher(args)
File "C:\Users\Win10\anaconda3\envs\f5-tts\lib\site-packages\accelerate\commands\launch.py", line 763, in simple_launcher
raise subprocess.CalledProcessError(returncode=process.returncode, cmd=cmd)
subprocess.CalledProcessError: Command '['C:\Users\Win10\anaconda3\envs\f5-tts\python.exe', 'src/f5_tts/train/finetune_cli.py', '--exp_name', 'F5TTS_Base', '--learning_rate', '1e-05', '--batch_size_per_gpu', '3200', '--batch_size_type', 'frame', '--max_samples', '64', '--grad_accumulation_steps', '1', '--max_grad_norm', '1', '--epochs', '26834', '--num_warmup_updates', '12', '--save_per_updates', '26', '--last_per_steps', '6', '--dataset_name', 'pedro_lab_custom', '--finetune', 'True', '--file_checkpoint_train', 'J:\Spanish-F5\spanish_model_tokenizer\model_1200000.safetensors', '--tokenizer_path', 'J:\Spanish-F5\spanish_model_tokenizer\vocab.txt', '--tokenizer', 'custom', '--log_samples', 'True', '--logger', 'tensorboard']' returned non-zero exit status 2.
Actualización: modifiqué el argumento no existente (file_checkpoint_train) por el argumento existente pretrain, pero ahora me da un nuevo error:
vocab : 2545
Using logger: tensorboard
Loading dataset ...
Traceback (most recent call last):
File "J:\Spanish-F5\src\f5_tts\model\dataset.py", line 246, in load_dataset
train_dataset = load_from_disk(f"{rel_data_path}/raw")
File "C:\Users\Win10\anaconda3\envs\f5-tts\lib\site-packages\datasets\load.py", line 2210, in load_from_disk
raise FileNotFoundError(f"Directory {dataset_path} not found")
FileNotFoundError: Directory J:\Spanish-F5\src\f5_tts....\data\pedro_lab_custom/raw not found
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "J:\Spanish-F5\src\f5_tts\train\finetune_cli.py", line 161, in
main()
File "J:\Spanish-F5\src\f5_tts\train\finetune_cli.py", line 152, in main
train_dataset = load_dataset(args.dataset_name, tokenizer, mel_spec_kwargs=mel_spec_kwargs)
File "J:\Spanish-F5\src\f5_tts\model\dataset.py", line 248, in load_dataset
train_dataset = Dataset_.from_file(f"{rel_data_path}/raw.arrow")
File "C:\Users\Win10\anaconda3\envs\f5-tts\lib\site-packages\datasets\arrow_dataset.py", line 740, in from_file
table = ArrowReader.read_table(filename, in_memory=in_memory)
File "C:\Users\Win10\anaconda3\envs\f5-tts\lib\site-packages\datasets\arrow_reader.py", line 329, in read_table
return table_cls.from_file(filename)
File "C:\Users\Win10\anaconda3\envs\f5-tts\lib\site-packages\datasets\table.py", line 1017, in from_file
table = _memory_mapped_arrow_table_from_file(filename)
File "C:\Users\Win10\anaconda3\envs\f5-tts\lib\site-packages\datasets\table.py", line 63, in _memory_mapped_arrow_table_from_file
opened_stream = _memory_mapped_record_batch_reader_from_file(filename)
File "C:\Users\Win10\anaconda3\envs\f5-tts\lib\site-packages\datasets\table.py", line 48, in _memory_mapped_record_batch_reader_from_file
memory_mapped_stream = pa.memory_map(filename)
File "pyarrow\io.pxi", line 1147, in pyarrow.lib.memory_map
File "pyarrow\io.pxi", line 1094, in pyarrow.lib.MemoryMappedFile._open
File "pyarrow\error.pxi", line 155, in pyarrow.lib.pyarrow_internal_check_status
File "pyarrow\error.pxi", line 92, in pyarrow.lib.check_status
FileNotFoundError: [WinError 3] Failed to open local file 'J:/Spanish-F5/src/f5_tts/../../data/pedro_lab_custom/raw.arrow'. Detail: [Windows error 3] El sistema no puede encontrar la ruta especificada.
Traceback (most recent call last):
File "C:\Users\Win10\anaconda3\envs\f5-tts\lib\runpy.py", line 196, in _run_module_as_main
return _run_code(code, main_globals, None,
File "C:\Users\Win10\anaconda3\envs\f5-tts\lib\runpy.py", line 86, in run_code
exec(code, run_globals)
File "C:\Users\Win10\anaconda3\envs\f5-tts\Scripts\accelerate.exe_main.py", line 7, in
sys.exit(main())
File "C:\Users\Win10\anaconda3\envs\f5-tts\lib\site-packages\accelerate\commands\accelerate_cli.py", line 48, in main
args.func(args)
File "C:\Users\Win10\anaconda3\envs\f5-tts\lib\site-packages\accelerate\commands\launch.py", line 1168, in launch_command
simple_launcher(args)
File "C:\Users\Win10\anaconda3\envs\f5-tts\lib\site-packages\accelerate\commands\launch.py", line 763, in simple_launcher
raise subprocess.CalledProcessError(returncode=process.returncode, cmd=cmd)
subprocess.CalledProcessError: Command '['C:\Users\Win10\anaconda3\envs\f5-tts\python.exe', 'src/f5_tts/train/finetune_cli.py', '--exp_name', 'F5TTS_Base', '--learning_rate', '1e-05', '--batch_size_per_gpu', '3200', '--batch_size_type', 'frame', '--max_samples', '64', '--grad_accumulation_steps', '1', '--max_grad_norm', '1', '--epochs', '26834', '--num_warmup_updates', '12', '--save_per_updates', '26', '--last_per_steps', '6', '--dataset_name', 'pedro_lab_custom', '--finetune', 'True', '--pretrain', 'J:\Spanish-F5\spanish_model_tokenizer\model_1200000.safetensors', '--tokenizer_path', 'J:\Spanish-F5\spanish_model_tokenizer\vocab.txt', '--tokenizer', 'custom', '--log_samples', 'True', '--logger', 'tensorboard']' returned non-zero exit status 1.
Las rutas las tengo correctas:
Para seguir entrenando es mejor utilizar el modelo .pt que se encuentra en el mismo huggingface. Este modelo incluye metadatos de entrenamiento que facilitan el proceso. Pones ese modelo en ckpts/proyect/model_last.pt y lo autodetecta
Muchas gracias por todo el trabajo. En cuanto pueda pruebo tu modelo. Me gustaría seguir entrenando tu modelo con audiolibros, no sé si se pueda. Tengo acceso a más de 1 TB que podría servir, puede que haya miles de horas de lectura. Tengo una RTX 4080 y 32 de RAM, no se cuánto tiempo pueda llevarme y si necesito transcribir los audiolibros o dividirlos en partes mas pequeñas o si el programa ya lo hace o si puedo ayudar en alguna forma.
Buenas, puedes seguir entrenando el modelo, el problema es el preprocesado que debes aplicar a tu dataset. Para entrenar el modelo, se requieren archivos .wav de 5-25s de duración, cada uno con su respectiva transcripción. Para hacer esto, debes automatizar un sistema que, dado un audiolibro, cree estos archivos, manteniendo un sentido lógico a las separaciones (cada frase es un audio, por ejemplo), haciendo las transcripciones con Whisper (o extrayéndolas del texto del libro, si lo tienes), y cuadrar que todo esté perfecto. La calidad del dato es lo más importante. Una vez tengas este sistema, puedes probar a entrenar el modelo con unas 500 horas de audio, y ver cómo progresa.
El entrenamiento en sí lo estimaría a una semana 24/7 con tu 4080 y las 500 horas de audio, una vez ya tengas el dataset. El preprocesado tardará también lo suyo si tienes que transcribir los audios.
También tendrías que tener consideraciones como la distribución equitativa de los audios (no meter 100 horas de la misma persona hablando, porque se sobreentrenaría sobre su voz en vez de generalizar).
Muy interesado en si decides continuar con este desarrollo.
Ni menciono el tema de las licencias de tus audiolibros, pero si no son dominio público, en teoría no podrías hacer este modelo público.
No funciona el google collab
EDIT: funciona
No funciona el google collab
EDIT: funciona
Dejo las instrucciones por si alguien mas las necesita.
Abrir https://colab.research.google.com/drive/1mm4NAlZVZq2_oL6ftijY64-PeEYwnqG1?usp=sharing#scrollTo=a2LYVge6IhOh
En la barra: Runtime -> Change Runtime Type -> Seleccionar T4 GPU
Runtime -> Run all
Esperar a que encienda y hacer click en el link que sale en "Running on public URL: https://link.gradio.live"
Entiendo! Claro, que sonso, el modelo que viene debe ser el comprimido de 1 GB, cuando necesito el de 5 GB para poder hacer fine tuning. En un rato intento nuevamente, gracias! 😅
Muchas gracias por todo el trabajo. En cuanto pueda pruebo tu modelo. Me gustaría seguir entrenando tu modelo con audiolibros, no sé si se pueda. Tengo acceso a más de 1 TB que podría servir, puede que haya miles de horas de lectura. Tengo una RTX 4080 con 32 de RAM, no se cuánto tiempo pueda llevarme y si necesito transcribir los audiolibros o dividirlos en partes mas pequeñas o si el programa ya lo hace o si puedo ayudar en alguna forma.
Yo tengo 2000 horas de español, todo de dominio público de librivox y buena calidad en su mayoría. Solo tendría que recortar y transcribir, pero no sé cuánto me llevaría ni como hacerlo de forma efectiva, ya que si bien tengo las herramientas como whisper, puede que tarde un tiempo que ni sea factible para empezar.
Estoy pensando en un whisper mediante Google colab con una Nvidia A100 40 gb pero pasar los audios al entorno de colab creo saturaria el almacenamiento de la sesión :/
Los archivos están en MP3 - 16 khz - mono (la única calidad que ofrece librivox)
Por si te interesa, te lo puedo compartir comprimido. Saludos.
Gracias por la oferta pero yo me retiro del finetuning por un buen rato. Llevo dos semanas a tope con esto e incluso durmiendo mal por dejar el ordenador toda la noche corriendo (en mi habitacion).
En cuanto a lo de Google Colab, ofrece la capacidad de cargar directamente de google drive, donde puedes ir subiendo de a fragmentos de 100gb o lo que sea.
@Blakus el gradio de entrenamiento de F5 te hace todo eso, con que tengas los wavs, la preparación del dataset te hace toda la transcripción y demás, así que con los archivos wav ya lo tienes todo.
@paconaranjo la 4090 tiene 24Gb de ram por defecto, ¿la tuya está modificada? si es así estaría interesado en saber quien puede hacer esa modificación :)
@Blakus el gradio de entrenamiento de F5 te hace todo eso, con que tengas los wavs, la preparación del dataset te hace toda la transcripción y demás, así que con los archivos wav ya lo tienes todo.
@paconaranjo la 4090 tiene 24Gb de ram por defecto, ¿la tuya está modificada? si es así estaría interesado en saber quien puede hacer esa modificación :)
Ha dicho RAM, no VRAM ;).
Y si, el gradio hace eso, pero no sé si me fiaría para un dataset tan grande. Lo hace por batches? Lo guarda mientras lo va haciendo por si se crashea? Igualmente hay que separar los audios "a mano"
aaah ok, entendí mal :)
A ver, lo que te puedo decir es que yo veo porcentaje del avance, pero no se si en caso de que pete en medio luego continua desde donde lo ha dejado :)
La separación en segmentos de un dataset propio que tengo, interno de mi estudio, la hecho automaticamente mediante python, utilizando los silencios y longitudes de audio mínimas, me ha dado bastante buen resultado.
Muy bueno saber eso. Yo daría prioridad a hacer los cortes después del fin de una frase ". ", y si sobrepasa el límite máximo, cortar en el último silencio "largo" antes de que sobrepase. Supongo que le vendrá bien al modelo tener el contexto entero de una frase, y si cabes dos o tres en esos 25s, mejor.
También habría que ver la distribución de la longitud de los audios, no sé si es mejor que sean todos cortos, todos largos, que esté balanceado, etc.
Claro, al final yo hice un script ayudado por IA, y le pedí varias condiciones, como frases completas y demás, utiliizando whisperX or faster whisper.
Pero para este último dataset lo he dejado en duración y silencios, por que al final he visto que no importa demasiado para el entrenamiento, al menos es mi sensación.
ah pues mira entonces así es mucho más rápido
Estas entrenando con este dataset? Como va la cosa? Cuantas horas tienes de datos?
He hecho muchas pruebas, y me quedan muchas por hacer.
Pero no he usado de momento ese dataset, he utilizado este:
https://huggingface.co/datasets/facebook/multilingual_librispeech
No se decirte el número de horas totales, pero es un dataset considerablemente grande, y le agrego nuestros datos internos para hacer que tienda más al epañol peninsular.
@jpgallegoar disculpa, la verdad que me estoy volviendo loco. A pesar de que tengo todas las rutas correctas del dataset, sigo teniendo error de que no encuentra los archivos necesarios.
¿Sería mucha molestia si pudieras hacer un pequeño tutorial en video de como cargas e inicias el entrenamiento de un dataset de prueba? Sin habla ni música, no te llevaría más de 1 o 2 minutos, Para tener una referencia visual y ver si hay algo que se me está escapando en cuanto a rutas y directorios o que… porque por más que intento debuggear el código, ya no le encuentro sentido al error, cuando tengo todo en sus respectivas ubicaciones.
Sin presiones ni apuros, si pudieses hacerlo sería de gran ayuda, ya que la mayoría de gente está usando tu modelo para inferencia, pero hay un grupo interesado en usarlo como fine tuning, que me parece, será su uso más valioso, y puesto que tú fuiste el que adaptó este fork para ello, eres el que mejor sabe como usarlo.
Tómate todo el tiempo que necesites.
Muchas gracias de antemano.
Pégale un vistazo a este vídeo, se ve todo bastante claro :)
He hecho muchas pruebas, y me quedan muchas por hacer.
Pero no he usado de momento ese dataset, he utilizado este:
https://huggingface.co/datasets/facebook/multilingual_librispeech
No se decirte el número de horas totales, pero es un dataset considerablemente grande, y le agrego nuestros datos internos para hacer que tienda más al epañol peninsular.
Yo utilicé este durante 1 semana, y una semana que perdí. Tiene 1000 horas pero hay datos de mala calidad que arruinan el entrenamiento, o al menos esa fue mo experiencia.
Pégale un vistazo a este vídeo, se ve todo bastante claro :)
@Blakus Si no lo consigues con esto dime y lo hago
Bueno, último intento por hoy: lo instalé todo desde cero, esta vez con virtualvenv en vez de conda. No hubo errores.
Parece ser que hay un error al momento de crear y actualizar los nombres de los proyectos, ya que por lo que entiendo, estos se construyen con {nombre del proyecto} + {tipo de tokenizer}
en mi caso sería
"pedro_lab" >>> "pedro_lab_custom"
Pero al momento de crear el proyecto, o poner los valores automáticos de entrenamiento, por alguna razón resetea la selección de los tókenes, haciendo que se construya mal la ruta de búsqueda para el dataset.
En este caso lo interpreta como "pedro_lab_pinyin" pero hay veces que lo interpreta como "pedro_lab_custom_custom" o incluso como "pedro_lab_custom_pinyin", básicamente que si uno intenta corregir los nombres, el código cambia o adosa los tókenes de manera incorrecta.
Y en cuanto a seleccionar la casilla finetuning, elegir vocab y pretrained model, me sale el error del argumento.
Mi directorio del dataset está correcto.
Aclaro que todo esto en el repositorio original no me había sucedido, solo me sucede en este fork para español con las nuevas casillas de finetuning o el tokenizador custom.
Claro, al final yo hice un script ayudado por IA, y le pedí varias condiciones, como frases completas y demás, utiliizando whisperX or faster whisper.
Pero para este último dataset lo he dejado en duración y silencios, por que al final he visto que no importa demasiado para el entrenamiento, al menos es mi sensación.
Eso está interesante, a lo mejor me animo con un scritpt así. Por la computadora no me apuro, puedo dejarla una semana entera prendida día y noche, tengo una lap para lo demás. Lo que me apura es el espacio que se necesita para 500 horas en wav y cuanto necesitaría para el entrenamiento. Tengo un M.2 de 1 TB con 150 GB libres. No se si con un disco duro sea más lento, o no importe para eso.
Y otra pregunta hace falta tener todo el dataset completo o puedo empezar con menos para ver si no hay errores y cuanto es lo mínimo que se necesita.
@Blakus Te recomiendo que utilices el repositorio original, yo no voy a mantener la parte de finetuning ni he cambiado nada para mejorarlo. Mi repositorio es practicamente solo para poder tener el huggingface space
@paconaranjo puedes empezar con solamente un audio si quieres. asi ves si arranca o no, y luego ya metes todo
Estaba pensando en hacer un entrenamiento utilizando el dataset de common_voice, pesa 46gb y cuenta con 2200 horas de voces y 26000 voces diferentes, sobre una Nvidia A100, consideran que me quedare corto o esa GPU esta bien para un dataset tan grande?
Buenas @comamosramen , el tamaño del dataset no afecta a la memoria (VRAM) necesaria, sino que es el batch size el que afecta. Yo utilicé 3200, pero con una A100 podrías aumentarlo hasta 15000-2000. Teóricamente mientras mayor el batch size, mejor sonará. El modelo original se entrenó con 96000 me parece.
@jpgallegoar
bueno, parece ser que lo hice funcionar. Ya que dijiste que el tokenizer de tu modelo era el mismo que el original, simplemente seleccioné pinyin y logré sortear el error.
Lo único que me quedaría por solucionar (y lo más importante jajaja) es el poder usar tu modelo para fine tuning.
Pongo el model_last.pt en J:\F5-TTS\ckpts\pedro_lab y al momento de entrenar directamente me detiene el entrenamiento
Parece ser que detecta en los metadatos de tu modelo la última step en que se detuvo el entrenamiento, y como seguramente supera por mucho a mis steps en los parámetros de entrenamiento, lo detiene.
Sin embargo, no sé qué valores debería poner para poder reanudar desde tu modelo, ya que solo me deja poner por epochs...
Bueno, lo que terminé haciendo fue reducir el modelo en español last_model.pt , (que fue lo mismo que has hecho resultando en el .safetensors), pero yo elegi el output como un archivo .pt, luego lo puse en "J:\F5-TTS\ckpts\pedro_lab\model_last.pt" y logré empezar a entrenar sin tomarme los metadatos de las steps. así que "en teoría" ahora mismo estaría entrenando mi dataset sobre tu modelo en español. Actualizaré más tarde :)
Disculpa las molestias.
Buenas @Blakus muchas gracias por tus aportes. Efectivamente el modelo model_last es para seguir entrenando sobre mi mismo dataset y poniendo más de 1.200.000 pasos que fue lo que entrené yo. Reduciéndolo borras los metadatos y consigues entrenar sobre él. Luego nos comentas como evoluciona :)