TensorFlow/Tensorflow Lite

Tensorflow Lite 를 C/C++로 빌드하기(bazel)

kim선달 2021. 8. 29. 04:05
Select Language

Tensorflow Lite 를 C/C++로 빌드하기(bazel)


 

1. Tensorflow Lite 다운로드

 

Tensorflow 공식 GitHub에 접속한 후, Release 탭에서 원하는 버전을 다운받습니다.

https://github.com/tensorflow/tensorflow/releases

 

Releases · tensorflow/tensorflow

An Open Source Machine Learning Framework for Everyone - tensorflow/tensorflow

github.com

압축의 차이만 있을 뿐 둘 중 어느걸 받아도 무방합니다. 

여기서는 현재(2021.08.29)의 최신버전인 2.4.3을 사용하겠습니다.

제가 기억하기로는 1.X 부터 현재까지 빌드하는방법은 모두 동일한것으로 기억합니다.

혹시 본 글대로 했는데 에러가 나는 경우 댓글로 알려주세요!

 

 

2. Python 및 최신 Bazel 다운로드 

Bazel은 Google 에서 만든 통합 빌드 도구입니다.

지금은 Tensorflow Lite 를 CMake로 빌드하는것도 experimental기능으로 지원되긴 하지만, 예전까지만 해도 무조건 bazel을 이용해서만 빌드를 해야 했습니다.

그래도 아직까지는 Tensorflow 에서 만들어놓은 빌드 스크립트가 CMake보다 훨씬 유용하므로 여기서는 bazel을 이용해서 진행하겠습니다.

https://docs.bazel.build/versions/main/install.html

 

Installing Bazel - Bazel main

Installing Bazel This page describes the various platforms supported by Bazel and links to the packages for more details. The Bazel team officially supports Bazel on these platforms: Bazel community members maintain these packages. The Bazel team doesn’t

docs.bazel.build

위의 공식 사이트에서 최신버전의 bazel을 다운로드 받습니다.

사실 엄청 예전버전만 아니면 굳이 최신버전이 아니어도 돌아가긴 합니다만, 그래도 혹시 빌드중에 문제가 생긴다면 꼭 업데이트를 하고 다시 진행해 보시길 바랍니다.

 

Python은 Tensorflow를 사용해보신 분들이라면 잘 아실테니 설명은 하지 않겠습니다.

혹시 다운로드 받지 않으신 분들은 https://www.python.org/ 에서 Python을 설치 해 주시면 됩니다.

 

3 . Download dependencies

여기서부턴 공식 문서대로 진행을 하면 됩니다. 다만, 문서가 좀 설명이 빈약한 경우가 많아서 몇가지 제가 살을 좀 덧붙였습니다

아까 다룬로드한 Tensorflow 파일의 압축을 풀고 해당 경로를 Terminal/명령 프롬프트 등을 이용해서 열어준 뒤, 아래 명령어를 입력해줍니다.

./tensorflow/lite/tools/make/download_dependencies.sh

그러면 자동으로 Tensorflow Lite 빌드에 필요한 서드파티들이 다운로드됩니다.
* 최신 Tensorflow 부터는 (2.5? / 2.6 이상) 부터는 이 과정이 필요하지 않습니다.

인터넷 환경에 따라 몇 분 정도 걸릴 수 있습니다.

 

4. Configure

컴파일을 하기 전, 어떠한 타겟으로 빌드할것인지 설정을 해 줍니다.

이 역시 대화형 스크립트가 있어서 필요한 대로 진행을 해 주면 되는데, 현재 환경(PC 및 OS)과 타겟 플랫폼이 다른 경우 입력해야될 내용이 다른점 주의해주세요!

그리고 플랫폼이나 추후 버전에 따라서 아래에 없는 질문이 나올수도, 몇몇 질문들이 없어질 수 도 있는데, 적절하게 대처 해 주시면 됩니다. 저는 MacBook Pro 에서 진행하였습니다.

 

Configure 진행은 최상위 디렉터리에서 아래 명령어를 실행하면 됩니다.

./configure

 

4-1. Python 경로

파이썬 경로를 묻는 모습입니다. 자동으로 탐색해주니 그냥 엔터를 쳐줍니다.

혹시 기본 Python(명령줄에 python을 입력했을시 실행되는 Python 버전)의 위치를 알고싶으시다면, which python 명령어로 경로를 알 수 있습니다.

 

4-2. Python 라이브러리 경로

그 다음으로는 Python 라이브러리 경로를 묻는 모습입니다. 저는 왜 다른 경로가 default로 제시되었는지는 모르겠는데, 위에 두 후보군을 보니 후자를 입력하면 될 것 같습니다.

4-3. ROCm 

세번째 질문 / AMD GPU 가속

ROCm은 AMD에서 GPU 가속을 사용할때 쓰는 라이브러리입니다.

AMD GPU가 장착되어있을때 사용가능한 옵션입니다. 원하시는 값을 입력하시면 됩니다.

저는 N을 입력하고 진행하였습니다.

 

사실 가속 옵션들은 여기 대화형에서 설정에서는 조금 굵직한것들 외에는 생략된것들이 좀 있는데, 모든 옵션들은 여기서 확인이 가능합니다.

4-4. CUDA

4번째 질문 / NVIDIA GPU 가속

CUDA는 NVIDIA사의 GPU 가속을 사용할때 쓰는 라이브러리입니다.

저는 MacBook 이라서 애초에 NVIDIA GPU가 없으니 N을 입력하였습니다.

 

4-5. Clang

Clang 컴파일러를 다운로드 할거냐고 물어보는데, 내장 STL 말고 Clang STL을 사용하려고 이러는건지 컴파일러를 Clang으로 설정하려고 하는지는 잘 모르겠습니다.

Experimental이라고 적혀있으니 N을 선택하겠습니다

4-6. 컴파일 옵션

C++ 컴파일 flag를 물어봅니다. Linux/macOS 에서 최고 속도 옵션인 -O3을 주겠습니다.

참고로, Windows에서는 최고 속도 옵션이 -O2입니다.

 

4-7. Android 빌드

안드로이드 빌드시 여기서 y라고 답해주어야 합니다. Android 에서 빌드하는법은 이 글을 참고해주세요

 

4-8. iOS 빌드

제가 아이폰이 없어서 iOS는 한번도 안해봤는데, 이것도 나중에 시간이 된다면 한번 다루도록 하겠습니다.

 

이제 설정이 끝났습니다!

 

5. 빌드

크로스컴파일하는 경우가 아니라면, 타겟 플렛폼을 굳이 명시해 줄 필요는 없습니다.

모든 빌드 옵션들은 여기서 확인이 가능합니다.

기본 옵션으로 빌드한다면, 현재 플랫폼에서 사용할 수 있는 라이브러리가 빌드되어서 나오고, 기본적으로 CPU만 사용하게 빌드됩니다.

 

5-1. 기본옵션 C++ 빌드

bazel build -c opt //tensorflow/lite:tensorflowlite

결과물로 빌드되는 파일의 확장자는 플랫폼별로 다릅니다. [이곳 참고]

다만 Mac의 경우 빌드 타겟(명령줄에서 :뒤에 오는 이름)을 libtensorflowlite.so 로 설정할 시 확장자를 .so로 설정할 수 있습니다만, 그럴 경우 리눅스랑 이름이 겹차기 때문에 딱히 추천드리지는 않습니다.

 

예전에는 Android에서 사용하기위해 C++로 빌드할시 링크 에러가 나는 경우가 있어서 C로 빌드해서 사용했었는데, 지금도 동일한 에러가 나는지는 테스트해보지 못했습니다. 테스트 후에 글을 한번 업데이트 하겠습니다.

혹시 C++로 빌드시 링크 에러가 나시는 분들은 C로 빌드를 해 주시면 됩니다.

5-2. 기본옵션 C 빌드

bazel build -c opt //tensorflow/lite/c:libtensorflowlite_c

5-1과 마찬가지로 빌드되는 파일의 확장자는 플랫폼별로 다릅니다.

C로 빌드한 경우 C API를 이용해서 라이브러리를 사용하게 됩니다.

동일한 코드를 멀티플랫폼에서 빌드할 때 고려해볼만한 옵션입니다.

 

5-3. GPU Delegate 빌드

bazel build -c opt //tensorflow/lite/delegates/gpu:libtensorflowlite_gpu_delegate

단계 4에서 GPU 사용을 했을시 빌드가능한 옵션입니다.

실제로 GPU를 이용한 추론을 하기 위해선 이것만으로는 동작을 하지않고, 위의 기본옵션을 사용해 CPU용으로 빌드한 라이브러리도 필요합니다.

 

5-4. 크로스컴파일

크로스컴파일시에는 추가 빌드옵션을 주어야 합니다. 아래처럼 --config= 뒤에 플랫폼 이름이 오면 됩니다.

위에서 소개된것들과 와 마찬가지로 C++/C로 빌드할것인지 GPU도 빌드할것인지 선택할 수 있습니다.

아래에서는 편의를 위해 C++의 경우만 서술하였습니다.

 

5-4-1. Android ARM

bazel build -c opt --config=android_arm //tensorflow/lite:tensorflowlite

 

 

5-4-2. iOS

bazel build --config=ios_fat -c opt //tensorflow/lite/ios:TensorFlowLiteC_static_framework

그 외

 

5-5. 그 외

5-5-1. NNAPI(Android 전용)

Android 에서 하드웨어 가속을 사용할때 사용하는 API입니다.

GPU를 빌드할때와 마찬가지로 기본옵션을 사용해 빌드한 라이브러리파일과 함께 사용해야 합니다.

bazel build -c opt //tensorflow/lite/delegates/nnapi:nnapi_delegate
bazel build -c opt //tensorflow/lite/nnapi:nnapi_implementation
bazel build -c opt //tensorflow/lite/nnapi:nnapi_util

5-5-2. XNNPack

XNNPack은 Arm, WebAssembly, x86 머신에서 floating-point 연산을 최적화해주는 delegate입니다.

몇몇 플랫폼에서 사용할 경우 퍼포먼스가 드라마틱하게 상승하는 경우가 있습니다.

XNNPack은 다른 delegate와는 달리 기본 CPU빌드에 추가하는 방식으로 동작시키는것이 권장되지 않습니다.

권장되는 방식은 아에 CPU를 이용한 추론시 무조건 XNNPack을 사용(하거나 혹은 사용하지 않거나)하는 방식입니다.

 

자세한 빌드 방법은 여기를 참고해주세요. 플랫폼에 따라서 빌드하는 방법이 다릅니다.

특히 PC의 경우 Windows와 그렇지 않은 경우의 빌드 방법이 아예 다르다는점을 유의해주세요.

 

5-5-3. 

모든 옵션들은 여기를 참고해주세요.

6. 마무리

이제 빌드가 끝났습니다!

필요한건 이제 헤더와 빌드된 라이브러리를 프로젝트에 링크하고 사용하기만 하면 됩니다.

빌드된 라이브러리의 이름과 위치를 확인하신 후, 사용하시면 됩니다.

텐서플로 디렉토리의 bazel-bin/tensorflow/lite 경로에 libtensorflowlite.dylib이란 이름으로 빌드되었다고 하네요.

확장자는 플랫폼마다 다를 수 있으며, 확장자나 이름은 절대로 바꾸시면 안됩니다.

 

이제 빌드를 했으니, 실행을 한번 해 봐야 겠죠?

다음 글들을 참고해주세요

 

PC 에서 Tensorflow Lite를 C++로 실행하기