0. 상황
머신러닝 전처리 개발이 완료되어 이 모듈을 라즈베리파이 우분투에 옮겨 실행시켜보았다. 전처리 중 토큰화 부분이 완료된 것 까지 확인하였고, 그 다음 단계인 불용어를 처리하는 부분에서 다음과 같은 오류가 발생했다.
colab에서 실행할 땐 오류가 나지 않았으니 아마 리눅스 python 환경에서 발생하는 버전 충돌 같은데 오류를 잡으려 코드를 수정한 후 다시 실행시키려니 colab에서도 오래 걸리던 토큰화 부분(약 30분)이 리눅스에서는 2시간 이상 걸리는 것을 확인했다.
코드를 수정했음에도 결과를 보기까지 시간이 많이 걸려 계속 이 상태로 진행한다면 다른 오류도 오래 기다려야 했기 때문에 비효율적이라고 판단했다.
문제 : colab환경에서도 리눅스 환경에서도 데이터의 토큰화가 너무 오래 걸림
IDEA : 토큰화한 후의 파일을 save시켜서 다시 그 부분부터 시작할 순 없을까? (게임에서 체크포인트 있는 것 처럼, 세이브파일 있는 것 처럼)
의견 : 데이터 셋의 개수가 2만 개가 넘다보니 colab에서는 30분, 라즈베리파이 리눅스에서는 2시간이 넘게 걸린다. 아직 main 함수(모듈)의 오류도 다 해결하지 못했는데 코드를 Run 할 때마다 2시간씩 기다려야 하는 건 너무 비효율적인 것 같다. 시간을 단축시킬 수 있도록 아이디어를 생각해봤으면 좋겠다.
IDEA
그나마 토큰화 시간이 적게 걸리는 코랩에서 한번 돌리고 그 결과를 파일로 저장하면 어떨까
그 파일 자체를 라즈베리파이에 넘겨주면 어떨까?
IDEA MAP
[python file read and write 패키지 -> txt 파일로 만들어서 저장 -> 다음 단계인 stop words 함수에 파일 경로를 넣어줌->동작(RUN)]
마음에 걸리는 것 : list->str로 바꾼다음에 다시 라즈베리파이에서 str->list 로 바꿔주면 너무 번거롭지 않을까? encoding과정에서 파일 손상이 일어나진 않을까? (아스키 문자 깨짐 현상 등)
1. 해결과정
사용한 코드 1
참고 :
https://colab.research.google.com/github/Tajyu/sm11/blob/master/ch04/ch4_03_file_io.ipynb
f = open("새파일.txt", "w") f.close() f = open("./새파일.txt", "w") for i in range(1, 11): data = "%d번째 줄입니다.\n" % i f.write(data) f.close()
발생한 오류 : 리스트는 write 함수로 쓸 수 없다. str만 가능
해결하기 위해 참고 (파이썬에서 str리스트를 문자열로 변환)
https://www.delftstack.com/ko/howto/python/how-to-convert-a-list-to-string/
추가한 코드
StrA = "".join(A) print(StrA)
발생한 오류 2
TypeError: sequence item 0: expected str instance, int found
StrA에는 문자열 리스트만 넣을 수 있다.. (분명 토큰화라 문자일텐데 이게 왜 발생한걸까 )
참고한 자료 (그럼 int 자료형을 강제로 형변환 시켜주자)
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=crm06217&logNo=221778003888
작성한 코드
for i in range(len(mylist): mylist[i] = str(mylist[i])
발생한 오류3
ValueError: I/O operation on closed file.
https://www.python2.net/questions-1265746.htm
파일을 연 후 제대로 닫아주지않아 발생한 오류 같은데 아무리봐도 들여쓰기나 문법적으로 틀린 부분이 없었다.
어차피 이 방법으로 하다가는 같은 코드를 A->B B->C C->D 처럼 빙빙 도는 느낌이라 포기하고 다른 방법 모색하기로 하였다.
IDEA
그럼 리스트 자체를 받아 파일로 저장해주는 라이브러리는 없을까
https://hello-bryan.tistory.com/217
import pickle 로 간단히 해결할 수 있었다.
작성한 코드
import pickle filePath1 = 'textDataOutput.txt' with open(filePath1, 'wb') as lf: pickle.dump(pad, lf) with open(filePath1, 'rb') as lf: readList1 = pickle.load(lf) print(readList1)
문제2: 토큰화 한 파일을 라즈베리파이로 넘겨주는 코드를 개발할거면 애초에 colab에서 전처리까지 완료한 파일을 output으로 받아서 전처리의 결과만 넘겨주는게 더 효율적이지 않을까? 해보자!
2. 해결
preprocessing을 거친 후 pickle 모듈을 통해 output 데이터를 text와 target에 대해 각각 txt 파일로 생성한다. ( 이 파일은 padding 과정까지 모두 거친 것임) 이 파일이 존재함으로써 1시간 반 가량의 토큰화를 계속 진행하지 않아도 된다.
참고한 블로그
https://wayhome25.github.io/cs/2017/04/04/cs-04/
내가 짠 코드 그리고 output
import pickle filePath1='/content/textDataOutput.txt' with open(filePath1, 'rb') as lf: readList1 = pickle.load(lf) print(readList1) one=np.array(readList1) filePath2='/content/targetDataOutput.txt' with open(filePath2, 'rb') as lf: readList2 = pickle.load(lf) print(readList2) two=np.array(readList2)
text data output 파일이 너무 커서 github에 올라가지 않길래 git clone를 실행할 수 없었다. 예외적으로 output파일만 카카오톡을 사용해 팀원들에게 넘겨주었다.
이 파일로 학습한 모델은 다음과 같다.
성공적으로 결과가 잘 도출됨을 알 수 있다.
이 과정이 없었더라면 전처리 과정을 거칠 때마다 2시간 이상씩 기다려야 했을 것이다. 프로젝트 진행 중 효율적인 방법을 찾아낸 것 같아 뿌듯하다.
'프로젝트 > 2021 한이음(probono)' 카테고리의 다른 글
[프로보노프로젝트] 2021 프로보노 공모전 3차 종합 평가 코엑스 대면 발표 후기 (0) | 2021.11.07 |
---|---|
[프로보노프로젝트/딥러닝/개발] KorEDA 개발 (0) | 2021.10.15 |
[프로보노 프로젝트] GitHub README.md 작성 (0) | 2021.10.02 |
[프로보노프로젝트/딥러닝] 학습 조기종료 콜백함수, 학습단위 - 에포크(Epoch), 배치(batch) (0) | 2021.09.27 |
[프로보노프로젝트/딥러닝] 교차검증 (Cross-validation) (0) | 2021.09.22 |