PyTorch 2.14 AOTInductor 외부 상수 API로 GPU 가중치 버퍼를 여러 컨테이너가 공유하는 방법 | DAKER 커뮤니티

가중치 한 번만

변형 모델 여러 개를 한 번에 서빙할 때 가장 먼저 부딪히는 문제 중 하나는 메모리입니다. 같은 베이스 가중치를 쓰는데도 컨테이너마다 GPU 복사본을 다시 올리면, 모델 수만큼 메모리 사용량이 커지기 쉽습니다.

PyTorch 2.14의 AOTInductor에는 이 지점을 점검해 볼 수 있는 경로가 있습니다. AOTInductorModelContainerCreateWithExternalConstants는 호출자가 넘긴 가중치 텐서를 그대로 사용하므로, 조건만 맞으면 같은 버퍼를 여러 모델 컨테이너가 공유할 수 있습니다.

PyTorch 2.14 AOTInductor의 AOTInductorModelContainerCreateWithExternalConstants는 호출자가 넘긴 가중치 텐서를 그대로 씁니다.

외부 상수 공유가 중요한 이유

같은 베이스 가중치를 바탕으로 여러 변형 모델을 운영할 때, 가중치를 매번 따로 로드하면 메모리 사용량이 빠르게 늘어납니다. 반대로 외부 상수로 하나의 버퍼를 넘기는 방식이 성립하면, 컨테이너마다 GPU 복사본을 다시 만들지 않고 같은 버퍼를 공유하는 구성이 가능합니다.

이때 먼저 확인할 것은 속도보다 소유권과 수명입니다. 벤치마크 숫자를 만들지 않아도, 누가 메모리를 소유하는지와 버퍼가 언제까지 살아 있어야 하는지만 분명하면 공유 경로를 검토할 수 있습니다.

얼마나 빠른가보다 누가 메모리를 소유하는가를 먼저 정리하는 것이 좋습니다.

재현해 볼 실험 조건

실험은 복잡하게 시작하지 않아도 됩니다. 같은 베이스 가중치 버퍼 하나를 준비한 뒤, 외부 상수 API를 통해 여러 컨테이너가 그 버퍼를 함께 가리키는 경우와, 컨테이너마다 상수를 따로 로드하는 경우를 비교 조건으로 두면 됩니다.

함께 확인할 핵심은 버퍼 수명과 파괴 순서입니다. 컨테이너가 살아 있는 동안 호출자 버퍼가 유지되는지, 다시 말해 버퍼가 컨테이너보다 먼저 해제되지 않는지를 점검해야 합니다.

이 API는 C ABI로만 열려 있고 Python 진입점은 아직 없습니다. 외부 상수를 넘기지 않는 기존 로드 경로는 그대로 유지됩니다.

실험 중 확인할 항목

  1. 같은 베이스 가중치 버퍼 하나를 준비합니다.
  2. 컨테이너 A·B를 외부 상수 API로 만들어 같은 버퍼를 가리키게 한 경우와, 컨테이너마다 상수를 따로 로드한 경우를 비교 조건으로 둡니다.
  3. 컨테이너가 살아 있는 동안 호출자 버퍼가 유지되는지, 파괴 순서(버퍼가 컨테이너보다 먼저 죽지 않는지)를 확인합니다.

실무에서 바로 볼 포인트

서빙 코드에서는 메모리 소유권을 주석으로 남겨 두는 것이 좋습니다. 특히 외부 상수를 쓰는 경우에는 호출자가 소유권을 유지하므로, 텐서나 버퍼의 수명이 컨테이너보다 짧아지면 안 됩니다.

프로세스 간 공유를 염두에 둔다면 CUDA IPC 같은 경로를 전제로 설계해야 합니다. 이 경우에는 IPC로 넘긴 핸들과 컨테이너 수명을 같은 표에 적어 두면 실수를 줄이는 데 도움이 됩니다.

서빙 체크리스트에는 C ABI 심볼 이름과 소유권 문구를 그대로 남겨 두는 편이 안전합니다.

실험 노트에 남기면 좋은 기준

실험 결과를 정리할 때는 성능 수치보다 구성 정보를 먼저 남기는 편이 유용합니다. 컨테이너 개수, 공유 버퍼 개수, 파괴 순서를 표로 적어 두면 외부 상수 경로가 실제로 어떤 조건에서 유지되는지 다시 확인하기 쉽습니다.

외부 상수를 쓰지 않는 기본 생성자와 비교할 때도 같은 체크리스트를 적용하면, 어떤 차이가 메모리 소유 구조에서 비롯되는지 더 분명하게 볼 수 있습니다.

항목 기록 내용
컨테이너 개수 몇 개의 모델 컨테이너를 동시에 유지하는지
공유 버퍼 개수 1 vs N
파괴 순서 버퍼가 컨테이너보다 먼저 해제되지 않는지
API 정보 PyTorch 2.14, AOTInductorModelContainerCreateWithExternalConstants

관련 DAKER 학습

참고 자료

https://daker.ai/public/learning/tracks/pytorch-practice-advanced-track
https://daker.ai/public/learning/materials/pytorch-advanced-2-embedding-self-attention-mini-i

여러 컨테이너가 같은 GPU 가중치 버퍼를 공유하는 구성을 검토해 보셨다면, 어떤 지점에서 소유권과 수명 관리가 가장 까다로웠는지 궁금합니다.