2019년 4월 25일 목요일
RAPIDS.ai on IBM POWER9 : ppc64le 환경에서 cuDF를 source로부터 build하기
RAPIDS.ai는 NVIDIA가 요즘 공을 들이고 있는 GPU를 이용한 data science platform입니다. 그 핵심 모듈이 cuDF와 cuML입니다. 이 모듈들은 최근 발표된 IBM PowerAI toolkit에도 포함되어 있습니다. ( https://www.ibm.com/support/knowledgecenter/en/SS5SF7_1.6.0/navigation/pai_getstarted_rapids.html 참조)
다만 IBM PowerAI는 CUDA 10.1만을 지원하는 등 제약 사항이 일부 있기 때문에 모든 환경에서 유연하게 사용하시기가 곤란한 부분이 있을 수 있습니다. 그래도 어차피 RAPIDS는 open source니까, ppc64le 아키텍처 위에서 그냥 source로부터 build하시면 됩니다. 이번 posting에서는 cuDF를 Ubuntu 18.04 ppc64le에서 build하는 방법을 보시겠습니다.
일단 아래와 같이 cuda 10.0을 설치합니다.
~/files$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/ppc64el/cuda-repo-ubuntu1804_10.0.130-1_ppc64el.deb
~/files$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/ppc64el/7fa2af80.pub
~/files$ sudo apt-get update
~/files$ sudo apt-get install cuda
~/files$ sudo tar -xvf ./cudnn-10.0-linux-ppc64le-v7.5.0.56.solitairetheme8 -C /usr/local
~/files$ sudo tar -xvf ./nccl_2.4.2-1+cuda10.0_ppc64le.txz -C /usr/local
Python은 Anaconda3를 설치하여 Python 3.6.8을 사용했습니다.
~/files$ which python
/home/u0017649/anaconda3/bin/python
먼저 conda install 명령으로 아래 package들을 설치합니다.
~/files$ conda install numpy six setuptools cython pandas pytest cmake flatbuffers rapidjson boost boost-cpp thrift snappy zlib gflags brotli lz4-c zstd arrow -c conda-forge
먼저 유의하실 것은 Ubuntu 18.10의 기본 gcc 버전인 gcc-8은 CUDA 10.0을 지원하지 않습니다. 그런데 또 현재 cudf v0.7.0은 아직 CUDA 10.1을 지원하지 않습니다. 그래서 해결책은 Ubuntu에 gcc-7과 g++-7을 설치해야 합니다.
~/files$ sudo apt-get install -y gcc-7 gcc-7-base gcc-7-powerpc-linux-gnu libgcc-7-dev g++-7
~/files$ sudo rm /usr/bin/gcc /usr/bin/g++
~/files$ sudo ln -s /usr/bin/gcc-7 /usr/bin/gcc
~/files$ sudo ln -s /usr/bin/g++-7 /usr/bin/g++
먼저, RMM을 설치합니다.
~/files$ git clone --recursive https://github.com/rapidsai/rmm.git
~/files$ cd rmm
~/files/rmm$ rm -rf build
~/files/rmm$ mkdir build && cd build
~/files/rmm/build$ cmake ..
~/files/rmm/build$ make -j2
~/files/rmm/build$ sudo make install
~/files/rmm/build$ cd ../python
~/files/rmm/python$ python setup.py install
다음으로는 custrings를 설치합니다.
~/files$ git clone --recursive https://github.com/rapidsai/custrings.git
~/files$ cd custrings/cpp
~/files/custrings/cpp$ mkdir build && cd build
~/files/custrings/cpp/build$ cmake ..
~/files/custrings/cpp$ make -j2
~/files/custrings/cpp$ sudo make install
다음으로는 thrift를 설치합니다.
~/files$ git clone --recursive https://github.com/apache/thrift
~/files$ cd thrift/
~/files/thrift$ sudo apt-get install libssl-dev
~/files/thrift$ ./bootstrap.sh
~/files/thrift$ ./configure
~/files/thrift$ cd build
~/files/thrift/build$ cmake ..
~/files/thrift/build$ make -j2
~/files/thrift/build$ sudo make install
다음으로는 Arrow를 설치합니다.
~/files$ sudo apt-get install libdouble-conversion1 libghc-double-conversion-dev libdouble-conversion-dev libgoogle-glog-dev libgoogle-glog0v5 thrift-compiler libthrift-java
~/files$ git clone https://github.com/apache/arrow.git
~/files$ cd arrow/cpp
~/files/arrow/cpp$ mkdir build && cd build
여기서 특정 header 파일을 아래와 같이 일부 수정해야 합니다. 이 error는 꼭 ppc64le 환경에서만 나는 것은 아니고, 나중에 patch가 될 예정입니다. ( error: there are no arguments to ‘DCHECK’ that depend on a template parameter, so a declaration of ‘DCHECK’ must be available 이라는 error 방지용. https://github.com/apache/arrow/issues/4014 참조)
~/files/arrow/cpp/build$ vi ~/files/arrow/cpp/src/arrow/util/sse-util.h
...
#include "logging.h" # 이 include 문을 삽입해야 함
~/files/arrow/cpp/build$ cmake -DCMAKE_BUILD_TYPE=release -DARROW_PYTHON=on -DARROW_PLASMA=on -DARROW_BUILD_TESTS=OFF -DARROW_PARQUET=ON ..
~/files/arrow/cpp/build$ make -j2
~/files/arrow/cpp/build$ sudo make install
~/files/arrow/cpp/build$ cd ../../python
~/files/arrow/python$ export ARROW_HOME=/usr/local
기본으로 설치되는 Cython 버전이 맞지 않으므로, 반드시 0.29 버전으로 새로 설치해야 하더라고요.
~/files/arrow/python$ pip install Cython==0.29
~/files/arrow/python$ MAKEFLAGS=-j2 python setup.py build_ext --build-type=release --with-parquet --inplace
~/files/arrow/python$ MAKEFLAGS=-j2 python setup.py build_ext --build-type=release --with-parquet --bundle-arrow-cpp bdist_wheel
위에서 생성되는 wheel file을 아래와 같이 설치하시면 됩니다.
~/files/arrow/python$ pip install dist/pyarrow-0.13.1.dev40+g6907d972.d20190408-cp37-cp37m-linux_ppc64le.whl
이제 비로소 cudf를 설치할 수 있게 되었습니다.
~/files$ git clone --recursive https://github.com/rapidsai/cudf.git
~/files$ cd cudf
~/files/cudf$ git submodule update --init --remote --recursive
여기서 역시 아래의 file 하나를 수정해야 합니다. 이 역시 ppc64le에 국한된 문제는 아니고, 아래 link에서 해결된 것인데, 나중에 patch로 반영될 예정입니다. ( https://github.com/rapidsai/cudf/issues/1384 참조)
~/files/cudf$ vi cpp/tests/hashing/hash_partition_test.cu
...
// The indices of the columns that will be hashed to determine the partitions
constexpr static const std::array<int, sizeof...(cols)> cols_to_hash{{cols...}};
};
template< typename tuple_of_vectors # 이하 4줄의 line을 추가하시면 됩니다.
gdf_hash_func hash,
int... cols>
constexpr const std::array<int, sizeof...(cols)> TestParameters<tuple_of_vectors, hash, cols...>::cols_to_hash;
그 다음은 아래와 같이 build하시면 됩니다.
~/files/cudf$ cd cpp
~/files/cudf/cpp$ mkdir build && cd build
~/files/cudf/cpp/build$ cmake .. -DCMAKE_INSTALL_PREFIX=~/anaconda3
~/files/cudf/cpp/build$ make -j2
~/files/cudf/cpp/build$ sudo make install
root@8f2f82cf3e22:/mnt/cudf# cd python
root@8f2f82cf3e22:/mnt/cudf/python# python setup.py build_ext --inplace
root@8f2f82cf3e22:/mnt/cudf/python# python setup.py install
...
Best match: numpy 1.16.2
Adding numpy 1.16.2 to easy-install.pth file
Installing f2py script to /opt/anaconda3/bin
Installing f2py3 script to /opt/anaconda3/bin
Installing f2py3.6 script to /opt/anaconda3/bin
Using /opt/anaconda3/lib/python3.6/site-packages
Finished processing dependencies for cudf==0.7.0.dev0+679.g97833593.dirty
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기