Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tts infer重构优化和批量推理支持 #721

Merged
merged 14 commits into from
Mar 10, 2024

Conversation

ChasonJiang
Copy link
Contributor

@ChasonJiang ChasonJiang commented Mar 8, 2024

tts infer重构优化和批量推理支持

改进内容

  • 重构优化了tts infer。在原有的基础上进行了逻辑功能拆分和优化。
  • 批量推理支持。新增了T2S模型的批量推理支持,大幅改善了推理吞吐量,降低了推理时间。
  • 与这项工作不同 Batching infer #712 ,我对句子做了排序和分桶,并对T2S模型的批量推理做一定的计算优化。

评估

测试环境:Windows 11, i5-13600KF + RTX4070
测试设置:fp16, batch_size=10 (Original 为1),测试10次取均值
测试文本:

  除却宝药外,小不点每日也在以符文为他治疗,半个月后,清风复原,其筋骨迅速愈合。
  “宝药真厉害,拥有神效啊,这么快就好了。”众人啧啧称奇,却不知小不点所练的原始真解也起了极大的作用。

测试结果:

Method T2S (task/s) VITS (task/s)
Original 0.207 0.702
Batch inference 0.706 0.857
Batch inference + Torchscript w/o flash 1.308 0.853

状态

  • 已合并至fast_inference分支

Warning: 改动较大,建议大量测试后再merge。

GoHomeToMacDonal and others added 5 commits March 6, 2024 01:37
	使t2s模型支持批量推理:   GPT_SoVITS/AR/models/t2s_model.py
	修复batch bug   GPT_SoVITS/AR/models/utils.py
    重构的tts infer   GPT_SoVITS/TTS_infer_pack/TTS.py
	文本预处理模块   GPT_SoVITS/TTS_infer_pack/TextPreprocessor.py
	new file   GPT_SoVITS/TTS_infer_pack/__init__.py
	文本拆分方法模块   GPT_SoVITS/TTS_infer_pack/text_segmentation_method.py
	tts infer配置文件   GPT_SoVITS/configs/tts_infer.yaml
	modified   GPT_SoVITS/feature_extractor/cnhubert.py
	modified   GPT_SoVITS/inference_gui.py
	重构的webui   GPT_SoVITS/inference_webui.py
	new file   GPT_SoVITS/inference_webui_old.py
	添加音频倍速支持:   GPT_SoVITS/inference_webui.py
@ChasonJiang
Copy link
Contributor Author

Update

  • 添加了音频倍速支持

@ChasonJiang
Copy link
Contributor Author

ChasonJiang commented Mar 9, 2024

Update

@ChasonJiang
Copy link
Contributor Author

ChasonJiang commented Mar 9, 2024

Update

  • 修复了t2s模型无prompt输入时引起的bug。
  • 支持了分段返回音频。
  • 优化了网页布局,并添加了一些功能选项。

image

(1, x_len + y_len), dtype=torch.bool, device=xy_pos.device
)
y_emb = self.ar_audio_embedding(y[:, -1:])
xy_pos = y_emb * self.ar_audio_position.x_scale + self.ar_audio_position.alpha * self.ar_audio_position.pe[:, y_len + idx].to( dtype= y_emb.dtype,device=y_emb.device)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

padding之后,self.ar_audio_position.pe[:, y_len + idx]里面的位置y_len+idx是错误的,这里需要对每个句子单独计算,单独取出来。个人建议使用类似transformers的方式,使用一个position_ids来记录对应的位置,每次循环+1即可。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

感谢指正,我待会看看。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

我觉得应该不用单独算,因为y实际上没有padding。实际测试下来似乎也没啥问题🤔

	fixed some bugs   GPT_SoVITS/TTS_infer_pack/TTS.py
@RVC-Boss RVC-Boss merged commit 8fd56af into RVC-Boss:main Mar 10, 2024
@leiyuyh
Copy link

leiyuyh commented Mar 10, 2024

批量推理是指能同时接收多个推理指令(并发?);
还是说在单个推理中,运用了某种模型能力加快单个推理的生成速度?

@ChasonJiang
Copy link
Contributor Author

批量推理是指能同时接收多个推理指令(并发?); 还是说在单个推理中,运用了某种模型能力加快单个推理的生成速度?

就是朴实无华的并行计算。在用CUDA之类的计算加速卡,以一个batch_size的大小的张量进行并行计算时,会更快一点,获得几乎成倍的提升。

@leiyuyh
Copy link

leiyuyh commented Mar 10, 2024

批量推理是指能同时接收多个推理指令(并发?); 还是说在单个推理中,运用了某种模型能力加快单个推理的生成速度?

就是朴实无华的并行计算。在用CUDA之类的计算加速卡,以一个batch_size的大小的张量进行并行计算时,会更快一点,获得几乎成倍的提升。

懂了,感谢解答;
那就是我理解的加快单个推理的生成速度

@X-T-E-R
Copy link

X-T-E-R commented Mar 10, 2024

如果设置"return_fragment": True,会报错

Traceback (most recent call last):
  File "e:\AItools\GPT-SoVITS-Inference\runtime\lib\site-packages\werkzeug\serving.py", line 362, in run_wsgi
    execute(self.server.app)
  File "e:\AItools\GPT-SoVITS-Inference\runtime\lib\site-packages\werkzeug\serving.py", line 325, in execute
    for data in application_iter:
  File "e:\AItools\GPT-SoVITS-Inference\runtime\lib\site-packages\werkzeug\wsgi.py", line 256, in __next__
    return self._next()
  File "e:\AItools\GPT-SoVITS-Inference\runtime\lib\site-packages\werkzeug\wrappers\response.py", line 32, in _iter_encoded
    for item in iterable:
  File "e:\AItools\GPT-SoVITS-Inference\runtime\lib\site-packages\flask\helpers.py", line 113, in generator
    yield from gen
  File "E:\AItools\GPT-SoVITS-Inference\Inference\src\inference_core.py", line 132, in get_streaming_tts_wav
    for chunk in chunks:
  File "E:\AItools\GPT-SoVITS-Inference\Inference\src\inference_core.py", line 104, in inference
    yield next(tts_pipline.run(inputs))
  File "E:\AItools\GPT-SoVITS-Inference\GPT_SoVITS\TTS_infer_pack\TTS.py", line 620, in run
    yield self.audio_postprocess(batch_audio_fragment,
  File "E:\AItools\GPT-SoVITS-Inference\GPT_SoVITS\TTS_infer_pack\TTS.py", line 654, in audio_postprocess
    audio = np.concatenate(audio, 0)
  File "<__array_function__ internals>", line 180, in concatenate
ValueError: zero-dimensional arrays cannot be concatenated
2.598   0.004   1.040   2.202

因为
image
这里的batch audio是list

像下图一样就可以修正

       
    def audio_postprocess(self, 
                          audio:np.ndarray, 
                          sr:int, 
                          batch_index_list:list=None, 
                          speed_factor:float=1.0, 
                          split_bucket:bool=True)->tuple[int, np.ndarray]:
        if split_bucket:
            audio = self.recovery_order(audio, batch_index_list)
        else:
            audio = [item for batch in audio for item in batch]
            
        if type(audio) == list:
            audio = np.array(audio)
            audio = (audio * 32768).astype(np.int16) 
        else:
            audio = np.concatenate(audio, 0)
            audio = (audio * 32768).astype(np.int16) 
        
        try:
            if speed_factor != 1.0:
                audio = speed_change(audio, speed=speed_factor, sr=int(sr))
        except Exception as e:
            print(f"Failed to change speed of audio: \n{e}")
        
        return sr, audio
            

@ChasonJiang
Copy link
Contributor Author

return_fragment

@X-T-E-R 感谢你的测试,我待会修复它

@X-T-E-R
Copy link

X-T-E-R commented Mar 10, 2024

return_fragment

@X-T-E-R 感谢你的测试,我待会修复它

您好,您有其他的联系方式吗,多段返回还有较多的问题,我比较希望在线与您取得联系

@yiya1989
Copy link

yiya1989 commented Apr 3, 2024

有比较多的反馈,合入这个PR后,生成的语音吞字、重复问题变严重,是否可以加个开关控制是否开启这个特性? @RVC-Boss @ChasonJiang

@ChasonJiang
Copy link
Contributor Author

有比较多的反馈,合入这个PR后,生成的语音屯子、重复问题变严重,是否可以加个开关控制是否开启这个特性? @RVC-Boss @ChasonJiang

@yiya1989 还没合并进主分支呢,不想用并行推理,设置batch_size=1就和主分支一样了

@yiya1989
Copy link

yiya1989 commented Apr 3, 2024

有比较多的反馈,合入这个PR后,生成的语音屯子、重复问题变严重,是否可以加个开关控制是否开启这个特性? @RVC-Boss @ChasonJiang

@yiya1989 还没合并进主分支呢,不想用并行推理,设置batch_size=1就和主分支一样了

感谢老哥的回复,感谢为项目的付出!
我有点懵了。。。看PR是 merged状态,但是main分之里面还真没有。这啥情况啊? =-=

我是用的B站 up主做的一键整合包。他这里确实用了你这个分支的代码。我本地跑效果来看,吞音重复问题确实更明显了。可以关注下。
https://www.bilibili.com/video/BV152421N7po/?spm_id_from=333.788&vd_source=19f6fcca265968bd53cc82b55b94bb26

@ChasonJiang
Copy link
Contributor Author

我是用的B站 up主做的一键整合包。他这里确实用了你这个分支的代码。我本地跑效果来看,吞音重复问题确实更明显了。可以关注下。 https://www.bilibili.com/video/BV152421N7po/?spm_id_from=333.788&vd_source=19f6fcca265968bd53cc82b55b94bb26

他这版本太老了bug比较多,建议用官方的fast_inference分支,当batch_size>1时,重复的问题确实更明显了;用batch_size=1就好了,不过要慢得多

@yiya1989
Copy link

yiya1989 commented Apr 3, 2024

我是用的B站 up主做的一键整合包。他这里确实用了你这个分支的代码。我本地跑效果来看,吞音重复问题确实更明显了。可以关注下。 https://www.bilibili.com/video/BV152421N7po/?spm_id_from=333.788&vd_source=19f6fcca265968bd53cc82b55b94bb26

他这版本太老了bug比较多,建议用官方的fast_inference分支,当batch_size>1时,重复的问题确实更明显了;用batch_size=1就好了,不过要慢得多

了解了,多谢!我看 fast_inference 是有相关代码的。但是pr标题是merge到main分支。这个是因为pr一开始提的是main分支,但后面更换了目标分支为fast_inference,所以导致pr提示的merge分支不准确么?

@ChasonJiang
Copy link
Contributor Author

了解了,多谢!我看 fast_inference 是有相关代码的。但是pr标题是merge到main分支。这个是因为pr一开始提的是main分支,但后面更换了目标分支为fast_inference,所以导致pr提示的merge分支不准确么?

是的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants