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

【Hackathon 7th】运行 Examples 脚本与导出模型到 PIR 说明 #3879

Open
Liyulingyue opened this issue Nov 9, 2024 · 3 comments
Open

Comments

@Liyulingyue
Copy link
Contributor

Liyulingyue commented Nov 9, 2024

简述

本文以 DeepSpeech2 为例说明如何在 Paddle 3.0 下,导出 PIR格式 的新静态图。虽然本文主要关注如何进行导出PIR,但验证 Example 文件夹下的脚本的流程与遇到的问题基本与本文类似,可以在测试前,先阅读本Issue。

本文的主要说明内容如下

  • 如何将 DeepSpeech2 运行测试、导出、验证导出的流程
  • 问题说明1:Example中存在说明文档和脚本不匹配的问题,应参考脚本重新写命令,修复见 【Hackathon 7th】Remove parser.add_argument #3878
  • 问题说明2:py文件存在 字段解析重复添加问题,删除对应代码即可,修复见 【Hackathon 7th】Remove parser.add_argument #3878
  • 问题说明3:部分历史代码已经不兼容,直接移除即可
  • 问题说明4:导出PIR后,当前代码可能存在问题,导致无法加载【需要讨论】

补充

经验证,能够成功导出,但读取逻辑仍有一些问题,待修复。

步骤

准备环境

# 安装Paddle 3.0
# 可以直接在Aistudio创建一个3.0的环境

# 克隆本仓库
# 如果Python版本为3.10,需要等待 https://github.com/PaddlePaddle/PaddleSpeech/pull/3877 合入后克隆
git clone https://github.com/PaddlePaddle/PaddleSpeech.git

# 检查setup.py,如果存在对paddle版本的依赖,去除该依赖

cd PaddleSpeech
# 在Aistudio环境中,需要使用 pip install . --user,安装后将 /home/aistudio/.local/bin 加入环境变量
pip install .

准备运行数据

# 确保当前目录为 PaddleSpeech
# 进入deepspeech的脚本页面
cd examples/aishell/asr0

# 配置环境
source path.sh
source ${MAIN_ROOT}/utils/parse_options.sh

# 数据预处理,最好执行这一步
# 如果在 PaddleSpeech/dataset/aishell/下没有 data_aishell.tgz,会自动下载,建议手动从更快的链接下载后放在此文件夹 
bash ./local/data.sh

下载模型

https://github.com/PaddlePaddle/PaddleSpeech/blob/develop/paddlespeech/resource/pretrained_models.py 下载对应的模型,并解压

# 当前目录 PaddleSpeech/examples/aishell/asr0
# 以 deepspeech2offline_aishell-zh-16k 为例,可以resource 文件中获取对应的下载链接
wget https://paddlespeech.bj.bcebos.com/s2t/aishell/asr0/asr0_deepspeech2_offline_aishell_ckpt_1.0.1.model.tar.gz
# 有一些文件解压时会覆盖原有文件,不是每个tar.gz包里的内容都是好的,处理其他模型时建议将原有文件夹(此处为asr0)内容做好备份
tar xzvf asr0_deepspeech2_offline_aishell_ckpt_1.0.1.model.tar.gz

运行测试

推理

推理采用动态图推理,会遇到重复添加控制台变量的问题,将对应脚本中 parser.add_argument 删除即可。
以 PaddleSpeech/paddlespeech/s2t/exps/deepspeech2/bin/test_wav.py 为例,按如下所示注释即可。修复PR见 #3878

if __name__ == "__main__":
    # 在这里已经添加了 audio_file
    parser = default_argument_parser()
    # 下面几行如果不注释,就会报错
    # parser.add_argument("--audio_file", type=str, help='audio file path')
    # save asr result to
    # parser.add_argument(
    #     "--result_file", type=str, help="path of save the asr result")
    args = parser.parse_args()
    print_arguments(args, globals())
    if not os.path.isfile(args.audio_file):
        print("Please input the audio file path")
        sys.exit(-1)
    check(args.audio_file)

推理部分的执行命令如下

wget -nc https://paddlespeech.bj.bcebos.com/datasets/single_wav/zh/demo_01_03.wav -P data/
CUDA_VISIBLE_DEVICES= ./local/test_wav.sh conf/deepspeech2.yaml conf/tuning/decode.yaml exp/deepspeech2/checkpoints/avg_10 data/demo_01_03.wav

静态图导出

会遇到的问题是

  1. 见推理部分的问题描述,解决方法一致
  2. logger.info(f"Export code: {static_model.forward.code}") 执行报错,直接注释此语句即可,在 PaddleSpeech/paddlespeech/s2t/exps/deepspeech2/model.py 333行附近。
  3. README和脚本执行逻辑不匹配。查阅脚本代码,重新配置命令即可。

可执行的命令如下:

# 如果你希望在PIR模式下导出,执行:
# export FLAGS_enable_pir_api=1

./local/export.sh conf/deepspeech2.yaml exp/deepspeech2/checkpoints/avg_10 exp/deepspeech2/checkpoints/avg_10.jit

不配置 FLAGS_enable_pir_api=1,导出结果为pdmodel,pdiparams。

配置了 FLAGS_enable_pir_api=1,导出结果为json,pdiparams。

静态图测试

会遇到的问题是

  1. 见推理部分的问题描述,解决方法一致
  2. README和脚本执行逻辑不匹配。查阅脚本代码,重新配置命令即可。
  3. 现有脚本只支持老版本静态图模型

对于前两个问题,修改py文件,更改控制台命令如下

CUDA_VISIBLE_DEVICES= ./local/test_export.sh conf/deepspeech2.yaml conf/tuning/decode.yaml exp/deepspeech2/checkpoints/avg_10.jit

对于第三个问题,需要更改 /home/aistudio/PaddleSpeech/paddlespeech/s2t/exps/deepspeech2/model.py 函数 setup_model(self) (在末尾部分),修改方案有两个,都会报C++错误,应该与本次任务无关,是Paddle侧的问题。

方案1:

    def setup_model(self):
        super().setup_model()

        # 如果存在新IR,以新IR格式加载
        if os.path.exists(self.args.export_path + ".json"):
          deepspeech_config = inference.Config(
              self.args.export_path + ".json",
              self.args.export_path + ".pdiparams")
        else:
          deepspeech_config = inference.Config(
              self.args.export_path + ".pdmodel",
              self.args.export_path + ".pdiparams")

        if (os.environ['CUDA_VISIBLE_DEVICES'].strip() != ''):
            deepspeech_config.enable_use_gpu(100, 0)
            deepspeech_config.enable_memory_optim()
        deepspeech_predictor = inference.create_predictor(deepspeech_config)
        self.predictor = deepspeech_predictor

方法2:

    def setup_model(self):
        super().setup_model()
        model_dir = os.path.dirname(self.args.export_path)
        model_prefix = os.path.basename(self.args.export_path)
        deepspeech_config = inference.Config(model_dir, model_prefix)

        if (os.environ['CUDA_VISIBLE_DEVICES'].strip() != ''):
            deepspeech_config.enable_use_gpu(100, 0)
            deepspeech_config.enable_memory_optim()
        deepspeech_predictor = inference.create_predictor(deepspeech_config)
        self.predictor = deepspeech_predictor

方法1报错如下

--------------------------------------
C++ Traceback (most recent call last):
--------------------------------------
0   paddle_infer::Predictor::Predictor(paddle::AnalysisConfig const&)
1   std::unique_ptr<paddle::PaddlePredictor, std::default_delete<paddle::PaddlePredictor> > paddle::CreatePaddlePredictor<paddle::AnalysisConfig, (paddle::PaddleEngineKind)2>(paddle::AnalysisConfig const&)
2   paddle::AnalysisPredictor::Init(std::shared_ptr<paddle::framework::Scope> const&, std::shared_ptr<paddle::framework::ProgramDesc> const&)
3   paddle::AnalysisPredictor::PrepareProgram(std::shared_ptr<paddle::framework::ProgramDesc> const&)
4   paddle::framework::NaiveExecutor::CreateVariables(paddle::framework::ProgramDesc const&, int, bool, paddle::framework::Scope*)

----------------------
Error Message Summary:
----------------------
FatalError: `Segmentation fault` is detected by the operating system.
  [TimeInfo: *** Aborted at 1731192005 (unix time) try "date -d @1731192005" if you are using GNU date ***]
  [SignalInfo: *** SIGSEGV (@0x0) received by PID 29222 (TID 0x7f6c61c9b740) from PID 0 ***]

./local/test_export.sh: line 26: 29222 Segmentation fault      (core dumped) python3 -u ${BIN_DIR}/test_export.py --ngpu ${ngpu} --config ${config_path} --decode_cfg ${decode_config_path} --result_file ${jit_model_export_path}.rsl --export_path ${jit_model_export_path}

方法2报错如下

Traceback (most recent call last):
  File "/home/aistudio/PaddleSpeech/paddlespeech/s2t/exps/deepspeech2/bin/test_export.py", line 62, in <module>
    main(config, args)
  File "/home/aistudio/PaddleSpeech/paddlespeech/s2t/exps/deepspeech2/bin/test_export.py", line 30, in main
    main_sp(config, args)
  File "/home/aistudio/PaddleSpeech/paddlespeech/s2t/exps/deepspeech2/bin/test_export.py", line 25, in main_sp
    exp.setup()
  File "/home/aistudio/PaddleSpeech/paddlespeech/s2t/training/trainer.py", line 167, in setup
    self.setup_model()
  File "/home/aistudio/PaddleSpeech/paddlespeech/s2t/exps/deepspeech2/model.py", line 640, in setup_model
    deepspeech_predictor = inference.create_predictor(deepspeech_config)
ValueError: basic_string::_M_replace_aux
@megemini
Copy link
Contributor

根据说明,遇到几个问题:

  1. 准备环境 安装完 PaddleSpeech 之后,需要手动再安装一遍 Paddle ,否则会把 AIStudio 中的环境替换掉 ~
  2. 静态图导出 的命令应该需要改一下:
./local/export.sh ./conf/deepspeech2.yaml exp/deepspeech2/checkpoints/avg_10 exp/deepspeech2/checkpoints/avg_10.jit.pdmodel 

原命令中没有写 deepspeech2.yaml 路径,exp/deepspeech2/checkpoints/avg_1 与后面的模型路径 exp/deepspeech2/checkpoints/avg_10 也不一致 ~

  1. 静态图测试,我这里貌似没有报错,最后返回的信息
2024-11-10 08:07:37.745 | INFO     | paddlespeech.s2t.exps.deepspeech2.model:test:394 - Test: epoch: 0, step: 0, Final error rate [cer] (7176/7176) = 0.056877
2024-11-10 08:07:37.747 | INFO     | paddlespeech.s2t.training.timer:__exit__:44 - Test/Decode Done: 0:51:24.312829

不过,这个 Test: epoch: 0, step: 0, 是不是不太对?

@Liyulingyue
Copy link
Contributor Author

根据说明,遇到几个问题:

  1. 准备环境 安装完 PaddleSpeech 之后,需要手动再安装一遍 Paddle ,否则会把 AIStudio 中的环境替换掉 ~
  2. 静态图导出 的命令应该需要改一下:
./local/export.sh ./conf/deepspeech2.yaml exp/deepspeech2/checkpoints/avg_10 exp/deepspeech2/checkpoints/avg_10.jit.pdmodel 

原命令中没有写 deepspeech2.yaml 路径,exp/deepspeech2/checkpoints/avg_1 与后面的模型路径 exp/deepspeech2/checkpoints/avg_10 也不一致 ~

  1. 静态图测试,我这里貌似没有报错,最后返回的信息
2024-11-10 08:07:37.745 | INFO     | paddlespeech.s2t.exps.deepspeech2.model:test:394 - Test: epoch: 0, step: 0, Final error rate [cer] (7176/7176) = 0.056877
2024-11-10 08:07:37.747 | INFO     | paddlespeech.s2t.training.timer:__exit__:44 - Test/Decode Done: 0:51:24.312829

不过,这个 Test: epoch: 0, step: 0, 是不是不太对?

感谢反馈

  1. 安装之前应该检查setup.py,移除对paddlepaddle-gpu=2.5的依赖。已补充描述
  2. 已修改,第三个参数不用加pdmodel尾缀
  3. 只要有打印预测结果和真实结果的值就行

@Liyulingyue Liyulingyue changed the title 【Hackathon 7th】导出模型到 PIR 说明 【Hackathon 7th】运行 Examples 脚本与导出模型到 PIR 说明 Nov 10, 2024
@enkilee
Copy link
Contributor

enkilee commented Nov 14, 2024

在Aistudio环境中,使用 pip install . --user --index-url https://mirrors.aliyun.com/pypi/simple
安装后将 /home/aistudio/.local/bin 加入环境变量

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

No branches or pull requests

3 participants