안녕하세요. 이번 포스팅에서는 지난 포스팅에 이어 올해 1학기에 진행했던 제주어 번역 프로젝트에 대해서 얘기해보려고 합니다.
프로젝트 주제 : <제주어, 표준어 양방향 음성 번역 모델 생성 프로젝트>
분야 : NLP, Translation, Deep-Learning, STS
1. 갑작스러운 성능 저하 사건
올해 4월 중간고사를 마치고
5월 초에 이것저것 시도해보려고 했었습니다.
그래서 처음 봤던 게 Max_length 라는 인자인데,
번역기를 실제로 사용할 때 그렇게 긴 문장을 넣을 것 같지는 않아서
max_length를 16으로 줄여보자는 아이디어에서 시작했습니다.
max_length를 16으로 줄이면 데이터의 문장들도 줄여야 하기 때문에
길이가 16 이상 넘어가는 문장들은 모두 16을 단위로 쪼개서 아래에다가 추가 행으로 붙였구요.
이렇게 해서 만든 데이터를 학습시켰더니 저런 수치가..
확실히 메모리랑 표현하고자 하는 문장의 length랑
적절히 분배를 해야겠다고 느꼈습니다.
아래는 그 코드입니다.
# 문자열을 자르고 새 데이터프레임 생성
def create_expanded_df(df):
def split_long_strings(row):
text = row['dialect_form']
# 16자 기준으로 문자열 분할
return [text[i:i+16] for i in range(0, len(text), 16)]
# 기존 데이터프레임의 각 행에 대해 문자열 분할 및 새로운 데이터프레임 생성
expanded_data = [
{'dialect_form': chunk}
for _, row in df.iterrows()
for chunk in split_long_strings(row)
]
return pd.DataFrame(expanded_data)
# 함수 적용
expanded_df = create_expanded_df(df)
2. 제주어 번역 모델 사용 가이드
그래서 궁극적으로 저희 모델을 어떻게 사용하냐,
제주어 번역기를 어떻게 쓸 수 있냐에 대한 가이드라인을 드리겠습니다.
우선 허깅페이스나 깃허브에도 나와 있지만 아래 코드를 참고합니다.
import torch
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
## Set up the device (GPU or CPU)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
## Load the tokenizer and model
tokenizer = AutoTokenizer.from_pretrained("Junhoee/Kobart-Jeju-translation")
model = AutoModelForSeq2SeqLM.from_pretrained("Junhoee/Kobart-Jeju-translation").to(device)
## Set up the input text
## 문장 입력 전에 방향에 맞게 [제주] or [표준] 토큰을 입력 후 문장 입력
input_text = "[표준] 안녕하세요"
## Tokenize the input text
input_ids = tokenizer(input_text, return_tensors="pt", padding=True, truncation=True).input_ids.to(device)
## Generate the translation
outputs = model.generate(input_ids, max_length=64)
## Decode and print the output
decoded_output = tokenizer.decode(outputs[0], skip_special_tokens=True)
print("Model Output:", decoded_output)
## Model Output: 안녕하수꽈
코드 설명
- pytorch와 transformers 패키지를 import
- gpu 를 쓸 수 있는 환경이라면 gpu, 그렇지 않다면 cpu로 돌아갈 수 있게 device 설정
- 토크나이저와 모델에 올바른 모델 이름 기입
- input_text에 번역하고자 하는 문장 작성
- 표준어를 작성했다면 [표준], 제주어를 작성했다면 [제주] 토큰을 기입
- 토큰 뒤에 번역하고자 하는 문장을 작성
- input_text에 대해서 번역 문장 생성
위와 같은 순서로 로직이 수행된다고 보시면 됩니다.
그리고 사실 Whisper랑 glow tts 모델을 가지고
STS 로직이 돌아가도록 구현을 마쳤지만
제가 음성 담당이 아니어가지고 자세하게는 리뷰를 못 드리겠네요. ㅠㅠ
그래도 음성 모델 또한 파인튜닝 시켜서 STT, TTS -> STS 로직이 잘 돌아가도록
코드 마무리는 해놨으니 궁금하신 분들은 깃허브 참고해주시면 좋을 것 같습니다.
그라디오 인터페이스
위 사진은 저희가 프로젝트 당시 구현했던 그라디오 인터페이스입니다.
주황색 색감하고 깔끔한 디자인은 지금 생각해도 너무 잘 만든 것 같아요.
그라디오 코드도 깃허브 페이지에 올라와있으니 참고해주세용.
그럼 이상으로 프로젝트 리뷰를 마치려고 합니다.
다음 포스팅은 또 어떤 내용으로 가져와야 할지 참 막막하지만
그래도 뭐 해야죠.. 하하
전국의 모든 개발자분들 파이팅입니다..!
'프로젝트' 카테고리의 다른 글
[프로젝트] 제주어, 표준어 양방향 음성 번역 모델 생성 프로젝트 리뷰 (2) (8) | 2024.12.06 |
---|---|
[프로젝트] 제주어, 표준어 양방향 음성 번역 모델 생성 프로젝트 리뷰 (1) (6) | 2024.12.03 |
[프로젝트] HR_면접자 정보 맞추기 프로젝트 (3) (2) | 2024.10.12 |
[프로젝트] HR_면접자 정보 맞추기 프로젝트 (2) (1) | 2024.10.04 |
[프로젝트] HR_면접자 정보 맞추기 프로젝트 (1) (4) | 2024.10.01 |
[프로젝트] Whisper 파인튜닝 (3) | 2024.09.21 |
[프로젝트] 티스토리 블로그 Web Crawling (11) | 2024.09.14 |
[프로젝트] 2024 하반기 ICT 학점연계 프로젝트 인턴십 합격 후기 (0) | 2024.08.14 |