Open3D 빌드했는데 라이브러리가 너무 크네 어쩌지

 

TLDR;

  • Open3D를 그냥 빌드했더니 1.2GB로 엄청나게 컸다
  • 시스템에 BLAS를 설치하고, shared library로 설치해서 106MB로 다이어트 성공했다.

 


배경

Open3D는 Intel에서 만든 3D 데이터 프로세싱 라이브러리이다.

개인적으로 느끼기에는 PCL + Pangolin의 상위 호환 정도로 생각하고 있었다. 듣기로는 포인트 클라우드 프로세싱은 좋은 알고리즘 + SIMD 적용이 되어있어서 빠르다고 했고, Viewing 쪽은 Filament 백엔드를 통해 이쁘게 렌더링 할 수 있을 뿐만이 아니라 WebRTC를 적용해서 웹 브라우저에서도 원격으로 볼 수 있다는 점이 끌렸다. 특히, 임베디드 보드에서 아까운 디스플레이 렌더링 자원을 쓰지 않고, 원격통신을 통해 렌더링을 하면 훨씬 편하게 구현을 할 수있지 않을까란 기대가 컸다.

그래서 일단 받아서 빌드를 해봤다.

 


첫번째 시도: Naive 빌드

GitHub에서 소스코드를 땡겨왔다.

기본적인 CMake 빌드를 돌리면 되겠지~ 하고 아래 커맨드를 입력했다. 필자는 시스템 설치보다는 로컬 설치를 좋아해서 추가 옵션을 사용했다.

1
2
3
4
5
6
7
8
9
10
cd ~
mkdir open3d && cd open3d
git clone https://github.com/isl-org/Open3D.git .
mkdir build
mkdir install
cd build

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../install ..
make -j
sudo make install

일단 cmake configure할 때 -GNinja 옵션을 통해 Ninja 빌드도 돌려보려고 했는데, ninja는 의외로 작동하지 않았다. 그래도 make로는 잘 돌아가니 얼마나 다행인가.

빌드를 하며 깜짝 놀랐는데, 필요한 3rdParty 라이브러리들을 다 땡겨와서 소스빌드를 하고있다는 점이였다. CMake 스크립트를 어떻게 짰는지는 모르겠는데 굉장히 엘레강스 해보였다. 대신, 빌드하는데에 걸리는 전체 시간을 예상할 수 없는 점은 조금 아쉬웠다.

약 10분 정도 시간이 지난 후 빌드가 완료되었다.

그러고 내용을 봤는데 대충격!

빌드 된 라이브러리들의 총 용량이 1.2GB 였다.

아니 세상에 좀 이쁜 뷰어 쓰겠다고 1.2GB 라이브러리를 쓰는건 말이 안되잖아요

대체 어떤 라이브러리가 용량을 많이 차지하는지 분석을 해봤더니, BLAS와 MKL을 통합시킨 라이브러리가 약 700MB 정도 차지했다.

내가 아는 BLAS는 이정도까지 크지 않은데… MKL이 좀 많이 무겁긴 하지.

근데 내가 왜 굳이 MKL을 빌드해야하지? MKL은 Intel 쟁이들의 물건이 아닌가?? 하씨 어쩐지 Intel이 만든 라이브러리더라,, 근데 난 ARM CPU 쓸건데??

그래서 다음 단계로 나는 이 라이브러리를 빌드하지 않을 방법을 찾기 시작했다.

 


두번째 시도: BLAS 라이브러리를 교체해서 빌드

Open3D CMakeLists.txt를 보니 USE_BLAS라는 옵션이 보였다.

MKL 대신 BLAS를 사용한다? 그러면 MKL을 다운받을 필요가 없을테니, 700MB나 되는 라이브러리가 더 작아질 것이다.

그래서 다음과 같은 커맨드로 빌드를 해봤다.

1
2
3
4
5
6
7
8
9
10
cd ~
mkdir open3d && cd open3d
git clone https://github.com/isl-org/Open3D.git .
mkdir build
mkdir install
cd build

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../install -DUSE_BLAS=ON ..
make -j
sudo make install

또 빌드가 10분정도 돌았는데, 의외로 빌드가 중간에 터졌다.

나타는 에러는 다음과 같았다 - libopenblas.a: undefined reference to '_gfortran_concat_string'

gfortran???? GNU Fortran 컴파일러가 여기서 왜 나와???

추정하기로는, Open3D에서 USE_BLAS 옵션을 키면 선형대수 계산 가속을 OpenBLAS 라이브러리를 통해서 하는데, 이 라이브러리를 빌드할 때 gfortran 링크가 안된 것이다.

그러면 OpenBLAS를 다시 깔아야한다.

sudo apt-get install libopenblas-dev로 다시 설치를 해봤다.

하지만 에러는 계속 나타났다. 음? 그러면 시스템에 있는 openblas가 잘못된건가? 그럴리는 없을 거 같다.

그렇다면 아마 openblas를 로컬에 설치하고 있지 않을까해서 build 폴더를 들어가봤는데, 역시나 OpenBLAS를 직접 설치하고 있었다.

OpenBLAS가 설치가 안될 이유가 뭐가 있을까… gfortran을 다시 깔아봤는데도 동일한 에러가 나타났다.

일단 첫날은 여기까지 하고, Open3D GitHub에 issue를 남겼다.

“컴파일 된 라이브러리 크기를 줄일 방법이 없나요?”

답변은 생각보다 굉장히 빠르게 왔다. USE_BLAS 옵션을 줘서 빌드를 해보면 된다고 한다.

원작자는 제대로 빌드하면 100MB 정도로 나온다고 한다.

근데 그거 내가 하고있는거잖아!

 

세번째 시도: OpenBLAS 제대로 고쳐서 빌드

일단 제대로 빌드하면 100MB 로 나온다는걸 보니, 분명 이 방법이 맞기는 한 것 같다.

하지만 난 빌드가 안되는걸 보니 분명 내 OpenBLAS에 문제가 있다는거겠지.

OpenBLAS를 삭제하고, 이걸 빌드할 때 쓰일만한 라이브러리들을 다시 깔아보았다.

BLAS… ATLAS… LAPACK…

응? LAPACK이 다시 깔렸다. 나 LAPACK 안깔아놨나?

Open3D를 다시 빌드해봤고, 빌드는 성공했다.

아마 LAPACK을 통해 OpenBLAS를 설치하면 gfortran 링크 문제가 없는게 아닐까 생각이 든다.

빌드의 결과물은 약 400MB 였고, 정확히 1.2GB에서 700MB정도 되는 MKL 라이브러리가 빌드되지 않아 남은것만 빌드가 된거였다.

그래도 400MB는 꽤 큰 라이브러리였다. OpenCV가 50MB인걸 생각하면 말도 안되는 크기인거 같다.

혹시 OpenBLAS를 소스 빌드했나? 하고 확인해봤더니 역시 OpenBLAS를 소스코드를 땡겨와서 빌드한 것 같았다.

OpenBLAS는 시스템에 깔린걸 쓰면 좀 덜 무겁지 않나 생각이 들었다.

찾아봤더니 BUILD_BLAS_FROM_SOURCE라는 빌드 옵션이 있는거 같은데, 이걸 OFF하면 사이즈가 줄지 않을까 생각한다.

Open3D의 원작자가 코멘트를 남겨줬는데, shared library 형태로 빌드를 하면 사이즈가 많이 작아진다고 한다.

Shared library가 뭔지 정확하게 몰라서 조금 공부를 하고 노트를 남겼다. (Static library vs Shared library 정리 글).

그리고 shared library 형태로 빌드를 해봤다.

1
2
3
4
5
6
7
8
9
10
cd ~
mkdir open3d && cd open3d
git clone https://github.com/isl-org/Open3D.git .
mkdir build
mkdir install
cd build

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../install -DUSE_BLAS=ON -DBUILD_SHARED_LIBS=ON -DBUILD_BLAS_FROM_SOURCE=OFF ..
make -j
sudo make install

그래서 나온 결과물은 단 하나의 libOpen3D.so 파일. 크기는 106 MB이다. 홀리몰리과카몰리~~~