Java 인프로세스 API 바인딩

Java 인프로세스 API 바인딩

Triton Inference Server는 JavaCPP를 사용해 Tritonserver를 감싸는 Java API 바인딩을 만들어요.

API는 tritonserver.java에 문서화되어 있고, 이 파일에서 생성된 웹 버전 API docs도 참고할 수 있어요.

참고: 현재 tritonserver.java에는 인프로세스 C-API 바인딩과 C-API Wrapper 바인딩이 모두 들어 있어요. C-API Wrapper에 대한 자세한 내용은 developer_tools 저장소에서 확인할 수 있어요.

출처: 공식문서

Java API를 쓰는 간단한 예제는 Samples 폴더에서 찾을 수 있는데, 여기 Simple.javasimple.cc와 비슷한 예제예요. Simple.java를 빌드하고 실행하는 방법은 sample usage documentation을 참고하세요.

QA 폴더에서 L0_java로 시작하는 폴더들은 Java API 테스트인데, ResNet50 테스트 같은 것이 시작하기에 좋은 참고가 돼요.

Java API 설정 방법

Tritonserver Java API를 쓰려면 환경에 Tritonserver 라이브러리와 의존성이 설치되어 있어야 해요. 방법은 두 가지예요.

  1. Tritonserver docker 컨테이너 사용 — 여기에 ① C API용 .jar Java 바인딩(권장), ② maven으로 직접 바인딩 빌드, 두 가지 선택지가 있어요.
  2. Docker 없이 자신의 환경에서 Triton 직접 빌드(권장하지 않아요).

Tritonserver 컨테이너 실행과 의존성 설치

Triton Java API 환경을 만들려면 다음 과정을 따라요.

  1. 먼저 Docker 컨테이너를 실행해요.
$ docker run -it --gpus=all -v ${pwd}:/workspace nvcr.io/nvidia/tritonserver:<your container version>-py3 bash
  1. jdk를 설치해요.
$ apt update && apt install -y openjdk-11-jdk
  1. maven을 설치해요 (직접 바인딩을 빌드하고 싶을 때만 필요해요).
$ cd /opt/tritonserver
$ wget https://archive.apache.org/dist/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.tar.gz
$ tar zxvf apache-maven-3.8.4-bin.tar.gz
$ export PATH=/opt/tritonserver/apache-maven-3.8.4/bin:$PATH

Java 바인딩 Jar로 Java 프로그램 실행

Tritonserver와 의존성이 설치되었다면 다음 과정으로 Java 바인딩과 함께 Java 프로그램을 실행할 수 있어요.

  1. Java 바인딩을 환경에 배치해요. 다음 두 방법 중 하나를 골라요.

    a. 제공된 빌드 스크립트로 Java API 바인딩을 빌드:

    # Clone Triton client repo. Recommended client repo tag is: main
    $ git clone --single-branch --depth=1 -b <client repo tag>
                   https://github.com/triton-inference-server/client.git clientrepo
    # Run build script
    ## For In-Process C-API Java Bindings
    $ source clientrepo/src/java-api-bindings/scripts/install_dependencies_and_build.sh
    ## For C-API Wrapper (Triton with C++ bindings) Java Bindings
    $ source clientrepo/src/java-api-bindings/scripts/install_dependencies_and_build.sh --enable-developer-tools-server
    

    이 명령은 Java 바인딩을 /workspace/install/java-api-bindings/tritonserver-java-bindings.jar에 설치해요.

    또는

    b. Triton SDK 컨테이너에서 "Uber Jar"를 복사:

    $ id=$(docker run -dit nvcr.io/nvidia/tritonserver:<triton container version>-py3-sdk bash)
    $ docker cp ${id}:/workspace/install/java-api-bindings/tritonserver-java-bindings.jar <Uber Jar directory>/tritonserver-java-bindings.jar
    $ docker stop ${id}
    

    참고: tritonserver-java-bindings.jar에는 인프로세스 Java 바인딩만 들어 있어요. C-API Wrapper Java 바인딩을 쓰려면 빌드 스크립트를 사용하세요.

  2. Java 바인딩을 담은 빌드된 "Uber Jar"를 사용해요.

$ java -cp <Uber Jar directory>/tritonserver-java-bindings.jar <your Java program>

Maven으로 Java 바인딩을 빌드하고 Java 프로그램 실행

Java 바인딩을 수정하고 싶다면 Maven으로 직접 빌드할 수 있어요. Run Java program with Java bindings Jar의 1.a 부분을 참고해 JavaCPP-presets의 Tritonserver 바인딩을 수정하지 않고도 jar을 직접 빌드할 수 있어요. 과정은 다음과 같아요.

  1. javacpp-presets/tritonserver로 로컬 저장소(/root/.m2/repository)에 JNI 바이너리를 만들어요. C-API Wrapper Java 바인딩(Triton with C++ bindings)의 경우 cmake·rapidjson 같은 빌드 전용 의존성도 설치해야 해요. 필요한 의존성과 컨테이너 수정 사항은 java installation script에서 확인하세요. 의존성 설치 후 javacpp-presets에서 tritonserver 프로젝트를 빌드해요.
$ git clone https://github.com/bytedeco/javacpp-presets.git
$ cd javacpp-presets
$ mvn clean install --projects .,tritonserver
$ mvn clean install -f platform --projects ../tritonserver/platform -Djavacpp.platform=linux-x86_64
  1. Maven용 커스텀 *.pom 파일을 만들어요. pom 파일 만드는 방법은 samples/simple/pom.xml을 참고하세요.

  2. pom.xml을 만든 뒤 다음으로 애플리케이션을 빌드해요.

$ mvn compile exec:java -Djavacpp.platform=linux-x86_64 -Dexec.args="<your input args>"

더 알아보기 (Learn more)