목차
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 앱들을 호스팅 해놓은 공간)
가 어떤 역할을 하는지 볼 수 있었다.



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의 의미


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. 이미지 출력


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초짜리) 들이다.
이번글에선 허깅페이스를 처음으로 간단하게 이용해 보며, 오픈소스 모델을 다운 받아 text-to-image 나, TTS를 해본 내용을 담았다. 특히나 일하면서 많이 언급만 했던 "허깅페이스를 통한 오픈소스 모델 다운" 프로세스를 경험해 봤다는 거 자체가 큰 의미가 있었다.
다음 글에선 허깅페이스의 pipeline 등의 라이브러리를 좀 더 깊게 파보며 다양한 모델 task를 해봤던 내용과, 가능하다면 tokenizer 관련 내용도 좀 더 깊게 작성해보고자 한다.
'AI 공부' 카테고리의 다른 글
| 7. LLM 양자화(Quantization): 원리부터 코드까지 - GPU 메모리는 왜 4배 줄어들까? (0) | 2026.03.22 |
|---|---|
| 6. 모델별 Tokenizer, special token, chat_template 작동방식 비교 (feat. Llama, Deepseek, Phi, Qwen-Coder) (0) | 2026.03.15 |
| 4. Tool calling 및 멀티모달(음성, 이미지) 적용_Gradio 항공예약 챗봇 (0) | 2026.02.01 |
| 3. Gradio 활용해보기_회사 소개 브로셔 제작 챗봇 (0) | 2026.01.25 |
| 2. Parameter, Token, Tokenizer, Context Window, Transformer (1) | 2025.08.31 |