데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      OpenLab - OpenLLM, LLama 2 : 모델 파인튜닝 및 추론까지

      issuure 24.05.08
      154 1 0
      DEVOTEE 요약
      OpenLLM 스터디에서 각 스터디원은 Llama, Gemma, Mistral 등의 LLM 모델 중 하나를 선택해 학습부터 추론까지의 과정을 실습했습니다. Llama2 - 7b 모델을 선택해 한국어 뉴스 요약 데이터셋을 학습시키고, 학습된 모델을 활용해 추론 과정을 수행했습니다. 모델 학습을 통해 Quantization 기법을 이해했으며, 리소스 제한이 있다는 것을 경험했습니다.
      DEVOTEE 추천 블로그

      스터디 소개

      OpenLLM 스터디

      5/8 스터디 전까지, 각 스터디원은 Llama, Gemma, Mistral 등의 LLM 모델 중 원하는 것을 선택하여 학습부터 추론까지의 코드를 돌려보는 것을 목표로 하였습니다.

      저는 Llama2 - 7b 모델 을 선택하였고, 모델을 활용해 추후 필요한 영역에 사용하는 것이 목표입니다.


      추후 수정사항이 생길 경우 내용 수정을 통해 내용을 업데이트 하겠습니다.

      개발 환경

      • Colab Pro, T4

        • 시스템 RAM 51.0GB

        • GPU RAM 15.0GB

        • 디스크 201.2 GB


      (1) 라이브러리 설치 및 로드

      !pip install transformers datasets bitsandbytes peft trl accelerate --upgrade -qqq
      !pip install -U huggingface_hub
      !pip3 install -q -U datasets==2.18.0
      import torch
      from datasets import Dataset, load_dataset
      from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig, pipeline, TrainingArguments
      from peft import LoraConfig, PeftModel
      from trl import SFTTrainer


      (2) 데이터셋 로드

      HuggingFace 로그인

      from huggingface_hub import notebook_login
      notebook_login()

      각자 Huggingface 토큰을 사용하여 로그인합니다.

      데이터셋 로드

      dataset = load_dataset("daekeun-ml/naver-news-summarization-ko")

      한국어 파인튜닝을 진행할 것이기 때문에, 한국어 뉴스 요약 데이터셋을 로드합니다.


      학습 데이터를 확인해보면 아래와 같습니다.

      dataset['train']

      Dataset({
          features: ['date', 'category', 'press', 'title', 'document', 'link', 'summary'],
          num_rows: 22194
      })

      dataset[’train’][0]

      {'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) 모델 로드

      meta의 모델을 사용하기 위해선, meta에 정보 제공이 필요합니다.


      huggingface/meta-llama에서 개인정보를 작성한 뒤 제출하면 몇 분 뒤 사용 가능합니다.


      image.png


      모델을 로드하는 과정에서 OOM 이슈로 인해, QLora(Quantization + Lora)를 활용합니다.

      BASE_MODEL = "meta-llama/Llama-2-7b-hf"
      
      lora_config = LoraConfig(
          r=8,
          lora_alpha = 8,
          lora_dropout = 0.05,
          target_modules=["q_proj", "o_proj", "k_proj", "v_proj", "gate_proj", "up_proj", "down_proj"],
          bias="none",
          task_type="CAUSAL_LM",
      )
      
      bnb_config = BitsAndBytesConfig(
          load_in_4bit=True,
          bnb_4bit_quant_type="nf4",
          bnb_4bit_compute_dtype=torch.bfloat16
      )
      
      model = AutoModelForCausalLM.from_pretrained(BASE_MODEL,
                                                   quantization_config=bnb_config,
                                                   device_map="auto"
                                                  )


      (4) 모델 학습

      SFTtrainer을 사용해 학습을 진행합니다.


      Max step은 500으로 설정했습니다.

      trainer = SFTTrainer(
          model=model,
          train_dataset=dataset['train'],
          max_seq_length=512,
          args=TrainingArguments(
              output_dir="outputs",
      #        num_train_epochs = 1,
              max_steps=500,
              per_device_train_batch_size=1,
              gradient_accumulation_steps=4,
              optim="paged_adamw_8bit",
              warmup_steps=0.03,
              learning_rate=2e-4,
              fp16=True,
              logging_steps=100,
              push_to_hub=False,
              report_to='none',
          ),
          peft_config=lora_config,
          formatting_func=generate_prompts,
      )
      
      trainer.train()

      [Output]

      Step

      Training Loss

      100

      1.031900

      200

      0.929300

      300

      0.923700

      400

      0.868500

      500

      0.863000

      TrainOutput(global_step=500, 
      training_loss=0.9232814483642579, 
      metrics = {
      'train_runtime': 3351.6021, 
      'train_samples_per_second': 0.597, 
      'train_steps_per_second': 0.149, 
      'total_flos': 4.038108997678694e+16, 
      'train_loss': 0.9232814483642579, 
      'epoch': 0.09011444534558889})


      (5) 모델 저장

      ADAPTER_MODEL = "lora_adapter"
      
      trainer.model.save_pretrained(ADAPTER_MODEL)
      
      model = AutoModelForCausalLM.from_pretrained(BASE_MODEL, device_map='auto', torch_dtype=torch.float16)
      model = PeftModel.from_pretrained(model, ADAPTER_MODEL, device_map='auto', torch_dtype=torch.float16)
      
      model = model.merge_and_unload()
      model.save_pretrained('./Llama-2-7b-hf-finetuned')


      (6) Fine-tuned 모델 로드

      여기 까지 실행 후, 메모리 이슈로 인해 학습된 모델을 로드하지 못하는 경우가 발생합니다.

      학습된 모델을 별도로 저장하고, 런타임을 재시작한 뒤 로드를 실행하는 것이 좋습니다.

      이 때

      BASE_MODEL = "meta-llama/Llama-2-7b-hf"
      FT_MODEL = "./Llama-2-7b-hf-finetuned"
      
      lora_config = LoraConfig(
          r=8,
          lora_alpha = 8,
          lora_dropout = 0.05,
          target_modules=["q_proj", "o_proj", "k_proj", "v_proj", "gate_proj", "up_proj", "down_proj"],
          bias="none",
          task_type="CAUSAL_LM",
      )
      
      bnb_config = BitsAndBytesConfig(
          load_in_4bit=True,
          bnb_4bit_quant_type="nf4",
          bnb_4bit_compute_dtype=torch.bfloat16
      )
      
      ft_model = AutoModelForCausalLM.from_pretrained(FT_MODEL,
      quantization_config=bnb_config, device_map={"":0})
      tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL, add_special_tokens=True)


      (7) 추론

      문장 요약 프롬프트

      def generate_prompts_sentence(example):
          prompt = f"""<|begin_of_text|><|start_header_id|>user<|end_header_id|>다음 글을 요약해주세요:
      {example['document']}<|eot_id|><|start_header_id|>assistant<|end_header_id|>
      {example['summary']}<|eot_id|>"""
          return prompt

      파이프라인

      pipe_finetuned = pipeline("text-generation", model=model2, tokenizer=tokenizer, max_new_tokens=512)

      추론

      outputs = pipe_finetuned(
          generate_prompts_sentence(dataset['test'][number]),
          do_sample=True,
          temperature=0.2,
          top_k=50,
          top_p=0.95,
          add_special_tokens=True
      )
      • number : 각 test set의 Index number


      (8) 결과

      print(outputs[0]['generated_text'][len(generate_prompts_sentence(dataset['test'][number])):])

      test set[0]

      아이일, 아이트로닉스는 차량용 복합기능형 졸음 방지 단말기 특허를 출원했으며 신규 특허는 자동차 주행 중 운전자의 졸음운전을 방지하는 상태 검출 기술에 관한 것으로, 해당 단말기는 가시광선 및 근적외선 광원을 조사하는 광원 모듈 운전자의 얼굴 영상을 촬영하는 가시광선 및 근적외선 카메라 차량 실내의 이산화탄소 농도를 측정하는 이산화탄소 센서로 구성됐다.<|eot_id|>

      아이일, 아이트로닉스는 차량용 복합기능형 졸음 방지 단말기 특허를 출원했으며 신규 특허는 자동차 주행 중 운전자의 졸음운전을 방지하는 상태 검출 기술에 관한 것으로, 해당 단말기는 가시광선 및 근적외선 광원을 조사하는 �

      test set[1]

      한국형 우주발사체 누리호 가 지난 6월 21일 전남 고흥 나로우주센터 발사대에서 날아올라 성공적으로 발사됐다.<|eot_id|>

      한국형 우주발사체 누리호 의 발사 성공에 힘입어 뉴스페이스 시대를 앞당기기 위한 발걸음이 빨라졌다.<|eot_id|>

      우주산업 클러스터가 조성될 지역을 8월중 선정키로 했다.<|eot_id|>

      이를 위해 오는 9월 중 우주산업클러스터 세부 사업의 예비타당성 조사를 신청키로 했다.<|eot_id|>

      예타가 성공적으로 마무리되면 내년에 예산안을 마련해 2024년부터는 본격적으로 클러스터 구축 사업에 착수할 계획이다.<|eot_id|>

      과기정통부는 정한 특화지구 지정원칙에 따르면 지역균형을 고려해 특화지구 지정때 수도권은 후보지에서 제외된다


      결과 및 시사점

      1. LLM의 학습 부터 추론까지 전체적인 사이클을 경험해보며, Quantization 기법에 대해 공부할 수 있었음

      2. 리소스의 제한에 따라 모델 사용의 제한이 크다는 것을 경험함.

      3. Output에서 아직 조금 오류가 있어, 추후 수정 필요


      참고 문헌 및 관련 포스팅

      (1) Gemma 한국어 요약 모델 파인튜닝 빠르게 해보기

      (2) 메타 Llama2 기본적 개념 학습 위한 코드 작성 및 스터디

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      issuure 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기