스터디로 알게 된 것
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가지 정도의 모델 시도는 해봐야겠다는 생각
반응형
'23년 이전 글 > Kaggle' 카테고리의 다른 글
NBME Score Clinical Patient Notes 솔루션 분석해보기 -Medical NLP (0) | 2023.01.26 |
---|---|
캐글 대회간 참조할 링크 (0) | 2022.01.18 |
[upstage] 캐글 그랜드 마스터 발표 정리 (0) | 2022.01.16 |