주제

1. Foundation 모델의 종류
2. Hugging Face
3. Hugging Face를 활용한 분석 실습

 

1. Foundation 모델의 종류

1.1 Foundation 모델이란?

  • 대규모 사전 학습 모델로, 자연어 처리, 컴퓨터 비전 등 인공 지능의 다양한 분야에 혁신을 가져옴
  • 광범위한 데이터 세트에 대해 학습되고, 파인 튜닝이 가능함
  • 프로그래밍에서 라이브러리를 사용하는 것과 흡사함

1.2 분야별 대표 Foundation 모델

  • NLP 모델
    • GPT, BERT
  • 비전 모델
    • ResNet, VGG, Inception과 같은 CNN 기반 모델들
    • Vision Transformers(VIT)처럼 트랜스포머 기반의 모델들도 존재
  • 멀티모달 모델
    • GPT4
  • 오디오/스피치 모델
    • WaveNet, BERT for Audio

 

2. Hugging Face

2.1 소개

  • 오픈 소스 AI 개발 관련 최고의 사이트(HuggingFace)

HuggingFace의 모습

 

2.2 제공하는 기능

  • HuggingFace Hub : 모델과 코드와 데이터셋 저장소(100,000개 이상의 데이터셋과 480,000이상의 모델이 존재)
  • 다양한 오픈소스 기반 AI 모델링 라이브러리 : 사용하기 쉽고 직관적
  • ML 애플리케이션 서비스
    • Spaces : 사용자들이 머신 러닝 애플리케이션을 구축하고 공유할 수 있는 플랫폼
    • Inferece Endpoints : 모델 추론 서비스
  • HuggingFace 자체 모델 : Bloom, StarCoder, Idefics
  • HuggingChat : 오픈소스 챗봇

 

2.3 인기 모듈

  1. transformers :
    • 텍스트 분류, 정보 추출, 질문 답변, 요약, 번역 등 NLP 작업을 위해 설계된 광범위한 사전 학습된 모델을 제공하는 자연어 처리를 위한 종합 라이브러리
    • 딥러닝 프레임워크를 기반으로 구축되어 연구자와 실무자에게 유연성과 사용 편의성을 제공
  2. datasets :
    • NLP 영역에서 데이터셋을 로드, 처리 및 평가하고 다른 머신 러닝 작업을 위해 설계된 강력하고 사용하기 쉬운 라이브러리
    • transformer 라이브러리를 보완하는 HuggingFace 에코시스템의 일부
  3. AutoTrain : 
    • ML 모델 빌딩 프로세스를 자동화해주는 라이브러리
  4. Diffuser :
    • Diffusion 모델을 훈련하거나 파인튜닝하거나 배포 가능하게 해주는 라이브러리
  5. Accelerate :
    • 하드웨어에 관계없이 모델을 훈련하고 실행 가능하게 해주는 라이브러리
  6. Optimum : 
    • Foudation 모델의 파인튜닝을 특정 하드웨어(인텔의 OpenVINO, 엔비디아의 TensorRT) 위에서 최적화해주는 라이브러리

 

3. Hugging Face를 활용한 분석 실습

3.1 텍스트 분석

  • Few-shot Learning : NLP 및 비전 분야의 접근 방식
    • 모델이 훈련을 위해 라벨이 지정된 대규모 데이터 세트가 필요 없이 작업을 처리하도록 만들어진 것을 말함
    • 최소한의 예제 만으로 작업을 이해하고 수행하는 모델 생성을 목표로 하는 학습 방법에 속함(Transfer Learning)
    • Zero-Shot : 예제 없이 바로 새로운 테스크 학습에 사용하는 것
    • One-Shot : 예제 하나를 가지고 학습을 하고 사용하는 것
    • Few-Shot : 적은 수의 예제를 갖고 훈련하는 것. 보통 Final layer만 새로 추가하는 형태로 감
  • 이번 실습에서는 Zero-Shot 학습을 이용

3.1.1 Fine-Tuning vs. Transfer Learning

  • 차이점 :
    • Transfer Learning은 한 모델을 활용하여 다른 작업을 시작하는 모든 시나리오를 포괄하는 광범위한 개념
    • Fine-Tuning은 Transfer Learning의 특정 기술로, 사전 학습된 모델을 약간 조정하는 것
  • 적용 :
    • Transfer Learning은 사전 학습된 모델을 특징 추출기로 사용한 다음 해당 특징을 기반으로 새로운 분류기를 학습하는 등 다양한 방식으로 적용 가능
    • Fine-Tuning은 새로운 데이터 세트에 대해 사전 훈련된 모델을 계속 훈련하는 프로세스
  • 훈련 깊이 :
    • Transfer Learning에서는 모델의 기본 레이러를 완전히 동결하고 네트워크의 일부만 훈련 가능
    • Fine-Tuning에서는 일반적으로 새로운 데이터에 더 잘 맞도록 학습된 표현을 약간 조정하기 위해 더 많은 모델 레이어가 훈련 프로세스에 포함됨

 

  • 이번 텍스트 분석 실습에 사용해볼 모델은 페이스북의 bart-large-mnli

  • 이 모델을 이용하여 텍스트 감정 분류(sentiment classification)를 실습
  • 사용법 :
from transformers import pipeline
classifier = pipeline("zero-shot-classification",
                      model="facebook/bart-large-mnli")
                      
sequence_to_classify = "one day I will see the world"
candidate_labels = ['travel', 'cooking', 'dancing']
classifier(sequence_to_classify, candidate_labels)
  • 분류기 다운로드

  • 문장 분류 실행
  • 레이블 중 travel 즉, 여행에 대한 문장이라는 결과가 나왔다.
  • 문장은 실제 여행에 대한 문장이 맞기 때문에 잘 분류가 되었다고 볼 수 있다

문장 분류 결과

  • 두번째 문장은 핸드폰에 문제가 있으니 빨리 수리가 필요하다는 부정적인 느낌을 주는 문장이다
  • 분류 결과는 다음과 같다 :

부정적으로 분류가 잘 된 모습

 

3.2 이미지 분석

  • 두가지 작업 실습 :
    1. 개/고양이 이미지 분류 작업 실습
      • OpenAI의 clip-vit-base-patch32를 사용
      • 이미지와 텍스트를 모두 이해하고 이미지에 대한 설명을 텍스트로 제공하여 이를 기반으로 이미지를 분류하는 zero-shot learning이 가능 
        1. Stable Diffusion으로 이미지 생성 작업

3.2.1 개/고양이 이미지 분류 작업

  • 모델과 프로세서 초기화와 레이블 지정 작업
from transformers import CLIPProcessor, CLIPModel

# 모델과 프로세서 초기화
model_name = "openai/clip-vit-base-patch32"
model = CLIPModel.from_pretrained(model_name)
processor = CLIPProcessor.from_pretrained(model_name)

# 분류한 레이블 정의
labels = ["a dog", "a cat"]
  • 사용할 이미지는 3개 : 고양이, 강아지, 강아지 3마리

cat.jpeg
dog.jpeg
dogs.jpeg

  • 이미지를 분류할 함수
from PIL import Image

def classify(file_path):
  # 이미지 로드
  image = Image.open(file_path)

  # 이미지와 텍스트를 모델에 입력하기 위한 처리
  inputs = processor(text=labels, images=image, return_tensors='pt', padding=True)
  # 모델 예측
  outputs = model(**inputs)

  # 로짓스(scores)에서 softmax를 사용하여 확률 얻기
  probs = outputs.logits_per_image.softmax(dim=1)

  # 확률 출력
  for label, prob in zip(labels, probs[0]):
    print(f'{label}: {prob:.4f}')
  • 이미지 분류 실행
classify('dog.jpeg')

개로 분류

classify('cat.jpeg')

고양이로 분류

classify('dogs.jpeg')

3마리 강아지 역시 강아지로 분류

 

3.2.2 Stable Diffusion 실습

  • 런타임을 반드시 GPU로 선택!(CPU에서는 실행되지 않음)
  • 텍스트로 지문을 입력하면 지문에 기반한 이미지를 생성해주는 모델
  • 모델 가져오기
    • 빠른 생성을 위해 EulerDiscreteScheduler를 사용
!pip install diffusers

from diffusers import StableDiffusionPipeline, EulerDiscreteScheduler
import torch

# EulerDiscreteScheduler: https://huggingface.co/docs/diffusers/en/api/schedulers/euler

model_id = "stabilityai/stable-diffusion-2"
scheduler = EulerDiscreteScheduler.from_pretrained(model_id, subfolder="scheduler")
pipe = StableDiffusionPipeline.from_pretrained(model_id, scheduler=scheduler, torch_dtype=torch.float16)

# device = "cuda" if torch.cuda.is_available() else "cpu"
pipe = pipe.to("cuda")
  • 입력 프롬프트 작성
    • 화성에서 말을 타고 있는 우주비행사의 사진
prompt = "a photo of an astronaut riding a horse on mars"
image = pipe(prompt).images[0]
  • 츨력된 이미지

  • 더 나은 이미지를 위해 num_inference_steps 늘려보기 (기본값은 50)
  • 100일 때의 이미지 :

  • 200일 때의 이미지 :

 

3.3 LLM 사용

  • 사용 방법 :
    • 모델을 다운받아서 로컬에서 사용 (컴퓨터의 사양에 따라 불가능한 모델도 존재)
    • HuggingFace Hub에 있는 모델을 API 형태로 사용

3.3.1 Text Generation vs. Text2Text Generation

  • Text Generation
    • Language Model 본연의 동작. 주어진 문장의 다음 단어 입력
    • Decoder Only : gpt2-medium
  • Text2Text Generation
    • ChatGPT처럼 문장에 대해 답을 주는 방식으로 동작
    • Encoder-Decoder: google/flan-t5-large

3.3.2 HuggingFace Hub 모드로 사용해보기(API 모드)

  • HuggingFace 계정으로 받은 토큰을 이용
  • Settings → Access Token 메뉴에서 발급

토큰 발급

!pip install -q langchain
!pip install -q huggingface_hub
!pip install -q sentence-transformers
import os
from langchain import HuggingFaceHub

os.environ['HUGGINGFACEHUB_API_TOKEN'] = '토큰 입력'
llm=HuggingFaceHub(
        repo_id="google/flan-t5-large",
        model_kwargs={
            "temperature":0,
            "max_length":64
        }
    )
  • 질문 프롬프트 작성
    • 프랑스의 수도는?
question = "What is the capital of France?"

print(llm.invoke(question))

출력 결과

3.3.3 로컬에서 사용하기(로컬 모드)

  • 이점 :
    • fine-tuned 모델
    • GPU 호스팅
    • 어떤 모델은 로컬 환경에서만 작동함
  • T5-Flan 사용
from transformers import AutoTokenizer, pipeline, AutoModelForSeq2SeqLM

model_id = 'google/flan-t5-large'# go for a smaller model if you dont have the VRAM
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForSeq2SeqLM.from_pretrained(model_id) # , load_in_8bit=True)

local_llm = pipeline(
    "text2text-generation",
    model=model,
    tokenizer=tokenizer,
    max_length=100
)
  • 프롬프트 작성
    • 대한민국의 수도는?
print(local_llm('What is the capital of Korea? '))

생성된 단어

  • GPT2-medium 사용
model_id = "gpt2-medium"

local_llm = pipeline(
    "text-generation",
    model = model_id,
    max_length=100
)
  • 프롬프트 작성
    • "kpop은"
question = "kpop is"
print(local_llm(question, max_length=30, num_return_sequences=5))

출력 결과

 

3.4 TTS 기능 구현

  • Bark 모델을 이용하여 한국어 문장을 오디오로 생성하는 모델
  • 모델 다운로드
!pip3 install bark
from bark import SAMPLE_RATE, generate_audio, preload_models
from IPython.display import Audio

# download and load all models
preload_models()
  • 오디오로 생성할 문장 프롬프트 작성
# generate audio from text
text_prompt = """안녕하세요? 최정혜입니다. 저는 데이터 분석가입니다."""
speech_array = generate_audio(text_prompt)
  • 오디오 재생
# play text in notebook
Audio(speech_array, rate=SAMPLE_RATE)

barkTTS.wav
0.28MB

 

+ Recent posts