-
Notifications
You must be signed in to change notification settings - Fork 5.7k
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
refine the dependencies of BLAS related libraries #3332
Comments
我有几点comment, 仅供大家参考哈:
另外,不是很推荐让用户自己下载编译安装MKLDNN,所以最终,至少我们还是要把MKLDNN的lib加入whl,那么还是需要去fix动态库的问题?MKLML的动态库应该也是一回事。 所以最终还是取决大家看觉得怎么最合适? |
MKLML的下载地址是prepare.sh,但这个地址里使用的是mklml_lnx_2018.0.20170425.tgz。Paddle目前使用的是mklml_lnx_2018.0.20170720.tgz。虽然MKLDNN的是最官方的,但我们提供的是最新的,用户应该不会觉得confuse。
cudnn/nnpack都是让用户设置一个环境变量的。
因为MKLDNN的编译安装略显麻烦,而且mkldnn.lib只有3M,所以可以让用户下载MKLML的lib。MKLDNN的编译安装由Paddle自动完成。 |
是的,这个应该是还没更新。但是Paddle目前我用的最新的。 那个confuse,其实我想说的用户去下载MKLML却要去MKLDNN的release package里面下,这两个其实应该是独立的关系的,这里会不会有confuse。如果觉得还好的话,应该也没太大关系,比较都是Intel的东西。 |
如果采用下载MKLML的方式,就不会让用户去MKLDNN的release package里面下载。这个脚本可以放在Paddle里面。 另外,我们可以先通过修改MKLDNN的源码,让它编译出静态库么? |
@tensor-tang 是的,动态库依赖始终是一个问题,所以可能还是把动态库放到python wheel包里面比较合适 那么,现在需要解决的就是保证python wheel包里面的core.so 依赖于 mklml.so 的依赖路径是对的 |
@QiJune 关于这个问题,现在他的依赖路径不对吗,我记得以前路径是对的,只不过由于lib被删了,所以才找不到的。 |
这一点我觉得,我们可以先提一个issue给MKLDNN team, 看他们觉得从mkldnn的角度这样是否可行,有没有别的什么问题,我觉得需要他们先确定。然后我们再改code才有效。他们team的效率还是蛮高的 |
@tensor-tang 主要在paddle重构的新代码里面,mul_op是依赖于mklml库的。最后python/paddle/v2/framework里面会编译生成一个core.so的动态库,这个动态库会依赖于libmklml_intel.so. 在python包安装之后,路径就不太对 复现方法如下:
会报这个错误
可以查看安装的paddle包的内容
会打印如下信息
也可以先看看#3209 这个pr所产生的build log |
Thanks @QiJune . 我在最新的paddle上打开MKLML没有发现问题。
没有发现link MKLML的相关信息。
这一点是在你的code里面加的吗?是这里对吗 另外,我看到这个是相对路径
是不是在你code哪里的路径改为绝对路径就好了,实际上lib的存在位置是对的。 并且我检查了下cmake的输出,是绝对路径,所以是不是看下那个相对路径是怎么的出来比较好?
|
@tensor-tang 是的,因为矩阵乘法依赖于mklml库 那个相对路径是怎么出来的还在看,但是即使改成绝对路径也不能解决python包的问题。 |
这点我就不是很明白了,如果mklml让用户安装的话,还是会有这个问题吗? |
在编译的时候,设置python/paddle/v2/framework/core.so依赖的是一个绝对路径,third_party里面的mklml动态库。这样如果用户自己是编译paddle源代码,然后pip install自己生成的wheel包就不会有问题。 但是,在发布python包的时候,如果不考虑让用户安装mklml,那么就需要把mklml动态库给拷贝到wheel包里面,同时需要把core.so的rpath给设置对了,设置为core.so同一级目录的路径,而不是编译时的third_party的绝对路径。 |
这点我同意。 但是, 我认为整体上是两个问题,单独来看: 第一个问题,
不管是不是用户安装,还是用third party 的mklml。如果在绝对路径对了的情况下,是不是可以解决你上面的问题?如果是,那么我认为你的问题#3209 找不到libmklml的问题就解了, 因为你是ldd出来的结果,如果lib都能found 就没有问题了,对吧。 第二问题,才是 我们到底是应该以怎样的方式使用mklml,这样时候才是发布Python包的问题。 但是,这个issue的topic是讨论的是第二问题,我觉得不影响你在现有的情况下解决问题一,对吧? 如果我的理解有误,请随时指正我,谢谢。 |
@tensor-tang 第一个问题,要保证链接的是绝对路径,似乎现在cmake会自动找相对路径;目前还在尝试解决方案 |
可以先把with_mklml和with_mkldnn都关了。那后面的思路是:如果用户下载了mklml,paddle就来编译mkldnn么? |
我认为,可以先单独关闭 |
hi @QiJune
所以我觉得是不是cmake 版本的问题? 我的cmake 版本是3.5.2 |
目前paddle处理blas相关的依赖库如下:
分支A:
1默认安装 MKLML WITH_MKLML=ON
2 下载 mklml库 include(external/mklml)
3 检查机器上是否存在blas库 include(externel/openblas) —> include(cblas)
因为已经下载安装mklml库,所以检查成功
分支B:
1 如果关闭MKLML库 WITH_MKLML=OFF
2 跳过下载mklml库
3 检查机器上是否存在blas库 include(externel/openblas) —> include(cblas)
4 依次搜索MKL/ATLAS/OpenBLAS等库,用户可以设置MKL_ROOT/ATLAS_ROOT/OPENBLAS_ROOT等指定路径;如果找到,会加上相应的编译选项,例如add_definitions(-DPADDLE_USE_OPENBLAS)
5 如果上述库都没有找到,则进入下载编译openblas阶段, 在这里会触发一个bug,没有设置
add_definitions(-DPADDLE_USE_OPENBLAS)
目前遇到一个问题是,如果打开WITH_MKLML选项,则mklml相关动态库会被安装在third_party目录下,安装python wheel包之后,目前的在python/paddle/v2/framework的core.so会找不到相应的mklml动态库
对于blas相关的库依赖有两种解决方案:
方案一:让用户安装相应的库,然后指定相应的路径传给paddle;
方案二:使用third_party的方式来下载依赖
目前两种都支持,但是存在互相交叉,python端的动态库依赖还没有解决。
使用方案一会使得依赖问题会清爽一些,依赖问题也容易解决
The text was updated successfully, but these errors were encountered: