동적 지식 그래프 라이브러리 DynGEM의 학습 라이브러리 설치 및 디버깅

배경

주제를 시작해야했고 동적 지식 그래프의 내용을 연구하고 싶었습니다. 제 시간에 맞춰서 dyngraph2vec : 동적 그래프 표현 학습을 사용하여 네트워크 역학 캡처 를 읽고 제 기사를 기반으로 DynGEM 라이브러리를 열었습니다. . 공리주의의 원리에 따라 지난주에 그것을 탐구하는 과정을 시작했습니다

이 라이브러리의 README.md에 따라 먼저 DynTriad 와 종속 환경을 설치 한 다음 DynGEM 자체와 환경을 설치해야합니다. 라이브러리의 설치가 어렵지 않을 거라고 생각했는데, 많은 의존성이 소스 설치를 필요로하고 설치가 완료 되더라도 가져올 수 있다고 기대했지만, 의존 버전, 환경 변수, 라이브러리 코드 자체로 인해, 일부 소스 코드를 수정해야하는데, 원활한 실행을 위해 약간의 차질이 있었고 완료하는 데 5 일이 걸렸습니다. 따라서 CentOS7의 설치 및 디버깅 프로세스에 대한 기록이 있으므로 우회를 피하시기 바랍니다.

DynTriad

다음 단계를 순서대로 수행하는 것이 좋습니다.

Boost.Python

1.58 버전1.73 버전 을 다운로드하고 설치하려면 명령이 동일하므로 58을 73으로 변경하면됩니다.

1.73을 예로 들어 명령을 실행하여 압축을 풀고 잘라냅니다.

[root@scentos DynamicGraph]# tar -xvzf boost_1_73_0.tar.gz
[root@scentos DynamicGraph]# cd boost_1_73_0/

그런 다음 명령을 실행하여 컴파일하고 설치하십시오.

[root@scentos boost_1_73_0]# ./bootstrap.sh
[root@scentos boost_1_73_0]# ./b2 install

완료 될 때까지 기다립니다. 완료되면 / usr / local / lib 아래에 많은 라이브러리가 생성됩니다.

[root@scentos boost_1_73_0]# ll/usr/local/lib
total 42032
.....

python3 버전을 컴파일하고 설치해야하는 경우 아래 단계를 따르세요.

먼저 bootstrap.sh 파일을 수정하고 python.configured에서 내용을 수정하십시오. python : $ PYTHON_VERSION : "$ PYTHON_ROOT"를 사용하여 원본을 주석 처리하고 cat에 따라 Python3의 내용을 작성합니다. Using python : 3.5 : "/usr/local/bin/python3.5": / usr / local / include /python3.5m : / usr / local / lib;

import python ;
if ! [ python.configured ]
{
    # using python : $PYTHON_VERSION : "$PYTHON_ROOT" ;
    # using python : 3.6 : "/usr/bin/python3.6" : /usr/include/python3.6m : /usr/local/lib ;
    using python : 3.5 : "/usr/local/bin/python3.5" : /usr/local/include/python3.5m : /usr/local/lib ;
}
EOF
fi

그런 다음 부트 스트랩 스크립트를 호출하고 매개 변수를 추가합니다.

[root@scentos boost_1_73_0]# ./bootstrap.sh --with-python=python3 --with-python-root=/usr/local/bin/python3.5 --with-python-version=3.5

설치 명령은 여전히 ​​./b2 install입니다.

시행 착오 끝에 버전 1.73은 Python 3.6 및 Python 2.7로 컴파일되었고 버전 1.58은 Python 3.5로 컴파일되었습니다.

CMake

https://cmake.org/download/ 패키지를 다운로드 한 다음 명령을 실행합니다.

[root@scentos DynamicGraph]# tar -zxvf cmake-3.18.2.tar.gz
[root@scentos DynamicGraph]# cd cmake-3.18.2/
[root@scentos cmake-3.18.2]# ./bootstrap
[root@scentos cmake-3.18.2]# make
[root@scentos cmake-3.18.2]# make install

개인적인

http://eigen.tuxfamily.org/index.php?title=Main_Page#Download 패키지를 다운로드 한 다음 압축을 풉니 다.

[root@scentos DynamicGraph]# tar -zxvf eigen-3.3.7.tar.gz

압축이 풀린 eigen-3.3.7 디렉토리에서 컴파일 및 설치하지 마십시오. 새 디렉토리 (여기서는 eigen3.3.7)를 만든 다음이 디렉토리로 이동하여 여기에서 eigen을 컴파일하고 설치해야합니다.

[root@scentos DynamicGraph]# mkdir eigen3.3.7
[root@scentos DynamicGraph]# cd eigen3.3.7
[root@scentos eigen3.3.7]# cmake ../eigen-3.3.7
[root@scentos eigen3.3.7]# make install

mpfr 및 expat

다운로드 경로는 https://www.mpfr.org/mpfr-current/#downloadhttps://sourceforge.net/projects/expat/입니다 . 다운로드 후 압축을 풀고 두 디렉터리를 입력하고 각각 실행합니다.

./configure
make && make install

cgal

다운로드 경로 https://github.com/CGAL/cgal/tree/releases/CGAL-4.7 , 다운로드 및 압축 해제, 디렉토리 입력 및 명령 실행

[root@scentos cgal-releases-CGAL-4.7]# cmake .
[root@scentos cgal-releases-CGAL-4.7]# make && make install

GraphTool

프로젝트 압축 패키지 https://git.skewed.de/count0/graph-tool/-/tree/master를 다운로드하고 먼저 gcc 버전> = 9.1.0인지 확인하십시오.

[root@scentos DynamicGraph]# gcc --version
gcc (GCC) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

버전이 상대적으로 낮거나 gcc가 전혀없는 경우 CentOS7 에서 gcc를 9.3.0 으로 업그레이드 하는 방법에 대한 내 기사를 참조 하여 업그레이드하거나 설치할 수 있습니다.

그런 다음 python2의 pip를 설치하고 https://pypi.org/project/pip/#files 경로를 다운로드하고 압축 해제 후 해당 디렉토리를 입력하고 명령을 실행하십시오.

[root@scentos pip-20.2.3]# python setup.py install
[root@scentos pip-20.2.3]# pip install pycairo scipy

yum을 사용하여 일부 종속성 설치

yum -y install numpy.x86_64 scipy.x86_64

마지막으로 명령을 실행하여 graph-tool을 컴파일하고 설치합니다. 여기에서 시간이 오래 걸립니다. 가상 머신에 쿼드 코어 8G 메모리가있는 데 2 ​​시간 이상이 걸렸습니다.

[root@scentos DynamicGraph]# tar -zxvf graph-tool-master.tar.gz
[root@scentos DynamicGraph]# cd graph-tool-master/
[root@scentos graph-tool-master]# ./autogen.sh
[root@scentos graph-tool-master]# ./configure --disable-sparsehash
[root@scentos graph-tool-master]# make && make install

DynamicTriad

위의 라이브러리를 설치 한 후 DynamicTriad를 컴파일하고 설치할 수 있으며 프로젝트 주소는 https://github.com/luckiezhou/DynamicTriad입니다.

먼저 pip로 딜 설치

[root@scentos DynamicTriad-master]# pip install dill

그런 다음 설치를 수행하고 다음 경로 및 기타 변수를 자신의 것으로 변경해야합니다.

[root@scentos DynamicTriad-master]# ./build.sh
entering /home/szc/DynamicGraph/DynamicTriad-master
You may need to specify some environments before building
PYTHON_LIBRARY? (default: /usr/lib64/libpython2.7.so.1.0, use a space ' ' to leave it empty) 
PYTHON_INCLUDE_DIR? (default: /usr/include/python2.7, use a space ' ' to leave it empty) 
EIGEN3_INCLUDE_DIR? (default: /usr/include, use a space ' ' to leave it empty) /home/szc/DynamicGraph/eigen-3.3.7
BOOST_ROOT? (default: , use a space ' ' to leave it empty) /usr/local/lib
name for boost_python library? (useful when boost_python cannot be detected by cmake) (default: boost_python, use a space ' ' to leave it empty) 

내부의 일부 변수 경로 (/home/szc/DynamicGraph/eigen-3.3.7, / usr / local / lib)는 상황에 따라 변경됩니다.

결과는 다음과 같습니다.

그런 다음 test.py를 실행하여 빌드가 완료되었는지 확인하십시오.

이 시점에서 DynTriad 및 해당 종속성이 설치되고 중지됩니다.

DynGEM

DynTriad 외에도이 라이브러리는 MATLAB 및 LaTex를 설치해야합니다.

MATLAB

다운로드 주소 https://www.mathworks.com/products/compiler/matlab-runtime.html , 2019 (9.6) 다운로드를 선택합니다. 다운로드하고 압축을 푼 후 ./install을 실행하고 기본값을 끝까지 실행합니다. 완료 후 / etc / profile 파일을 수정하고 끝에 행 추가

export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/MATLAB/MATLAB_Runtime/v96/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v96/runtime/glnxa64:/usr/local/MATLAB/MATLAV_Runtime/v96/sys/os/glnxa64

저장하고 종료 한 후 소스를 사용하여 효과적이되도록합니다.

유액

다운로드 주소는 https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/Images/ 이고 내부에서 textlive.iso를 선택합니다. 다운로드 후 가상 머신에 넣고 원본을 지우고 새 것을 마운트하고 설치하십시오.

[root@scentos szc]# locate texlive | xargs rm -rf
[root@scentos szc]# mount  -o loop texlive.iso /mnt/
[root@scentos szc]# cd /mnt/
[root@scentos mnt]# ./install-tl

설치 방법을 선택하고 i를 직접 선택하십시오. 설치 후 / etc / profile 파일 끝에 몇 줄의 환경 변수를 추가하십시오.

export PATH=/usr/local/texlive/2020/bin/x86_64-linux:$PATH

export MANPATH=/usr/local/texlive/2020/texmf-dist/doc/man
export INFOPATH=/usr/local/texlive/2020/texmf-dist/doc/info

그런 다음 소스를 활성화하고 라텍스 버전을 확인하십시오.

[root@scentos mnt]# source /etc/profile
[root@scentos mnt]# tex --version
TeX 3.14159265 (TeX Live 2020)
kpathsea version 6.3.2
Copyright 2020 D.E. Knuth.
There is NO warranty.  Redistribution of this software is
covered by the terms of both the TeX copyright and
the Lesser GNU General Public License.
For more information about these matters, see the file
named COPYING and the TeX source.
Primary author of TeX: D.E. Knuth.
[root@scentos mnt]#

DynGEM

프로젝트 주소는 https://github.com/palash1992/DynamicGEM입니다 . 디렉토리에 다운로드하고 압축을 푼 후 직접 실행하십시오.

python setup.py install

예, 오류가보고 된 경우

Traceback (most recent call last):
  File "./setup.py", line 185, in <module>
    setup_package()
  File "./setup.py", line 138, in setup_package
    write_version_py()
  File "./setup.py", line 119, in write_version_py
    version = imp.load_source('DynamicGEM.version', 'dynamicgem/version.py')
  File "/usr/lib64/python3.6/imp.py", line 172, in load_source
    module = _load(spec)
  File "<frozen importlib._bootstrap>", line 684, in _load
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 674, in exec_module
  File "<frozen importlib._bootstrap_external>", line 781, in get_code
  File "<frozen importlib._bootstrap_external>", line 741, in source_to_code
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "dynamicgem/version.py", line 3
    short_version = '1.0.0'

그런 다음 dynamicgem / version.py 파일을 수정하고 원본 콘텐츠를 지우고 다음 콘텐츠를 복사합니다 (실제로 코드에 의해 생성 된 version.py에서 코드의 각 줄을 들여 쓰기 때문에 발생 함).

short_version = '1.0.0'
version = '1.0.0'
full_version = '1.0.0'
git_revision = 'Unknown'
release = True
if not release:
    version = full_version
    short_version += ".dev"

DynGEM 디버그

pycharm을 사용하여 DynGEM 공식 웹 사이트의 README.md에 python3.6으로 테스트 코드를 붙여넣고 실행하면 다음과 같은 문제가 발견되었습니다.

1) 미리 컴파일 된 DynamicTraid의 mygraph가 so 패키지이므로 DynamicGEM에서 가져 오는 방법이 잘못되어 ctype의 가져 오기 방법으로 변경해야합니다.

# /usr/local/lib/python3.6/site-packages/dynamicgem/dynamictriad/core/gconv.py

import ctypes
import os
# mygraph=ctypes.cdll.LoadLibrary(os.path.realpath('')+'/dynamicgem/dynamictriad/core/mygraph.so')
dll_path_ = "/home/szc/DynamicGraph/DynamicGEM-master/dynamicgem/dynamictriad/core/mygraph-build/mygraph.so"
mygraph = ctypes.cdll.LoadLibrary(dll_path_)

# import dynamicgem.dynamictriad.core.mygraph as mygraph

만큼 잘

# /usr/local/lib/python3.6/site-packages/dynamicgem/dynamictriad/core/mygraph_utils.py

import os
import ctypes
# mygraph=ctypes.cdll.LoadLibrary(os.path.realpath('')+'/dynamicgem/dynamictriad/core/mygraph.so')
dll_path_ = "/home/szc/DynamicGraph/DynamicGEM-master/dynamicgem/dynamictriad/core/mygraph-build/mygraph.so"
mygraph = ctypes.cdll.LoadLibrary(dll_path_)
# import dynamicgem.dynamictriad.core.mygraph as mygraph

2) MATLAB의 libstdc ++ 파일을 교체합니다. 이는 MATLAB9.6의 libstdc ++. so 파일 6.0.22 버전에는 GLIBCXX_3.4.26이 없지만 6.0.28 버전에는 있으므로 후자로 교체해야합니다. 그렇지 않으면 기다리십시오. 오류.

[root@scentos boost_1_73_0]# mv /usr/local/MATLAB/MATLAB_Runtime/v96/sys/os/glnxa64/libstdc++.so.6.0.22 /usr/local/MATLAB/MATLAB_Runtime/v96/sys/os/glnxa64/libstdc++.so.6.0.22_old
[root@scentos boost_1_73_0]# cp /usr/lib64/libstdc++.so.6.0.28 /usr/local/MATLAB/MATLAB_Runtime/v96/sys/os/glnxa64/
[root@scentos boost_1_73_0]# rm -f /usr/local/MATLAB/MATLAB_Runtime/v96/sys/os/glnxa64/libstdc++.so.6
[root@scentos boost_1_73_0]# ln -s libstdc++.so.6.0.28 /usr/local/MATLAB/MATLAB_Runtime/v96/sys/os/glnxa64/libstdc++.so.6

3) keras 및 tensorflow 버전이 일치하는지 확인하고, 여기서 tensorflow는 버전 1.11이어야하며, https://docs.floydhub.com/guides/environments/ 에 따라 keras 버전을 수정합니다.

[root@scentos Textset]#  /usr/local/bin/pip3.6 install tensorflow==1.11 
[root@scentos Textset]#  /usr/local/bin/pip3.6 install keras==2.2.4

그런 다음 numpy를 업그레이드하고 h5py 버전을 수정하십시오.

[root@scentos Textset]#  /usr/local/bin/pip3.6 install -U numpy
[root@scentos Textset]#  /usr/local/bin/pip3.6 install h5py==2.8.0

4) 운전 중 여전히 수퍼 파라미터 불일치 문제가 발생하면 해당 코드 부분으로 건너 뛰어 수정해야합니다.

예를 들어, 환경 변수의 MATLAB 주소로 실행 중이므로 해당 파일 (/usr/local/lib/python3.6/site-packages/TIMERS_ALL)에서 해당 부분 (os.environ이 아닌 경우)을 수정했습니다. /__init__.py) [self.path_var] .__ contains __ ( "MATLAB") 부분) :

    def get_paths_from_os(self):
        ....

        path_elements = []
        if self.path_var in os.environ:
            if not os.environ[self.path_var].__contains__("MATLAB"):
                os.environ[self.path_var] = os.environ[self.path_var] + os.pathsep\
                                            + "/usr/local/MATLAB/MATLAB_Runtime/v96/bin/glnxa64:" \
                                              "/usr/local/MATLAB/MATLAB_Runtime/v96/runtime/glnxa64:" \
                                              "/usr/local/MATLAB/MATLAB_Runtime/v96/sys/os/glnxa64"
            path_elements = os.environ[self.path_var].split(os.pathsep)
        if not path_elements:
            .....

구성 편집-> 환경 변수에서 지정할 수도 있습니다.

5) 여기로 가면 실제로 대부분의 DynGEM 코드를 실행할 수 있지만 DynTriad에는 여전히 문제가 있습니다.

  ....
  File "/usr/local/lib/python3.6/site-packages/dynamicgem/dynamictriad/core/mygraph_utils.py", line 90, in load_adjlist
    g = mygraph.Graph(node_type, weight_type)
  File "/usr/lib64/python3.6/ctypes/__init__.py", line 356, in __getattr__
    func = self.__getitem__(name)
  File "/usr/lib64/python3.6/ctypes/__init__.py", line 361, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: /...../DynamicGEM-master/dynamicgem/dynamictriad/core/mygraph-build/mygraph.so: undefined symbol: Graph

해당 코드는

# dynamicgem\dynamictriad\core\mygraph_utils.py

def load_adjlist(fn, node_type='string', weight_type='float'):
    """
    loads only undirected graph, if multiple instances of the same edge is detected,
    their weights are summed up
    :param fn:
    :param node_type:
    :param weight_type:
    :return:
    """
    py_node_type = type2python(node_type)
    py_weight_type = type2python(weight_type)

    edgeset = set()  # check if the graph is undirected
    g = mygraph.Graph(node_type, weight_type)
    for line in open(fn, 'r'):
        fields = line.split()

오류 메시지에 따르면 오류는 mygraph.so에 Graph 속성이나 클래스가 없다는 것이며, 컴파일을 위해 so 패키지 경로를 DynGEM에서 DynTriad로 변경했습니다.이 문제는 여전히 있지만 사이트 패키지의 dyngem / dyntraid / core 디렉토리에는 mygraph.py 파일이 없으므로 DynGEM 코드 자체에 문제가 될 것입니다. 이미 작성자에게 문제를 제기했지만 아직 답장을 보지 못했습니다.

가동 결과

기사의 시그니처 모델 AERNN을 예로 들어 테스트는 DynGEM을 실행하고 실행은 40 분 이상 후에 종료됩니다. 스크린 샷은 다음과 같습니다.

결론

이 시점에서 DynGEM이 설치되어 정상적으로 동작하더라도 (DynTriad 테스트 부분 제외) 브레이크 포인트 디버깅을 통해 이해하고 탐색 할 수 있습니다.

마지막으로 모든 링크를 네트워크 디스크에 연결하여 다운로드합니다.

링크 : https://pan.baidu.com/s/1TaDTq555xIF6o_xWGlHq1Q 
추출 코드 : kkwf

추천

출처blog.csdn.net/qq_37475168/article/details/108614253