Docker 이미지와 컨테이너의 차이
이미지는 컨테이너를 만들때 사용하는 설계도 혹은 청사진으로 비유할 수 있다. 마치 객체지향에서 클래스와 인스턴스처럼 실제 사용할 수 있는 VM 은 컨테이너라고 불린다
Docker Compose 와 Dockerfile 의 차이
- Dockerfile 은 하나의 이미지를 정의하기 위해 사용되며 사용처에 맞는 이미지를 만들 때 매번 베이스 이미지를 컨테이너로 실행하여 수정 후 commit 할 수 없기때문에 Dockerfile을 사용한다.
- Dockerfile 을 통해 이미지의 수정사항을 명시하면 해당 방식으로 수정된 이미지를 생성할 수 있으며 또한 commit 된 이미지와 다르게 Dockerfile 의 특정 명령에 따라 layer 단위로 분리-저장 함으로써 상위계층의 레이어가 수정되면 하위 계층의 레이어는 캐싱된 데이터를 그대로 사용할 수 있다는 장점이 있다.
- Docker compose 는 컨테이너 여러개를 복합적으로 운영할때 사용되며 주로 이미 만들어진 이미지를 사용하여 여러가지 서비스를 실행할 때 이미지가 컨테이너로 실행될때 수행해야할 명령어, 포트 노출, 서비스 간 상관관계를 관리할 수 있다.
Kubernetes란?
컨테이너화된 애플리케이션의 배포, 관리 및 확장을 자동으로 하는 오케스트레이션 플랫폼
- 컨테이너가 중단되거나 오류가 발생하면 같은 역할을 하는 새로운 컨테이너로 교체하거나 재시작
- 같은 역할의 컨테이너 여러대에 자동 로드 밸런싱
- 접속 세션 수에 따라 자동 스케일-아웃/인
- VM 리소스를 효율적으로 사용하기 위한 팟(pod) 단위 관리
딥러닝 모델을 ONNX, TensorRT 등의 포맷으로 관리해야하는 이유
- 프로덕션에 올라갈 모델을 ONNX 로 관리하면 다양한 플랫폼에 적용하거나 해당 플랫폼에 맞게 변경할 수 있는 초석이 됨
- 엔비디아 GPU 를 사용하는 추론 서버가 대세인 현재 TensorRT 는 엔비디아 GPU 위에서 월등한 성능을 보여주기 때문에 서비스에 적합함
Post-Training Quantization
학습이 완료된 모델을 양자화하는 것으로 동적 양자화와 정적 양자화가 있음
static quantization
입력 데이터를 대표하는 1% 미만의 데이터셋을 사용하여 입력 데이터를 양자화를 위한 최적의 수치를 미리 계산하여 모델과 함께 저장 (캘리브레이션 과정). 이후 추론 시에는 해당 수치를 사용하여 입력데이터를 바로 양자화. 속도가 빠르다는 장점이 있고 주파수 신호나 이미지파일처럼 어느정도 데이터의 범위가 정해져있을때 권장되는 방식. 캘리브레이션 시에 사용되었던 데이터와 차이가 큰 이상치가 들어오면 추론 성능이 급격하게 나빠지나 오히려 양자화로 일반화 성능이 좋아져서 추론 성능이 소폭 증가하는 경우도 있음
dynamic quantization
정적 양자화와는 달리 캘리브레이션 과정을 수행하지 않고 내부 가중치만 양자화한 상태로 저장. 추론 시 입력데이터가 들어오면 각 레이어에 맞게 런타임에서 데이터를 양자화함. 주로 LLM 처럼 입력 데이터의 다양성이 높을 때 권장됨. 실제 입력 데이터에 맞춘 캘리브레이션이 진행되기때문에 일반적으로 정적 양자화보다는 추론 성능이 좋음
Quantization-Aware Training
- 모델을 학습시킬 때 레이어의 가중치와 입력 데이터를 INT8 형식으로 반올림한 값이 적용되게 학습을 진행
- 이미 학습이 완료된 모델에 기존 학습량 및 학습률을 1~10% 수준으로 낮게 학습하여 이미 학습된 가중치가 크게 망가지지 않게 하는 것이 중요
- 학습을 위해서는 역전파 시 기울기가 미분가능해야하기때문에 순전파에서만 반올림한 값을 사용하고 역전파시에는 기존 기울기를 그대로 사용
양자화 / 모델 경량화 시 주의해야할 점
추론 성능 테스트
경량화 이전 모델과 추론 성능을 비교했을때 성능이 심각하게 훼손되지는 않는지 확인이 필요함
추론 속도 테스트
양자화 및 모델 경량화가 항상 빠른속도를 보장해주진 않음. 모델 파라미터 크기가 작은 경우 입력 데이터의 양자화 - 역 양자화시 발생하는 오버헤드 비용이 더 커서 속도가 더 느려지는 경우가 발생함