PyTorch용 오픈 소스 모델 서버 TorchServe 출시
PyTorch는 딥 러닝을 위한 가장 인기 있는 오픈 소스 라이브러리 중 하나입니다. 개발자와 연구자들은 모델 개발 및 학습에서 특히 PyTorch가 제공하는 유연성을 즐깁니다. 하지만, 프로덕션 환경에서 모델의 배포 및 관리는 맞춤형 예측 API를 개발하고 이를 확장하며 보안을 제공하는 것과 같은 기계 학습 프로세스의 가장 까다로운 부분이기도 합니다.
모델 배포 프로세스를 간소화하기 위한 한 가지 방법은 프로덕션에서 기계 학습 예측을 처리하도록 특별하게 설계된 모델 서버(예: 상용 웹 애플리케이션)를 사용하는 것입니다. 모델 서버를 사용하면 한 개 이상의 모델을 손쉽게 로드하여 확장 가능한 웹 서버가 지원하는 예측 API를 자동으로 생성할 수 있습니다. 또한, 예측 요청에서 선처리 및 후처리 코드를 실행하는 것도 가능합니다. 마지막으로 모델 서버는 로깅, 모니터링 및 보안과 같이 프로덕션에 매우 중요한 기능도 제공합니다. 인기 있는 모델 서버로는 TensorFlow Serving과 Multi Model Server 등이 있습니다.
사용자 지정 코드를 작성할 필요 없이 학습된 PyTorch 모델을 대규모로 손쉽게 배포할 수 있는 라이브러리를 제공하는 PyTorch 모델인 TorchServe가 오늘 출시되었습니다.
TorchServe 소개
TorchServe는 AWS와 Facebook이 공동으로 개발한 모델로, PyTorch 오픈 소스 프로젝트의 일환으로 사용할 수 있습니다. 이 프로젝트가 어떻게 시작되었는지와 관련된 내용은 Github에서 제공되는 초기 RFC에서 확인할 수 있습니다.
TorchServe를 사용하면, 이제 PyTorch 사용자는 사용자 지정 코드를 작성할 필요 없이 더 빠르게 모델을 프로덕션으로 이동할 수 있습니다. TorchServe는 짧은 대기 시간으로 예측 API를 제공할 뿐만 아니라 가장 일반적인 애플리케이션(예: 객체 감지 및 텍스트 분류 등)을 위한 기본 핸들러가 내장됩니다. 또한, TorchServe에는 다중 모델 서비스, A/B 테스트를 위한 모델 버전 관리, 모니터링 메트릭 및 애플리케이션을 통합하기 위한 RESTful 엔드포인트가 포함되어 있습니다. 원하는 방식대로 TorchServe는 Amazon SageMaker, 컨테이너 서비스 및 Amazon Elastic Compute Cloud(EC2)와 같은 모든 기계 학습 환경을 지원합니다.
많은 고객은 이미 TorchServe의 장점을 활용하고 있습니다.
Toyota Research Institute Advanced Development, Inc. (TRI-AD)는 Toyota Motor Corporation에서 자율 주행을 위한 소프트웨어를 개발하고 있습니다. TRI-AD ML 툴 부문 리더 Yusuke Yachide는 “컴퓨터 비전 모델을 지속해서 최적화하고 향상하고 있으며, 이는 자율 주행을 통해 모두를 위한 안전한 모빌리티를 달성하려는 TRI-AD의 미션에 매우 중요한 부분입니다. 모델은 AWS에서 PyTorch로 학습하고 있지만, 아직 PyTorch에는 모델 처리 프레임워크가 부족한 실정입니다. 그로 인해 차량 및 클라우드 서버 플릿에 대한 PyTorch 모델 배포용 소프트웨어를 개발하고 유지하기 위해 커다란 엔지니어링 노력을 기울이고 있습니다. 이제 TorchServe를 사용함으로써 당사는 AWS와 PyTorch 커뮤니티에서 공식적으로 지원 및 관리되는 성능 기준을 충족하는 경량 모델 서버를 활용할 수 있게 되었다”고 전합니다.
Matroid는 동영상 화면에서 개체와 이벤트를 감지하는 컴퓨터 비전 소프트웨어를 제작하는 업체입니다. Matroid Inc.의 창립자 겸 CEO인 Reza Zadeh는 “당사는 AWS 및 온프레미스 환경에서 PyTorch를 사용하여 빠르게 증가하고 있는 기계 학습 모델을 개발하고 있습니다. 기계 학습 모델은 모델을 다양한 형식으로 변환해야 하는 사용자 지정 모델 서버를 사용하여 배포되며, 이는 시간이 많이 걸리고 번거로운 작업입니다. TorchServe를 사용하면 단일 정보 소스의 기능도 수행하는 1개의 서비스 가능 파일을 사용하여 간단하게 모델을 배포하며 편리하게 공유 및 관리할 수 있다”고 설명합니다.
이제 TorchServe의 설치 방법과 사전 학습된 모델을 Amazon Elastic Compute Cloud(EC2)에 로드하는 방법에 대해 알아보겠습니다. 설명서를 따라 다른 환경에서도 이를 실습할 수 있습니다.
TorchServe 설치하기
우선, 딥 러닝 AMI(Ubuntu 에디션)로 구동되는 CPU 기반 Amazon Elastic Compute Cloud(EC2) 인스턴스를 실행합니다. 이 AMI는 필요한 여러 종속성이 사전에 설치되어 있어 빠르게 설정할 수 있습니다. 다른 AMI를 대신 사용해도 됩니다.
TorchServe는 Java로 구현되어, 실행하려면 최신 OpenJDK가 필요합니다.
sudo apt install openjdk-11-jdk
다음은 TorchServe를 위한 새로운 Conda 환경을 생성하여 활성화합니다. 그러면 Python 패키지가 깔끔하게 유지됩니다(virtualenv도 사용 가능).
conda create -n torchserve
source activate torchserve
그다음 TorchServe를 위한 종속성을 설치합니다.
pip install sentencepiece # not available as a Conda package
conda install psutil pytorch torchvision torchtext -c pytorch
GPU 인스턴스를 사용 중인 경우에는 추가 패키지가 필요합니다.
conda install cudatoolkit=10.1
종속성을 설치했으므로 이제 TorchServe 저장소를 복제하고 TorchServe를 설치할 수 있습니다.
git clone https://github.com/pytorch/serve.git
cd serve
pip install .
cd model-archiver
pip install .
설정이 완료되었습니다. 이제 모델을 배포해 보겠습니다!
모델 배포하기
이 데모에서는 PyTorch model zoo에서 사전 학습된 모델을 다운로드하겠습니다. 실제 상황에서는 자체 모델을 사용하는 경우가 많습니다.
wget https://download.pytorch.org/models/densenet161-8d451a50.pth
이제 모델을 모델 아카이브로 패키지화해야 합니다. 모델 아카이브는 모든 모델 아티팩트(예: 모델 자체(densenet161-8d451a50.pth)), 상태 딕셔너리(레이어 일치 텐서) 및 필요한 모든 추가 파일로 구성되는 ZIP 파일입니다. 여기에 이름이 클래스 식별자를 클래스 이름으로 매핑하는 기능을 수행하는 index_to_name.json인 파일을 포함합니다. 이 파일을 내장 image_classifier 핸들러가 사용하며, 해당 핸들러는 예측 로직을 담당합니다. 다른 내장 핸들러(object_detector, text_classifier, image_segmenter)도 사용 가능하며, 자체적으로 구현할 수 있습니다.
torch-model-archiver --model-name densenet161 --version 1.0
--model-file examples/image_classifier/densenet_161/model.py
--serialized-file densenet161-8d451a50.pth
--extra-files examples/image_classifier/index_to_name.json
--handler image_classifier
이제 디렉터리를 생성하여 모델 아카이브를 저장한 후 생성한 디렉터리를 이동합니다.
mkdir model_store
mv densenet161.mar model_store/
그리고 TorchServe를 시작하여 로드할 모델 스토어 및 모델을 가리킵니다. 필요하면 여러 개 모델을 로드할 수도 있습니다.
torchserve --start --model-store model_store --models densenet161=densenet161.mar
같은 시스템에서 이미지를 가져와 HTTP POST 요청을 사용하여 로컬에서 처리하기 위해 TorchServe로 전송하겠습니다. URL 형식에 유의하십시오. 여기에는 사용할 모델의 이름이 포함됩니다.
curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg
curl -X POST http://127.0.0.1:8080/predictions/densenet161 -T kitten.jpg
결과는 즉시 표시됩니다. 내장 핸들러로 클래스 이름을 확인할 수 있습니다.
[
{"tiger_cat": 0.4693356156349182},
{"tabby": 0.46338796615600586},
{"Egyptian_cat": 0.06456131488084793},
{"lynx": 0.0012828155886381865},
{"plastic_bag": 0.00023323005007114261}
]
‘stop’ 명령을 사용하면 TorchServe를 중단할 수 있습니다.
torchserve --stop
보시다시피 기본 구성을 사용하면 매우 편리하게 TorchServe를 시작할 수 있습니다. 이제 원격 처리를 설정하는 방법을 설명하겠습니다.
원격 처리를 위한 TorchServe 구성하기
TorchServe용 구성 파일인 config.properties(기본 이름)를 생성하겠습니다. 이 파일은 로드할 모델을 정의하고 원격 처리를 설정합니다. 여기서는 모든 퍼블릭 IP 주소에 서비스를 제공하도록 바인딩하지만 원하면 특정 주소로 제한할 수도 있습니다. EC2 인스턴스에서 실행되므로 보안 그룹에서 포트 8080 및 8081이 열려 있는지 확인해야 합니다.
model_store=model_store
load_models=densenet161.mar
inference_address=http://0.0.0.0:8080
management_address=http://0.0.0.0:8081
이제 명령줄 인수를 전달할 필요 없이 동일한 디렉터리에서 TorchServe를 시작할 수 있습니다.
torchserve --start
로컬 시스템으로 돌아와서 TorchServe를 원격에서 호출하면 동일한 결과를 얻을 수 있습니다.
curl -X POST http://ec2-54-85-61-250.compute-1.amazonaws.com:8080/predictions/densenet161 -T kitten.jpg
확인하셨겠지만 저는 HTTP를 사용했습니다. 많은 사용자에게 프로덕션에서 HTTPS가 필요하므로 HTTPS에서의 설정 방법도 보여드리겠습니다.
HTTPS를 위한 TorchServe 구성하기
TorchServe는 Java 키스토어 또는 인증서를 사용할 수 있습니다. 여기에서는 인증서를 사용하겠습니다.
우선 openssl로 인증서와 프라이빗 키를 생성합니다.
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem
그리고 구성 파일을 업데이트하여 인증서 및 키의 위치를 정의하고 TorchServe를 기본 보안 포트로 바인딩합니다(보안 그룹을 업데이트해야 함).
model_store=model_store
load_models=densenet161.mar
inference_address=https://0.0.0.0:8443
management_address=https://0.0.0.0:8444
private_key_file=mykey.key
certificate_file=mycert.pem
TorchServe를 다시 시작하면 HTTPS로 TorchServe를 호출할 수 있습니다. 지금은 자체 서명 인증서를 사용하고 있으므로 ‘–insecure’ 플래그를 curl로 전달해야 합니다.
curl --insecure -X POST https://ec2-54-85-61-250.compute-1.amazonaws.com:8443/predictions/densenet161 -T kitten.jpg
TorchServe 구성에는 훨씬 더 많은 내용이 있으므로 설명서를 읽는 것이 좋습니다!
시작하기
이제 TorchServe는 https://github.com/pytorch/serve에서 제공됩니다.
시도해 본 다음 Github에서 피드백을 제공해 주십시오.
Leave a Reply