
![]()
클라우드에서 효율적인 모델 서빙.

MOSEC는 ML 모델 지원 백엔드 및 마이크로 서비스를 구축하기위한 고성능 및 유연한 모델 서빙 프레임 워크입니다. 방금 훈련 한 기계 학습 모델과 효율적인 온라인 서비스 API 간의 격차를 해소합니다.
MOSEC은 3.7 이상의 파이썬이 필요합니다. Linux X86_64 또는 MacOS X86_64/ARM64 용 최신 PYPI 패키지를 다음과 같이 설치하십시오.
pip install -U mosec
# or install with conda
conda install conda-forge::mosec소스 코드에서 빌드하려면 Rust를 설치하고 다음 명령을 실행하십시오.
make package dist 폴더에 MOSEC 휠 파일이 표시됩니다.
우리는 MOSEC이 서비스로 미리 훈련 된 안정적인 확산 모델을 쉽게 호스팅하는 데 어떻게 도움이되는지 보여줍니다. 전제 조건으로 디퓨저 및 변압기를 설치해야합니다.
pip install --upgrade diffusers[torch] transformers먼저 라이브러리를 가져 와서 기본 로거를 설정하여 어떻게되는지 더 잘 관찰합니다.
from io import BytesIO
from typing import List
import torch # type: ignore
from diffusers import StableDiffusionPipeline # type: ignore
from mosec import Server , Worker , get_logger
from mosec . mixin import MsgpackMixin
logger = get_logger ()그런 다음 클라이언트가 텍스트 프롬프트를 쿼리 할 수있는 API를 구축하고 3 단계만으로 안정적인 분해 -V1-5 모델을 기반으로 이미지를 얻습니다.
mosec.Worker 물려받는 수업으로 서비스를 정의하십시오. 여기서 우리는 Msgpack 직렬화 형식 (a) 을 사용하기 위해 MsgpackMixin 상속합니다.
__init__ 메소드 내에서 모델을 초기화하여 해당 장치에 넣습니다. 선택적으로 일부 데이터와 함께 self.example (B) 모델을 할당 할 수 있습니다 (B) 모델. 데이터는 핸들러의 입력 형식과 호환되어야하며 다음에 자세히 설명해야합니다.
forward 방법을 대체하여 서명을 통해 서비스 핸들러 (c) 를 작성하십시오 forward(self, data: Any | List[Any]) -> Any | List[Any] . 단일 항목 또는 튜플을 수신/반환하는 것은 동적 배치 (d)가 구성되어 있는지 여부에 따라 다릅니다.
class StableDiffusion ( MsgpackMixin , Worker ):
def __init__ ( self ):
self . pipe = StableDiffusionPipeline . from_pretrained (
"sd-legacy/stable-diffusion-v1-5" , torch_dtype = torch . float16
)
self . pipe . enable_model_cpu_offload ()
self . example = [ "useless example prompt" ] * 4 # warmup (batch_size=4)
def forward ( self , data : List [ str ]) -> List [ memoryview ]:
logger . debug ( "generate images for %s" , data )
res = self . pipe ( data )
logger . debug ( "NSFW: %s" , res [ 1 ])
images = []
for img in res [ 0 ]:
dummy_file = BytesIO ()
img . save ( dummy_file , format = "JPEG" )
images . append ( dummy_file . getbuffer ())
return images[!메모]
(a)이 예에서는 JSON이 지원하지 않는 이진 형식으로 이미지를 반환합니다 (페이로드를 더 크게 만드는 Base64로 인코딩되지 않는 한). 따라서 Msgpack은 우리의 필요에 더 적합합니다.
MsgpackMixin상속하지 않으면 JSON은 기본적으로 사용됩니다. 다시 말해, 서비스 요청/응답의 프로토콜은 Msgpack, JSON 또는 기타 형식 일 수 있습니다 (Mixins 확인).(b) 워밍업은 일반적으로 GPU 메모리를 미리 할당하는 데 도움이됩니다. 워밍업 예제가 지정되면 예제가 핸들러를 통해 전달 된 후에 만 서비스가 준비됩니다. 그러나 예제가 제공되지 않으면 첫 번째 요청의 대기 시간이 길어질 것으로 예상됩니다.
exampleforward받을 것으로 예상되는 것에 따라 단일 항목 또는 튜플로 설정해야합니다. 또한 여러 가지 다른 예를 사용하여 워밍업하려는 경우multi_examples설정할 수 있습니다 (여기에서 데모).(c)이 예제는 단일 단계 서비스를 보여줍니다. 여기서
StableDiffusion작업자가 클라이언트의 프롬프트 요청을 직접 가져 와서 이미지에 응답합니다. 따라서forward완전한 서비스 핸들러로 간주 될 수 있습니다. 그러나 파이프 라인에서 다른 작업 (예 : 이미지 다운로드, 모델 추론, 후 처리)을 수행하는 작업자와 다단계 서비스를 설계 할 수도 있습니다. 이 경우 전체 파이프 라인은 서비스 핸들러로 간주되며 첫 번째 작업자는 요청을 받고 마지막 작업자는 응답을 보냅니다. 작업자 간의 데이터 흐름은 프로세스 간 통신에 의해 수행됩니다.(d)이 예에서 동적 배치가 활성화되기 때문에,
forward방법은 끈 목록 , 예를 들어,['a cute cat playing with a red ball', 'a man sitting in front of a computer', ...], 다른 클라이언트와 집계 되어 시스템 처리량을 향상시킵니다.
마지막으로, 우리는 작업자에게 단일 단계 워크 플로를 구성 할 수 있도록 서버에 추가 할 수 있도록 (다중 단계는 처리량을 더욱 강화 하고이 예를 참조하고,이 num=1 를 참조하고, 병렬로 실행하려는 프로세스의 수를 지정하고, 최대 배치 크기 ( max_batch_size=4 , 최대의 동적 배치 수치가 max_wait_time=10 . 밀리 초, 이는 가장 긴 시간 MOSEC가 배치를 작업자에게 보낼 때까지 기다립니다).
if __name__ == "__main__" :
server = Server ()
# 1) `num` specifies the number of processes that will be spawned to run in parallel.
# 2) By configuring the `max_batch_size` with the value > 1, the input data in your
# `forward` function will be a list (batch); otherwise, it's a single item.
server . append_worker ( StableDiffusion , num = 1 , max_batch_size = 4 , max_wait_time = 10 )
server . run ()위의 스 니펫은이 예제 파일에서 병합됩니다. 프로젝트 루트 레벨에서 직접 실행할 수 있습니다. 먼저 명령 줄 인수 (설명)를 살펴 봅니다.
python examples/stable_diffusion/server.py --help그런 다음 디버그 로그를 사용하여 서버를 시작하겠습니다.
python examples/stable_diffusion/server.py --log-level debug --timeout 30000 http://127.0.0.1:8000/openapi/swagger/ 를 개방하여 OpenApi 문서를 받으십시오.
그리고 다른 터미널에서는 테스트하십시오.
python examples/stable_diffusion/client.py --prompt " a cute cat playing with a red ball " --output cat.jpg --port 8000현재 디렉토리에 "cat.jpg"라는 이미지가 표시됩니다.
메트릭을 확인할 수 있습니다.
curl http://127.0.0.1:8000/metrics그게 다야! 당신은 방금 서비스로 안정적인 확산 모델을 주최했습니다!
더 많은 즉시 사용 가능한 예제는 예제 섹션에서 찾을 수 있습니다. 포함 :
max_batch_size 및 max_wait_time (millisecond) append_worker 로 전화 할 때 구성됩니다.max_batch_size 값에 대한 추론이 GPU에서 메모리를 유발하지 않도록하십시오.max_wait_time 배치 추론 시간보다 작아야합니다.max_batch_size 에 도달하거나 max_wait_time 이 경과 한 경우 배치를 수집합니다. 트래픽이 높을 때 서비스는이 기능의 혜택을받습니다.mosec 설치된 GPU 기본 이미지를 찾고 있다면 공식 이미지 mosecorg/mosec 확인할 수 있습니다. 복잡한 사용 사례는 Envd를 확인하십시오.mosec_service_batch_size_bucket 배치 크기 분포를 보여줍니다.mosec_service_batch_duration_second_bucket 각 단계에서 각 연결에 대한 동적 배치 지속 시간을 보여줍니다 (첫 번째 작업을 수신함에 따라 시작).mosec_service_process_duration_second_bucket 각 단계에서 각 연결에 대한 처리 기간을 보여줍니다 (IPC 시간 포함하지만 mosec_service_batch_duration_second_bucket 제외).mosec_service_remaining_task 현재 처리 작업의 수를 보여줍니다.mosec_service_throughput 서비스 처리량을 표시합니다.SIGINT ( CTRL+C ) 또는 SIGTERM ( kill {PID} )으로 서비스를 중지하십시오. max_batch_size 및 max_wait_time 찾으십시오. 메트릭은 실제 배치 크기 및 배치 지속 시간의 히스토그램을 보여줍니다. 이 두 매개 변수를 조정하기위한 주요 정보입니다.serialize_ipc/deserialize_ipc 메소드에 의해 직렬화/사제화되므로 전체 파이프 라인을 느리게 만들 수 있습니다. 직렬화 된 데이터는 기본적으로 Rust를 통해 다음 단계로 전달되며 공유 메모리가 대기 시간을 줄일 수 있습니다 (Ref redisshmipcmixin).serialize/deserialize 방법을 선택해야합니다. 기본적으로 둘 다 JSON을 사용하고 있습니다. 그러나 이미지와 임베딩은 JSON에 의해 잘 지원되지 않습니다. 더 빠르고 이진 호환되는 Msgpack을 선택할 수 있습니다 (참조 안정 확산).mosec V0.8.8 이후 사용자의 프로토콜 (예 : HTTP/2)에 자동으로 적응합니다. 다음은 MOSEC를 사용하는 회사 및 개별 사용자 중 일부입니다.
이 소프트웨어가 연구에 유용하다고 생각하면 인용을 고려하십시오.
@software{yang2021mosec,
title = {{MOSEC: Model Serving made Efficient in the Cloud}},
author = {Yang, Keming and Liu, Zichen and Cheng, Philip},
url = {https://github.com/mosecorg/mosec},
year = {2021}
}
우리는 모든 종류의 기여를 환영합니다. 문제를 제기하거나 불화에 대해 논의하여 피드백을 제공하십시오. 코드와 요청 요청도 직접 기여할 수도 있습니다!
개발을 시작하려면 ENVD를 사용하여 고립되고 깨끗한 파이썬 및 녹 환경을 만들 수 있습니다. 자세한 내용은 Envd-Doc 또는 Build.envd를 확인하십시오.