반응형
스켈터랩스에서의 인턴 생활에 대한 글은
지난 글(링크)을 마지막으로 끝내려고 했는데,
한 가지 더 쓰고 싶은 것이 생겨 작성해놓으려고 한다.
글 제목처럼 스켈터랩스에서 인턴을 하며 배웠던
IT 혹은 실무에서의 기초 지식들에 대해 분류나 순서 없이 나열했다.
멘토님이 알려주신 지식 내용이나
내가 업무를 하며 알게 되었던 지식들을 메모장에 마구마구 적어두었던 것들이다.
언젠가는 하나씩 자세히 파고들어서 블로그에 포스팅하는 것도 괜찮을 것 같다.
- Vim에 관한 블로그
- 일본어 텍스트 파일 인코딩 방식
- utf-8, euc-jp, shift-jis2 등 존재
- chardetect를 이용하여 파일의 인코딩 방식 알 수 있음
- 혹은 file -I input.txt로 알 수 있음
- iconv -f from -t to input.txt > output.txt
- iconv를 이용하여 input file의 encoding을 변환시킬 수 있다.
- binary로 쓰인 csv 파일은 cat으로 읽는 것이 좋다.
- 조금 더 연구해보면 좋을 것 같다.
- OKR(Objectives and Key Results)
- 스켈터랩스에서는 매 분기마다 OKR을 정한다.
- Jira, Confluence에 대한 설명
- du -sh *
- -s : 지정된 디렉터리 내에 존재하는 모든 파일 및 서브 디렉터리들의 용량을 합쳐서 표시
- -h : 표시되는 용량 단위를 사용자가 읽기 쉬운 형태로 표현
- * : 모든 파일 표시
- cat /home/test/aaa | wc -l
- 총 line number를 알 수 있음
- cat /home/test/aaa | wc -w
- 총 word number를 알 수 있음
- Doc string
- Python의 문법 요소 중 하나이다.
- Class 나 함수 선언 바로 밑에 주석 """를 사용하여 작성한다.
- 해당 class나 함수에 대한 설명을 작성하면 된다.
- ipython 실행 후, doc string에 대해 알아보고 싶은 파이썬 스크립트를 import test.py 와 같이 실행한다.
- 그 후, help() 커맨드로 doc string을 알 수 있다.
- ex) help(run_classifier) / help(run_classifier.LivedoorProcessor)
- Google Coding Style Guide (https://google.github.io/styleguide/)
- Class
- 이름은 Camelcase로 띄어쓰기 없이 작성한다.
- 함수
- 이름은 띄어쓰기를 “_”로 대체하고 소문자만 사용한다.
- “_” 로 시작하는 함수는 웬만하면 해당 클래스 / 함수 안에서만 쓰라는 뜻이다.
- Module 정렬 순서
- Built-in module
- (빈 줄)
- pip install 이 필요하거나 third-party 에 있는 module
- (빈 줄)
- Codebase 에서 import 하는 module
- Class
- yapf, pylint
- yapf는 띄어쓰기 같은 formating을 관리한다.
- pylint로 Coding guide를 관리한다.
- lint 란 코딩 가이드를 관리하는 행위이고,
- linter는 그러한 툴을 말한다.
- ./init-repo.sh
- 위와 같은 쉘 스크립트 파일을 실행하면서 해당 프로그램에 요구되는 라이브러리, 패키지 등 오류를 해결해나가면서 환경설정을 할 수 있다.
- git review
- REPLY를 보낼 때, 보통 PTAL(Please Take Another Look)을 보통 보낸다.
- Coupling(커플링)
- 두 기능이 서로 연관이 있거나 맞물려 있을 때를 말한다.
- ex) Tightly Coupling, Loosely Coupling
- 되도록 커플링이 없는 코드를 만드는 것이 좋다
- Closure 함수
- ————————————- def nanutsem(y): return nanutsem
- ————————————-
- return y / x
- def nanutsem_builder(x):
- 함수 자체가 값으로 return 된다.
- type() 커맨드를 통해 function이 return 되는 것을 확인할 수 있다.
- Uncased model, Cased model
- Uncased model 이란 소문자로 되어있는 모델을 뜻한다.
- Cased model 이란 대소문자가 구분되어 있는 모델이다.
- 모델 파일
- 모델을 훈련시키며 생성된 checkpoint를 기록한 파일을 모델 파일이라고 한다.
- ckpt-1400000 이면 140만 번째 체크포인트의 모델을 기록한 것
- 모델을 훈련시키며 생성된 checkpoint를 기록한 파일을 모델 파일이라고 한다.
- End-to end
- input을 넣었을 때 중간 과정에 대해 신경 쓰지 않아도 알아서 output이 나오는 경우를 말한다.
- Unicode 정규화 방식
- NFC : 초성+중성+종성을 하나로 보는 것, 한글은 3byte이므로 한 글자는 3byte (초성+중성+종성)
- NFD : 초성, 중성, 종성 을 따로 보는 것, 한 글자는 6~9byte (초성+중성 ~ 초성+중성+종성)
- NFKC, NFKD : NFC, NFD 방식에 특수한 문자들까지 고려하는 경우
- 반각 문자, 전각 문자
- 반각 문자란 한글 한 글자 크기를 뜻한다.
- 전각 문자란 일본에서 반각 문자의 두 배 정도 되는 크기를 갖고 있는 문자이다.
- Json 파일 출력(쓰기, write) 방법
- import json j = json.load(ifile) json.dump(j, ofile, ensure_ascii=False, indent=‘\t’)
- with open(“pretty_sample.json”, “w”) as ofile:
- with open(“sample.json”, “r”) as ifile:
- git review를 할 때는 최상위 디렉터리에서 수행한다.
- Python script 안에서 Command를 실행하고 싶을 때
- Input from file, Output to file
- myinput = open(“myinput.txt”, “r”)p = subprocess.Popen(“myprogram.exe”, stdin=myinput, stdout=myoutput)myoutput.flush()
- p.wait()
- myoutput = open(“myoutput.txt”, “r”)
- Input from stdin(text), Store Output
- input_txt = ‘sample’
- output_txt = subprocess.check_output(“myprogram.exe”, universal_newlines=True, input=input_txt)
- Input from file, Output to file
- 터미널에서 작업을 종료할 때는 Ctrl+c 나 Ctrl+d 를 사용하도록 한다.
- 일시 중단할 때는 Ctrl+z
- fg 명령어로 다시 되돌아 갈 수 있다.
- 일시 중단할 때는 Ctrl+z
- 잘 모르는 함수, 기능을 쓸 때는 return 되는 값이 어떤 Type 인지, 어떤 Value를 갖고 있는지 확인하는 습관을 갖도록 한다.
- Mecab에서 parse()를 하게 되면 ‘EOS’가 나오는데 End Of Sentence라는 뜻으로 여기서부터는 삭제하면 된다.
- 무언가를 비교를 하는 행위에서 Unit(단위)을 확실히 정해야 한다.
- character 인지, word 인지, token 인지 등등…
- repr(), eval()
- repr()
- repr()을 통해 출력한 문자열로는 다시 기존 객체와 같은 값을 가지는 객체 생성 가능하다, eval()의 역함수 목적
- eval()
- expression 인자에 string 값을 넣으면 해당 값을 그대로 실행하여 결과 출력한다.
- 단순 연산뿐 아니라 내장 함수나 객체도 실행 가능하다.
- 하지만 사용을 자제하도록 권고한다.
- 왜냐하면 표현식을 그대로 실행하는 것이기 때문에 “__import__(‘os’). system(‘rm -rf \’)” 와 같은 것을 입력하면 대참사가 일어난다.
- 즉 Command Injection Flaws를 그대로 노출할 수 있다.
- 또한 코드의 가독성을 떨어뜨리고 디버깅을 어렵게 만든다.
- repr()
- “공백” 에는 세 가지 타입이 존재한다.
- Space, “ “
- Tab, “\t”
- New line, “\n”
- strip()을 이용하면 문장 양 끝에 있는 공백들을 제거할 수 있다.
- import importlib
- importlib.reload(modulename)을 이용하면 원하는 모듈의 reload가 가능하다.
- repo의 최상위 디렉터리에서 “pylint —rcfile=.pylintrc *. py”를 입력하면 pylint 실행 가능하다(터미널 환경에서 작업 시)
- with을 이용하여 파일을 열면 소멸자(__del__)가 자동 생성되고 코드 블록이 끝나면 자동 호출되어 종료된다.
- Type hinting
- python 3.4부터 함수의 input parameter, return type을 명시해주기 위해 사용한다.
- 함수 파라미터에 대해서는 ":"을 사용하고 return type에 대해서는 "->"사용한다.
- ex) from typing import List
def foo(example: str) -> List[str] : - ~~~
- python에서는 csv를 많이 사용한다.
- 직렬화
- pickle(python)
- Object Serialization을 이용하여 bytes의 나열로 바꿔준다 (== 한 줄 == 1차원).
- 사람이 읽을 수 없는 반면에 저장이나 전송이 효율적이다.
- 상위 버전의 Pickle Protocol Version에서 저장한 경우에는 하위 버전에서 역직렬화가 불가능하다.
- dump(s), load(s)에서 “s”의 유무의 차이는 “binary file” 혹은 “bytes object” 의 차이이다.
- json, xml, yaml
- 위와 같은 파일 형식들은 Object Serialization으로 쓰여 있는 것이다.
- 저장이나 전송이 pickle 보다는 덜 효율적이지만 사람이 읽을 수 있는 가독성이 좋다.
- Thrift, Protocol Buffer
- 이식성(portability)의 문제를 해결하기 위해 사용된다.
- 이식성이란 다른 프로그래밍 언어에서도 사용할 수 있는 것을 말한다.
- Protocol Buffer 은 json처럼 사람이 보기 쉽게 하는 방식과 bytes 방식 둘 다 제공한다
- 이식성(portability)의 문제를 해결하기 위해 사용된다.
- pickle(python)
- csv 파일은 benchmarking 용 data이다(즉, 다른 회사나 플랫폼에서도 사용 가능하다).
- benchmark 란?
- 성능 측정
- 참고
- benchmark 란?
- Mac OS에서 긴 flag를 넣기 위해선 gnu-getopt 가 필요하다.
- brew install gnu-getopt
- export PATH=“/usr/local/opt/gnu-getopt/bin:$PATH”
- Pre-order, In-order, Post-order
- Tree를 순회할 때, 뜻 그대로 root node 가 가장 앞에 나오는지, 중간에 나오는지, 마지막에 나오는지에 대한 것이다.
- 모델 학습이 잘 되고 있는지에 대한 것은 두 가지로 알 수 있다.
- Error 가 안 나고 잘 작동하고 있는지
- model 이 잘 learn 되고 있는지 (overfitting 이 없고, loss 가 발산하지 않는지 등)
- gRPC(RPC, Remote Procedure Call)
- Protocol Buffer로 된 Object Serialization data를 서로 다른 컴퓨터에서 주고받게 할 수 있는 프로토콜이다.
- Protocol Buffer 가 서로 다른 프로그래밍 언어에서 데이터를 주고받고 사용할 수 있게 한다면, RPC 는 더 큰 차원에서 서로 다른 컴퓨터에서 데이터를 주고 받고 사용할 수 있게 하는 것이다.
- GKE(Google Kubernetes Engine)의 TPU와 Container 사이에서 사용된다.
- 참고로 XMLRPC는 가장 유명한 RPC이며 대부분의 프로그래밍 언어에 탑재되어 있지만 속도가 매우 느리다
- Deprecate, Obsolete
- Deprecate는 “그것 쓰지 마세요!” 정도로 나중에 버전 업 되거나 하면 쓰일 수 없다고 알려주는 것이다.
- Obsolete는 “그것은 더 이상 쓸 수 없는 기능이다, 바꿔라”라고 알려주는 것이다.
- Training 용어
- Epoch
- 전체 Dataset에 대해 몇 번 학습을 진행할 것인가에 대한 것
- 너무 작으면 underfitting, 너무 크면 overfitting 이 발생할 확률이 높음
- 메모리의 한계와 속도 저하 때문에 대부분의 경우에 한 번의 epoch에서 모든 데이터를 한꺼번에 넣을 수 없어서 데이터를 나누어서 넣음
- Iteration(= training step)
- 데이터를 몇 번 나누어서 주는가에 대한 것
- (batch size) * (# of iteration) = epoch
- ex) 전체 2,000개 data에서 epochs=20, batch size=500일 때
- 1 epoch은 4번의 iteration으로 구성된다.
- 전체 dataset에 대해 20번의 학습이 이루어지고, iteration 기준으로는 총 80번이다.
- ex) 전체 2,000개 data에서 epochs=20, batch size=500일 때
- Batch size
- 각 iteration마다 주는 data size
- 1 step에 볼 data size
- Step
- Iteration과 유사하지만, 1 step 이 끝나면 gradient 가 update 된다.
- Learning Rate
- Weight과 Bias를 매 step 마다 얼마다 update 할 것인지에 대한 수치이다.
- Epoch
- git 명령어
- git log -r <commit id>
- commit id로 git log 를 보여줌
- git checkout <commit id>
- commit id 로 브랜치를 생성
- git checkout — <directory>
- 현재 위치한 브랜치 때의 directory로 바꿔준다.
- git log -r <commit id>
- Ammulator => 완벽하게 속이는 것 -> 전가상화(아예 독립된 가상의 컴퓨터), 반가상화
- Container => Image를 이용하여 만들어낸 가상 컴퓨터(Container 가상화)
- 문자열을 찾는 프로그램의 종류
- grep
- 다른 program의 stdout 을 다른 program 의 stdin으로 사용할 때 많이 쓴다.
- 속도가 느려서 단순 문자열을 파일 내에서 찾는 데에는 쓰지 않는다.
- ack(ac4)
- ack-grep이라고 불리며 속도가 빠르고 검색 결과에 색이 칠해져 있어서 보기 편하다.
- 소스 코드 내에서만 검색할 수 있게 하는 등 다양한 옵션이 있다.
- ripgrep(rg)
- Rust를 이용하여 만들어졌으며 가장 빠른 서치 속도를 갖고 있다.
- silver searcher(ag)
- grep
- os에서 관리하는 clip board는 vim 이 관리하는 yank와 연동되어 있지 않다.
- vim에서 복사한 것을 사용하고 싶으면 그 둘을 연동시켜 놓아야 한다.
- 대체제로는 Shift+Command+c로 복사 가능하다.
- pre-train 은 loss를 그래프로 찍어보면서 epoch, batch size 등 설정을 할 수 있지만, fine tuning 은 너무 빨리 끝나기 때문에 그래프를 볼 수 없다.
- 일반적으로 batch size 가 커지면 F1 score 도 커진다고 알려져 있다.
일반적으로 epoch 이 커지면 훈련 시간이 길어진다고 알려져 있다. - epoch 대비 F1 Score를 보면서 “가성비”를 따지는 것이 중요하다.
- top_k accuracy는 모델이 예측한 k 개만큼의 결과를 label(실제 정답)과 비교한 값이다.
- 즉 top_1 은 모델이 예측한 1개의 결과가 정답과 일치하는 비율을 나타내는 것
- pathlib
- python 3.4부터 도입되었으며 os, glob 모듈을 대체할 수 있다.
- file system path를 단순 string 이 아닌 object로 다룬다.
- 연산자 “/“ 를 이용하여 직관적으로 이해 가능하다.
- Train vs. Eval/Predict
- Eval, Predict는 entire dataset에 대해 한 번만 수행하면 되므로 데이터에 대한 Padding 이 필요하다.
- Train 은 굳이 Padding을 할 필요 없이 데이터의 개수가 모자라도 다시 처음으로 돌아가서 훈련을 해주면 된다.
- batch size=200, data size=201 일 때, 한 개가 남으면 drop 하는 경우도 있다 (drop_remainder).
- 이때, shuffle() 같은 함수를 사용하여 데이터를 섞어주면 모든 데이터에 대해 학습을 할 수 있다
- Training vs. Inference
- Training 은 존재하는 데이터로 new capability를 학습하는 것이다.
- Inference는 Training으로 만들어진 모델로 새로운 데이터에 capability를 적용하는 것이다.
- map() vs. apply()
- map() 은 정의한 function 이 dataset의 각 element에 적용되고 바뀐 각 element를 return 한다.
- apply()는 function을 전체 dataset에 한 번에 적용되고 바뀐 전체 dataset을 return 한다.
- collections.defaultdict
- 처음 key를 지정할 때, value를 주지 않으면 해당 key 에 대한 value 를 선언 시 인자로 넘긴 객체의 초기값으로 지정한다.
- ex) in_dict = defaultdict(int)
int_dict[‘key1’] == 0
- zip(*iterable) 은 동일한 개수로 이루어진 자료형을 묶어 주는 역할을 하는 함수이다.
- *iterable 은 반복 가능한 자료형 여러 개를 입력할 수 있다는 의미이다.
- ex) list( zip( [1, 2, 3], [4, 5, 6] ) ) == [ (1, 4), (2, 5), (3, 6) ]
- git review -d [REVEIW_NUMBER]
- 해당 리뷰 넘버를 갖고 있는 브랜치를 다운로드하여서 checkout 할 수 있다.
- 저 리뷰를 작성한 사람이 새로운 패치 셋을 올렸을 때 이 명령어를 다시 입력하면 알아서 최신화가 된다.
- 각 모델에는 그에 맞는 vocab 이 필요하다.
- ex) KorQuAD model => Korean vocab
- SQuAD model => English vocab
- Annotation
- 문장 속에 어떤 entity 가 있는지 표시하는 행위이다.
- Annotator 가 Annotate를 한다.
- git add를 했을 때 원치 않은 파일까지 staged 됐다면
- “git reset HEAD [FILE_NAME]” 을 하면 된다(파일 이름 안 쓰면 모든 파일을 대상으로 함).
- git commit에 원치 않은 파일까지 commit 해버렸다면
- “git reset HEAD~1 [FILE_NAME]” 을 사용하면 된다
- git rm (—cached)는 삭제를 하는 것이므로 웬만하면 사용하지 않는 것이 좋다.
- Data Augmentation
- augmentation == 증강 (AR에서 쓰이는 단어)
- 일부러 노이즈를 넣거나, 문장들의 순서를 바꾸거나, 랜덤 단어를 masking 하거나, 랜덤 단어를 유사 단어로 바꾸는 등을 이용하여 데이터를 부풀리는 방법이다.
- git cherry-pick {COMMIT-NUMBER}
- 해당 커밋을 현재 브랜치로 가져와준다.
- Precision, Recall, F1
- Precision(정밀도) => 모델이 예측한 것 중 실제 Data Label 값에서도 맞은 비율, 정답률
- Recall(재현율) => 실제 Data Label 값을 기준으로 모델이 예측하여 맞은 비율, sensitivity/hit rate
- Accuracy(정확도) => Precision, Recall 이 옳게 예측한 경우만 다루었다면 Accuracy는 False의 경우도 고려
- F1 score => Precision과 Recall의 조화 평균
- https://sumniya.tistory.com/26
- max_seq_length(msl)와 doc_stride(ds)의 차이
- msl으로만 input data를 자르게 되면 answer span이 잘라져 답을 찾지 못할 수 있다.
- 그래서 ds의 개념을 도입해서 slide windowing을 가능하게 한다.
- ex) 해(254) 리(255) 포(256) 터(257) 와(258), answer=해리포터, msl=256, ds=128
- msl만 사용하면 […해리][포터와…] 처럼 answer span이 나누어지게 될 수 있다.
- 하지만 ds를 같이 이용하면 0-255, 128-383, 256-512처럼 자를 수 있어서 [...해리], [해리포터와], [포터와] 처럼 answer span이 온전히 존재하는 것을 찾을 수 있다.
휴.. 사실 매주 블로그 포스팅을 하자고 결심했지만
이번 주는 다음 주까지 준비해야 할 일들이 많아
빠르게 포스팅을 하려고 선택한 주제이기도 한데,
생각보다 정리하는 데에 엄청 오래 걸렸다;;
다음 주에는 면접 후기 글이나
요즘 생활코딩 이고잉님의 데이터베이스 수업을 재밌게 듣고 있어서
정리 글을 써볼까 한다.
끝!
반응형
'취준 아카이브(2020년) > 인턴 후기' 카테고리의 다른 글
[인턴 후기][Skelter Labs] Skelter Labs(스켈터랩스)의 인턴 후기 ③ (0) | 2020.05.02 |
---|---|
[인턴 후기][Skelter Labs] Skelter Labs(스켈터랩스)의 인턴 후기 ② (12) | 2020.04.25 |
[인턴 후기][Skelter Labs] Skelter Labs(스켈터랩스)의 인턴 후기 ① (2) | 2020.04.18 |