모델을 배포하는 방법은 여러가지가 있다:

  • 텐서플로우나 파이토치로 모델을 저장하고 클라우드 서비스인 AWS SageMaker 에 업로드하는 식으로 배포하는 것.
    • S3 에 모델을 업로드하면 해당 파일을 SageMaker 가 읽어와서 서빙을 할 수 있다.
  • TensorFlow Serving 같은 모델 서빙 프레임워크를 이용하는 것.
  • FastAPI, Flaks, Django 와 같은 웹 서버를 이용하고 모델을 웹 서버의 메모리에 로드해서 서빙하는 방법.

 

배치 예측 vs 온라인 예측

모델이 하는 예측은 3가지 유형이 있다:

  • 배치 피처로 배치 예측
  • 배치 피처로 온라인 예측
  • 배치 피처와 스트리밍 피처로 온라인 예측

온라인 예측은 요청이 들어왔을 때 모델이 에측을 수행하는 걸 말하며, 배치 예측은 미리 예측을 해두는 경우를 말한다.

 

넷플릭스 추천 시스템을 생각해보면 됨. 이게 배치 예측이다. 넷플릭스는 4시간마다 추천을 해서 데이터베이스에 기록해둔다고 함. 그래서 사용자가 앱에 접속하면 저장된 결과를 가져가기만 하면 됨.

 

아키텍처로 보면 다음과 같음.

 

 

배치 예측은 온라인 예측을 못하기 떄문에 하는 거라고 생각함. 온라인 예측이 더 어렵다. 레이턴시 조건이 빡세서.

  • 만약에 이런 레이턴시 조건이 없다고 생각해봐라. 온라인 예측을 하는게 더 이득임. 불필요하게 미리 계산해둘 핑요가 있나? 그냥 사용자가 접속하기만하면 그때 예측하면 되는데.
  • 상황이 바뀌면 즉시 그것에 맞게 예측 또한 변경되야 하지 않나. 생각이 든다. 예시로 넷플릭스에서 공포 영화를 좋아하는 유저에게 공포 영화를 추천하고 있지만, 사용자가 그 날은 코미디 영화를 보는 것 같다고 판단하면 즉시 코미디 영화를 추천해야하니까.
  • 실제로 하드웨어가 더 좋아지면서 온라인 예측으로 넘어가고 있는 분위기라고 한다. 배치 예측에서.

 

배치 예측은 온라인 예측의 레이턴시 문제를 회피하기 위한 방법 중 하나인거라고 생각.

 

배치 예측을 못하는 ML 시스템도 있음. 번역기와 같은거. 배치 시스템은 미리 들어올 요청을 알고 있어야 하는데 번역기 같은 경우는 어떤 요청이 올지 알지 못하니.

 

 

Q) 배치 피처와 스트리밍 피처 두가지 파이프라인이 있는 경우에 한 파이프라인의 변경 사항이 다른 파이프라인에 제대로 복제되지 않아서 두 파이프라인에서 서로 다른 피처 집합 두 개가 추출되는 경우도 발생할 수 있어?

 

배치 파이프라인과 스트리밍 파이프라인에서 동일한 피처를 추출하지만, 데이터 처리의 시점과 방식의 차이로 인해 발생하는 데이터의 가중치나 피처 값이 다를 수 있음.

 

그리고 배치 처리와 스트리밍 처리 파이프라인에서 동일한 데이터에 대해 다른 피처 추출 로직이 적용되어, 결과적으로 두 파이프라인에서 추출된 피처 집합이 서로 다를 경우도 발생할 수 있음.

 

이 경우에는 훈련 데이터로 생성한 피처와 스트리밍 피처가 서로 다르니까 예측을 잘 못하는 문제가 생김. 이를 "피처 불일치(Feature Skew)" 또는 "피처 드리프트(Feature Drift)" 라고 한다.

 

중앙화된 피처 스토어를 사용해서 이런 문제를 해결할 수 있음.

 

 

Q) 피처 스토어를 사용하면 훈련에 사용되는 배치 피처와 예측에 사용하는 스트리밍 피처 간의 일관성을 보장할 수 있어?

 

피처 스토어는 모델 훈련과 실시간 예측 간에 피처의 일관성을 유지하는 데 중요한 역할을 함.

 

피처 스토어는 머신러닝 모델의 훈련과 서빙을 위한 피처 데이터를 중앙에서 관리하는 시스템으로, 데이터의 정의, 저장, 검색을 일관된 방식으로 처리한다. 

 

피처 스토어에서는 피처 계산 로직을 중앙에서 관리한다.

 

이는 모델 훈련 시 사용된 피처 정의와 실시간 예측 시 사용되는 피처 정의가 동일하게 유지되도록 보장한다. 결과적으로, 훈련 데이터와 서빙 데이터 간의 불일치(피처 불일치) 문제를 해결할 수 있다.

 

그리고 피처 스토어는 피처의 저장과 함께 버전 관리를 지원한다. 이를 통해 훈련과 예측 시점에 사용된 피처 데이터의 정확한 상태를 기록하고 재현할 수 있다.

 

피처 스토어를 사용하면 배치 데이터셋으로 모델을 훈련시키고, 실시간 스트리밍 데이터를 처리할 때 동일한 피처 엔지니어링 파이프라인을 사용하여 일관성을 유지할 수 있다.

 

 

모델 압축

ML 모델이 추론 레이턴시를 줄이는 방법으로는 크게 3가지 방법이 있음:

  • 추론을 더 빠르게 하기 (당연하긴함. 다르게는 이를 추론 최적화라고 한다.)
  • 모델을 더 작게 만들기 (이를 모델 압축이라고 한다.)
  • 더 좋은 하드웨어나 최적화 기능을 사용하기

 

여기서는 모델 압축의 4가지 기법들에 대해서 소개한다.

  • low rank factorization
  • knowledge distillation
  • Pruning
  • Quantization

 

low rank factorization

low rank factorization:

  • 머신러닝에서 대규모 매트릭스 또는 텐서를 더 작고 관리 가능한 구성 요소로 분해하는 방법. 고차원 텐서를 저차원 텐서로 대체해서 계산 효율성을 높이는 방법이다.

 

그러니까 큰 행렬 A 를 작은 행렬 U 와 V 의 곱으로 표현할 수 있는 방법을 말한다. 이렇게 하면 파라미터의 수가 더 줄어드니까 계산을 더 빠르게 할 수 있음.

  • 예시로 행렬 A 가 m x n 이라고 치자, 그러면 행렬 U 와 V 를 각각 m x k, k x n 으로 풀어낼 수 있고 결과적으로 k(m + n) 개수로 줄여낼 수 있다.

 

low rank factorization 이 사용되는 분야:

  • 이미지 처리: 이미지의 크기를 줄이면서도 중요한 정보를 유지할 수 있다.
  • 자연어 처리: 단어 또는 문서의 임베딩을 저차원으로 표현할 때 사용될 수 있다.
  • 추천 시스템: 사용자와 아이템 간의 관계를 저차원 공간에서 표현하여 추천의 정확도를 높일 수 있다.

 

 

Q) 텐서가 뭔데?

 

수학과 컴퓨터 과학에서 다차원 데이터를 나타내는 일반적인 개념임.

 

머신러닝과 딥러닝에서는 데이터 구조와 모델의 파라미터를 표현하기 위해 사용된다.

 

텐서는 일반적으로 차원(Dimension)에 따라 다양한 유형으로 분류된다:

  • 스칼라(Scalar): 0차원 텐서로, 하나의 값만을 가진 단일 숫자이다.
  • 벡터(Vector): 1차원 텐서로, 여러 개의 숫자가 순서대로 나열된 데이터이다.
  • 행렬(Matrix): 2차원 텐서로, 행과 열로 구성된 데이터 구조이다.
  • 고차원 텐서: 3차원 이상의 텐서를 의미합니다. 3차원 텐서는 주로 3D 데이터, 4차원 텐서는 영상 데이터를 표현하는 데 사용된다.

 

텐서는 딥러닝 프레임워크에서 핵심적인 요소로 사용됨:

  • 데이터 표현: 텐서는 이미지, 텍스트, 오디오 등의 데이터 유형을 나타내는 데 사용된다.
  • 모델 파라미터: 딥러닝 모델의 가중치와 편향은 주로 텐서로 표현된다.

 

 

Q) CPU 는 스칼라 데이터만 한번에 처리할 수 있고, GPU 는 벡터와 행렬 차원의 데이터까지 한번에 처리할 수 있는거야? 그러니까 하드웨어에 따라서 한번에 처리할 수 있는 데이터의 양이 다른거지?

 

맞다.

 

CPU 와 GPU 의 데이터 처리 방식은 다르다.

 

CPU는 일반적으로 스칼라 데이터(단일 값)를 한번에 처리하는 데 최적화되어 있고, GPU는 벡터와 행렬과 같은 다차원 데이터를 병렬로 처리하는 데 뛰어나다.

 

이 차이는 하드웨어 아키텍처와 목적에 따라 발생한다.

 

CPU:

  • 각 코어의 클럭 속도가 높아 단일 작업을 빠르게 처리할 수 있다.
  • CPU는 코어 수가 제한되어 있으며, 각 코어는 주로 직렬 처리에 초점을 맞춥니다. 다만 멀티스레딩을 통해 어느 정도 병렬성을 지원하기도 한다.

 

GPU:

  • 벡터와 행렬 같은 다차원 데이터를 동시에 처리할 수 있도록 설계되어있다.
  • 많은 코어를 갖추고 있어 대규모 병렬 처리가 가능하다.

 

TPU:

  • TPU는 특히 텐서 연산에 최적화되어 있어, 대량의 데이터를 매우 빠른 속도로 처리할 수 있는 것이 특징이다.
  • 높은 병렬성: TPU는 수천 개의 코어를 갖추고 있으며, 이 코어들은 복잡한 텐서 연산을 동시에 수행할 수 있다.
  • TPU는 특히 매트릭스 곱셈과 같은 연산에 최적화되어 있어, 뉴럴 네트워크의 학습과 추론 속도를 크게 향상시킬 수 있습니다
  • 딥러닝 모델의 트레이닝과 추론에 주로 사용된다.

 

 

Q) TPU 를 지원하는 하드웨어는 Google Cloud 에서 사용할 수 있나?

 

사용가능하다.

 

 

Q) TPU 는 LLM 추론 과정에서도 다른 하드웨어들보다 빠르게 추론을 해?

 

LLM 에서도 빠르게 추론할 수 있다.

 

 

Q) LLM 과 일반 딥러닝 프레임워크는 추론 과정의 연산 방식이 크게 다르지 않아?

 

LLM과 일반 딥러닝 프레임워크 모두 뉴럴 네트워크 아키텍처를 기반으로 한다.

 

따라서 기본적인 연산은 행렬 곱셈, 비선형 활성화 함수, 소프트맥스와 같은 공통적인 연산을 포함한다.

 

LLM과 일반 딥러닝 프레임워크는 모두 학습과 추론의 과정을 거치며, 학습된 모델을 기반으로 새로운 데이터에 대한 추론을 수행한다.

 

두 유형 모두 텐서를 사용하여 데이터를 표현하며, 이러한 텐서에 대한 연산은 GPU 또는 TPU와 같은 병렬 하드웨어에서 효율적으로 처리된다.

 

LLM은 수십억 개의 파라미터를 갖는 매우 대규모 모델이다.

 

일반 딥러닝 프레임워크의 모델은 상대적으로 작거나 중간 규모의 파라미터를 갖는 경우가 많다.

 

LLM은 주로 자연어 처리(NLP) 작업에 특화되어 있지만, 일반 딥러닝 프레임워크는 이미지, 오디오, 텍스트 등의 다양한 데이터 유형을 다룬다.

 

 

knowledge distillation

큰 모델에서 작은 모델로 지식을 전달하여 모델의 크기를 줄이면서도 성능을 유지하거나 향상시키는 방법이다.

 

이 기법은 머신러닝과 딥러닝에서 모델의 경량화와 추론 속도 개선을 위해 사용된다.

 

Knowledge Distillation은 주로 다음과 같은 과정을 통해 진행된다:

  • 교사 모델과 학생 모델: 큰 모델을 "교사 모델"로, 작은 모델을 "학생 모델"로 설정합니다. 교사 모델은 학습된 복잡한 구조와 성능을 가지고 있다.
  • 소프트 타겟: 교사 모델의 출력값을 직접 사용하는 것이 아니라, 소프트맥스 함수를 적용하여 확률 분포 형태로 변환된 "소프트 타겟"을 생성한다. 이 소프트 타겟은 모델의 내부 지식을 포함하고 있다.
  • 지식 전달: 학생 모델은 교사 모델의 소프트 타겟을 기반으로 학습한다. 이렇게 하면 학생 모델은 교사 모델의 지식과 패턴을 효율적으로 흡수할 수 있다.
  • 보조 손실 함수: 학생 모델은 소프트 타겟과 함께 원래 데이터에 대한 타겟 값도 함께 학습한다. 이를 통해 학생 모델이 교사 모델의 지식을 학습하면서도 원래 데이터에 대한 성능을 유지할 수 있다.

 

 

Q) 소프트맥스 함수는 뭐지?

 

소프트맥스(Softmax) 함수는 딥러닝에서 주로 분류 작업에 사용되는 활성화 함수임.

 

이 함수는 입력값을 확률 분포로 변환하며, 모델의 출력이 다양한 클래스에 대한 확률로 해석될 수 있도록 한다.

 

소프트 타겟(Soft Target)은 소프트맥스 함수를 통해 생성된 확률 분포 형태의 타겟 값이다.

 

소프트맥스 함수는 각 입력값의 지수를 계산한 후 그 합으로 나누어 확률 분포를 생성한다. 이렇게 하면 모든 출력값의 합이 1이 되어 확률 분포로 해석할 수 있다.

 

 

Q) 교사 모델이 입력 데이터를 바탕으로 복잡한 패턴을 파악해서 추론을 하는 거라면 학생 모델은 교사 모델이 낸 결과를 학습하는거야? 학습 목적이 다르긴하네?

 

교사 모델은 일반적으로 더 크고 복잡한 구조를 가지고 있으며, 입력 데이터를 직접 학습해서 모델은 많은 파라미터와 복잡한 계층 구조를 통해 데이터를 분석하고, 다양한 패턴과 관계를 파악한다.

 

학생 모델은 교사 모델보다 더 작고 간단한 구조를 가지고 있다. 학생 모델은 주로 교사 모델이 낸 결과, 특히 소프트 타겟을 학습하여 교사 모델의 지식을 전달받는다.

 

 

Q) 소프트 타겟이 어떻게 지식을 표현하고 있는거지?

 

소프트 타겟은 소프트맥스 함수를 통해 생성된 확률 분포를 의미한다.

 

단순히 교사 모델의 출력 값이 아님. 모델의 출력이 각 클래스에 대해 얼마나 "부드럽게" 분포되어 있는지를 나타냄.

 

예를 들어, 어떤 분류 모델이 3개의 클래스를 가지고 있다고 가정해보자. 모델의 소프트맥스 출력이 다음과 같다면:

 

클래스 A: 0.7
클래스 B: 0.2
클래스 C: 0.1

 

이 출력은 클래스 A가 가장 가능성이 높지만, 클래스 B와 C도 약간의 확률을 가지고 있음을 나타냄. 이러한 부드러운 확률 분포가 소프트 타겟임.

 

 

Pruning

Pruning(가지치기)은 모델 압축 기법 중 하나로, 딥러닝 모델의 불필요한 파라미터나 중요하지 않은 가중치를 가진 파라미터를 제거하여 모델의 크기를 줄이고, 계산 효율성을 높이며, 추론 속도를 개선하는 데 사용된다.

 

Pruning의 다양한 유형:

  • 특정 임계값보다 작은 가중치를 가진 파라미터를 제거합니다. 이렇게 하면 모델의 파라미터 수가 줄어들며, 계산량이 감소한다.
  • 뉴런 또는 필터 기반 Pruning: 네트워크의 뉴런 또는 합성곱 필터를 제거한다. 이는 네트워크 구조를 간소화하고, 메모리 사용량을 줄인다.
  • 구조 기반 Pruning: 네트워크의 전체 레이어 또는 블록을 제거하여 모델 구조를 간소화한다. 이는 모델의 크기를 크게 줄일 수 있다.

 

 

Q) 합성곱 필터와 뉴런이 뭐야?

 

합성곱 필터는 CNN에서 사용되는 주요 구성 요소로, 이미지나 다른 형태의 다차원 데이터를 처리하는 데 사용된다.

 

합성곱 필터는 입력 데이터에 특정 변환을 적용하여, 중요한 패턴이나 특징을 추출한다. 합성곱 필터가 없으면 모델이 패턴을 파악하지 못하게 만들 수도 있음.

 

뉴런은 일반적인 신경망에서 사용되는 기본 구성 요소로 사용되며 입력 데이터를 처리하고 결과를 생성하는 역할을 한다.

 

뉴련의 동작 과정:

  • 입력과 가중치: 뉴런은 여러 개의 입력을 받으며, 각 입력에는 가중치(weight)가 적용됨. 가중치는 뉴런이 입력 데이터의 중요성을 조절하는 데 사용된다.
  • 활성화 함수: 뉴런은 입력 값과 가중치의 선형 조합에 활성화 함수(activation function)를 적용한다. 활성화 함수는 뉴런이 활성화되는 방식을 결정하며, 신경망의 비선형성을 부여하는 중요한 요소이다.
  • 출력: 뉴런은 활성화 함수의 결과를 출력하며, 이 출력은 다음 레이어로 전달된다. 이를 통해 신경망은 입력 데이터를 단계적으로 처리하며, 최종 예측을 생성한다.

 

 

Q) 뉴런은 신경망에서 몇 개의 뉴런을 쓸 지 명시해서 사용해?

 

신경망을 설계할 때 각 레이어에서 몇 개의 뉴런을 사용할지 명시해서 사용한다.

 

신경망의 구조는 여러 레이어로 구성되며, 각 레이어에는 특정 개수의 뉴런이 포함된다.

 

뉴런의 수는 모델의 복잡성과 용량을 결정하는 주요 요소 중 하나로, 신경망을 설계할 때 중요한 고려 사항임.

 

 

Q) 뉴런 또는 합성곱 필터 기반 Pruning 기법을 사용할 때 아무 뉴런이나 합성곱 필터를 제거하면 안될 거 같은데? 어떤 기준으로 제거하는가?

 

뉴런 또는 합성곱 필터가 출력에 얼마나 영향을 미치는지 분석하여 Pruning 대상 여부를 결정한다.

 

 

Quantization

모델 압축 기법 중 하나로, 딥러닝 모델의 가중치와 활성화를 낮은 비트 수로 표현하여 모델 크기를 줄이고 추론 속도를 향상시키는 방법임.

 

이 기법은 주로 제한된 리소스 환경(예: 모바일 기기, 임베디드 시스템)에서 모델을 실행하거나, 추론 속도를 개선하려는 경우에 사용된다.

 

Quantization의 주요 특징:

  • 비트 수 감소: 일반적으로 딥러닝 모델의 가중치와 활성화는 32비트 부동소수점 값으로 표현됨. Quantization을 통해 이를 16비트, 8비트, 또는 더 낮은 비트 수로 줄임으로써 메모리 사용량과 모델 크기를 줄일 수 있다.

 

Quantization의 주의점:

  • 정확도 손실: 낮은 비트 수로 표현하면 정보 손실이 발생할 수 있으며, 모델의 정확도가 떨어질 수 있다.

 

 

클라우드와 엣지 디바이스에서의 ML

엣지 디바이스에서 ML 을 사용할 수 있다면 이걸 사용하는게 더 나음.

 

클라우드 서비스는 비용이 많이 들어가고 네트워크 레이턴시도 있고 하니까. 데이터 개인정보 문제도 있고.

 

근데 엣지 디바이스에서는 계산을 처리할 수 있을만큼 강력하지도 않고 메모리에 올리기에도 충분하지 않으니까 이게 문제임.

 

 

딥러닝 모델 프레임워크를 실행하기 위해서는 하드웨어 수준의 지원이 필요하다.

파이토치나 텐서플로로 개발한 모델이 추론을 하거나 학습을 하는 명령은 CPU, GPU, TPU 등의 명령으로 변환되어야하는데 하드웨어 제공업에서 자신의 하드웨어에 맞게 변환될 수 있도록 하는 기능을 제공해줘야 된다는 거임.

 

그러니까 딥러닝 프레임워크의 고수준 명령을 하드웨어 수준의 저수준 명령으로 변환하는 기능이 필요하다는거.

 

NVIDIA 는 CUDA 라이브러리를 통해서 GPU 수준의 명령으로 변환할 수 있는 기능을 제공해주고, Google 의 XLA (Accelerated Linear Algebra) 를 통해서 TPU 수준의 명령으로 변환할 수 있는 기능을 제공해준다.

 

 

모델 최적화 기법

크게 로컬 기법과 전역 기법으로 나눠진다:

  • 모델 내부의 특정 부분이나 세부 요소를 최적화하는 반면, 전역 최적화는 모델 전체 또는 시스템 전체의 최적화를 목표로 함.

 

로컬 기법:

  • Vectorization(벡터화)
  • Parallelization(병렬화)
  • Loop Tiling
  • Operator Fusion

 

전역 기법:

  • End-to-End 최적화:
  • 전체 그래프 최적화:
  • 전체 시스템 최적화

 

로컬 기법

Vectorization(벡터화):

  • SIMD(Single Instruction Multiple Data) 를 이용해 여러 데이터 요소에 대해 단일 연산을 동시에 적용하는 것
  • 루프나 중첩 루프에서 데이터를 한 번에 하나씩 처리하는 대신, 여러 요소를 동시에 처리하여 성능을 개선하는 것.
  • 벡터화는 메모리에서 인접한 데이터 요소를 동시에 가져와서 연산하는 것. 이를 통해 메모리 액세스 레이턴시(지연 시간)를 줄이고, 캐시 효율성을 높이는 것.

Parallelization(병렬화):

  • 입력 배열 혹은 n차원 배열이 주어지면 이를 독립적인 작업 청크로 나눠서 각 청크가 개별적으로 수행될 수 있도록 하는 방법

Loop tiling:

  • 루프에서 데이터 엑세스 순서를 변경해서 하드웨어의 메모리 레이아웃과 캐시를 활용하는 것.
  • CPU 와 GPU 에서의 최적화 방법은 다르다고 함.

Operator Fusion:

  • 여러 연산을 하나의 연산으로 합쳐서 불필요한 중간 데이터를 줄이고, 연산 속도를 높이는 방법이다.

 

전역(Global) 기법

딥러닝 모델은 추론 과정에서 그래프 연산을 통해 작업을 수행한다.

 

End-to-End 최적화:

  • 모델 전체 또는 계산 그래프를 최적화하여 전체 시스템의 성능을 향상시키는 것.
  • 이 방법은 모델 전체의 흐름과 병목 현상을 분석하고, 최적화된 경로로 조정하는 것이다.

전체 그래프 최적화:

  • 텐서플로의 XLA(XLA - Accelerated Linear Algebra)와 같은 기술을 사용하여 전체 그래프를 최적화하는 것.
  • 이를 통해 연산을 미리 컴파일하고, 하드웨어에 맞게 최적화된 코드를 생성하여 실행 속도를 높이는 것.

전체 시스템 최적화:

  • 모델이 실행되는 전체 하드웨어 및 소프트웨어 환경을 최적화하는 것.

 

'Machine Learning' 카테고리의 다른 글

연속 학습과 프로덕션 테스트  (0) 2024.04.30
데이터 분포 시프트와 모니터링  (0) 2024.04.25
모델 개발과 오프라인 평가  (0) 2024.04.15
피처 엔지니어링  (0) 2024.04.11
훈련 데이터  (0) 2024.04.05

+ Recent posts