Skip to content

修复 DirectML 支持 #2066

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

Merged
merged 1 commit into from
Mar 30, 2025
Merged

Conversation

endink
Copy link
Contributor

@endink endink commented Mar 30, 2025

问题描述:

当使用以下 CMAKE 参数:

  • DSHERPA_ONNX_ENABLE_DIRECTML=ON

同时设置以下环境变量:

  • SHERPA_ONNXRUNTIME_INCLUDE_DIR
  • SHERPA_ONNXRUNTIME_LIB_DIR

通常,这个时候无论我们自定义的 ONNX 是链接静态 ONNX 还是动态 ONNX, DML 都应该由选项 DSHERPA_ONNX_ENABLE_DIRECTML 决定,一旦 DML 开启,现有的 cmake 文件 onnxruntime-win-x64-directml.cmake 会强制下载一个 onnruntime (包含 DML),而不再遵循 SHERPA_ONNXRUNTIME_INCLUDE_DIRSHERPA_ONNXRUNTIME_INCLUDE_DIR (自定义路径将无效)。


这个 PR 优先考虑用户自定义 onnxruntime 路径, 两种情况:

  1. 如果自定义路径中是动态链接库,那么仅下载 DIRECTML 包,由于 DML 包的 .lib 兼容性良好,链接库的版本影响不大(测试 1.0-1.15 都可以使用同一个 .lib 来链接 C++ 符号),最终用户可以选择自己发布自己 onnxruntime 并附加任意版本的 directml.dll 来得到想要的输出,而不是被强制覆盖到 onnxruntime-win-x64-directml.cmake,这个 PR 可以 fix 掉问题。

  2. 如果自定义路径中是静态链接库(例如使用我这里提供的预编译静态库),那么情况会变得复杂。

编译一个带有 DML 的 ONNX 静态链接后,使用时候还需要链接系统中的 D3D 符号和 directml.lib 文件,解决这个问题,添加一个选项 SHERPA_ONNX_LINK_D3D 让用户自行控制是否连接 D3D 相关符号,同时,sherpa-onnx\csrc\CMakeList.txt 中添加代码:

if(TARGET directml)
    target_link_libraries(sherpa-onnx-core directml)
endif()

以上代码检查,目标 directml (onnxruntime-win-x64-directml.cmake 生效时) 存在时,core 依赖 dicrectml, 我相信无论静态编译还是动态编译这个代码都不会有副作用,已经编译动态库并测试成功。

PS: 通过连接一个预编译的 ORT 静态库(带 DML ), 可以让整个 sharpa onnx 仅依赖 directml.dll, 减少 onnxruntime.dll 依赖,这样避免复杂项目中 onnxruntime 库冲突问题。

Copy link
Collaborator

@csukuangfj csukuangfj left a comment

Choose a reason for hiding this comment

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

Thank you for your contribution!

@csukuangfj csukuangfj merged commit ce196fc into k2-fsa:master Mar 30, 2025
170 of 212 checks passed
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.

2 participants