파이톨치

[BoostCamp AI Tech] EfficientTraining 본문

AI&ML/BoostCamp AI Tech

[BoostCamp AI Tech] EfficientTraining

파이톨치 2024. 9. 17. 23:51
728x90

1. 데이터 캐싱이란?

데이터 캐싱은 반복적으로 사용되는 데이터를 미리 처리해 저장하거나 메모리에 일시적으로 보관해두어 재사용하는 기술입니다. 이를 통해 데이터 처리 속도를 높이고 학습에 필요한 데이터를 빠르게 불러올 수 있습니다.

 

2. 캐싱의 필요성

  • 반복적인 데이터 로딩 시간을 줄이고 I/O 병목 현상을 해소해 전체 학습 시간을 단축합니다.

3. 캐싱이 필요한 부분

  • 반복적인 처리 과정을 찾아내고, 매번 에폭마다 동일한 이미지 파일을 벡터화하는 과정을 미리 진행해두는 것이 중요합니다.
  • 예를 들어, 1장의 이미지를 처리하는 시간이 8ms라면, 전체 이미지 수와 에폭 수에 비례하여 처리 시간이 증가합니다.

4. 캐싱 적용 방법

  • 전체 이미지를 미리 벡터화 후 .npy 파일로 저장: 모든 이미지를 벡터화해 .npy 파일로 저장한 뒤, 이를 불러와 사용합니다. 이미지 크기가 크다면 효과적이지만, 작은 이미지에는 비효율적일 수 있습니다.
  • 첫 번째 에폭에서 벡터화 후 메모리에 저장: 첫 에폭에서 이미지를 벡터화하고 이후 에폭에서는 메모리에 저장된 데이터를 활용해 데이터 로딩 시간을 크게 줄일 수 있습니다.

5. 다양한 상황에 따른 캐싱 전략

  • 이미지 크기가 큰 경우: 각 이미지별로 .npy 캐싱 활용.
  • 충분한 메모리와 많은 에폭이 필요한 경우: 전체 이미지를 .npy로 캐싱.
  • 메모리가 적당하고 이미지 크기가 큰 경우: 배치 단위로 .npy 캐싱.
  • 데이터가 매우 많은 경우: 일정 단위(예: 5000개)로 나누어 .npy 캐싱.

Training 최적화

Gradient Accumulation은 훈련 최적화를 위해 사용되는 기법으로, 여러 배치에서 계산된 그래디언트를 누적하여 모델의 가중치를 업데이트하는 기술입니다.

 

이 방법에서는 각 배치 처리 후 그래디언트를 즉시 업데이트하지 않고 메모리에 누적합니다. 지정된 수의 배치가 처리된 후에야 누적된 그래디언트를 사용해 모델의 가중치를 업데이트합니다.

이렇게 하면 GPU 메모리의 한계로 인해 큰 배치 사이즈를 사용할 수 없는 상황에서도 마치 더 큰 가상 배치 사이즈를 사용한 것과 유사한 효과를 얻을 수 있습니다.

 

부동 소수점 형식의 종류와 특징

1. Float32 (fp32)

  • 1비트 부호, 8비트 지수, 23비트 가수로 구성된 표준 부동 소수점 형식.
  • 정밀도가 높아 기본 계산 단위로 주로 사용됨.

2. Float16 (fp16)

  • 1비트 부호, 5비트 지수, 10비트 가수로 구성된 부동 소수점 형식.
  • 속도와 메모리 효율성을 높이는 대신, 수치 표현 범위가 제한되어 Float32보다 정밀도가 낮음.

3. bfloat16 (bf16)

  • 1비트 부호, 8비트 지수, 7비트 가수로 구성된 부동 소수점 형식.
  • Float16보다 높은 정밀도를 가지며, Float32와 동일한 8비트 지수 표현 범위를 가짐.

FP32와 FP16 비교

  • NVIDIA에 따르면 FP16은 FP32 대비 약 8배 빠른 연산 속도, 2배 빠른 메모리 처리량, 절반의 메모리 크기를 사용함.
  • FP16을 활용하면 효율성이 높지만, 정밀도가 낮아지는 단점이 있음.
  • Mixed Precision: FP16의 정밀도 문제를 해결하는 방법으로, 연산이 필요한 시점에서는 FP16을 사용하고, 손실(Loss) 계산이나 모델 가중치 업데이트와 같이 모델 성능에 영향을 미치는 연산에서는 FP32로 변환된 값을 사용하여 성능을 보장함.

Mixed Precision 적용 방법

  • "GradScaler()"를 사용하여 스케일링을 조절.
  • 모델의 forward 단계에서 가중치를 FP16으로 복사하고, FP32 손실 계산 시 "with autocast()"를 활용.

Mixed Precision의 장점

  • 큰 배치 크기나 많은 파라미터를 가진 모델(ex. Transformers)의 학습 시 속도와 메모리 효율 향상.
  • 다양한 실험을 빠르게 진행할 수 있어 모델 선별, 파라미터 튜닝 등 반복적인 실험에 유용함.
  • 최종적으로 선정된 모델과 파라미터로는 기본 FP32 학습을 진행하고, 추론(Inference)이나 추가 후처리(ex. Ensemble) 단계에서 이 FP32 모델을 사용.

3. Semi-Supervised Learning (SSL)
라벨링된 대규모 이미지 데이터셋을 만드는 작업은 많은 비용과 시간이 필요하며 전문적인 지식이 요구된다. 이러한 문제를 해결하기 위해 SSL은 일부 라벨이 있는 데이터와 많은 양의 라벨이 없는 데이터를 결합하여 학습하는 방법을 사용한다.

 

Pseudo Labeling

  1. 라벨이 있는 데이터로 모델을 학습한다 (일반적인 지도 학습 방식).
  2. 학습한 모델을 사용해 라벨이 없는 데이터를 예측한다.
  3. 예측 결과 중 신뢰도(예: 확률 값이 일정 임계값 이상)가 높은 결과를 선택하여 pseudo label 데이터를 만든다.
  4. 원본 데이터와 pseudo label 데이터를 함께 사용해 새로운 모델을 학습한다.

초기 모델의 중요성

  • 초기 모델의 성능이 낮으면 잘못된 라벨이 학습에 사용될 수 있기 때문에, 일정 수준 이상의 성능을 보장하는 초기 모델이 필요하다.

Class Imbalance

  • Pseudo labeling 과정에서 특정 클래스에 대한 예측이 많아지지 않도록 주의하며, 불균형을 통제할 수 있는 샘플링 방법을 적용한다.

Validation Set 고정

  • 검증 데이터는 pseudo labeling 과정에 포함시키지 않고 모델의 성능 평가에만 사용한다.

신뢰도 기준 설정

  • 신뢰도가 낮은 결과는 노이즈로 작용하기 때문에, 모델의 예측 결과 중 신뢰도가 높은 결과만 pseudo label로 사용한다.

Image Generation

  • 학습에 활용할 추가 데이터를 확보하기 위해 이미지를 생성한다.
  • 텍스트-이미지 또는 이미지-이미지에 특화된 생성 모델을 사용하여 이미지를 생성하며, 생성된 이미지의 신뢰도를 평가할 기준이 필요하다.

생성 이미지 신뢰도 측정

  • 생성된 이미지가 의도한 정보를 포함하는지 측정한다. 예를 들어, CLIP 모델을 활용해 생성된 이미지가 특정 표현(텍스트)을 포함하는지 측정하고 필터링할 수 있다.

Bengali.AI Handwritten Grapheme Classification 대회 1등 솔루션

  • CycleGAN을 활용해 unseen 클래스의 zero-shot 학습을 진행했다.
  • 합성 데이터를 이용해 폰트 분류기를 학습하고, CycleGAN을 통해 손으로 쓴 합성 이미지를 생성했다.
  • 다양한 폰트로 학습된 모델을 앙상블하여 최종 성능을 높였다.

데이터 파이프라인의 중요성

  • 데이터 파이프라인을 잘 이해할수록 학습 프로세스의 효율이 상승한다.
  • 앞으로 다양한 형태의 학습 프로세스가 등장할 수 있으며, 예를 들어 데이터가 로컬이 아닌 네트워크 상에 있을 경우도 대비해야 한다.
  • 어노테이션이 부족한 데이터셋을 활용하는 전략을 마련하는 것이 중요하다.

 

+ num_workers 

728x90