현재 회사에서 JNI와 더불어 회사의 주요 제품인 솔루션의 so 라이브러리에 추가 기능을 개발 요청이 들어왔다. 개발을 하다보니 이전에 알지 못했던 것들을 사용해야만 했는데 이것들이 무엇인지 이번에 정리해보고 왜 이것들을 이렇게 사용하는지 알아보고자 한다.
Shared library)로, 런타임에 로드되어 여러 프로그램에서 함께 사용될 수 있는 라이브러리이다..so 파일은 컴파일 시점이 아니라 런타임에 로드된다. 이는 메모리 사용량 절감과 프로그램 크기 감소에 유리하다..so 파일을 사용할 수 있어 코드 재사용성을 높인다.ldd {so 파일명}.so 을 입력하면 확인이 가능하다. (아래 이미지 참고)
.so 파일이 없으면 라이브러리 로딩 오류가 발생, 이를 DLL 지옥이라고도 부른다..so 파일을 필요로 하지만, 서로 다른 버전을 요구하면 충돌이 발생할 수 있다.| 특성 | 동적 라이브러리 | 정적 라이브러리 |
|---|---|---|
| 파일 확장자 | .so | .a |
| 링크 시점 | 실행 시점(런타임) | 컴파일 시점 |
| 파일 크기 | 작음 | 큼 |
| 메모리 사용량 | 공유(효율적) | 중복 포함(비효율적) |
| 실행속도 | 느림 (동적 로드 필요) | 빠름 |
| 유지보수 | 용이 (라이브러리만 교체) | 어려움(재컴파일 필요) |
| 의존성 문제 | 있음(.so 파일 필요) | 없음 |
| 재사용성 | 높음 | 낮음 |
CMakeLists.txt)에 기술합니다..so, .dll, .dylib 같은 동적 라이브러리와 .a(Linux), .lib(Windows) 같은 정적 라이브러리를 빌드할 수 있다.find_package, includedirectiries 등)cmake_minimum_required(VERSION 3.0)
project(HelloProject {LANGUAGES C | CXX | NONE})
add_library(hello_library SHARED library.cpp)
SHARED 대신에 STATIC 키워드를 사용하면 정적 라이브러리를 생성find_package(JNI REQUIRED)
find_library({VAR}
{NAMES <name1> [<name2> ...]}
{PATHS <path1> [<path2> ...]}
{NO_DEFAULT_PATH}
{REQUIRED}
)
find_library 는 CMake에서 라이브러리를 찾는 명령어이다.Required 설정이 되었을 경우 찾고자 하는 라이브러리를 못 찾으면 에러를 발생시킨다.target_include_directories({target_name}
{visibility}
{directory_path}
)
target_link_libraries({target_name}
{visibility}
[LIBRARY_NAMES <library_name1> <library_name2> ...]
)
target_compile_definitions({target_name}
{visibility}
{macro_definitions}
)
if(ENABLE_GPU)
message("ENABLE GPU")
else()
message("DISABLE GPU")
endif()
1. 호환성
| 특징 | PMX | ONNX |
|---|---|---|
| 주요 사용 사례 | TorchServe 기반 모델 배포 | 다양한 환경 및 프레임워크 간의 호환성 |
| 지원 포맷 | PyTorch 전용 | PyTorch, TensorFlow, Keras 등 다수 |
| 포맷 구조 | PyTorch 모델 상태 및 메타데이터 포함 | 중립적인 연산 그래프 표현(Protobuf 기반) |
| 추론 환경 | TorchServe | ONNX Runtime 및 기타 지원 프레임워크 |
| 사용성 | PyTorch에 최적화 | 프레임워크 독립적, 하드웨어 최적화 가능 |
이번에 나는 왜 우리 회사는 솔루션을 이렇게 구성해서 사용할까? 에 대한 질문을 계속 생각하면서 정리를 해왔다. 물론 선임분들이나 동료분들께 질문을 드리면 쉽게 풀리겠지만 그전에 내 생각을 먼저 정리해서 말씀드리는게 맞을거 같아 아직 따로 여쭤보지는 않았다. 이번에 정리해보면서 느낀거는 아직 내가 Java를 잘 몰라서 그런건지는 몰라도 이미지를 처리를 하는 관점에서보면 Java보단 C++이 나은거 같아 JNI를 활용해 Spring Boot 서버에서 요청을 받고 해당 요청에 대한 이미지들을 C++에서 전처리하여 딥러닝 모델로 전달하여 결과를 받고 해당 결과에 대한 데이터들 정도만 Spring Boot에서 후처리 하는 방식으로 솔루션을 구성한게 아닐까 생각을 하고 있지만, 아직 이건 내가 Java를 잘 모르는 거일수도 있기 때문에 기회가 생긴다면 솔루션 so library 개발 담당자분에게 위 질문에 대한 답변을 듣고 Java에서도 구현이 가능한지 테스트를 해봐야겠다.
추가적으로 현재 회사에서 Java만 사용하여 모든 업무를 진행해왔는데 이번에 뜻하지 않은 기회가 생겨 Java 이외에 다른 영역에 살짝(?)걸칠 수 있게되었다. 처음에는 이게 도움이 될까 싶었지만 정리를 하면서 업무를 진행하다보니 궁금증이 폭발해서 회사 노트북을 집까지 가져와서 추가적인 공부를 했다. 업무를 마무리하는 예상 기간보다는 많이 늦어졌지만.... 결국에는 잘 마무리하게 되어 매우 보람찼다!!
