Full Stack Deep Learning — Testing and Deployment

이 글은 Full Stack Deep Learning의 여섯번째 코스인 Testing and Deployment를 보고 내용을 정리한 글입니다. 내용의 사진은 모두 발표 슬라이드를 가져왔습니다. 잘못 이해했거나, 의역이나 오타가 있을 수 있습니다. 제보해주시면 감사하겠습니다 🙏

머신러닝 시스템에는 어떤 구성요소들이 있을까? 아래 그림처럼 나누어서 살펴본다.

ML Test Score

ML Test Score : A Rubric for Production Readiness and Technical Debt Reduction 이것은 구글 실무자들의 철저한 프레임워크/체크리스트다. 총 28가지 검사항목이 4종류로 나뉘어져있다. 명확하고 준비된 가이드라인과 지표로 사용하며 안정적인 시스템을 개발하는 방향으로 발전시켜갈 수 있다.

Data Tests

  1. 스키마와 잘 맞는다
  2. 모든 피처들은 유익하다
  3. 어떤 피처도 비용이 너무 많이 들지 않는다
  4. 피처는 메타레벨 요구사항을 충족한다
  5. 데이터 파이프라인이 적절하게 개인정보를 제어한다
  6. 새로운 피처도 빠르게 추가될 수 있다
  7. 모든 피처입력코드는 테스트됐다.

Model Test

  1. 모델 스펙이 리뷰를 받고 제출됬다
  2. 온라인/오프라인 metrics가 연관성이 있다(?)
  3. 하이퍼파라미터는 튜닝됬다
  4. 모델의 부실한 점의 영향력을 알고있다.
  5. 더 간단한 모델이 더 좋지는 않다
  6. 모델 성능은 중요한 데이터 조각에 충분하다(?)
  7. 모델은 inclusion을 고려하기 위한 테스트이다(?)

원문보고 무슨 말인지 잘 모르겠음 ㅠ

ML Insfrastructure Tests

  1. 트레이닝 결과는 재생산가능하다
  2. 모델 스펙이 단위 테스트를 통과했다
  3. ML 파이프라인은 통합 테스트를 통과했다
  4. 모델 성능은 배포 전 검증됬다
  5. 모델은 디버깅할 수 있다
  6. 모델은 배포전 카나리 테스트를 통과했다(Canaried가 카나리아 테스트를 말하는듯)
  7. 배포된 모델은 롤백할 수 있다.

Monitoring Tests

  1. 의존성 변경 결과를 알려준다
  2. 입력에 대한 데이터 불변성 유지
  3. 학습과 배포는 skewed되지 않는다(??)
  4. 모델은 너무 오래되지 않았다
  5. 모델은 수치적으로 안정돼있다
  6. 계산성능이 퇴보되지 않는다
  7. 예측성능이 퇴보되지 않는다

그리고 이제 이 항목들마다 아래 기준으로 점수를 매겨본다. 그리고 평균을 내보자.

  • 0점: 상용 제품 시스템이라기보단 연구 프로젝트다
  • 0–1점: 전부 테스트를 하지 않은건 아니지만, 신뢰도에 큰 구멍이 있을 가능성을 고려해봐야 한다.
  • 1–2점: 간단한 프로덕션화를 통과했다. 하지만 투자가 더 필요하다
  • 2–3점: 합리적으로 테스트됬다. 하지만 아직도 자동화될 수 있는 테스트와 절차들이 남아있다.
  • 3–5점: 테스트, 모니터링 자동화가 잘 됐고 중요한 시스템에도 적절하다.
  • 5점 이상: 엄청난 수준의 테스트와 모니터링 자동화

아래 사진에서 듯 구글 팀들도 각 항목에서 상당히 점수가 낮음을 알 수 있다.

CI / Testing

  • 유닛 테스트: 모듈 기능을 테스트함.
  • 통합 테스트: 전체 시스템이 작동하는 것을 테스트함.
  • CI(Continuous Integration): repository에 코드가 푸시될때 모든 테스트 작업들을 수행하는 것

이를 하는 방법은

  • SaaS: CircleCI, Travis, etc… — GPU를 쓸 수 없음.
  • Jenkins / Buildkite: 자신의 하드웨어나 클라우드에서 CI를 돌린다면 좋은 선택, GPU를 이용해서 예약된 학습 테스트를 할 수 있다. 유연성이 좋다
  • 마지막으로 도커를 이용한 컨테이너화(Docker)

Docker

더 진행하기 전에, 도커에 대해 간단히 알아보자. 도커는 가상머신(VM)이다. 도커는 운영체제 수준의 가상화를 지원한다. 바로 컨테이너화(Containerization)이다.

일반 가상머신은 Host OS위에 Guest OS를 띄우고 그 위에서 앱을 실행한다. 하지만 Docker는 Host OS 바로 위에서 앱을 실행한다. 따라서 Guest OS를 거치며 성능이 줄어들지 않는다.

가상화된 환경을 통해 우리는 여러 앱을 격리된 환경에서 실행한다. 예를 들어 위 사진의 세 컨테이너는 각각 다른 앱을 실행하며, 서로에 영향을 주지 않는다.

Dockerfile로 도커 이미지를 생성한 뒤 실행할 수 있다. 도커 이미지는 다른 이미지를 베이스로 만든다. DockerHub나 Docker Repository를 이용해서 다른 사람들이 만든 공개된 이미지를 바탕으로 새로운 이미지를 만들수도 있고, Private한 이미지를 가져올 수도 있다.

수많은 분산 컨테이너를 관리하기 위해서는 Orchestration Tool이 필요하다. 오픈소스로 대표적인건 Kubernetes다.

Web Deployment

웹 배포에는 여러 방법이 있다. 우선 기본적으로 REST API의 형태로 기능을 제공하게된다.

  • 가상머신에 배포하면, 인스턴스를 늘려서 스케일링이 가능하다
  • 컨테이너를 통해 배포하면, 오케스트레이션으로 스케일링
  • 서버리스 배포를 하면 스케일링 걱정 X
  • 모델 배포 특화 솔루션을 사용할 수도 있다 — Google’s Tensorflow Serving, Amazon’s Model Server for MXNet, Berkeley RISE Lab’s Clipper, etc…

다른 한가지 중요한건 GPU Batching이다. 큰 모델을 효율적으로 GPU인스턴스에서 사용하기 위해선 적절한 배치 사이즈를 만들어야하는데, 이를 전문 모델서빙 솔루션들이 수행해준다.

Monitoring

어떻게 ML 시스템을 모니터링할까?

  • 에러가 나거나, 서버가 죽으면 그것을 고치기 위해 기록해야한다.
  • 클라우드 제공자들은 모니터링 솔루션들을 제공한다.

수집되는 데이터 분포를 모니터링 할수도 있다. KL Divergence 같은 방법을 이용해서 데이터 분포가 갑자기 바뀌면 알람을 보내는 식이다. 근데 실제로 사용하는 곳을 보지 못했다고 한다.

단순히 서버 잘 돌아가는지만 보지 말고, 비즈니스에도 잘 사용되는지 확인해봐야 한다.

  • 모델 예측의 확신도가 갑자기 줄어들었다거나
  • 유저가 예측 결과를 교정하는 경우가 증가했다거나

또한 이런 실패들은 문제를 해결할 수 있도록 잘 기록되어야한다.

Hardware / Mobile

어떻게 모바일/임베디드 하드웨어에 모델을 배포할까?

Model Pruning & Quantization

모델 가지치기와 양자화는 모델이 더 적은 메모리와 적은 계산량으로 빠르게 동작하게 도와주는 모델 압축 기법이다. 텐서플로우는 Tensorflow Lite, 파이토치는 Pytorch Mobile을 사용할 수 있다.

  • Model Pruning: 중요하지 않은 가중치 값을 제거해서 계산량과 모델 크기를 즐이는 방법
  • Quantization: 가중치 값을 32비트 부동소수점에서 16비트 부동소수점으로 바꾸는 등의 방법으로 계산을 더 빠르고 메모리 사용량을 줄임.

임베디드 기기는 메모리도 훨씬 적고, 계산도 느리고, PyTorch/Tensorflow의 기능을 모두 사용할 수 없을 수도 있다.

  • 아키텍처를 신경써야하고
  • Interchange Format을 고려해볼 수 있다

예를 들어 ONNX 모델을 이용해서 모든 프레임워크를 ONNX 모델로 바꾼 뒤 클라우드나 디바이스에 배포한다면, 프레임워크나 환경의 제약을 받지 않을 수 있다. — 성능은 아직 그렇게 좋지 않은 모양

다른 방법으로는 MobileNet처럼 작고 성능이 좋은 네트워크를 고려해보거나, Distillation 기법을 사용하는 것이다. Distillation은 큰 모델을 학습한 뒤, 작은 모델로 큰 모델과 유사한 결과를 내는 모델을 만드는 기법이다.

거의 다 끝났다 ㅠ

2020.12.8 ~ 2022.6.9 군복무중 Serving in the South Korean Military Service

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store