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

use -rpath to fix libmklml_intel.so not found #11806

Merged
merged 10 commits into from
Jul 5, 2018
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ ENV HOME /root
COPY ./paddle/scripts/docker/root/ /root/

RUN apt-get update && \
apt-get install -y --allow-downgrades \
apt-get install -y --allow-downgrades patchelf \
git python-pip python-dev python-opencv openssh-server bison \
libnccl2=2.1.2-1+cuda8.0 libnccl-dev=2.1.2-1+cuda8.0 \
wget unzip unrar tar xz-utils bzip2 gzip coreutils ntp \
Expand Down
15 changes: 15 additions & 0 deletions python/paddle/libs/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved
Copy link
Contributor

Choose a reason for hiding this comment

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

为什么要加这个文件呢?我看numpy的lib下面只有so.

$ pwd
xxx/python2.7/site-packages/numpy/.libs
$ ll
-rwxrwxr-x 1 tangjian tangjian  1023960 Jun 15 01:01 libgfortran-ed201abd.so.3.0.0
-rwxrwxr-x 1 tangjian tangjian 38513408 Jun 15 01:01 libopenblasp-r0-39a31c03.2.18.so

Copy link
Contributor Author

Choose a reason for hiding this comment

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

一开始如果没有__init__.py的话,whl打包的时候,会找不到这个目录。不过可以尝试在打包后删除这个文件。

#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# used for setup.py.in to store the thirdparty shared libraries
34 changes: 27 additions & 7 deletions python/setup.py.in
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from setuptools import setup, Distribution, Extension
import subprocess
import shutil
import os
class BinaryDistribution(Distribution):
def has_ext_modules(foo):
return True
Expand Down Expand Up @@ -62,6 +64,7 @@ write_version_py(filename='@PADDLE_BINARY_DIR@/python/paddle/version.py')


packages=['paddle',
'paddle.libs',
'paddle.utils',
'paddle.dataset',
'paddle.reader',
Expand Down Expand Up @@ -113,12 +116,30 @@ package_dir={
}
if '${WITH_FLUID_ONLY}'== 'OFF':
package_dir['py_paddle']='${PADDLE_BINARY_DIR}/python/py_paddle'


paddle_rt_lib_dir = 'lib'
paddle_rt_libs = ['${WARPCTC_LIBRARIES}']
if '${MKL_SHARED_LIBS}'!= '':
paddle_rt_libs += '${MKL_SHARED_LIBS}'.split(';')
# put all thirdparty libraries in paddle.libs
package_data['paddle.libs']=['libwarpctc.so']
libs_path='${PADDLE_BINARY_DIR}/python/paddle/libs'
shutil.copy('${WARPCTC_LIBRARIES}', libs_path)
if '${WITH_MKL}'== 'ON':
shutil.copy('${MKLML_LIB}', libs_path)
shutil.copy('${MKLML_IOMP_LIB}', libs_path)
package_data['paddle.libs']+=['libmklml_intel.so','libiomp5.so']
if '${WITH_MKLDNN}'== 'ON':
package_data['paddle.libs']+=['libmkldnn.so.0']
shutil.copy('${MKLDNN_SHARED_LIB}', libs_path)
package_dir['paddle.libs']=libs_path

# change rpath of core.so, add $ORIGIN/../libs/ to it.
# The reason is that libwarpctc.so, libiomp5.so etc are in paddle.libs, and
# core.so is in paddle.fluid, thus paddle/fluid/../libs will pointer to above libraries.
# This operation will fix https://github.com/PaddlePaddle/Paddle/issues/3213
os.environ['core_rpath']=str(os.popen("patchelf --print-rpath \
Copy link
Contributor

Choose a reason for hiding this comment

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

为什么要用environ?直接存一个string可以吗?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

存一个string的写法一直没有搞定,所以换成environ了。

${PADDLE_BINARY_DIR}/python/paddle/fluid/core.so").read().strip('\n'))
os.environ['core_rpath']=os.environ['core_rpath']+":'$ORIGIN/../libs/'"
Copy link
Contributor

Choose a reason for hiding this comment

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

其实我觉得是不是别的路径都不需要,只要ORIGIN那个就好了,因为他的路径都是编译时就有的。安装之后很大可能也用不到。

Library runpath: [/home/tangjian/.jumbo/opt/gcc48/lib64:/home/tangjian/.jumbo/lib:$ORIGIN/../libs/]
ldd core.so
libiomp5.so => /usr/local/lib/python2.7/dist-packages/paddle/fluid/./../libs/libiomp5.so (0x00007ff7b16c6000)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

有道理。

command = "patchelf --set-rpath " + os.environ['core_rpath'] +\
" ${PADDLE_BINARY_DIR}/python/paddle/fluid/core.so"
os.system(command)
Copy link
Contributor

Choose a reason for hiding this comment

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

Same as above, need some checks.


setup(name='${PACKAGE_NAME}',
version='${PADDLE_VERSION}',
Expand All @@ -128,6 +149,5 @@ setup(name='${PACKAGE_NAME}',
ext_modules=[Extension('_foo', ['stub.cc'])],
package_data=package_data,
package_dir=package_dir,
scripts=paddle_bins,
data_files=[(paddle_rt_lib_dir, paddle_rt_libs)]
scripts=paddle_bins
)