제퍼넷 로고

Deep Java Library를 사용하여 AWS Elastic Beanstalk를 사용하여 Java로 제공하는 모델이 쉬워졌습니다.

시간

기계 학습 (ML) 모델을 REST 엔드 포인트에서 실행하는 것이 그 어느 때보 다 쉬워졌습니다. 사용 AWS 엘라스틱 빈스토크아마존 엘라스틱 컴퓨트 클라우드 (Amazon EC2) 엔드 포인트를 호스팅하고 딥 자바 라이브러리 (DJL)을 사용하여 추론을 위해 딥 러닝 모델을로드하면 모델 배포 프로세스를 매우 쉽게 설정할 수 있습니다. 모든 추론 호출에 대해 빠른 응답 시간이 필요한 경우 Elastic Beanstalk에서 모델을 설정하는 것이 좋습니다. 이 게시물에서는 DJL을 사용하여 Elastic Beanstalk에 모델을 배포하고 이미지에 포함 된 내용에 대한 추론 결과를 얻기 위해 사후 호출을 통해 이미지를 전송하는 방법을 다룹니다.

DJL 정보

DJL은 교육 및 추론을 지원하는 Java로 작성된 딥 러닝 프레임 워크입니다. DJL은 최신 딥 러닝 엔진 (예 : TenserFlow, PyTorch 및 MXNet)을 기반으로 구축되었습니다. DJL을 쉽게 사용하여 모델을 훈련 시키거나 추가 변환없이 다양한 엔진에서 좋아하는 모델을 배포 할 수 있습니다. 여기에는 훈련 된 모델을 관리하고 한 줄로로드 할 수있는 강력한 모델 동물원 디자인이 포함되어 있습니다. 빌트인 모델 동물원은 현재 GluonCV, HuggingFace, TorchHub 및 Keras에서 70 개 이상의 사전 훈련되고 바로 사용할 수있는 모델을 지원합니다.

장점

Elastic Beanstalk 및 DJL을 사용하여 모델을 호스팅 할 때의 주요 이점은 설정이 매우 쉽고 사후 요청에 일관된 XNUMX 초 미만의 응답을 제공한다는 것입니다. DJL을 사용하면 다른 라이브러리를 다운로드하거나 선택한 딥 러닝 프레임 워크에 대한 종속성 가져 오기에 대해 걱정할 필요가 없습니다. Elastic Beanstalk를 사용하면 두 가지 이점이 있습니다.

  • 콜드 스타트 ​​업 없음 – 비교 AWS 람다 솔루션을 사용하면 EC2 인스턴스가 항상 실행되므로 엔드 포인트에 대한 모든 호출이 즉시 실행되고 새 컨테이너를 시작할 때 ovdeeerhead가 없습니다.
  • 확장 – 서버 기반 솔루션과 비교할 때 Elastic Beanstalk를 수평으로 확장 할 수 있습니다.

구성

PyTorch 모델을 실행하려면 다음과 같은 gradle 종속성을 설정해야합니다.

plugins { id 'org.springframework.boot' version '2.3.0.RELEASE' id 'io.spring.dependency-management' version '1.0.9.RELEASE' id 'java'
} dependencies { implementation platform("ai.djl:bom:0.8.0") implementation "ai.djl.pytorch:pytorch-model-zoo" implementation "ai.djl.pytorch:pytorch-native-auto" implementation "org.springframework.boot:spring-boot-starter" implementation "org.springframework.boot:spring-boot-starter-web"
}

코드

먼저 Java SpringBoot를 사용하여 RESTful 엔드 포인트를 만들고 이미지 요청을 수락합니다. 이미지를 디코딩하여 Image 우리 모델로 전달할 객체. 모델은 Spring 프레임 워크에 의해 자동 연결됩니다. model() 방법. 단순화를 위해 우리는 예언자 추론을 위해 이미지를 전달합니다 (객체 풀을 사용하여이를 최적화 할 수 있음). 추론이 완료되면 결과를 요청자에게 반환합니다. 다음 코드를 참조하십시오.

 @Autowired ZooModel<Image, Classifications> model; /** * This method is the REST endpoint where the user can post their images * to run inference against a model of their choice using DJL. * * @param input the request body containing the image * @return returns the top 3 probable items from the model output * @throws IOException if failed read HTTP request */ @PostMapping(value = "/doodle") public String handleRequest(InputStream input) throws IOException { Image img = ImageFactory.getInstance().fromInputStream(input); try (Predictor<Image, Classifications> predictor = model.newPredictor()) { Classifications classifications = predictor.predict(img); return GSON.toJson(classifications.topK(3)) + System.lineSeparator(); } catch (RuntimeException | TranslateException e) { logger.error("", e); Map<String, String> error = new ConcurrentHashMap<>(); error.put("status", "Invoke failed: " + e.toString()); return GSON.toJson(error) + System.lineSeparator(); } } @Bean public ZooModel<Image, Classifications> model() throws ModelException, IOException { Translator<Image, Classifications> translator = ImageClassificationTranslator.builder() .optFlag(Image.Flag.GRAYSCALE) .setPipeline(new Pipeline(new ToTensor())) .optApplySoftmax(true) .build(); Criteria<Image, Classifications> criteria = Criteria.builder() .setTypes(Image.class, Classifications.class) .optModelUrls(MODEL_URL) .optTranslator(translator) .build(); return ModelZoo.loadModel(criteria); } 

코드의 전체 사본은 GitHub 레포.

JAR 파일 빌드

로 이동 beanstalk-model-serving 디렉토리를 열고 다음 코드를 입력하십시오.

cd beanstalk-model-serving
./gradlew build

그러면 다음 위치에있는 JAR 파일이 생성됩니다. build/libs/beanstalk-model-serving-0.0.1-SNAPSHOT.jar

Elastic Beanstalk에 배포

이 모델을 배치하려면 다음 단계를 완료하십시오.

  1. Elastic Beanstalk 콘솔에서 새 환경을 생성합니다.
  2. 사용 사례에서는 환경 이름을 DJL-Demo로 지정합니다.
  3. 럭셔리 플랫폼, 고르다 관리 형 플랫폼.
  4. 럭셔리 플랫폼 설정선택한다. 자바 8 및 적절한 분기 및 버전.

  1. 애플리케이션 코드를 선택할 때 파일 선택 그리고 업로드 beanstalk-model-serving-0.0.1-SNAPSHOT.jar 빌드에서 생성되었습니다.
  2. 왼쪽 메뉴에서 환경 조성.

Elastic Beanstalk가 환경을 생성 한 후에는 소프트웨어생산 능력 우리 구성의 상자는 구성 개요 페이지.

  1. 다음 소프트웨어 구성에 추가 설정을 추가합니다. 환경 속성 이름이 SERVER_PORT이고 값이 5000 인 섹션.
  2. 다음 생산 능력 구성에서 인스턴스 유형을 t2.small로 변경하여 엔드 포인트에 더 많은 컴퓨팅과 메모리를 제공합니다.
  3. 왼쪽 메뉴에서 구성 적용 엔드 포인트가 업데이트 될 때까지 기다립니다.

엔드 포인트 호출

이제 웃는 얼굴 이미지로 Elastic Beanstalk 엔드 포인트를 호출 할 수 있습니다.

다음 코드를 참조하십시오.

curl -X POST -T smiley.png <endpoint>.elasticbeanstalk.com/inference

다음과 같은 응답을받습니다.

[ { "className": "smiley_face", "probability": 0.9874626994132996 }, { "className": "face", "probability": 0.004804758355021477 }, { "className": "mouth", "probability": 0.0015588520327582955 }
]

출력은 웃는 얼굴이 우리 이미지에서 가장 가능성이 높은 항목이라고 예측합니다. 성공!

제한 사항

모델이 자주 호출되지 않고 빠른 추론에 대한 요구 사항이없는 경우 Lambda와 같은 서버리스 서비스에 모델을 배포하는 것이 좋습니다. 그러나 이것은 서비스의 콜드 시작 특성으로 인해 오버 헤드를 추가합니다. Elastic Beanstalk를 통해 모델을 호스팅하는 것은 EC2 인스턴스가 하루 24 시간 실행되기 때문에 약간 더 비쌀 수 있으므로 서비스를 사용하지 않을 때에도 비용을 지불해야합니다. 그러나 한 달에 많은 추론 요청이 예상되는 경우 엔드 포인트에 대한 추론 요청이 약 3 만 건일 때 Lambda에서 모델을 제공하는 비용이 t2.57.small을 사용하는 Elastic Beanstalk 비용과 동일하다는 사실을 알게되었습니다.

결론

이 게시물에서는 Elastic Beanstalk 및 DJL을 사용하여 딥 러닝 모델을 배포하고 제공하는 방법을 시연했습니다. Java Spring으로 엔드 포인트를 설정하고, JAR 파일을 빌드하고, 해당 파일을 Elastic Beanstalk에 업로드하고, 일부 구성을 업데이트하면 배포됩니다!

또한이 배포 프로세스의 몇 가지 장단점, 즉 빠른 추론 호출이 필요한 경우 이상적이지만 활용도가 낮은 서버리스 엔드 포인트에서 호스팅하는 것과 비교할 때 비용이 더 높다는 점에 대해서도 논의했습니다.

이 데모는 DJL 데모 GitHub 리포지토리. Spark와 같은 다양한 JVM 도구 및 Lambda와 같은 AWS 제품에서 DJL로 모델을 제공하는 다른 예를 찾을 수도 있습니다. 귀하의 요구 사항이 무엇이든 귀하를위한 옵션이 있습니다.

우리를 따라 GitHub의, 데모 저장소, 여유 채널트위터 DJL의 더 많은 문서와 예제를 위해!


저자에 관하여

프랭크 리우 AWS Deep Learning의 소프트웨어 엔지니어입니다. 그는 소프트웨어 엔지니어와 과학자를위한 혁신적인 딥 러닝 도구를 구축하는 데 중점을 둡니다. 여가 시간에는 친구 및 가족과 함께 하이킹을 즐깁니다.

출처 : https://aws.amazon.com/blogs/machine-learning/model-serving-in-java-with-aws-elastic-beanstalk-made-easy-with-deep-java-library/

spot_img

최신 인텔리전스

spot_img

우리와 함께 채팅

안녕하세요! 어떻게 도와 드릴까요?