23년 이전 글/Kaggle

캐글로 알게 된 10가지

스터디로 알게 된 것

Hugging face Datasets 라이브러리

  • dictionary 형식으로 dataset을 만드는 구조로 tensorflow와 pytorch형 dataset으로 자유롭게 형식을 변경할 수 있으며 필요시 Dataset 또한 편리하게 받을 수 있다. trainer와도 훈련이 가능하다

 

모델이 편향적이지 않게 기본적으로 K-fold를 사용한다

  • 대부분 대회에서 seed를 고정하여 5fold를 적용하며 각각의 모델을 저장한다

 

Tensorflow로 Huggingface의 pretrained 모델을 불러와서 훈련을 시킬 때 gradient가 존재하지 않는다는 Warning이 뜨는데 실제 훈련 및 추론에선 정상 작동한다!

 

 

데이터 증강은 시도해볼만하지만 성능의 향상을 보장하진 않는다. backtranslation을 통해 2배의 데이터를 준비했지만 성능은 오히려 감소하였다. 데이터 증강으로 인해 노이즈가 더 강해진 듯 보였다

  • 여기서 노이즈란 문단을 나누는 “\n” 또는 에세이에 존재했던 특이문자”x\”등의 바이트 단어들이다
  • backtranslation을 할때 “\n”은 2개의 번역 모델을 거치면서 사라졌고, 특이문자들 또한 영향을 받았을 가능성이 있어보였다
  • backtranslation에 쓰인 모델은 facebook의 pretrained M2M100 모델로 독일어로 변경했다가 영어로 변경하는 backtranslation이었다
  • 너무 오래걸려서 중간에 google의 translation을 selenium으로 활용하여 사용하려 했으나 이 또한 시간 걸림 + 에러 발생으로 결국 local 피시로 직접 번역하였다

 

Colab과 TPU

  • Colab에서 GPU를 사용하였으나 p100 한대만으론 학습이 오래걸렸다
  • TPU는 8개를 제공하며, 병렬 연결 시 특히 가속화가 빠름을 확인하고 학습하였다
  • 대체로 GPU 기반으로 학습한 모델은 TPU 연산이 불가했으며, TPU로 학습한 모델은 TPU 학습이 가능하였다(Longformer는 불가, Roberta는 가능, Funnel-Transformer는 가능)
  • TPU를 위한 분산 방법, 그리고 이를 효율적으로 하기 위해서는 tensorflow의 data api에 대한 이해도가 필요했다

 

tensorflow.data API

  • tensorflow의 data api로 데이터셋에 대한 전반적인 내용을 담고 있다
  • from_tensor_slice로 간단하게 데이터셋 형태로 바꿀 수 있으며 바꾼 이후 map 메서드를 통해 전처리를 빠르고 쉽게 처리할 수 있으며, 이후 batch,shuffle,prefetch등을 통해 모델에 input을 할 수 있다, 특히 분산처리를 할때에는 distributed 기능을 활용해서 빠르게 활용할 수 있다
  • RAM의 부족함을 절실히 깨달은 Kaggle로 tf.Record api에 대해서는 추후 공부해 나가야 할 부분이다

 

Huggingface Transformer modeling

  • Huggingface Transformer의 Automodel을 사용하면 Head 없이 pretrained된 모델만 받을 수 있으며, 이를 통해 Input의 형태를 바꿔볼 수 있음(이 효과로 점수 향상을 위한 고민은 더 필요)
  • Tensorflow의 모델로 받아 input과 output을 조절하면 다양한 형태의 시도를 해볼 수 있다
  • task에 맞는 pretrained 모델을 찾고 Downstream task에 많은 시도를 느낄 수 있게 되었다
  • feature extraction을 통해 해당 모델이 문장이나 단어를 어떻게 이해하는지 알아볼 수 있고 이는 필요한 task를 하기에 적합한지 확인하는 용도로 사용할 수 있을 것이다

 

wandb

  • 여러 훈련과 테스트를 하게 되면서 이를 기록할 방법이 필요했고 wandb를 시도해보게 되었다
  • 다양한 내용이 시각화 되고 기록 되기 때문에 편리하게 체크할 수 있었다

 

데이터 타입

  • 큰 모델을 사용하게 되면서 제한된 메모리 공간안에 의미있는 batch size로 돌릴 방법이 필요했고 이 과정에서 tf.keras.mixed_precision.set_global_policy(’mixed_bfloat16’), tf.config.optimizer.set_experimental_options(”auto_mixed_precision”:True)를 사용하여 batch_size를 늘리고 성능의 향상을 보았다 gpu는 float16, TPU는 bfloat16을 사용할 수 있다

 

deepspeed

  • discussion에서 나온 새로운 SOTA 모델인 deberta의 큰 모델을 훈련시키기 위해 microsoft사의 deepspeed 라이브러리를 활용
  • stage3를 사용하면 CPU, 또는 NVMe Memory를 사용할 수 있어 큰 모델의 훈련이 가능하였다. 단 속도가 느려지고 , pytorch 또는 trainer를 사용해야했다
  • 코랩의 제한된 GPU와 느린 epoch로 의미있는 학습과 추론까지의 과정을 끝내지 못한 점이 아쉬운 점

 

PostProcessing

  • 데이터가 imbalance한 상태에서 다들 basecode에 postprocessing을 적용했는데 적절한 수치적용과 코드에 대해서는 이해도가 부족해서 더 공부가 필요

 

그랜드마스터들의 노력

지식도 지식이지만 노력과 기록의 시도들이 무엇보다 본받을 만한 점 같았다

위에 나온 표를 비롯하여 10개 이상에 task에 적합한 모델을 찾기 위해 노력하고 훈련을 통해 검증해 나가는 모습을 보여주었는데 앞으로 task를 대할 때 가능하면 10가지 정도의 모델 시도는 해봐야겠다는 생각

반응형