sLLM, Gemma 파인튜닝 예

안녕하세요 오늘은 BESPIN GLOBAL innovate AI실 박지호님이 작성해주신 ‘sLLM, Gemma 파인튜닝 예’란 무엇인지에 대하여 소개해드리도록 하겠습니다.

목차

  1. 개발 환경 설정
  2. Dataset 생성 및 준비
  3. Gemma 모델의 한국어 요약 테스트
  4. Gemma 파인튜닝
  5. Gemma 한국어 요약 모델 추론

[Gemma 소개]

Gemma는 Gemini 모델을 만드는 데 사용된 것과 동일한 연구 및 기술로 빌드된 경량의 최첨단 개방형 모델 제품군입니다.

(공식 페이지 :https://ai.google.dev/gemma?hl=ko)

[Gemma의 주요 특징] 

  • 다양한 모델 제공: Gemma는 Gemma 2B와 Gemma 7B 두 가지 유형으로 제공, 각 유형은 pre-trained 및 instruction-tuned 된 두가지 타입의 모델 제공
  • 책임감 있는 AI 툴킷: Gemma를 활용하여 안전한 AI 애플리케이션을 제작할 수 있는 가이드와 필수 도구를 제공하는 새로운 책임감 있는 생성형 AI 툴킷이 함께 제공
  • 프레임워크 지원: Kera JAX, PyTorch, TensorFlow와 같은 주요 프레임워크에서 추론 및 SFT을 위한 툴체인을 제공
  • 다양한 하드웨어 지원: NVIDIA GPU와 구글 클라우드 TPU 등에 최적화

[Gemma 성능 평가지표]

[Gemma 성능 평가지표]

[Gemma 간단한 학습 가이드]

출처 : Gemma 한국어 요약 모델 파인튜닝 빠르게 해보기 (https://devocean.sk.com/blog/techBoardDetail.do?ID=165703&boardType=techBlog)

1. 개발 환경 설정
1.1 필수 라이브러리 설치하기

Fine-Tuning 과정을 시작하기 전, 필수 라이브러리들을 설치해야 합니다.

여기에는 trltransformersdatasets를 포함한 Hugging Face 라이브러리와 Pytorch가 포함됩니다.

Gemma 모델이 최근에 출시되었기 때문에, 이를 지원하는 라이브러리들은 반드시 최신 버전이어야 합니다.

참고 : https://huggingface.co/google/gemma-7b/discussions/43

참고.

1.2 Import modules

필요한 모듈을 로드 합니다.

 1.2 Import modules

1.3 Huggingface 로그인

Gemma 모델을 사용하기 위해서는 구글의 라이선스 정책에 동의해야 합니다. 이 과정은 Hugging Face를 통해 간단히 처리할 수 있습니다.

 1.3 Huggingface 로그인

2. Dataset 생성 및 준비

우리의 목적은 한국어 요약 모델을 만드는 것입니다.

따라서 한국어로 된 문장을 요약하는 데이터셋이 필요한데 huggingface의 dataset에서 검색해보니 아래와 같은 적당한 데이터셋이 있는 경우, datasets 라이브러리 에서 바로 로드 할수 있도록 우선 이 데이터셋을 활용하겠지만, 데이터셋의 품질이 좋은 편은 아닙니다.

보다 높은 성능을 위해서는 AI 허브등에서 제공하는 요약 데이터셋을 활용하시길 권장 드립니다.

2.1 데이터셋 로드

네이버 기사 요약 데이터셋인 daekeun-ml/naver-news-summarization-ko 를 로드 합니다.

2.1 데이터셋 로드

2.2 데이터셋 탐색

데이터셋은 train과 validation, test까지 이미 구분이 되어 있네요

 2.2 데이터셋 탐색

데이터셋은 train과 validation, test까지 이미 구분이 되어 있네요

2.3 데이터셋 예시

그러면 train 데이터셋을 한번 읽어와 볼까요?

2.3 데이터셋 예시

기사의 제목, 본문, 그리고 본문의 요약을 포함한 딕셔너리 객체를 반환합니다. 여기서 앞으로 사용할 데이터는 본문(document)과 요약문(summary) 입니다.

{'date': '2022-07-03 17:14:37',
 'category': 'economy',
 'press': 'YTN ',
 'title': '추경호 중기 수출지원 총력 무역금융 40조 확대',
 'document': '앵커 정부가 올해 하반기 우리 경제의 버팀목인 수출 확대를 위해 총력을 기울이기로 했습니다. 특히 수출 중소기업의 물류난 해소를 위해 무역금융 규모를 40조 원 이상 확대하고 물류비 지원과 임시선박 투입 등을 추진하기로 했습니다. 류환홍 기자가 보도합니다. 기자 수출은 최고의 실적을 보였지만 수입액이 급증하면서 올해 상반기 우리나라 무역수지는 역대 최악인 103억 달러 적자를 기록했습니다. 정부가 수출확대에 총력을 기울이기로 한 것은 원자재 가격 상승 등 대외 리스크가 가중되는 상황에서 수출 증가세 지속이야말로 한국경제의 회복을 위한 열쇠라고 본 것입니다. 추경호 경제부총리 겸 기획재정부 장관 정부는 우리 경제의 성장엔진인 수출이 높은 증가세를 지속할 수 있도록 총력을 다하겠습니다. 우선 물류 부담 증가 원자재 가격 상승 등 가중되고 있는 대외 리스크에 대해 적극 대응하겠습니다. 특히 중소기업과 중견기업 수출 지원을 위해 무역금융 규모를 연초 목표보다 40조 원 늘린 301조 원까지 확대하고 물류비 부담을 줄이기 위한 대책도 마련했습니다. 이창양 산업통상자원부 장관 국제 해상운임이 안정될 때까지 월 4척 이상의 임시선박을 지속 투입하는 한편 중소기업 전용 선복 적재 용량 도 현재보다 주당 50TEU 늘려 공급하겠습니다. 하반기에 우리 기업들의 수출 기회를 늘리기 위해 2 500여 개 수출기업을 대상으로 해외 전시회 참가를 지원하는 등 마케팅 지원도 벌이기로 했습니다. 정부는 또 이달 중으로 반도체를 비롯한 첨단 산업 육성 전략을 마련해 수출 증가세를 뒷받침하고 에너지 소비를 줄이기 위한 효율화 방안을 마련해 무역수지 개선에 나서기로 했습니다. YTN 류환홍입니다.',
 'link': 'https://n.news.naver.com/mnews/article/052/0001759333?sid=101',
 'summary': '올해 상반기 우리나라 무역수지는 역대 최악인 103억 달러 적자를 기록한 가운데, 정부가 하반기에 우리 경제의 버팀목인 수출 확대를 위해 총력을 기울이기로 결정한 가운데, 특히 수출 중소기업의 물류난 해소를 위해 무역금융 규모를 40조 원 이상 확대하고 물류비 지원과 임시선박 투입 등을 추진하기로 했다.'}
3. Gemma 모델의 한국어 요약 테스트

Google이 제공하는 Gemma 모델은 2가지 타입, base 모델과 IT 모델(Instruction Tuned) 모델을 포함합니다.

이 두 모델의 주된 차이는 IT 모델이 대화 형식의 상호작용에 최적화되어 사용자의 의도를 더 정확하게 파악하여 보다 정제된 답변을 제공한다는 것입니다. 이는 ChatGPT와 유사한 경험을 제공하며, 질문에 대한 응답에서 높은 수준의 맥락 이해와 적합성을 보입니다.

반면 base 모델은 이러한 튜닝 작업을 거치지 않은 원본의 모델이라서 출력 품질로 보면 IT 모델보다 떨어지지만 다른 방식으로 Instruct tuning을 거쳐 사용자의 목적에 더 적합한 모델을 만들어 낼 수 있는 자유도가 있습니다. 우리는 요약 finetuned 모델을 만들기 위해 사전 tuning된 google/gemma-2b-it 모델을 사용해 볼 것입니다.

3.1 모델 로드

google/gemma-2b-it 모델을 로드 합니다.

3.1 모델 로드

3.2 Gemma-it의 프롬프트 형식

먼저 huggingface 홈페이지에서 gemma-2b-it 의 모델 카드를 확인해 봅시다.

https://huggingface.co/google/gemma-2b-it

중간쯤에 chat template 형식에 대한 내용이 나오고, 모델의 prompt 형식에 대한 정의를 확인 할 수 있습니다. 즉, gemma에게 질문을 하려면 모델이 알아 들을 수 있는 형식으로 프롬프트를 만들어야 한다는 것입니다.

 3.2 Gemma-it의 프롬프트 형식

프롬프트 형식을 살펴보면 전형적인 chat template의 형식을 가지고 있음을 확인 할 수 있습니다. <start_of_turn> 이라는 구분자를 통해 대화 턴의 시작을 구분하며, 대화의 끝은<end_of_turn>구분자로 마무리 짓고 있습니다.

또한 대화자는 user와 model로 지정됨을 알 수 있습니다.

그럼 이제 부터 우리는 모델에 질문을 할 때 위와 같은 형식으로 프롬프트를 만들어야 합니다. prompt 템플릿을 만들어서 사용해도 되겠지만, huggingface 는 보다 쉬운 방법을 제공 합니다. tokenizer의 apply.chat_template 메소드가 바로 그것인데요, 사용 방법은 다음과 같습니다.

https://huggingface.co/docs/transformers/main/en/chat_templating

앞서 봤던 프롬프트에서 정의한 사용자와 질문 내용을 각각 role과 content 딕셔너리로 만들어줍니다.

이후 해당 메시지 리스트를 apply_chat_template 메소드에 입력으로 넣으면 prompt 를 자동으로 만들어 주게 됩니다.

이후 해당 메시지 리스트를 apply_chat_template 메소드에 입력으로 넣으면 prompt 를 자동으로 만들어 주게 됩니다.

그럼 예제를 통해 실행해볼까요? 데이터셋 중의 본문 하나를 가져옵니다.

데이터셋 중의 본문 하나를 가져옵니다.

요약문 생성을 위한 파이프라인을 설정합니다.

요약문 생성을 위한 파이프라인을 설정합니다.

그리고 위에 chat_template 을 구성하고 apply_chat_template 메소드의 입력값으로 넣습니다.

그리고 위에 chat_template 을 구성하고 apply_chat_template 메소드의 입력값으로 넣습니다.

만들어진 prompt 내용을 살펴보죠

만들어진 prompt 내용을 살펴보죠

'<bos><start_of_turn>usern다음 글을 요약해주세요 :nn앵커 정부가 올해 하반기 우리 경제의 버팀목인 수출 확대를 위해 총력을 기울이기로 했습니다. 특히 수출 중소기업의 물류난 해소를 위해 무역금융 규모를 40조 원 이상 확대하고 물류비 지원과 임시선박 투입 등을 추진하기로 했습니다. 류환홍 기자가 보도합니다. 기자 수출은 최고의 실적을 보였지만 수입액이 급증하면서 올해 상반기 우리나라 무역수지는 역대 최악인 103억 달러 적자를 기록했습니다. 정부가 수출확대에 총력을 기울이기로 한 것은 원자재 가격 상승 등 대외 리스크가 가중되는 상황에서 수출 증가세 지속이야말로 한국경제의 회복을 위한 열쇠라고 본 것입니다. 추경호 경제부총리 겸 기획재정부 장관 정부는 우리 경제의 성장엔진인 수출이 높은 증가세를 지속할 수 있도록 총력을 다하겠습니다. 우선 물류 부담 증가 원자재 가격 상승 등 가중되고 있는 대외 리스크에 대해 적극 대응하겠습니다. 특히 중소기업과 중견기업 수출 지원을 위해 무역금융 규모를 연초 목표보다 40조 원 늘린 301조 원까지 확대하고 물류비 부담을 줄이기 위한 대책도 마련했습니다. 이창양 산업통상자원부 장관 국제 해상운임이 안정될 때까지 월 4척 이상의 임시선박을 지속 투입하는 한편 중소기업 전용 선복 적재 용량 도 현재보다 주당 50TEU 늘려 공급하겠습니다. 하반기에 우리 기업들의 수출 기회를 늘리기 위해 2 500여 개 수출기업을 대상으로 해외 전시회 참가를 지원하는 등 마케팅 지원도 벌이기로 했습니다. 정부는 또 이달 중으로 반도체를 비롯한 첨단 산업 육성 전략을 마련해 수출 증가세를 뒷받침하고 에너지 소비를 줄이기 위한 효율화 방안을 마련해 무역수지 개선에 나서기로 했습니다. YTN 류환홍입니다.<end_of_turn>n<start_of_turn>modeln'

우리가 의도한 대로 구분자가 들어간 prompt 형식으로 변경이 되었습니다.

3.3 Gemma-it 추론

이제 모델에 우리가 만든 프롬프트를 입력으로 넣고 출력이 어떻게 나오는지 확인해보겠습니다.

이제 모델에 우리가 만든 프롬프트를 입력으로 넣고 출력이 어떻게 나오는지 확인해보겠습니다.

이제 모델에 우리가 만든 프롬프트를 입력으로 넣고 출력이 어떻게 나오는지 확인해보겠습니다.

이제 모델에 우리가 만든 프롬프트를 입력으로 넣고 출력이 어떻게 나오는지 확인해보겠습니다.

출력이 어떤가요? 일단 한글 생성이 제법이네요 생성된 문장이 크게 어색하지 않습니다.

다만, 요약이 목록 형태로 제시되었습니다. 이는 gemma-it 가 구조적이고 논리적으로 답변을 제공하도록 학습된 결과입니다. 목록 형태로 요약 되었음에도 불구하고, 전반적으로 충분히 잘 요약 되었다는 느낌이 들지 않습니다. (저만 그런가요?) 사실 저는 요약이라고 하면 전체 문장을 이렇게 목록으로 요약하는 것이 아니라 간략한 단락으로 요약되는것을 기대 했기 때문입니다. 간략한 단락으로 요약이 이루어지려면, 현재 모델을 수정해서 우리가 기대하는 출력이 나오도록 해야 합니다.

LLM은 특정 목적에 맞는 데이터로 모델을 추가 학습시켜 출력을 조정할 수 있습니다.

이 과정을 ‘fine-tuning‘ 이라고 부르며, 이미 사전 학습된 모델의 지식을 활용하면서도 특정 목적이나 도메인에 더욱 최적화하기 위해 추가로 학습을 하는 것을 의미합니다.

4. Gemma 파인튜닝

그럼 우리 입맛에 맞게 출력이 조정 되도록 네이버 뉴스 요약 데이터인 naver-news-summarization-ko 데이터셋을 활용해서 gemma 모델을 파인 튜닝 하겠습니다.

주의: Colab GPU 메모리 한계로 이전장 추론에서 사용했던 메모리를 비워 줘야 파인튜닝을 진행 할 수 있습니다. notebook 세션을 재시작 한 후 1번과 2번 항목을 다시 실행하여 로드 한 후 아래 과정을 진행합니다

4.1 학습용 프롬프트 조정

앞서 chat_template을 통해 모델이 이해 할 수 있는 형태로 prompt를 만드는 과정 을 살펴봤습니다. 생성된 프롬프트는 다음과 같은 형식으로 출력됩니다.

앞서 chat_template을 통해 모델이 이해 할 수 있는 형태로 prompt를 만드는 과정 을 살펴봤습니다. 생성된 프롬프트는 다음과 같은 형식으로 출력됩니다.

이것은 우리가 모델에 질문할 때의 형식이였고, 이제는 우리가 모델에게 “이렇게 질문하면 이렇게 대답해야 해” 하고 가르쳐야 합니다.

위의 형식을 고려 하면 user turn에 본문이 들어가고 model turn에 요약문이 들어가면 되겠네요

chat_template을 이용한다면 아래와 같은 코드로 작성 할 수 있습니다.

def generate_prompts(example):
    output_texts = []     for i in range(len(example['document'])):
        messages = [             {"role": "user",              "content": "다음 글을 요약해주세요:nn {}".format(example['document'][i])},              {"role": "assistant",              "content": "{}".format(example['summary'][i])}         ]
        chat_message = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=False)
        output_texts.append(chat_message)      return output_texts

그러 결과는 다음과 같이 만들어 질 것 입니다.

그러 결과는 다음과 같이 만들어 질 것 입니다.

실제 Train dataset를 넣어서 테스트 해보겠습니다.

실제 Train dataset를 넣어서 테스트 해보겠습니다.

<bos><start_of_turn>user
다음 글을 요약해주세요:
앵커 정부가 올해 하반기 우리 경제의 버팀목인 수출 확대를 위해 총력을 기울이기로 했습니다. 특히 수출 중소기업의 물류난 해소를 위해 무역금융 규모를 40조 원 이상 확대하고 물류비 지원과 임시선박 투입 등을 추진하기로 했습니다. 류환홍 기자가 보도합니다. 기자 수출은 최고의 실적을 보였지만 수입액이 급증하면서 올해 상반기 우리나라 무역수지는 역대 최악인 103억 달러 적자를 기록했습니다. 정부가 수출확대에 총력을 기울이기로 한 것은 원자재 가격 상승 등 대외 리스크가 가중되는 상황에서 수출 증가세 지속이야말로 한국경제의 회복을 위한 열쇠라고 본 것입니다. 추경호 경제부총리 겸 기획재정부 장관 정부는 우리 경제의 성장엔진인 수출이 높은 증가세를 지속할 수 있도록 총력을 다하겠습니다. 우선 물류 부담 증가 원자재 가격 상승 등 가중되고 있는 대외 리스크에 대해 적극 대응하겠습니다. 특히 중소기업과 중견기업 수출 지원을 위해 무역금융 규모를 연초 목표보다 40조 원 늘린 301조 원까지 확대하고 물류비 부담을 줄이기 위한 대책도 마련했습니다. 이창양 산업통상자원부 장관 국제 해상운임이 안정될 때까지 월 4척 이상의 임시선박을 지속 투입하는 한편 중소기업 전용 선복 적재 용량 도 현재보다 주당 50TEU 늘려 공급하겠습니다. 하반기에 우리 기업들의 수출 기회를 늘리기 위해 2 500여 개 수출기업을 대상으로 해외 전시회 참가를 지원하는 등 마케팅 지원도 벌이기로 했습니다. 정부는 또 이달 중으로 반도체를 비롯한 첨단 산업 육성 전략을 마련해 수출 증가세를 뒷받침하고 에너지 소비를 줄이기 위한 효율화 방안을 마련해 무역수지 개선에 나서기로 했습니다. YTN 류환홍입니다.<end_of_turn>
<start_of_turn>model
올해 상반기 우리나라 무역수지는 역대 최악인 103억 달러 적자를 기록한 가운데, 정부가 하반기에 우리 경제의 버팀목인 수출 확대를 위해 총력을 기울이기로 결정한 가운데, 특히 수출 중소기업의 물류난 해소를 위해 무역금융 규모를 40조 원 이상 확대하고 물류비 지원과 임시선박 투입 등을 추진하기로 했다.<end_of_turn><eos>

제대로 만들어지는 것을 확인했으니, 이제 학습 데이터셋을 만들 준비가 끝났습니다. 이제 모델 학습을 위한 환경 설정이 필요합니다.

4.2 QLoRA 설정

개요에서 언급한것 처럼 Colab에서 동작 할 수 있도록 QLoRA 기법을 활용해 파인튜닝을 진행하겠습니다. LoRA(Low-Rank Adaptation) 기법은 기존 모델의 파라미터를 직접 수정하는 대신, 추가적인 작은 파라미터를 도입하여 모델의 출력을 조절하는 방식입니다. 이 방법은 모델의 크기를 크게 늘리지 않으면서도, 특정 작업에 모델을 효과적으로 최적화할 수 있는 장점 덕분에 LLM의 파인튜닝에 많이 사용됩니다.

LoRA가 기존의 Pre-Trained 모델을 유지하면서 별도의 파라미터를 학습하는 접근법을 취한다면, QLoRA는 이를 한 단계 더 나아가서 Pre-Trained 모델 자체도 4-bit로 양자화하고, 그 위에 LoRA 기법을 적용하여 파인튜닝 합니다.

이 양자화 (Quantization) 과정은 모델의 메모리 사용량을 대폭 줄여주어, 더 큰 모델을 더 적은 리소스로 학습 시킬 수 있게 만들어 줍니다. LoRA와 QLoRA의 자세한 내용은 아래를 참고하시기 바랍니다.

QLoRA를 사용하기 위한 설정을 다음과 같이 정의 합니다.

QLoRA를 사용하기 위한 설정을 다음과 같이 정의 합니다.

QLoRA를 적용해서 모델을 로드 합니다

QLoRA를 적용해서 모델을 로드 합니다

4.3 Trainer 실행

드디어 학습을 시작할 단계입니다. 학습은 Huggingface Transfomers의 Trainer 클래스 대신 SFTTrainer 클래스를 사용할 것입니다. SFTTrainer (Supervised Fine-tuning Trainer)는 Trainer 클래스에 비해 대화형 또는 Instruction 포멧의 데이터셋을 다루는데 보다 효율적인 방법을 제공합니다.

formatting_prompts_func이 그러한 기능들중 하나입니다.

Training parameter의 설명은 생략하겠습니다. 자세한 내용은 아래를 참조하세요

https://huggingface.co/docs/transformers/v4.31.0/en/main_classes/trainer#transformers.TrainingArguments

Training parameter의 설명은 생략하겠습니다. 자세한 내용은 아래를 참조하세요

max_seq_lenght와 batch size, gradient accumulation 값은 Colab의 16G 메모리를 고려한 설정입니다.

더 큰 메모리를 가지고 있는 GPU를 사용할 수 있다면 해당 값을 조정하면서 학습 속도를 높일 수 있을 것입니다.

max_seq_lenght와 batch size, gradient accumulation 값은 Colab의 16G 메모리를 고려한 설정입니다.
더 큰 메모리를 가지고 있는 GPU를 사용할 수 있다면 해당 값을 조정하면서 학습 속도를 높일 수 있을 것입니다.

max_seq_lenght와 batch size, gradient accumulation 값은 Colab의 16G 메모리를 고려한 설정입니다.
더 큰 메모리를 가지고 있는 GPU를 사용할 수 있다면 해당 값을 조정하면서 학습 속도를 높일 수 있을 것입니다.

아쉽게도 colab의 gpu runtime 시간 제한으로 1 epoch도 돌리지는 못할 것입니다. 약 3,000 step 정도 가능할 것으로 보이는데, 가용 시간을 확인해서 max_steps을 조절 하시기 바랍니다.

그리고 이렇게 학습이 충분히되지 못하면 모델의 성능에 직접적인 영향을 미칩니다. 이후 추론의 결과는 참고용으로만 봐주세요.

4.4 Finetuned Model 저장

학습이 종료되었으면 학습된 lora weight 를 저장합니다.

학습이 종료되었으면 학습된 lora weight 를 저장합니다.

학습된 LoRA weight를 확인해보면 29M 밖에 되지 않을 정도로 작습니다.

학습된 LoRA weight를 확인해보면 29M 밖에 되지 않을 정도로 작습니다.

이제 LoRA 학습된 weight을 원래 gemma-7b-it 모델과 합쳐 하나의 finetuned 모델로 만들겠습니다.

이제 LoRA 학습된 weight을 원래 gemma-7b-it 모델과 합쳐 하나의 finetuned 모델로 만들겠습니다.

합쳐진 모델을 확인해봅시다. 이제는 하나의 모델로 배포가 가능해지겠네요.

합쳐진 모델을 확인해봅시다. 이제는 하나의 모델로 배포가 가능해지겠네요.

5. Gemma 한국어 요약 모델 추론

이제 네이버 뉴스 요약 데이터로 새롭게 학습된 우리만의 요약 모델을 테스트 해 봅시다.

5.1 Fine-tuned 모델 로드

병합한 모델이 위치한 경로를 지정합니다.

병합한 모델이 위치한 경로를 지정합니다.

5.2 Fine-tuned 모델 추론

pipeline을 구성합니다.

pipeline을 구성합니다.

학습되지 않은 test 데이터셋에서 샘플 하나를 가져 옵니다.

학습되지 않은 test 데이터셋에서 샘플 하나를 가져 옵니다.

prompt를 구성합니다.

prompt를 구성합니다.

추론을 수행합니다.

추론을 수행합니다.

결과

한국동서발전은 다음달 31일까지 울산시민과 함께하는 생활 속 걷기 챌린지 탄소중립 건강걷기 누비GO 초록발자국 챌린지 를 진행한다고 1일 밝혔으며 울산숲사랑운동과 함께 하는 이번 챌린지는 코로나19로 지친 시민들이 일상 속 걷기 운동을 통해 건강을 증진하고 자가용 대신 대중교통을 이용해 탄소중립 사회를 실현하기 위해 마련됐다.

여기까지 ‘sLLM, Gemma 파인튜닝 예’에 대해 소개해드렸습니다. 유익한 정보가 되셨길 바랍니다. 감사합니다. 

Written by 박 지호 / Innovate AI실

BESPIN GLOBAL