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

신고하기

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

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

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

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

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

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

      임시저장함

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

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

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

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

      회원정보 연결

      허깅 페이스 Trainer API 이용하기

      SSunny 24.11.07
      2,833 8 0
      DEVOTEE 요약
      허깅페이스는 트랜스포머 모델을 쉽게 활용할 수 있는 플랫폼으로, 베이스 모델 및 데이터셋 라이브러리를 제공합니다. 사용자들은 허깅페이스의 지원을 받아 데이터셋을 전처리하고, 트레이너 API를 이용해 모델 학습을 수행할 수 있으며, 학습된 모델을 온라인 허브에 업로드하여 공유할 수도 있습니다. 특히, 사용자 맞춤형 파이프라인 또는 기본 제공 파이프라인을 사용해 모델 예측을 수행하고 이를 토대로 실시간 데이터 처리 및 예측 작업을 쉽게 수행할 수 있습니다.
      DEVOTEE 추천 블로그

      허깅페이스는 인공지은 모델을 쉽게 활용할 수 있는 플랫폼을 제공합니다.

      허깅페이스 트랜스포머는 트랜스포머 모델을 통일된 인터페이스로 사용할 수 있도록 지원하는 오픈소스 라이브러리입니다. (https://huggingface.co/)

      • transformers : 트랜스포머 모델과 토크나이저를 활용할 때 사용하는 라이브러리

      • datasets : 데이터셋을 공개하고 사용할 수 있도록 지원하는 라이브러리

      허깅페이스 허브는 다양한 사전 학습 모델과 데이터셋을 탐색하고 사용할 수 있도록 제공하는 온라인 플랫폼입니다. 모델, 데이터셋, 스페이스를 제공합니다.

      모델은 Multimodal, Computer Vision, 자연어 처리(Natural Language Processing), Audio, Tabular, Reinforcement Learning 등을 제공합니다.

      데이터셋은 task와 라이브러리에 따라 뷰어를 제공하여 데이터를 볼 수 있도록 되어 있습니다. 스페이스를 통해 모델 데모를 공유합니다.


      학습 데이터셋 준비

      허깅페이스 라이브러리를 사용해 KLUE의 연합뉴스 주제 분류(ynat) 데이터셋을 다운로드, 전처리, 분할하는 작업을 수행해 보겠습니다.

      klue 데이터셋의 ynat(연합뉴스 주제 분류) 부분을 불러옵니다. split='train'과 split='validation'으로 각각 훈련과 검증용 데이터셋을 다운로드합니다

      from datasets import load_dataset
      
      #1.모델 학습에 사용할 연합뉴스 데이터셋 다운로드
      klue_tc_train = load_dataset('klue', 'ynat', split='train')
      klue_tc_eval = load_dataset('klue', 'ynat', split='validation')
      
      #2. 실습에 사용하지 않는 불필요한 컬럼 제거
      klue_tc_train = klue_tc_train.remove_columns(['guid', 'url', 'date'])
      klue_tc_eval = klue_tc_eval.remove_columns(['guid', 'url', 'date'])
      
      #3. 카테고리를 문자로 표기한 label_str 컬럼 추가
      klue_tc_train.features['label']
      # ClassLabel(names=['IT과학', '경제', '사회', '생활문화', '세계', '스포츠', '정치'], id=None)
      
      klue_tc_train.features['label'].int2str(1)
      # '경제'
      
      klue_tc_label = klue_tc_train.features['label']
      
      def make_str_label(batch):
        batch['label_str'] = klue_tc_label.int2str(batch['label'])
        return batch
      
      klue_tc_train = klue_tc_train.map(make_str_label, batched=True, batch_size=1000)
      
      #4.학습/검증/테스트 데이터셋 분할
      train_dataset = klue_tc_train.train_test_split(test_size=10000, shuffle=True, seed=42)['test']
      dataset = klue_tc_eval.train_test_split(test_size=1000, shuffle=True, seed=42)
      test_dataset = dataset['test']
      valid_dataset = dataset['train'].train_test_split(test_size=1000, shuffle=True, seed=42)['test']
      1. 다운받은 데이터에서 불필요한 컬럼을 제거(remove_columns 메서드로 'guid', 'url', 'date' 제거)하여 데이터셋 용량을 줄이고 처리 속도를 높입니다.

      2. make_str_label 함수를 정의하여 label 값을 문자열로 변환한 새로운 컬럼 label_str을 추가합니다. map 메서드를 통해 데이터셋의 각 배치(batch)에 함수를 적용합니다.

      3. train_test_split 함수로 데이터셋을 훈련, 검증, 테스트 세트로 분할합니다. shuffle=True로 데이터를 무작위로 섞고, seed=42는 결과를 재현 가능하게 하는 시드입니다.

      각각의 결과는 아래와 같습니다.

      klue_tc_train
      
      Dataset({
          features: ['guid', 'title', 'label', 'url', 'date'],
          num_rows: 45678
      }) 
      
      klue_tc_train[0]
      
      {'guid': 'ynat-v1_train_00000',
       'title': '유튜브 내달 2일까지 크리에이터 지원 공간 운영',
       'label': 3,
       'url': 'https://news.naver.com/main/read.nhn?mode=LS2D&mid=shm&sid1=105&sid2=227&oid=001&aid=0008508947',
       'date': '2016.06.30. 오전 10:36'}
       
       klue_tc_train.features['label'].names
      # ['IT과학', '경제', '사회', '생활문화', '세계', '스포츠', '정치']
      
      klue_tc_train[0]
      # {'title': '유튜브 내달 2일까지 크리에이터 지원 공간 운영', 'label': 3, 'label_str': '생활문화'}


      모델 학습

      허깅 페이스는 학습에 필요한 다양한 기능을 학습 인자만으로 활용할 수 있는 trainer API를 제공합니다.

      KLUE/roberta-base 모델을 사용하여 시퀀스 분류(텍스트 분류) 작업을 수행하는 실습을 트레이너 api 를 사용해 보겠습니다.

      import torch
      import numpy as np
      from transformers import (
          Trainer,
          TrainingArguments,
          AutoModelForSequenceClassification,
          AutoTokenizer
      )
      
      #1. 준비
      def tokenize_function(examples):
          return tokenizer(examples["title"], padding="max_length", truncation=True)
      
      model_id = "klue/roberta-base"
      model = AutoModelForSequenceClassification.from_pretrained(model_id, num_labels=len(train_dataset.features['label'].names))
      tokenizer = AutoTokenizer.from_pretrained(model_id)
      
      train_dataset = train_dataset.map(tokenize_function, batched=True)
      valid_dataset = valid_dataset.map(tokenize_function, batched=True)
      test_dataset = test_dataset.map(tokenize_function, batched=True)
      
      #2. 학습 인자정의
      training_args = TrainingArguments(
          output_dir="./results",
          num_train_epochs=1,
          per_device_train_batch_size=8,
          per_device_eval_batch_size=8,
          evaluation_strategy="epoch",
          learning_rate=5e-5,
          push_to_hub=False
      )
      #3. 평가 함수 정의
      def compute_metrics(eval_pred):
          logits, labels = eval_pred
          predictions = np.argmax(logits, axis=-1)
          return {"accuracy": (predictions == labels).mean()}
      
      #4.학습 진행 
      trainer = Trainer(
      	model=model,
      	args=training_args,
      	train_dataset=train_dataset,
      	eval_dataset=valid_dataset,
      	tokenizer=tokenizer,
      	compute_metrics=compute_metrics,
      )
      
      trainer.train()
      trainer.evaluate(test_dataset) # 정확도 0.84

      1. 준비 단계

      • tokenize_function 함수: 주어진 데이터셋의 title 컬럼을 토크나이즈합니다.

        토크나이저는 지정된 최대 길이까지 패딩하고, 입력을 자릅니다. tokenizer는 KLUE/roberta-base 모델의 토크나이저를 사용합니다.

      • 모델 및 데이터셋 설정: AutoModelForSequenceClassification을 사용하여 시퀀스 분류를 위한 KLUE/roberta-base 모델을 불러옵니다.

        이 모델은 미리 학습된 roberta 모델로, 다중 클래스 분류 작업에 사용됩니다.

      • train_dataset, valid_dataset, test_dataset 각각에 대해 tokenize_function을 적용하여 텍스트를 토큰으로 변환합니다.

      2. 학습 인자 (TrainingArguments) 정의

      모델 학습을 위한 하이퍼파라미터를 정의합니다.

      • output_dir: 학습 결과가 저장될 경로.

      • num_train_epochs: 학습 반복 횟수(1회).

      • per_device_train_batch_size: 학습 시 각 디바이스당 배치 크기(8).

      • evaluation_strategy: 평가 전략(매 epoch마다 평가).

      • learning_rate: 학습 속도.

      3.평가 함수 정의

      • compute_metrics 함수: 평가 시 사용되는 메트릭 함수를 정의합니다. 모델의 출력 로짓(logits)을 통해 예측을 만든 후, 실제 레이블과 비교하여 정확도를 계산합니다.

      4. 학습 및 평가

      • Trainer 정의:Trainer 클래스는 모델 학습, 평가, 예측 등의 작업을 간단하게 처리합니다.

        정의된 model, training_args, train_dataset, valid_dataset, tokenizer, compute_metrics을 사용하여 학습을 진행합니다.

      • 훈련 및 평가: trainer.train()을 호출하여 모델을 학습시킵니다.

        trainer.evaluate(test_dataset)을 통해 테스트 데이터셋에서 모델의 성능(정확도 0.84)을 평가합니다.



      허깅페이스에 모델 업로드

      허깅페이스 허브에 학습한 모델을 업로드하면 필요할때마다 계정에 접속해서 사용할 수 있습니다.

      from huggingface_hub import login
      
      login(token="허깅페이스개인토큰")
      repo_id = f"허깅페이스개인계정/roberta-base-klue-ynat-classification"
      
      trainer.push_to_hub(repo_id)

      결과는 아래와 같습니다. 허깅페이스 확인해 보면 개인계정에 아래와 같이 보입니다.



      추론하기

      모델 추론(Model Inference)은 기계 학습에서 훈련된 모델을 사용하여 새로운 데이터에 대한 예측이나 결정을 내리는 과정입니다.

      이 과정은 모델이 학습 단계에서 습득한 패턴과 관계를 바탕으로 실시간 데이터를 처리하고 결과를 생성하는 것을 포함합니다.

      PyTorch와 Hugging Face의 datasets 및 transformers 라이브러리를 사용하여 텍스트 분류 작업을 수행해 보겠습니다.

      # 실습을 새롭게 시작하는 경우 데이터셋 다시 불러오기 실행
      import torch
      import torch.nn.functional as F
      from datasets import load_dataset
      from transformers import pipeline
      
      dataset = load_dataset("klue", "ynat", split="validation")
      
      model_id = "smjung8710/results"
      model_pipeline = pipeline("text-classification", model=model_id)

      transformers 라이브러리의 pipeline 함수는 사전학습된 모델로 다양한 자연어 처리 작업을 간단히 수행할 수 있는 기능입니다.

      klue 데이터셋의 ynat (연합뉴스 주제 분류) 데이터셋을 다운로드하고, validation (검증) 세트를 불러옵니다. 이 데이터셋은 주제 분류(task)에 사용되는 한국어 데이터셋입니다.

      이 코드는 데이터셋과 분류 모델을 연결하여, 주어진 텍스트에 대해 주제를 예측하는 데 활용될 수 있습니다.


      결과 확인

      custom_pipeline(dataset['title'][:5])
      
      [{'label': '경제', 'score': 0.973315954208374},
       {'label': '사회', 'score': 0.8159481883049011},
       {'label': 'IT과학', 'score': 0.9437124133110046},
       {'label': '경제', 'score': 0.9733883142471313},
       {'label': '사회', 'score': 0.9629247188568115}]

      pipeline 함수를 사용하지 않고 직접 추론하는 아래 코드를 수행하는 방법도 있으니 참고하세요

      import torch
      from torch.nn.functional import softmax
      from transformers import AutoModelForSequenceClassification, AutoTokenizer
      
      class CustomPipeline:
          def __init__(self, model_id):
              self.model = AutoModelForSequenceClassification.from_pretrained(model_id)
              self.tokenizer = AutoTokenizer.from_pretrained(model_id)
              self.model.eval()
      
          def __call__(self, texts):
              tokenized = self.tokenizer(texts, return_tensors="pt", padding=True, truncation=True)
      
              with torch.no_grad():
                  outputs = self.model(**tokenized)
                  logits = outputs.logits
      
              probabilities = softmax(logits, dim=-1)
              scores, labels = torch.max(probabilities, dim=-1)
              labels_str = [self.model.config.id2label[label_idx] for label_idx in labels.tolist()]
      
              return [{"label": label, "score": score.item()} for label, score in zip(labels_str, scores)]
      
      custom_pipeline = CustomPipeline(model_id)

      댓글 0

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

      SSunny 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기