오늘은 허깅페이스를 소개하고 사용하는 법에 대해 잘 정리되어 있는 튜토리얼을 정리해보려고 합니다.
기업 스토리 & 서비스 소개
허깅페이스는 딥러닝 개발자들의 깃헙이라고 이해했는데 해당 기업에 대해 간단하게 소개해보고 넘어가보려 한다. 출처는 Contrary Research의 HuggingFace analysis 글을 토대로 작성했다. 라이브러리 사용의 글이니 정말 간단하게만 작성했다.
기업 스토리
1. 처음에는 10대 청소년과 상호작용할 수 있는 챗봇 서비스로 시작했음.
2. 챗봇 서비스를 구현하다보니 그 기반인 NLP 모델을 오픈소스화하기 시작했고 이게 개발자 커뮤니티에서 순식간에 인기를 얻었음.
3. 챗봇 서비스를 포기하고 대규모 NLP 모델을 수집해서 오픈 소스로 제공하기 시작한게 오늘의 허깅페이스가 되었음.
무엇이 다른지?
이전까지는 모델을 사용하려면 각 회사의 깃헙에 들어가서 불러왔다면 허깅페이스에서는 transformers, diffusers라는 라이브러리 내부적으로 다양한 모델에 한번에 접근할 수 있도록 만들어줬다는 점이 인상깊다. 그렇게 오픈소스 커뮤니티를 내부적으로 만들었고 오늘날 많은 연구자들이 그 속에서 다양한 기능(AI 제품을 구현하는데 필요한 다양한 지원 도구)들을 붙여나간게 오늘날의 허깅 페이스다.
현재 기업가치(2023.8월 기준)는 6조로 평가받고 있다.
세부 기능
1. autotrain : 데이터만 올리면 원하는 모델들에 대해서 파인튜닝 해주는 기능을 지원한다.
2. inference api : model만 구현되어 있으면 인프라 관련 설정들을 허깅페이스에서 자동으로 지원해주는 기능
3. 기타 mlops 도구들 : hardware 가속화 관련 기능 제공
사전 용어 사전
튜토리얼
Diffusers 소개
가장 관심있는 분야가 비디오,이미지 분야이기 때문에 우선 HuggingFace에 나와있는 Diffusers의 튜토리얼을 기준으로 정리를 해보았다. 허깅페이스는 현재 생성 AI, LLM 기반이 되는 모델들을 각각 Diffusers, Transformers라는 라이브러리에서 쉽게 가져와서 사용할 수 있도록 제공하고 있다.(High-level end-to-end class라고 하는데 쉽게 말해 추상화를 엄청 시켜서 유저와 시스템을 바로 연결해줘서 사용하기 쉽다라고 이해하면 좋을 것 같다.)
허깅페이스 라이브러리에서 공통적으로 Pipeline이라는 개념이 있는데 이것이 위에서 말한 High-level end-to-end 개념을 구현하기 위해 필요한 기능이라고 볼 수 있다. 파이프라인은 추론을 위해 모델을 실행하는 빠르고 쉬운 방법으로, 이미지를 생성하는 데 코드가 4줄 이상 필요하지 않습니다
좀 더 자세히 배우겠지만 아래 2줄을 통해서 내가 원하는 모델을 바로 불러들일 수 있다.
from diffusers import DiffusionPipeline
pipeline = DiffusionPipeline.from_pretrained("dataautogpt3/OpenDalleV1.1")
from diffusers import DDPMPipeline
ddpm = DDPMPipeline.from_pretrained("google/ddpm-cat-256", use_safetensors=True).to("cuda")
image = ddpm(num_inference_steps=25).images[0]
image
파이프라인 뜯어보기(모델 및 스케줄러 이해하기)
위에서 파이프라인을 단순히 활용하는 것만으로도, 바로 이미지를 생성할 수 있었다. 최대한 추상화한 것이기 때문에 이 속에 무엇이 들어있는지 튜토리얼에서는 이를 뜯어보았다.
위의 파이프라인에는 UNet2DModel과 DDPMScheduler가 포함되어 있는데 이러한 코드로 작성해서 똑같이 구현할 수 있다. 단 4줄이.. 20줄이 되었고, 커스터마이징 해줘야할 것도 매우 많다.
from diffusers import DDPMScheduler, UNet2DModel
scheduler = DDPMScheduler.from_pretrained("google/ddpm-cat-256")
model = UNet2DModel.from_pretrained("google/ddpm-cat-256", use_safetensors=True).to("cuda")
scheduler.set_timesteps(50)
#모델이 이미지의 노이즈를 제거하는 시간 간격을 조정한다.
scheduler.timesteps tensor([980, 960, 940, 920, 900, 880, 860, 840, 820, 800, 780, 760, 740, 720, 700, 680, 660, 640, 620, 600, 580, 560, 540, 520, 500, 480, 460, 440, 420, 400, 380, 360, 340, 320, 300, 280, 260, 240, 220, 200, 180, 160, 140, 120, 100, 80, 60, 40, 20, 0] ))
import torch
sample_size = model.config.sample_size
noise = torch.randn((1, 3, sample_size, sample_size), device="cuda")
input = noise
#Unet2DModle.forward()를 하고 노이즈 잔여를 반환시킨다.
for t in scheduler.timesteps:
with torch.no_grad():
noisy_residual = model(input, t).sample
previous_noisy_sample = scheduler.step(noisy_residual, t, input).prev_sample
input = previous_noisy_sample
#이미지로 변환
from PIL import Image
import numpy as np
image = (input / 2 + 0.5).clamp(0, 1).squeeze()
image = (image.permute(1, 2, 0) * 255).round().to(torch.uint8).cpu().numpy()
image = Image.fromarray(image)
image
좀 더 복잡한 모델을 Pipeline을 통해서 구현하는 코드도 있는데 이건 별도 포스트에서 정리해보려고 한다.
AutoPipeline
계속 모델이 업데이트되고 있기 때문에 현재 기준으로도 제공하고 있는 모델이 너무 많다. 추가로 우리가 대부분 모델은 알고 있지만 사실 상위 클래스를 다 기억하기에는 어려워서 이런 편의를 위해 만들어진 기능이 AutoPipeline이다.
하지만, Task자체와 활용하려는 모델은 개발자가 알고 있기 때문에 diffusers에서는 Task만 알면 알아서 클래스를 찾아주는 클래스가 있다. 아래는 이를 활용하는 코드이다.
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained(
"runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, use_safetensors=True
).to("cuda")
prompt = "peasant and dragon combat, wood cutting style, viking era, bevel with rune"
image = pipeline(prompt, num_inference_steps=25).images[0]
image
이렇게, runwayml/stable-diffusion-v1-5만 아는 것만으로 알아서 클래스를 찾아서 pipeline을 활용할 수 있다.
튜토리얼이 다는 아니고 이후에 훈련이나, LoRA를 붙이기, 추론 가속화를 위한 장치가 있는데 이는 추후에 공부하면서 정리할 예정이다.
참고 링크
1. 허깅페이스 Diffuser 튜토리얼 : https://huggingface.co/docs/diffusers/using-diffusers/write_own_pipeline
'Machine Learning > 공부 기록' 카테고리의 다른 글
랭체인 튜토리얼 (0) | 2024.01.31 |
---|---|
A/B 테스트에서의 양측검정 vs 단측검정 (0) | 2023.10.12 |
시각적 이해를 위한 머신러닝 5~7강 (1) | 2023.10.02 |
시각적 이해를 위한 머신러닝 3, 4강 (0) | 2023.09.28 |
시각적 이해를 위한 머신러닝 1~2강 (Machine learning for Visual Understanding) (0) | 2023.09.28 |