Colab에서 TPU로 BERT 처음부터 학습시키기 - Tensorflow/Google ver.

2018년말부터 현재까지 NLP 연구에서 BERT는 여전히 압도적인 위치를 차지하고 있다.

한편, BERT모델을 사용하는 이유 중 가장 큰 것 하나가 바로 한국어로 Pretrained된 모델이 있다는 점이다. Google에서 논문을 처음 공개했을 때 Multilingual pretrained model을 공개해 Fine-tuning만으로도 우리가 필요한 데이터셋에 맞춰 분류기를 만드는 등의 여러 응용이 가능하고, 동시에 높은 성능을 보여주었기 때문에 BERT 자체를 학습시키는 것에 대해서는 크게 신경쓰지 않은 것이 사실이다.

한편 작년 ETRI의 한국어 BERT 언어모델, 그리고 SKTBrain의 KoBERT 등 한국어 데이터셋으로 학습시킨 모델들이 등장했고, 이런 모델들을 Fine-tuning할 경우 기존 구글의 다국어 모델을 사용한 것보다 성능이 조금이라도 더 잘 나오기도 한다. (특히 정제되지 않은 글에 대해 좀 더 나은 성능을 보여줬다. OOV문제가 덜한 편이었다.)

다만 이런 모델들 역시 굉장히 ‘보편적’ 글로 학습된 것이라 도메인 특화된 분야에 있어서는 성능이 잘 나오지 않을 수도 있다. 따라서 특수한 경우의 특수한 도메인에 최적화된 Pretrained model을 만든다면 우리의 NLP 모델도 좀 더 성능이 좋아질 수 있다!

이번 글에서는 BERT 모델을 TPU와 Tensorflow를 이용해 처음부터 학습시켜보는 과정을 다뤄본다.

이번 글은 Colab Notebook: Pre-training BERT from scratch with cloud TPU를 기반으로 작성되었습니다.

Colab에서 PyTorch 모델 TPU로 학습하기

딥러닝 모델을 학습시키다 보면 항상 vram의 압박에 시달리게 된다. 특히 최근 막대한 크기의 모델들이 등장해 이런 압박은 더 심해지기도 한다.

한편, 일반 사용자용 그래픽 카드 중 최상위인 Nvidia 2080ti조차도 vram이 겨우 11GB밖에 되지 않아 거대한 모델을 Fine-tuning 하는 것조차 굉장히 작은 배치사이즈로 학습시켜야 한다.

Google Colab에서 제공하는 TPU는 tpu v3-8 모델로 총 128GB의 메모리를 가지고 있어, 상대적으로 큰 모델과 배치사이즈를 이용해 학습할 수 있다. (tpu v3 하나는 16GB의 HBM 메모리를 가지고 있고, tpu v3-8은 8개의 코어로 총 128GB의 메모리를 가진다.)

PyTorch에서는 Pytorch/XLA 프로젝트를 통해 PyTorch에서도 TPU를 통한 학습을 할 수 있도록 컴파일러를 제공하고 있고, colab에 해당 패키지를 설치하면 TPU를 곧바로 사용할 수 있다.

NOTE: 이번 글은 아래 공식 튜토리얼의 내용을 따라갑니다.

공식 Tutorial: PyTorch on Cloud TPUs: Single Core Training AlexNet on Fashion MNIST

(단 내용의 100%를 담는 대신, 기존 PyTorch와 동일한 부분은 제외함)

AWS SSM로 VPN없이 Private 자원 접근하기

AWS EC2 혹은 RDS를 사용할때 가장 편리한 방법은 EIP를 부여받아 고정 IP를 할당한 뒤 직접 SSH등으로 접속해 제어하는 방법이다. 하지만 이러한 방법은 보안상 취약하기 때문에 DB등 중요한 데이터가 들어있는 자원은 외부 IP를 부여하지 않고 사용하게 된다.

하지만 이렇게 될 경우, “VPC 내부에서만 액세스 가능하다”는 문제가 생긴다. 즉, AWS의 같은 VPC, 같은 내부 IP를 받은 자원에서만 접근이 가능하다는 점이다.

공개 ip가 부여되지 않기 때문에 인터넷에서 직접적으로 요청을 받는 것이 불가능하다.

이를 해결하기 위해서는..

  1. ❌ AWS에 VPN 서버를 세팅하고 VPN에 연결해 작업한다.
    👉 VPN 서버를 따로 관리해야하는 어려움이 있다.

  2. ❌ AWS Client VPN 서비스(AWS Managed)를 사용한다.
    👉 요금이 비싸다. (최소 월 $70+)

  3. 🤩 AWS SSM + Bastion EC2 + SSH 터널링을 이용한다.
    👉 이번 글에서 다루는 내용! EC2 비용 하나로 서버 세팅 없이 간단히 접속하기

이번 글에서는 3번 방법을 이용해 SSM으로 SSH를 대체하고, SSM 연결을 SSH 세션처럼 이용해 SSH 터널링을 이용해 내부 RDS에 접근하는 과정을 다뤄본다.

데이터 분석 파이프라인 풀세트, HopsWorks 설치기

성윤님의 블로그에서 Machine Learning의 Feature Store란? 글을 보고서 hopsworks 라는 제품에 관심을 갖게 되었다.

과연 어떤 기능을 갖고 있는 것일까? 내가 생각하는 것 처럼 데이터 버저닝부터 모델링 버전까지 모두 관리해주는 좋은 ‘실험실’을 구축해줄 수 있는 것일까? 라는 호기심에 설치를 시도해보었다.

Pandas에서 Parquet 사용하기 with Snappy/Gzip

Pandas나 PySpark등을 사용하다보면 *.csv 포맷으로는 만족하지 못하는 경우가 많다.

예를들어..

  • Data Type이 저장되지 않는다.

  • 너무 많은 데이터는 저장해도 CSV의 이점(엑셀로 열어볼 수 있다)을 살리지 못한다.

  • 특정 Column만 선택하는 것이 불가능하다. (= 전체 파일을 항상 모두 열어야 한다)

  • 용량이 상대적으로 작지만 크다 (압축을 하지 않은 경우)

  • (종종) Escaping이 잘 되지 않은 경우에는 파일 Parsing이 깨진다.

  • 한글이 들어간 csv의 경우 “MS Excel”에서는 BOM이 없으면 UTF-8을 제대로 인식하지 못한다. (한편, euc-kr 인코딩은 잘 읽는다.)

등등.. 여러가지 이슈가 있다.

그렇다면, 어떤 형식을 써야 할까?

NLP 튜토리얼: 라벨링 없이 트위터 유저들을 자동으로 나누어보기

트위터에는 굉장히 다양한 유저들이 있다.

그리고 트위터 유저들은 “BIO”라고 부르는 자기소개 페이지에 자신에 대한 정보를 적어둔다.

Github 트위터 공식 계정

위 스크린샷과 같이, 자신의 계정이 어떤 계정인지를 간단한 160자 내로 드러내는 것이 바로 BIO다.

그렇다면, 이런 계정들이 ‘어떤’ 계정인지 BIO를 이용해 분류해 볼 수 있지 않을까?

하지만 모든 유저를 우리가 손으로 라벨을 붙여 학습시키는 것은 힘들다.

그렇다면 알아서 분류하려면 어떻게 해야할까?

간단한 자연어 처리를 통해 라벨링 없이 유저를 클러스터링해보자.

🌟 바로바로 실행하면서 따라올 수 있는 Google Colab 👨🏻‍💻👩🏻‍💻👇

https://colab.research.google.com/drive/1bgv3CHZDp2smIWXQwAUD3j5z8LAYbLVz

2019년 회고, 2년치 연말정산

2018년에는 회고를 쓰지 않았다.

정확히 말하면.. 회고를 쓰기에 너무 많은 일이 있었기 때문이 아니었을까.

2019년의 회고글이지만, 2018년과 19년은 마치 1년처럼 끊김없이 이어진 기분이었다.

그래서 이번 회고는 2019년 회고이지만 2018년도 함께 정리해보려 한다.

👨🏻‍💻👩🏻‍💻 (대략 열심히 타이핑 중이라는 뜻)

트위터에서 많은 팔로워를 크롤링하는 방법 [3]: 1초에 5천개 데이터 가져오기

앞서 쓴 글(2편)에서는 Twint와 직접 만든 크롤러를 이용해 데이터를 수집하는 내용을 정리했다. 하지만 여전히 큰 문제가 남아있었다.

“1만명까지는 어떻게든 모을 수 있다. 그런데 10만 이상의 팔로워/팔로잉을 가진 유저의 데이터는 대체 어떻게 가져와야 하나?”

여기서는 몇 가지의 이슈가 충돌했다.

  1. “여러 계정을 한번에 가져와야 한다.”: 수집해야하는 계정이 여전히 1k+개.
  2. “15분 이상의 긴 수집 시간이 필요하다.”: Lambda에서는 어렵다.
  3. “한 IP에서 너무 많은 요청을 하면 안된다.”: 한 IP에서 너무 많은 요청을 하면 걸릴 수 있다.
  4. “HTML 웹 크롤링은 간혹 일부만 수집후 종료되더라.”: 트위터에서 간혹 팔로잉/팔로워를 모두 수집하지 않았음에도 (5만명중 1만명만 수집 등) 이후 Cursor를 제공하지 않아 크롤링이 정지되는 경우가 있었다.

그러다, 이 이슈를 한번에 해결할 수 있는 방법(꼼수)를 찾게 되었다.

트위터에서 많은 팔로워를 크롤링하는 방법 [2]: HTML 웹 크롤링을 해보자

앞서 쓴 글(1편)에서는 몇가지 조건들과 나쁜 상황을 걸어 단순한 수집이 아니라 뭔가 꼼수가 필요한 상황을 가정해 보았다.

API를 유료로 못쓴다? ➡️ 못쓸정도로 느리다! 😨

따라서 다른 방법인 직접 데이터 크롤링이 필요했고, 이번에는 Twint와 HTML 웹 크롤링을 통해서 수집을 해 본 과정을 적어보았다.

트위터에서 많은 팔로워를 크롤링하는 방법 [1]: 어떤 점들을 고려해야 할까?

트위터에는 수많은 유저가 있다. 그 중에서는 단 1명의 팔로워도 모으지 못한 유저도 있지만 반대로 수백 수천만명의 팔로워를 가진 유저도 있다.

Twitter의 트위터 공식 계정에는 약 5천6백만명의 팔로워가 있다.

당장 우리가 ‘팔로워’ 를 클릭해 내용을 살펴보면 한번에 20명씩 정보를 보여준다. 스크롤을 해서 5천만명의 유저 데이터를 가져올 수는 없다.

그렇다면 어떤 방법을 써야 저 데이터를 가져올 수 있을까?

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×