주제
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)

2.2 제공하는 기능
- HuggingFace Hub : 모델과 코드와 데이터셋 저장소(100,000개 이상의 데이터셋과 480,000이상의 모델이 존재)
- 다양한 오픈소스 기반 AI 모델링 라이브러리 : 사용하기 쉽고 직관적
- ML 애플리케이션 서비스
- Spaces : 사용자들이 머신 러닝 애플리케이션을 구축하고 공유할 수 있는 플랫폼
- Inferece Endpoints : 모델 추론 서비스
- HuggingFace 자체 모델 : Bloom, StarCoder, Idefics
- HuggingChat : 오픈소스 챗봇
2.3 인기 모듈
- transformers :
- 텍스트 분류, 정보 추출, 질문 답변, 요약, 번역 등 NLP 작업을 위해 설계된 광범위한 사전 학습된 모델을 제공하는 자연어 처리를 위한 종합 라이브러리
- 딥러닝 프레임워크를 기반으로 구축되어 연구자와 실무자에게 유연성과 사용 편의성을 제공
- datasets :
- NLP 영역에서 데이터셋을 로드, 처리 및 평가하고 다른 머신 러닝 작업을 위해 설계된 강력하고 사용하기 쉬운 라이브러리
- transformer 라이브러리를 보완하는 HuggingFace 에코시스템의 일부
- AutoTrain :
- ML 모델 빌딩 프로세스를 자동화해주는 라이브러리
- Diffuser :
- Diffusion 모델을 훈련하거나 파인튜닝하거나 배포 가능하게 해주는 라이브러리
- Accelerate :
- 하드웨어에 관계없이 모델을 훈련하고 실행 가능하게 해주는 라이브러리
- 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 이미지 분석
- 두가지 작업 실습 :
- 개/고양이 이미지 분류 작업 실습
- OpenAI의 clip-vit-base-patch32를 사용
- 이미지와 텍스트를 모두 이해하고 이미지에 대한 설명을 텍스트로 제공하여 이를 기반으로 이미지를 분류하는 zero-shot learning이 가능
- Stable Diffusion으로 이미지 생성 작업
- stabilityai의 stable-diffusion-2를 사용
- 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마리



- 이미지를 분류할 함수
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.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)
'Data Science > TIL (Today I Learned)' 카테고리의 다른 글
| 프로그래머스 데이터분석 데브코스 1기 - 74일차 (0) | 2024.03.07 |
|---|---|
| 프로그래머스 데이터분석 데브코스 1기 - 73일차 (0) | 2024.03.06 |
| 프로그래머스 데이터분석 데브코스 1기 - 71일차 (1) | 2024.03.04 |
| 프로그래머스 데이터분석 데브코스 1기 - 70일차 (0) | 2024.03.01 |
| 프로그래머스 데이터분석 데브코스 1기 - 69일차 (0) | 2024.02.29 |