modelscope-funasr这个问题怎么解决?

modelscope-funasr中,在Linux系统上配置了Torch 2.1.1, FunASR 0.8.7, ModelScope 1.10.02,我尝试对下载的speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404模型进行量化导出。这个过程产生了一个TorchScripts文件,但当我将数据加载到这个模型并执行时,出现了错误,提示指出至少有两个设备上的张量不一致,cuda:0和cpu。可能问题代码是mask0 = torch.to(mask, torch.device("cpu"), 6),但不确定错误代码属于模型还是ModelScope的问题,而且使用ONNX时没有这个问题,只是ONNX输入是numpy格式而我的输入是tensor格式,这是怎么回事呢?
975c7f499bff17b39e97bd2ea5a0baf8.png
https://alibaba-damo-academy.github.io/FunASR/en/funasr/export/README.html

展开
收起
嘟嘟嘟嘟嘟嘟 2024-01-05 06:19:05 129 分享 版权
阿里云 AI 助理回答

根据您提供的信息,问题的核心在于模型量化导出后,在加载和执行过程中出现了设备不一致的错误(cuda:0cpu)。以下是针对该问题的详细分析与解决方法:


1. 问题分析

1.1 错误描述

  • 您在使用 speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404 模型时,通过量化导出生成了一个 TorchScript 文件。
  • 在加载并运行该模型时,出现设备不一致的错误,提示张量分布在不同的设备上(cuda:0cpu)。
  • 可能的问题代码为:
    mask0 = torch.to(mask, torch.device("cpu"), 6)
    

    这段代码尝试将张量 mask 转换到 CPU 设备,但可能未正确处理输入数据的设备一致性。

1.2 ONNX 对比

  • 使用 ONNX 格式时没有类似问题,但 ONNX 的输入是 NumPy 格式,而您的输入是 PyTorch Tensor 格式。
  • 这表明问题可能与 PyTorch 的设备管理机制有关,而非模型本身的问题。

2. 解决方案

2.1 确保设备一致性

在 PyTorch 中,张量的设备(CPU 或 GPU)必须保持一致。如果模型在 GPU 上运行,则所有输入张量也必须位于 GPU 上;反之亦然。以下是具体操作步骤:

  1. 检查模型和输入张量的设备
    在加载模型和输入数据时,确保它们位于同一设备上。例如:

    # 假设模型已加载到 GPU
    model = model.to("cuda:0")
    
    # 将输入张量移动到 GPU
    input_tensor = input_tensor.to("cuda:0")
    
  2. 修改问题代码
    如果问题代码为:

    mask0 = torch.to(mask, torch.device("cpu"), 6)
    

    则需要根据模型的实际运行设备调整 torch.device 参数。例如,如果模型运行在 GPU 上,应改为:

    mask0 = torch.to(mask, torch.device("cuda:0"), 6)
    
  3. 统一设备管理逻辑
    在整个推理流程中,建议统一设备管理逻辑。例如:

    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    model = model.to(device)
    input_tensor = input_tensor.to(device)
    

2.2 验证 TorchScript 导出过程

  • 导出时指定设备
    在导出 TorchScript 文件时,确保模型和输入数据的设备一致。例如:

    # 将模型和示例输入移动到同一设备
    model = model.to("cuda:0")
    example_input = example_input.to("cuda:0")
    
    # 导出 TorchScript
    scripted_model = torch.jit.script(model)
    scripted_model.save("model.pt")
    
  • 验证导出文件
    加载导出的 TorchScript 文件并测试其运行是否正常:

    loaded_model = torch.jit.load("model.pt")
    loaded_model = loaded_model.to("cuda:0")  # 确保加载到正确的设备
    output = loaded_model(input_tensor.to("cuda:0"))
    

2.3 输入格式转换

  • 如果您的输入是 PyTorch Tensor 格式,而 ONNX 的输入是 NumPy 格式,则需要确保输入格式的一致性。
  • 在使用 TorchScript 时,可以直接传递 PyTorch Tensor,无需额外转换。但如果需要兼容 NumPy 格式,可以使用以下方法:
    # 将 NumPy 数组转换为 PyTorch Tensor
    input_tensor = torch.from_numpy(numpy_array).to("cuda:0")
    

3. 其他注意事项

3.1 检查依赖版本

  • 您当前的环境配置为:
    • Torch 2.1.1
    • FunASR 0.8.7
    • ModelScope 1.10.02
  • 确保这些版本之间兼容。如果问题仍然存在,可以尝试升级或降级相关依赖。例如:
    pip install torch==2.0.1
    pip install funasr==0.8.6
    

3.2 使用官方文档参考

  • 根据 FunASR 官方文档,建议按照推荐的环境配置和导出流程操作,以避免潜在的兼容性问题。

3.3 调试与日志

  • 在调试过程中,可以通过打印张量的设备信息来定位问题:
    print(f"Model device: {next(model.parameters()).device}")
    print(f"Input tensor device: {input_tensor.device}")
    

4. 总结

  • 问题的根本原因可能是设备不一致(cuda:0cpu),需要确保模型和输入张量位于同一设备上。
  • 修改问题代码中的设备参数,并统一设备管理逻辑。
  • 验证 TorchScript 导出过程,确保导出和加载时设备一致。
  • 如果问题仍未解决,建议检查依赖版本或参考官方文档进行进一步排查。

希望以上解决方案能够帮助您解决问题!如果仍有疑问,请随时提供更多信息以便进一步分析。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!欢迎加入技术交流群:微信公众号:魔搭ModelScope社区,钉钉群号:44837352

热门讨论

热门文章

还有其他疑问?
咨询AI助理