AI 공부

5. Hugging Face 오픈소스 모델 다운 및 이용 (feat. Stable Diffusion, Speech T5)

kdb1248 2026. 2. 8. 17:39

 

목차

1. Day11 - Hugging Face/Google Colab 세팅. Stable Diffusion (text-to-image), SpeechT5(TTS) 모델 이용

 


3주 차 (day 11~15)는 허깅페이스를 활용한 오픈소스 모델들을 이용해 보는 시간이었다. 

1. Day11 - Hugging Face/Google Colab 세팅. Stable Diffusion (text-to-image), SpeechT5(TTS) 모델 이용

실제 오픈소스 모델을 직접 허깅페이스를 통해 다운 받고, google colab의 T4 (공짜 gpu)로 돌려보기 위한 사전 세팅 작업을 한 뒤,  여러 모델을 직접 돌려볼 수 있는 시간이었다. 

 

특히, AI 관련 사업 실무를 하면서 "허깅페이스에 있는 오픈소스 모델들은 다운 받아서 쓸 수 있어요! " 같은 말들을 많이 하고 또 들었었다. 

실제로 허깅페이스에 있는 모델 다운은 어떻게 할 수 있는 것인지, 그리고 다운 받은 모델을 이용하기 위해 어떤 과정들을 거치는지 (pipeline 이용 등)을 가볍게 직접 경험해 볼 수 있는 시간이었다. 

 

또 그과정에서 transformer 계열 모델이 아닌 diffusion 모델 계열이 어떻게 작동하는지, tts 모델은 어떻게 작동하는지도 경험해 볼 수 있는 시간이었다. 

 

1) 허깅페이스와 친숙해지기

- 허깅페이스 웹사이트를 직접 돌아다녀 보며 각각의 페이지

   1) datasets (데이터셋을 공개해 둔 공간)

   2) models (각종 모델들을 올려놓은 공간)

   3) spaces (다른 사람들이 볼 수 있게 ai 앱들을 호스팅 해놓은 공간)

가 어떤 역할을 하는지 볼 수 있었다. 

허깅페이스의 다양한 페이지들. 왼쪽부터 datasets, models, spaces

 

2) 허깅페이스 vs Ollama 비교

1주차에 다뤘던 Ollama 도 오픈소스 모델을 직접 다운받아 쓸 수 있는 서비스인데 이와 허깅페이스와의 차이를 정리할 수 있었다 

 

한마디로 정리하면 Ollama는 이미 완성되어 있는 모델을 서빙하기 위한 엔진으로 모델 튜닝이 불가하지만, 

허깅페이스는 코드단에서 모델 튜닝, 토크나이저 수정 등의 작업이 가능하다는 점이었다. 

 

아래는 상세 비교표이다. 

구분 Ollama Hugging Face
핵심 목적 로컬에서 LLM 실행 LLM 개발·실험·조작
주요 사용처 데모, PoC, 개인용 챗봇 연구, 파인튜닝, 서비스 개발
실행 방식 C/C++ 기반 런타임 (llama.cpp 계열) Python + PyTorch / TensorFlow
로컬 실행 가능 (기본) 가능
Python 코드 접근 ❌ 불가 ✅ 가능
신경망 구조 접근 ❌ 불가 ✅ 가능
레이어 수정 ❌ 불가 ✅ 가능 (freeze / replace 등)
토크나이저 조작 ❌ 불가 ✅ 가능
토큰 추가/삭제 ❌ 불가 ✅ 가능
Fine-tuning ❌ 불가 ✅ 가능 (LoRA, QLoRA 등)
학습(Training) ❌ 불가 ✅ 가능
추론(Inference) ✅ 가능 ✅ 가능

 

3) Stable Diffusion XL 모델 이용 이미지 생성 (Text-to-image) 

: Hugging Face Diffusers 라이브러리를 이용해 모델을 로드하고, 

: 텍스트 프롬프트를 입력해 GPU에서 이미지 1장을 생성한 뒤 시각화 했다. 

from IPython.display import display
from diffusers import DiffusionPipeline
import torch

pipe = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16, use_safetensors=True, variant="fp16")
pipe.to("cuda")

prompt = "A class of data scientists learning AI engineering in a vibrant high-energy pop-art style"

image = pipe(prompt=prompt, num_inference_steps=30).images[0]

display(image)

 

a. Diffusion 모델 로드

- torch_dtype=torch.float16 (모델 파라미터를 fp16으로 로드해 VLAM을 절약+ 추론 속도 높임)

- variant="fp16 (같은 모델이라도 여러 가중치 버전 중 fp16 전용 파일을 사용)  

-> 모델을 "메모리에 올리는 단계 " 

 

b. gpu로 이동 

- pipe.to("cuda") 

-> 모델 전체를 GPU 메모리(VRAM)로 이동

 

c. 프롬프트 정의 

- 자연어로 이미지의 내용 및 스타일 설명

 

d. 이미지 생성(inference) 

image = pipe(prompt=prompt, num_inference_steps=30).images[0]

- 랜덤 노이즈에서 시작해 Diffusion(노이즈 제거) 과정을 30 step 반복해, 텍스트 프롬프트에 맞게 점점 이미지 형성 

- inference steps 값이 클수록 품질은 높아지지만 속도는 느려짐

 

* infernece steps?

- Diffusion 모델에서 inference steps는 “이미지를 복원하는 과정에서 몇 번의 노이즈 제거 단계를 거칠 것인가”를 의미

- Diffusion 모델은 2단계로 작동함 

  1. Foward process (학습 때)

  : 이미지를 점점 더 노이즈로 바꾸는 과정 
  -> 수백~천 단계(Timesteps, 예: 1000 steps) 동안 노이즈를 추가

x₀ → x₁ → x₂ → ... → x_T (완전한 노이즈)

 

  2. Reverse process (추론 때) 

  : 완전한 노이즈에서 원본 이미지를 역방향으로 복원하는 과정

   -> 이때 거치는 단계 수가 inference steps

- "노이즈 -> 이미지"를 몇 번의 정제 단계로 복원할 것인가가 inference steps의 의미

생성된 이미지 (팝아트 스타일 데이터 사이언티스트)
모델이 gpu에 로딩 된 과정을 볼 수 있음 (GPU 사용량: 12.7/15 GB)

 

4) Stable Diffusion XL (Base + Refiner) 2-단계 생성 파이프라인

: 이번엔 Stable Diffusion XL 모델을 그냥 쓰는 게 아니라 Base 모델과 Refiner 모델을 나눠 쓰는 구조로 써봤다. 

  • Base는 전체 구조·구도(거친 그림)를 만들고
  • Refiner는 디테일·질감·마무리를 담당한다.
  • 이 코드는 노이즈 제거 과정을 80% / 20%로 분리해 두 모델이 협업하게 만든 것이다

 

from diffusers import DiffusionPipeline
import torch

base = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16, variant="fp16", use_safetensors=True)
base.to("cuda")
refiner = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-xl-refiner-1.0", text_encoder_2=base.text_encoder_2, vae=base.vae, torch_dtype=torch.float16, use_safetensors=True, variant="fp16",)
refiner.to("cuda")

# Define how many steps and what % of steps to be run on each experts (80/20) here
n_steps = 40
high_noise_frac = 0.8

prompt = "A class of data scientists learning AI engineering in a vibrant high-energy pop-art style"

# run both experts
image = base(
    prompt=prompt,
    num_inference_steps=n_steps,
    denoising_end=high_noise_frac,
    output_type="latent",
).images

image = refiner(
    prompt=prompt,
    num_inference_steps=n_steps,
    denoising_start=high_noise_frac,
    image=image,
).images[0]

display(image)

a. base 모델 로드 

- 러프 스케치를 담당하는 base 모델을 먼저 로드시킨다. 

 

b. Refiner 모델 로드 

text_encoder_2=base.text_encoder_2
vae=base.vae
  • 텍스트 해석 기준 통일
  • latent 공간 일관성 유지
  • Base → Refiner 전환 시 이미지 붕괴 방지

c. Diffusion step 분할 설정

  • 전체 diffusion step: 40
  • Base 담당: 0 ~ 80% (32 step)
  • Refiner 담당: 80 ~ 100% (8 step)

-> Base는 노이즈가 많은 구간,

-> Refiner는 노이즈가 거의 제거된 구간을 담당

 

d. base 모델 실행 (latent 출력) 

- 이미지가 아닌 latent representation 출력 

 

e. Refiner 모델 실행 

 

f. 이미지 출력 

 

조금 더 프롬프트에 맞는 고퀄 이미지가 출력
GPU는 이전에 비해 더 아슬아슬하게 사용됨 (GPU사용량: 14.4/15GB)

 

5) SpeechT5 모델 활용 음성 합성 (TTS)

: SpeechT5 기반 TTS 모델을 사용해, 텍스트를 특정 화자의 목소리로 음성합성 후 재생

from transformers import pipeline
from datasets import load_dataset
import soundfile as sf
import torch
from IPython.display import Audio

synthesiser = pipeline("text-to-speech", "microsoft/speecht5_tts", device='cuda')
embeddings_dataset = load_dataset("matthijs/cmu-arctic-xvectors", split="validation", trust_remote_code=True)
speaker_embedding = torch.tensor(embeddings_dataset[7306]["xvector"]).unsqueeze(0)
speech = synthesiser("Hi to an artificial intelligence engineer, on the way to mastery!", forward_params={"speaker_embeddings": speaker_embedding})

Audio(speech["audio"], rate=speech["sampling_rate"])

 

a. TTS 파이프라인 생성 
- task: "text-to-speech"
- model: SpeechT5
- device: GPU 사용 (cuda)
-> 내부적으로는 

 

  • 텍스트 인코딩
  • 음성 프레임 예측
  • waveform 생성
    을 전부 캡슐화해 줌

 

 

 

 

b. 화자 임베딩 데이터셋 로드 

embeddings_dataset = load_dataset("matthijs/cmu-arctic-xvectors", split="validation", trust_remote_code=True)

- CMU ARCTIC 음성 기반 각 화자의 x-vector (speaker embedding)를 제공
- “이 목소리는 이런 특성을 가진 화자다”라는 숫자 벡터

 

c. 특정 화자 선택 

speaker_embedding = torch.tensor(embeddings_dataset[5000]["xvector"]).unsqueeze(0)

- xvector: 화자의 음색, 억양, 발성 특성을 압축한 고정 길이 벡터 

- 이 코드 한 줄이 텍스트를 이 사람 목소리로 읽어라 라는 지시

 

d. 음성 합성 (inference) 

speech = synthesiser("Hi to an artificial intelligence engineer, on the way to mastery!", forward_params={"speaker_embeddings": speaker_embedding})

- forward_params : 파이프라인 내부 모델에 추가 파라미터 전달 

- speaker_embeddings : speaker embedding 만 바꾸면 전혀 다른 목소리 나옴 

 

e. 오디오 재생

Audio(speech["audio"], rate=speech["sampling_rate"])

 

  • waveform 배열을
  • 지정된 sampling rate로
  • Jupyter에서 즉시 재생

아래는 xvector를 5000, 7306 각각으로 했을 때 나온 음성 합성 예시 (5초짜리) 들이다. 

 

 

음성 합성 예시_xvector 5000.wav
0.12MB
음성 합성 예시_xvector 7306.wav
0.15MB

 

 

 

 


이번글에선 허깅페이스를 처음으로 간단하게 이용해 보며, 오픈소스 모델을 다운 받아 text-to-image 나, TTS를 해본 내용을 담았다. 특히나 일하면서 많이 언급만 했던 "허깅페이스를 통한 오픈소스 모델 다운" 프로세스를 경험해 봤다는 거 자체가 큰 의미가 있었다.

 

다음 글에선 허깅페이스의 pipeline 등의 라이브러리를 좀 더 깊게 파보며 다양한 모델 task를 해봤던 내용과, 가능하다면 tokenizer 관련 내용도 좀 더 깊게 작성해보고자 한다. 

 

(꾸준히 공부하고, 적을 테니 많은 관심 부탁드립니다.)

 

Profile:

Linkedin