2022년 1월 6일 목요일

Pycharm delete, reinstall on remote server - 원격 서버에서 파이참 재설치

 

원격 서버에서 Pycharm을 쓸 때, 이상하게 잘 안 될 때가 있어서 재설치 하는 방법을 찾아봤다.

참고 사이트 : https://www.jetbrains.com/help/pycharm/uninstall.html#standalone


Pycharm은 원격 서버에 있는 자기 자신의 home 디렉토리에 깔리는 거 같다.

내 경우 ~/.cache/JetBrains/RemoteDev/dist/


사이트에는 설치된 디렉토리랑 아래의 디렉토리를 지우라고 하는데

~/.config/JetBrains/<product><version>

~/.cache/JetBrains/<product><version>

~/.local/share/JetBrains/<product><version>

JetBrains 하위 디렉토리 구조가 정확히 위의 형태를 띄고 있지는 않았다.


그래도 설치된 디렉토리랑 겹치는 부분이 있으니 그냥

~/.config/JetBrains, ~/.cache/JetBrains, ~/.local/share/JetBrains/ 를 다 지우고 다시 접속하니 다시 새로 설치하는 것 같다.




2021년 6월 17일 목요일

Naver LarVa 발표자료 정리

 예전부터 보려고 했던 네이버 LarVa Project 발표자료를 읽고 정리해본다.


1. 실시간 평가

비싸고 오래 걸리는 Language Model을 잘 학습하기 위해,

학습이 진행될 때마다 평가 데이터셋으로 평가하여 학습 상황 모니터링한다.


2. Dynamic input generation

기존 bert의 static file 방식과 달리 이 방식을 쓸 경우, 

  • 저장 공간을 줄일 수 있고,
  • Training 중간에 sequence length, masking 개수, 방식 등을 동적으로 변경할 수 있다.
이 때, file reader가 코퍼스를 분할 저장한 파일들을 읽어 Queue에 학습 인스턴스를 넣고, data reader가 큐에서 인스턴스를 읽어와 모델 input으로 사용하였다.


3. Half precision training

FP16으로 학습하였다. 이 때 성능의 저하는 없이 배치 사이즈를 키우고, 학습 시간이 빨라지며 모델 크기도 줄어들었다.


4. Hyper parameters

Batch size는 클 수록 좋다. 하지만 개인, 소규모 회사가 구현하기는 힘들다. TPU pod를 쓰던지

모델 사이즈도 클 수록 좋다...

Char vs subword 는 char 단위가 감정분석에서 조금 좋고 다른 분야에서는 비슷하다.

Cased vs Uncased(자모 분해됨). 대체로 성능은 비슷하나, 자모 분해로 Token 수가 늘어나 기계독해 성능 하락 Cased 우세, 감정분석 Task에서는 Uncased이 약간 우세 라고 하는데, 한글을 lower casing 하면 자모로 분해되나?

Vocab은 32k보다 64k가 좋다.

BERT vs RoBERTa:

그래도 최고점은 RoBERTa가 높은 듯.


5.Masking strategy



6. Fine-tuning

Multi-task learning(모든 task를 한 번에 학습)


그 외  service에 적용한(하려는) 아이디어들은 생략.

2021년 6월 16일 수요일

BPE(Bytepair encoding), Wordpiece, Sentencepiece 정리

 

최근의 NLP 논문과 여러 자료들을 읽다보면, Bytepair encoding, Wordpiece, Sentencepiece 등의 여러가지 용어가 나온다. 그리고, Bytepair encoding을 character 단위로 했는지, byte 단위로 했는지도 다르다. 대충 비슷한거 같은 용어들이 어떻게 다른지 정리해보려고 한다.



1. Bytepair encoding

기본적인 원리가 딥 러닝을 이용한 자연어처리 입문 위키독스 에 잘 설명되어 있다.

원래 압축 알고리즘으로 쓰이던 bytepair encoding을 자연어 처리 분야에 적용하여 vocabulary를 만드는 데 쓰였다. 이를 처음 적용한 논문은 sennrich의 번역 논문이다. BPE 알고리즘을 쓴 대표적인 논문이 GPT이다.


GPT 논문에서는 unicode 단위가 아닌 byte 단위 BPE를 사용했다고 한다. RoBERTa 논문에 따르면 그 이유는 유니코드 하나하나를 독립적인 단위로 취급하면 유니코드들이 vocabulary의 상당 부분을 차지하기 때문(unicode characters can account for a sizeable portion of this vocabulary when modeling large and diverse corpora, such as the ones considered in this work.)이라고 한다. 유니코드 캐릭터 중에는 복수의 byte로 이루어진 캐릭터들이 많기 때문에 byte단위로 subword를 구성할 경우 같은 byte sequence를 공유하는 unicode들끼리는 묶일 수가 있다. 

스택오버플로 문답 참고


2. Wordpiece model

구글에서 BERT 모델을 학습할 때 쓴 subword 모델이다. BERT에서는 구글이 번역 시스템에서 만들었던 embedding을 가져온 것으로 보인다. 이 시스템에 쓰인 알고리즘인 wordpiece model은 BPE와 거의 비슷하다고 언급되어 있으며, 구글의 음성 인식 연구에서 처음 제안되었다. 

Bytepair encoding이 count만을 이용하여 가장 많이 등장하는 character pair를 합쳤다면, wordpiece model은 likelihood를 기준으로 character pair를 합쳐나갔다. 학습 데이터에 대한 likelihood를 최대화하는 character pair를 합쳐나가는 것인데, huggingface tokenizer 에 간단한 예시와 설명이 있다. 옮겨 적어보면, "a"와 "b"를 합치려면 "ab"가 character pair 중 가장 많이 등장하는 것이 아닌, P("ab") / P("a")P("b") 값이 가장 커야 한다 - P("a")는 데이터에서 "a"가 등장하는 빈도이다.


3. Sentencepiece

구글이 만든 tokenizer 라이브러리이다. 가장 큰 특징은 모든 언어를 다 다루기 위해 띄어쓰기까지 하나의 문자로 취급하여 tokenize한다는 것이다. 깃헙을 보면 알 수 있듯이, tokenize하는 여러 방법이 있으며, subword 단위 tokenizer인 BPE, unigram lanugage model과 character 단위, word 단위 tokenizer를 지원한다. 추가적으로 subword regularization도 지원한다. 이름을 보면 햇갈릴 수 있는데, wordpiece 알고리즘을 지원하지는 않는다.


정리 끄읕!

2021년 4월 19일 월요일

Tensorflow 2.0 모델 저장, 불러오기

 Tensorflow 2.x에서 모델을 저장하고 불러오기 위한 코드입니다.

*.pb 파일을 불러오는 예제입니다.



import tensorflow as tf

pb_path = 'PATH TO DIR CONTAINING PB FILE'
model = tf.saved_model.load(pb_path)

tf.saved_model.save(model, "PATH TO SAVE MODEL")


2021년 4월 5일 월요일

Python pyrouge 패키지 설치

 

Summarization task를 돌리다 보면 pyrouge 패키지를 이용하는 것을 볼 수 있다.

그런데, 단순히 pip install pyrouge 하면 끝나는 게 아니라, 추가적인 설정이 필요하다.

일단, pyrouge 프로젝트의 github의 README를 보면 다음과 같다.



'pip install pyrouge'를 실행하면 여러 binary 실행 파일도 같이 설치되며, 그 중 하나가 pyrouge_set_rouge_path'이다.

인자로 '/absolute/path/to/ROUGE-1.5.5/directory'를 설정해야 하는데, 여기서 말하는 ROUGE-1.5.5는 https://github.com/andersjo/pyrouge의 './tools/ROUGE-1.5.5/'를 의미한다.

프로젝트를 다운받고, 경로를 설정해 준다.


그러면, 'python -m pyrouge.test'가 성공하는 것처럼 나오는데, 실제 실행할 경우 'Cannot open exception db file for reading: ~/Projects_PATH/rouge/tools/ROUGE-1.5.5/data/WordNet-2.0.exc.db' 이런 메세지가 나왔다.

한동안 해결을 못하고 있다가, 다른 Summarization repo를 보다가 해결책이 보였다.


아마도 이미 있는 파일의 버전이 잘못되어 있는 것 같다.

위의 명령어를 실행해 WordNet-2.0.exc.db 파일을 다시 만들어주면 test가 완료된다.


2021년 4월 1일 목요일

Kubeflow(minikube)를 사용하여 모델 serving 하기


Kubeflow를 활용한 MLOps에 대해 공부를 시작하면서 알게 된 내용들을 기록한다.

Cloud 상이 아닌 로컬(on-premise) 환경에서 테스트했다.

 

Minikube 설치

  • Kubeflow 설치 안내 페이지에 가보면 kubeflow를 설치할 수 있는 여러 선택지가 있는데, 처음에는 Microk8s를 설치해 예제를 실행해보니 잘 안 되는 게 많았다.
  • 그 후에, Minikube를 설치해보니 훨씬 에러가 적어 minikube로 진행하게 됐다.
  • 리눅스 상에서 설치했고, 설치는 이곳을 보고 그대로 따라하면 어렵지 않다.
    • kubectl 버전은 1.15 -> 1.20로 변경했다.
    • Minikube start 시, cpu 8개, 12G 메모리를 사용했다.
    • kubeflow를 deploy할 때, 경로를 자신의 환경에 맞게 설정한다.
  • Prerequisites에 나와 있듯이 최소 8코어, 16G 메모리, 상당한 디스크 용량이 필요하며, cpu와 메모리가 부족할 시, 여러 컴포넌트들이 실행이 안되는 등 여러 문제가 생길 수 있다.

InferenceService 실행

  • 이제 모델 serving을 위한 컴포넌트를 실행해보겠다.
  • kfserving 깃허브의 예제를 따라했다. (0.4.1 버전임을 유의)
  • 'tensorflow.yaml' 파일을 실행한다.
tensorflow.yaml :
apiVersion: "serving.kubeflow.org/v1alpha2"
kind: "InferenceService"
metadata:
  name: "flowers-sample"
spec:
  default:
    predictor:
      tensorflow:
        storageUri: "gs://kfserving-samples/models/tensorflow/flowers"

  • metadata.name은 이 instance의 이름을 의미한다.
  • spec.default.predictor.tensorflow.storageUri는 모델 파일(.pb파일)이 저장되어 있는 위치를 의미하는 것 같다.
  • 실행 명령 :

kubectl apply -f tensorflow.yaml

inferenceservice.serving.kubeflow.org/flowers-sample created

  • 정상적으로 배포되다면 아래처럼 READY가 True로 되어 있는 것을 볼 수 있다.
kubectl get inferenceservice flowers-sample

NAME                URL                                              READY   DEFAULT TRAFFIC   CANARY TRAFFIC   AGE
flowers-sample   http://flowers-sample.default.example.com   True    100                                9m

  • default는 namespace를 뜻한다.


테스트

  • kfserving의 README를 참고했을 때 DNS가 없는 경우, HOST header와 INGRESS_HOST, INGRESS_PORT로 모델을 호출할 수 있다.
  • 모델을 호출하기 위한 엔드포인트는 로컬 환경 기준으로 NodePort로 되어 있고, external-ip는 <none>인 상태이다.
kubectl get -n istio-system svc/istio-ingressgateway

NAME                   TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                                                                                                                                      AGE
istio-ingressgateway   NodePort   10.104.40.48   <none>        15020:32026/TCP,80:31380/TCP...   129m
  • 페이지에서 좀 더 위로 가보면 INGRESS_HOST, PORT를 아래와 같이 얻을 수있다.
# Minikube
export INGRESS_HOST=$(minikube ip)

export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')초
  • 최종적으로 input.json 파일을 이용하여 아래 명령을 실행하면 모델을 호출하여 결과를 확인해볼 수 있다.
CLUSTER_IP=$(kubectl -n istio-system get service flowers-sample -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
curl -v -H "Host: ${SERVICE_HOSTNAME}" http://${INGRESS_HOST}:${INGRESS_PORT}/v1/models/flowers-sample:predict -d @./input.json'


*   Trying 192.168.49.2...
* TCP_NODELAY set
* Connected to 192.168.49.2 (192.168.49.2) port 31380 (#0)
> POST /v1/models/flowers-sample:predict HTTP/1.1
> Host: flowers-sample.default.example.com
> User-Agent: curl/7.58.0
> Accept: */*
> Content-Length: 16193
> Content-Type: application/x-www-form-urlencoded
> Expect: 100-continue
> 
< HTTP/1.1 100 Continue
* We are completely uploaded and fine
< HTTP/1.1 200 OK
< content-length: 220
< content-type: application/json
< date: Thu, 01 Apr 2021 07:33:01 GMT
< x-envoy-upstream-service-time: 1457
< server: istio-envoy
< 
{
    "predictions": [
        {
            "prediction": 0,
            "key": "   1",
            "scores": [0.999114931, 9.2098875e-05, 0.000136786475, 0.00033725836, 0.000300533167, 1.84814126e-05]
        }
    ]
* Connection #0 to host 192.168.49.2 left intact
}


참고 사이트 :

  • https://mokpolar.github.io/kfserving_custum_inference/

2021년 3월 2일 화요일

논문 리뷰 - Universal Sentence Encoder


 

논문 정보 : 


요약 : 

  • Transformer layer를 이용한 초기 pre-trained 모델
  • Sentence embedding vector를 생성하는 것이 목표
  • Sentence 단위로 transfer learning한 모델이 word 단위로 한 것보다 더 좋다.

모델 - Encoders :

  • 학습 방법 
    • Multi task로 학습했다.
    • Sentence vector는 word 단위 vector를 평균 내어 구했다.
    1. Skip-thought like task
      • 이게 뭔지 몰라서 참조 논문(링크)을 찾아봤다.
      • 간단히 설명하자면, 문장이 3개 있을 때, encoder로 가운데 문장의 vector를 얻고, 두 개의 다른 decoder가 encoder의 vector를 이용해 앞, 뒤 문장의 language modeling을 수행하는 방식이다.
      • Skip-thought 모델 학습 구조


      • Loss는 decoder의 output을 이용하며, 학습이 끝나면 encoder만 사용한다.
      • 원 논문에서는 RNN을 썼으며, 이 논문에서는 transformer를 썼다.
      • 데이터는 Wikipedia, web news를 쓴 것 같다.
    2. Conversational response prediction task
      • 역시 참조 논문(링크)이 필요했다.
      • (대충 봤는데...) siamese network처럼 질문-응답 쌍을 각각 동일한 encoder를 통해 vector representation을 얻은 다음, 맞은 응답이 나올 score를 높이는 방향으로 학습했다.
      • 후속 연구(링크)에 있는 모델 구조


    3. Supervised classification task
      • SNLI로 supervised 학습했다.
      • 후속 연구(링크)에 있는 모델 구조


  • 모델 구조
    1. Transformer layer
    2. Deep Averaging network(DAN)
      • Layer 형태는 feedforward network이다.
      • Input으로 word, bi-gram embedding을 평균내어 사용한다.
    • Input 형태
      • 일단 문장을 PTB style로 tokenize 했다는 것을 보면 word 단위인 것 같다.
      • Vocab에 대한 내용은 없다...
      • System demonstration 논문(링크)에는, oov의 경우, 400,000개의 임베딩으로 hashing한다고 되어 있다.
      • DAN에서는 word embedding과 bi-gram embedding을 같이 썼다고 한다.

Evaluation :

  • 이렇게 사전 학습한 모델로, 다른 여러 task들에 대한 성능을 측정하였다.
  • 학습한 encoder의 output은 각 task에 맞는 layer에 입력으로 사용됐다.
  • Pairwise semantic similarity task의 경우, 두 문장의 벡터 u, v가 있을 때 similarity를 다음과 같이 계산했다.

  • Arccos는 cosine similarity를 삼각부등식을 만족하는 angular distance로 변환하는데, cosine similarity보다 더 좋았다고 한다.
  • 여러 방법으로 실험해 봤으며, 잘 됐다...

  • USE_D는 DAN으로 pre-training한 모델이며, USE_T는 Transformer로 pre-training한 모델이다.
  • Sentence 단위로 transfer learning한 모델이 가장 좋았고 sentence + word로 transfer한 모델이 가장 좋았다.
  • Transformer 모델의 성능이 더 좋았다.


이하 다른 내용들은 생략...

참고 사이트