Large Model 추론시 A100 Mig instance 사용에 관한 질문

현재 llama2 모델을 A100 GPU를 사용해서 서빙해보려고 합니다. mig로 구성된 인스턴스 4개를 사용하려고 하는데(single node, gpu 4장, 1장 당 mig 인스턴스 1개 <- 7g80GB), mig 인스턴스의 gpu 여러장을 활용해서 분산 추론을 서빙하고 싶은데.. 여기저기 확인해보니 mig 컨셉상 이렇게 활용하는게 아닌 것 같더라구요;; 그렇다 해도 혹시 방법이 없을까 찾아보고 있는데..

torchrun으로 4개로 sharding된 모델파일을 각각 gpu의 올리고 추론하는것은 해봤는데요 (nccl이 불가능해서 gloo 사용), torchserve에서는 또 이게 어떻게 할지를 모르겠어서.. 조언이 필요합니다.

  • 아래 답변은 Anthropic의 Claude-2 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요 JunhoBae999님,

A100 GPU에서 MIG 인스턴스를 사용한 대용량 모델 추론에 대한 질문 감사합니다.

요약하자면, llama2 모델을 A100 GPU 4장 짜리 single node에서 MIG 인스턴스 4개를 사용해 서빙하려고 한다고 하셨죠.

그런데 MIG 인스턴스의 여러 GPU를 활용해 분산 추론을 하려니 제대로 되지 않는 것 같다고 하셨습니다.

네, MIG의 컨셉 자체가 분산 추론을 위한 것이 아니라서 그렇습니다.

MIG는 기본적으로 메모리 격리를 위한 것이고, 별도 host 없이 GPU 하나 안에서 격리된 인스턴스를 만드는 것이죠.

따라서 torchrun sharding 방식으로 분산 추론을 하려고 해보셨지만 nccl 통신이 안 되는 문제가 있었다고 하셨습니다.

torchserve 에서의 MIG 사용에 대해서는 잘 모르겠다고도 언급하셨는데요.

제 생각으로는 torchserve 기본 동작에서 MIG 인스턴스를 제대로 지원하지 않을 것 같습니다.

참고로, 딥러닝 프레임워크 차원에서도 현재 PyTorch나 TensorFlow에서 MIG를 공식적으로 지원하는 것으로 보이지 않습니다.

결론적으로, A100 MIG 인스턴스를 분산 추론에 활용하는 것은 어려울 것으로 보입니다.

대신, single GPU 단위로 MIG 인스턴스를 사용하면 메모리 측면의 이점은 있겠지만, 분산 처리 측면의 이점은 기대하기 어려울 것 같습니다.

다만 혹시 찾으신 다른 방법이 있다면 공유해 주시면 감사하겠습니다.

조언 요청 감사합니다. 도움이 되셨길 바랍니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-4-Turbo 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요 JunhoBae999님, A100 GPU의 MIG(Multi-Instance GPU) 인스턴스를 활용하여 대규모 모델의 추론 서빙을 구성하려는 계획에 대해 질문해주셨군요. MIG 인스턴스를 여러 개 사용하여 분산 추론을 구현하는 것에 대한 고민이 있으신 것 같습니다. 질문을 잘 이해했는지 확인해보겠습니다.

MIG 인스턴스를 사용하여 단일 노드에서 여러 GPU를 활용하는 분산 추론 환경을 구축하고 싶으신데, torchrun을 사용하여 각 GPU에 모델을 샤딩하여 추론을 수행하는 것까지는 성공하셨으나, torchserve를 사용할 때 어떻게 구성해야 할지에 대한 조언을 구하고 계십니다.

분산 추론을 위해 PyTorch의 분산 패키지를 사용하는 것은 좋은 접근 방법입니다. torchrun을 사용하여 모델을 샤딩하고 gloo 백엔드를 사용하여 추론을 수행한 경험이 있으시다면, 이미 분산 처리에 대한 이해도가 있으신 것으로 보입니다. torchserve를 사용할 때도 비슷한 원리로 접근할 수 있습니다.

torchserve는 모델 서빙을 위한 PyTorch의 도구로, 여러 모델을 동시에 호스팅하고 REST API를 통해 추론 요청을 처리할 수 있습니다. MIG 인스턴스를 사용하여 torchserve를 구성하는 방법은 다음과 같습니다:

  1. 각 MIG 인스턴스에 대해 별도의 torchserve 인스턴스를 실행합니다.
  2. torchserve 인스턴스는 독립적으로 모델을 로드하고 추론 요청을 처리합니다.
  3. 추론 요청을 분산시키기 위해 로드 밸런서나 프록시 서버를 사용할 수 있습니다.

아래는 각 MIG 인스턴스에서 torchserve를 실행하는 예시 코드입니다:

# model_store 디렉토리에 모델 파일(.mar)이 준비되어 있다고 가정합니다.
# 각 MIG 인스턴스에 대해 다음 명령을 실행합니다.

# MIG 인스턴스 0에서 torchserve 시작
CUDA_VISIBLE_DEVICES=MIG-GPU-0 torchserve --start --model-store model_store --models my_model.mar

# MIG 인스턴스 1에서 torchserve 시작
CUDA_VISIBLE_DEVICES=MIG-GPU-1 torchserve --start --model-store model_store --models my_model.mar

# ... 각 MIG 인스턴스에 대해 반복 ...

CUDA_VISIBLE_DEVICES 환경 변수를 사용하여 각 torchserve 인스턴스가 사용할 GPU를 지정할 수 있습니다. my_model.martorch-model-archiver를 사용하여 생성한 모델 아카이브 파일입니다.

추가적으로, 로드 밸런서나 프록시 서버를 사용하여 여러 torchserve 인스턴스로 요청을 분산시킬 수 있습니다. 이를 위해 Nginx, HAProxy 등의 솔루션을 사용할 수 있습니다.

torchserve에 대한 더 자세한 정보는 PyTorch 공식 문서를 참조하시기 바랍니다:

MIG 인스턴스를 활용한 분산 추론은 복잡할 수 있으나, 위에서 제시한 방법을 참고하여 구성해보시면 좋을 것 같습니다. 만약 추가적인 질문이나 도움이 필요하시면 언제든지 질문해주세요.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요 JunhoBae999님, A100 GPU의 MIG(Multi-Instance GPU) 인스턴스를 활용하여 대규모 모델 추론을 구현하려는 계획에 대해 질문해주셨군요. MIG 인스턴스를 여러 개 사용하여 분산 추론을 서빙하는 방법에 대해 알아보고 계시고, torchrun을 사용하여 sharding된 모델 파일을 각 GPU에 올려 추론을 시도해보셨지만, torchserve에서는 구현 방법을 찾지 못하셨다는 내용을 이해했습니다.

MIG는 각각의 인스턴스가 독립적인 GPU처럼 동작하도록 하여, 하나의 물리적 GPU를 여러 개의 논리적 인스턴스로 분할하는 기술입니다. 이를 통해 리소스를 효율적으로 분할하여 사용할 수 있습니다. 분산 추론을 위해서는 각 MIG 인스턴스에서 실행되는 모델이 서로 통신할 수 있어야 하며, 이를 위해 PyTorch의 분산 패키지를 사용할 수 있습니다.

torchserve는 모델을 서빙하기 위한 PyTorch의 공식 도구로, 모델을 패키징하고 배포하는 데 사용됩니다. torchserve를 사용하여 분산 추론을 설정하는 것은 torchrun을 사용하는 것보다 복잡할 수 있습니다. 그러나 torchserve에서도 분산 추론을 위한 핸들러를 구현하여 각 MIG 인스턴스에서 모델을 실행하고, 필요한 경우 다른 인스턴스와 통신할 수 있도록 설정할 수 있습니다.

다음은 분산 추론을 위한 기본적인 설정을 담은 예시 코드입니다. 이 코드는 torch.distributed를 사용하여 각 MIG 인스턴스에서 모델을 실행하고 통신하는 방법을 보여줍니다.

import torch
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP

def setup(rank, world_size):
    # 분산 환경 설정
    dist.init_process_group("gloo", rank=rank, world_size=world_size)

def cleanup():
    # 분산 환경 정리
    dist.destroy_process_group()

def model_inference(rank, world_size, model, input_data):
    setup(rank, world_size)
    # 모델을 DDP로 감싸기
    ddp_model = DDP(model, device_ids=[rank])
    
    # 추론 수행
    output = ddp_model(input_data)
    
    # 필요한 경우 다른 인스턴스와 통신
    # 예: dist.reduce(output, dst=0)
    
    cleanup()
    return output

# 각 MIG 인스턴스에 대한 설정
world_size = 4  # MIG 인스턴스의 개수
rank = ...  # 현재 인스턴스의 rank를 설정해야 함
model = ...  # 모델을 로드
input_data = ...  # 입력 데이터를 준비

# 추론 실행
output = model_inference(rank, world_size, model, input_data)

위 코드는 각 MIG 인스턴스에서 독립적으로 모델을 실행하고, 필요한 경우 dist.reduce와 같은 통신 연산을 사용하여 결과를 합치는 방법을 보여줍니다. 실제로 torchserve에서 이러한 설정을 적용하려면, 사용자 정의 핸들러를 작성하여 모델 로딩, 추론 실행, 그리고 결과 반환 로직을 구현해야 합니다.

torchserve에 대한 자세한 정보는 공식 문서를 참조하실 수 있습니다:

분산 추론에 대한 PyTorch 공식 문서는 다음 링크에서 확인하실 수 있습니다:

위의 코드와 문서를 참고하여 torchserve에서 사용자 정의 핸들러를 구현하시면, MIG 인스턴스를 활용한 분산 추론 서빙이 가능할 것입니다. 다만, 실제 환경에서의 구현은 여러 복잡한 요소를 고려해야 하므로, 추가적인 실험과 조정이 필요할 수 있습니다.

제 답변이 정확하지 않을 수도 있으니, 실제 구현 시에는 공식 문서와 커뮤니티의 다른 사용자들의 경험을 참고하시는 것이 좋습니다. 추가적인 질문이나 도움이 필요하시면 언제든지 문의해주세요.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!