Ver3.0 ๐ Hugging Face Space๋ก AI ์น์ฑ ๋ฐฐํฌํ๊ธฐ: ์ด๋ณด์๋ 10๋ถ์ด๋ฉด ๊ฐ๋ฅ!

๐ Hugging Face Space๋ก AI ์น์ฑ ๋ฐฐํฌํ๊ธฐ: ์ด๋ณด์๋ 10๋ถ์ด๋ฉด ๊ฐ๋ฅ!
๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์น์์ ๋ฐ๋ก ์คํํ ์ ์๋ ๋ง๋ฒ๊ฐ์ ํ๋ซํผ ์์ ์ ๋ณต
๐ฏ ์ด ๊ธ์์ ๋ฐฐ์ธ ๋ด์ฉ
AI ๋ชจ๋ธ ๋ง๋ค์๋๋ฐ ๋จ๋คํํ
๋ณด์ฌ์ฃผ๊ณ ์ถ์๋ฐ ์ด๋ป๊ฒ ํด์ผ ํ ์ง ๋ง๋งํ๋ ์ ์์ฃ ? ใ
ใ
ใ
์๋ฒ ๊ตฌ์ถํ๊ณ ๋๋ฉ์ธ ์ฌ๊ณ ์ด๋ฌ๋ฉด ๋๋ ๋ค๊ณ ๋ณต์กํ๋ฐ์. Hugging Face Space๋ฅผ ์ฐ๋ฉด ์ง์ง 10๋ถ ๋ง์ ๋ฌด๋ฃ๋ก AI ์น์ฑ์ ๋ฐฐํฌํ ์ ์์ด์! ๐
์ด ๊ธ์์๋ Hugging Face Space์ ๊ฐ๋
๋ถํฐ ์ค์ ๋ฐฐํฌ ๊ณผ์ , ๊ทธ๋ฆฌ๊ณ ์ค์ ํ๊น์ง ์๋ฒฝํ๊ฒ ๋ค๋ค๋๋ฆด๊ฒ์. ์ฝ๋ฉ ์ด๋ณด์๋ ๋ฐ๋ผํ ์ ์๊ฒ ์คํ
๋ฐ์ด ์คํ
์ผ๋ก ์ค๋ช
๋๋ฆฝ๋๋ค!
๐ค Hugging Face Space๊ฐ ๋ญ๋ฐ?
Hugging Face๋ ์๋ ์์ฐ์ด์ฒ๋ฆฌ(NLP) ๋ชจ๋ธ๋ค์ ๊ณต์ ํ๋ ํ๋ซํผ์ผ๋ก ์์ํ๋๋ฐ์. ์ง๊ธ์ AI/๋จธ์ ๋ฌ๋ ๋ถ์ผ์์ GitHub ๊ฐ์ ์กด์ฌ๊ฐ ๋์ด์ ใ ใ ใ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ์๊ธฐ๊ฐ ๋ง๋ ๋ชจ๋ธ์ ์ฌ๋ฆฌ๊ณ ๊ณต์ ํ๋ ๊ณณ์ด์ฃ .
๊ทธ์ค์์๋ Hugging Face Space๋ ์ด๋ฐ AI ๋ชจ๋ธ๋ค์ ์น ์ ํ๋ฆฌ์ผ์ด์ ํํ๋ก ๋ฐฐํฌํ ์ ์๊ฒ ํด์ฃผ๋ ์๋น์ค์์. ์ฝ๊ฒ ๋งํ๋ฉด "๋ด๊ฐ ๋ง๋ AI ๋ชจ๋ธ์ ์น์ฌ์ดํธ๋ก ๋ง๋ค์ด์ ๋๊ตฌ๋ ์ ์ํด์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ํ๋ซํผ"์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ผ์! ๐จ
๐ก ์ Hugging Face Space๋ฅผ ์จ์ผ ํ ๊น?
1. ์์ ๋ฌด๋ฃ - ๊ธฐ๋ณธ ์ฌ์ฉ์ 100% ๋ฌด๋ฃ์์. AWS๋ GCP ๊ฐ์ ํด๋ผ์ฐ๋ ์๋น์ค ์ฐ๋ฉด ๋ ๋๊ฐ๋๋ฐ ์ฌ๊ธฐ๋ ๊ณต์ง ใ
ใ
ใ
2. ์๋ฒ ๊ด๋ฆฌ ํ์ ์์ - ์๋ฒ ์ธํ
, ๋๋ฉ์ธ ์ฐ๊ฒฐ, SSL ์ธ์ฆ์ ์ด๋ฐ ๊ฑฐ ์ ๊ฒฝ ์ ์จ๋ ๋ผ์. ๊ทธ๋ฅ ์ฝ๋๋ง ์ฌ๋ฆฌ๋ฉด ๋!
3. ๋ค์ํ ํ๋ ์์ํฌ ์ง์ - Gradio, Streamlit, Docker ๋ฑ ์ฌ๋ฌ ๋ฐฉ์์ผ๋ก ๋ฐฐํฌ ๊ฐ๋ฅํด์.
4. ์๋ ๋ฒ์ ๊ด๋ฆฌ - Git ๊ธฐ๋ฐ์ด๋ผ ์ฝ๋ ์์ ํ๋ฉด ์๋์ผ๋ก ์ฌ๋ฐฐํฌ๋ผ์.
5. ์ปค๋ฎค๋ํฐ ๊ณต์ - ๋ด ์ฑ์ ์ ์ธ๊ณ ์ฌ๋๋ค๊ณผ ๊ณต์ ํ๊ณ ํผ๋๋ฐฑ ๋ฐ์ ์ ์์ด์! ๐
๐ ๏ธ ๋ฐฐํฌ ๋ฐฉ๋ฒ 3๊ฐ์ง: ์ด๋ค ๊ฑธ ์ ํํ ๊น?
Hugging Face Space๋ ํฌ๊ฒ 3๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ฑ์ ๋ฐฐํฌํ ์ ์์ด์. ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์์ผ๋๊น ์๊ธฐ ์ํฉ์ ๋ง๋ ๊ฑธ ์ ํํ๋ฉด ๋ผ์!
Gradio
๋์ด๋: โญ (๊ฐ์ฅ ์ฌ์)
ํน์ง: ํ์ด์ฌ ์ฝ๋ ๋ช ์ค๋ก UI ์๋ ์์ฑ
์ถ์ฒ: ๋น ๋ฅธ ํ๋กํ ํ์
, ๋ฐ๋ชจ ์ ์
์ฅ์ : ์ฝ๋ ์ง์ง ๊ฐ๋จํจ ใ
ใ
ใ
Streamlit
๋์ด๋: โญโญ (์ค๊ฐ)
ํน์ง: ๋ฐ์ดํฐ ์๊ฐํ์ ๊ฐํจ
์ถ์ฒ: ๋์๋ณด๋, ๋ถ์ ๋๊ตฌ
์ฅ์ : ์ปค์คํฐ๋ง์ด์ง ์์ ๋ ๋์
Docker
๋์ด๋: โญโญโญ (์ด๋ ค์)
ํน์ง: ์์ ํ ์ปค์คํ
ํ๊ฒฝ
์ถ์ฒ: ๋ณต์กํ ํ๋ก์ ํธ
์ฅ์ : ๋ชจ๋ ๊ฑธ ๋ด ๋ง๋๋ก!
๐ฌ ์ค์ ๊ฟํ
์ฒ์ ์์ํ๋ ๋ถ๋ค์ ๋ฌด์กฐ๊ฑด Gradio ์ถ์ฒ๋๋ ค์! ์ง์ง 5๋ถ ๋ง์ ๋ฐฐํฌ ๊ฐ๋ฅํ๊ฑฐ๋ ์ ใ
ใ
ใ
๋์ค์ ์ต์ํด์ง๋ฉด Streamlit์ด๋ Docker๋ก ๋์ด๊ฐ๋ ๋ฆ์ง ์์์. ์ฌ๋ฅ๋ท์์ AI ๊ด๋ จ ์ฌ๋ฅ์ ๊ณต์ ํ์ค ๋๋ Gradio๋ก ๋น ๋ฅด๊ฒ ๋ฐ๋ชจ ๋ง๋ค์ด์ ๋ณด์ฌ์ฃผ๋ฉด ์ ๋ขฐ๋๊ฐ ํ ์ฌ๋ผ๊ฐ์! ๐
๐ ์ค์ ! Gradio๋ก ์ฒซ Space ๋ง๋ค๊ธฐ
์, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ค์ต ๋ค์ด๊ฐ๋๋ค! ๊ฐ์ฅ ์ฌ์ด Gradio๋ฅผ ์ฌ์ฉํด์ ๊ฐ๋จํ ํ ์คํธ ๊ฐ์ ๋ถ์ ์ฑ์ ๋ง๋ค์ด๋ณผ๊ฒ์. ๋จ๊ณ๋ณ๋ก ์ฒ์ฒํ ๋ฐ๋ผ์ค์๋ฉด ๋ฉ๋๋ค! ๐ฏ
๐ Step 1: Hugging Face ๊ณ์ ๋ง๋ค๊ธฐ
๋จผ์ Hugging Face ์น์ฌ์ดํธ(huggingface.co)์ ์ ์ํด์ ํ์๊ฐ์
์ ํด์ผ ํด์. ์ด๋ฉ์ผ์ด๋ GitHub ๊ณ์ ์ผ๋ก ๊ฐ๋จํ๊ฒ ๊ฐ์
ํ ์ ์์ด์.
๊ฐ์
ํ๊ณ ๋๋ฉด ํ๋กํ ์ค์ ๋ ํด์ฃผ์ธ์. ๋์ค์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ด Space๋ฅผ ๋ณผ ๋ ํ๋กํ์ด ๋ณด์ด๊ฑฐ๋ ์! ๐ธ
์ค์! ๊ฐ์
ํ Settings์์ Access Token์ ์์ฑํด๋์ธ์. ๋์ค์ ๋ก์ปฌ์์ ์
๋ก๋ํ ๋ ํ์ํด์.
๐จ Step 2: ์ Space ์์ฑํ๊ธฐ
๋ก๊ทธ์ธํ ์ํ์์ ์ฐ์ธก ์๋จ์ ํ๋กํ ์์ด์ฝ์ ํด๋ฆญํ๊ณ "New Space"๋ฅผ ์ ํํ์ธ์.
๊ทธ๋ฌ๋ฉด ์ด๋ฐ ์ต์
๋ค์ด ๋์์:
- Space name: ์ฑ ์ด๋ฆ (์: sentiment-analyzer)
- License: ๋ผ์ด์ ์ค ์ ํ (๋ณดํต MIT ๋ง์ด ์)
- SDK: ์ฌ๊ธฐ์ Gradio ์ ํ!
- Hardware: ๋ฌด๋ฃ CPU๋ก ์์ (๋์ค์ ์
๊ทธ๋ ์ด๋ ๊ฐ๋ฅ)
"Create Space" ๋ฒํผ ๋๋ฅด๋ฉด ๋! ์ง์ง ๊ฐ๋จํ์ฃ ? ใ
ใ
ใ
๐ป Step 3: ๋ก์ปฌ์์ ์ฝ๋ ์์ฑํ๊ธฐ
์ด์ ๋ด ์ปดํจํฐ์์ ์ฝ๋๋ฅผ ์์ฑํ ์ฐจ๋ก์์. ๋จผ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ผ ํด์:
pip install gradio transformers torch
๊ทธ๋ฆฌ๊ณ ๊ฐ๋จํ ๊ฐ์ ๋ถ์ ์ฑ ์ฝ๋๋ฅผ ์์ฑํด๋ณผ๊ฒ์. app.py ํ์ผ์ ๋ง๋ค๊ณ ์ด๋ ๊ฒ ์์ฑํ์ธ์:
import gradio as gr
from transformers import pipeline
# ๊ฐ์ ๋ถ์ ๋ชจ๋ธ ๋ก๋
classifier = pipeline("sentiment-analysis")
def analyze_sentiment(text):
result = classifier(text)[0]
label = result['label']
score = result['score']
# ๊ฒฐ๊ณผ๋ฅผ ํ๊ธ๋ก ๋ณํ
if label == 'POSITIVE':
sentiment = f"๊ธ์ ์ ๐ (ํ์ ๋: {score:.2%})"
else:
sentiment = f"๋ถ์ ์ ๐ข (ํ์ ๋: {score:.2%})"
return sentiment
# Gradio ์ธํฐํ์ด์ค ์์ฑ
demo = gr.Interface(
fn=analyze_sentiment,
inputs=gr.Textbox(lines=5, placeholder="๋ถ์ํ ํ
์คํธ๋ฅผ ์
๋ ฅํ์ธ์..."),
outputs=gr.Textbox(label="๊ฐ์ ๋ถ์ ๊ฒฐ๊ณผ"),
title="๐ญ ํ
์คํธ ๊ฐ์ ๋ถ์๊ธฐ",
description="์
๋ ฅํ ํ
์คํธ์ ๊ฐ์ ์ ๋ถ์ํด๋๋ฆฝ๋๋ค!",
examples=[
["์ค๋ ์ ๋ง ๊ธฐ๋ถ์ด ์ข์์!"],
["์ด ์ ํ์ ์ต์
์ด์์..."],
["๊ทธ๋ฅ ๊ทธ๋์."]
]
)
if __name__ == "__main__":
demo.launch()
์ด ์ฝ๋ ์ง์ง ๊ฐ๋จํ์ฃ ? ใ ใ ใ Gradio๊ฐ ์์์ UI๋ฅผ ๋ง๋ค์ด์ค์ ์ฐ๋ฆฌ๋ ๋ก์ง๋ง ์์ฑํ๋ฉด ๋ผ์! ๐จ
๐ฆ Step 4: requirements.txt ์์ฑํ๊ธฐ
Space์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชฉ๋ก์ ์๋ ค์ค์ผ ํด์. requirements.txt ํ์ผ์ ๋ง๋ค๊ณ ์ด๋ ๊ฒ ์์ฑํ์ธ์:
gradio==4.8.0
transformers==4.35.0
torch==2.1.0
๋ฒ์ ์ ๋ช ์ํ๋ ๊ฒ ์ค์ํด์! ๋์ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋ฐ์ดํธ๋ก ์ธํ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์๊ฑฐ๋ ์. ๐
๐ Step 5: Space์ ์ ๋ก๋ํ๊ธฐ
์ด์ ์์ฑํ ํ์ผ๋ค์ Space์ ์ฌ๋ฆด ์ฐจ๋ก์์! ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ด์:
๋ฐฉ๋ฒ 1: ์น ์ธํฐํ์ด์ค ์ฌ์ฉ (์ด๋ณด์ ์ถ์ฒ)
Space ํ์ด์ง์ "Files" ํญ์์ "Add file" ๋ฒํผ์ ํด๋ฆญํ๊ณ app.py์ requirements.txt๋ฅผ ๋๋๊ทธ ์ค ๋๋กญํ๋ฉด ๋!
๋ฐฉ๋ฒ 2: Git ์ฌ์ฉ (๊ฐ๋ฐ์ ์ถ์ฒ)
ํฐ๋ฏธ๋์์ ์ด๋ ๊ฒ ์
๋ ฅํ์ธ์:
git clone https://huggingface.co/spaces/your-username/your-space-name
cd your-space-name
# ํ์ผ ๋ณต์ฌ ํ
git add .
git commit -m "Initial commit"
git push
ํ์ผ์ ์ ๋ก๋ํ๋ฉด ์๋์ผ๋ก ๋น๋๊ฐ ์์๋ผ์. ๋ณดํต 2-3๋ถ ์ ๋ ๊ฑธ๋ ค์! โฑ๏ธ
โ ๏ธ ์ฃผ์์ฌํญ
์ฒ์ ๋ฐฐํฌํ ๋ ๋น๋๊ฐ ์คํจํ๋ ๊ฒฝ์ฐ๊ฐ ์ข
์ข
์์ด์. ๋๋ถ๋ถ requirements.txt์ ๋ฒ์ ์ถฉ๋์ด๋ ์คํ ๋๋ฌธ์ด์์. ๋น๋ ๋ก๊ทธ๋ฅผ ๊ผผ๊ผผํ ํ์ธํ์ธ์!
๋ ํฐ ๋ชจ๋ธ์ ์ฌ์ฉํ ๋๋ ๋ฌด๋ฃ CPU๋ก๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ์ ์์ด์. ๊ทธ๋ด ๋ ๋ ์์ ๋ชจ๋ธ์ ์ฌ์ฉํ๊ฑฐ๋ ์ ๋ฃ GPU๋ก ์
๊ทธ๋ ์ด๋ํด์ผ ํด์.
๐ฏ Streamlit์ผ๋ก ๋ ๋ฉ์ง ์ฑ ๋ง๋ค๊ธฐ
Gradio์ ์ต์ํด์ก๋ค๋ฉด ์ด์ Streamlit์ ์๋ํด๋ณผ ์ฐจ๋ก์์! Streamlit์ ๋ฐ์ดํฐ ์๊ฐํ์ ๋์๋ณด๋ ์ ์์ ํนํ๋์ด ์์ด์ ์ข ๋ ๋ณต์กํ ์ฑ์ ๋ง๋ค ์ ์์ด์. ๐
๐ Streamlit์ ์ฅ์
1. ํ๋ถํ ์์ ฏ - ์ฌ๋ผ์ด๋, ์ฒดํฌ๋ฐ์ค, ํ์ผ ์
๋ก๋ ๋ฑ ๋ค์ํ UI ์ปดํฌ๋ํธ
2. ๋ ์ด์์ ์์ ๋ - ์ปฌ๋ผ, ์ฌ์ด๋๋ฐ, ํญ ๋ฑ์ผ๋ก ๋ ์ด์์ ๊ตฌ์ฑ ๊ฐ๋ฅ
3. ์ฐจํธ ํตํฉ - Plotly, Matplotlib ๋ฑ ์ฐจํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๊ฒ ํตํฉ
4. ์ํ ๊ด๋ฆฌ - ์ธ์
์ํ๋ก ์ฌ์ฉ์ ์ธํฐ๋์
๊ด๋ฆฌ ๊ฐ๋ฅ
Streamlit์ผ๋ก ์ด๋ฏธ์ง ๋ถ๋ฅ ์ฑ์ ๋ง๋ค์ด๋ณผ๊ฒ์. Space ์์ฑํ ๋ SDK๋ฅผ Streamlit์ผ๋ก ์ ํํ๊ณ , app.py๋ฅผ ์ด๋ ๊ฒ ์์ฑํ์ธ์:
import streamlit as st
from PIL import Image
from transformers import pipeline
import torch
st.set_page_config(
page_title="์ด๋ฏธ์ง ๋ถ๋ฅ๊ธฐ",
page_icon="๐ผ๏ธ",
layout="wide"
)
# ์บ์ฑ์ผ๋ก ๋ชจ๋ธ ๋ก๋ ์ต์ ํ
@st.cache_resource
def load_model():
return pipeline("image-classification", model="google/vit-base-patch16-224")
classifier = load_model()
st.title("๐ผ๏ธ AI ์ด๋ฏธ์ง ๋ถ๋ฅ๊ธฐ")
st.markdown("์ด๋ฏธ์ง๋ฅผ ์
๋ก๋ํ๋ฉด ๋ฌด์์ธ์ง ์๋ ค๋๋ ค์!")
# ์ฌ์ด๋๋ฐ์ ์ค๋ช
์ถ๊ฐ
with st.sidebar:
st.header("์ฌ์ฉ ๋ฐฉ๋ฒ")
st.write("1. ์ด๋ฏธ์ง ํ์ผ์ ์
๋ก๋ํ์ธ์")
st.write("2. AI๊ฐ ์๋์ผ๋ก ๋ถ์ํฉ๋๋ค")
st.write("3. ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์!")
st.markdown("---")
st.info("๐ก ์ง์ ํ์: JPG, PNG, JPEG")
# ๋ฉ์ธ ์ปจํ
์ธ
col1, col2 = st.columns(2)
with col1:
uploaded_file = st.file_uploader("์ด๋ฏธ์ง ์ ํ", type=['jpg', 'jpeg', 'png'])
if uploaded_file is not None:
image = Image.open(uploaded_file)
st.image(image, caption="์
๋ก๋๋ ์ด๋ฏธ์ง", use_column_width=True)
with col2:
if uploaded_file is not None:
with st.spinner("๋ถ์ ์ค... ๐"):
results = classifier(image)
st.subheader("๋ถ์ ๊ฒฐ๊ณผ")
for i, result in enumerate(results[:5], 1):
label = result['label']
score = result['score']
st.write(f"**{i}. {label}**")
st.progress(score)
st.write(f"ํ์ ๋: {score:.2%}")
st.markdown("---")
st.markdown("---")
st.caption("Powered by Hugging Face Transformers ๐ค")
Streamlit์ Gradio๋ณด๋ค ์ฝ๋๊ฐ ์ข ๋ ๊ธธ์ง๋ง, ๊ทธ๋งํผ ์ปค์คํฐ๋ง์ด์ง์ด ์์ ๋ก์์! ๋ ์ด์์๋ ๋ด ๋ง๋๋ก ๊ตฌ์ฑํ ์ ์๊ณ ์. ใ ใ ใ
๐จ ๋์์ธ ํ
Streamlit์ st.set_page_config()๋ก ํ์ด์ง ์ ๋ชฉ, ์์ด์ฝ, ๋ ์ด์์์ ์ค์ ํ ์ ์์ด์. layout="wide"๋ก ์ค์ ํ๋ฉด ํ๋ฉด์ ๋๊ฒ ์ธ ์ ์์ด์ ๋์๋ณด๋ ๋ง๋ค ๋ ์ข์์!
๊ทธ๋ฆฌ๊ณ @st.cache_resource ๋ฐ์ฝ๋ ์ดํฐ๋ ๊ผญ ์ฌ์ฉํ์ธ์. ๋ชจ๋ธ ๋ก๋ฉ ์๊ฐ์ ์์ฒญ ์ค์ฌ์ค์! ๐
๐ณ Docker๋ก ์์ ํ ์์ ๋ฅผ ๋๋ฆฌ๊ธฐ
Gradio์ Streamlit๋ ์ข์ง๋ง, ์ ๋ง ๋ณต์กํ ํ๋ก์ ํธ๋ ํน์ํ ํ๊ฒฝ์ด ํ์ํ ๋๋ Docker๋ฅผ ์ฌ์ฉํด์ผ ํด์. Docker๋ฅผ ์ฐ๋ฉด ๋ง ๊ทธ๋๋ก ๋ญ๋ ์ง ํ ์ ์์ด์! ๐ฅ
๐ฏ Docker๊ฐ ํ์ํ ๊ฒฝ์ฐ
โข ํน์ ์์คํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ ๋ (์: OpenCV, FFmpeg)
โข ์ฌ๋ฌ ์๋น์ค๋ฅผ ๋์์ ์คํํด์ผ ํ ๋ (์: ๋ฐฑ์๋ + ํ๋ก ํธ์๋)
โข ๋ณต์กํ ์์กด์ฑ ๊ด๋ฆฌ๊ฐ ํ์ํ ๋
โข ๊ธฐ์กด Docker ์ด๋ฏธ์ง๋ฅผ ํ์ฉํ๊ณ ์ถ์ ๋
โข ์์ ํ ์ปค์คํ
ํ๊ฒฝ์ด ํ์ํ ๋
Docker Space๋ฅผ ๋ง๋ค๋ ค๋ฉด Dockerfile์ ์์ฑํด์ผ ํด์. ์๋ฅผ ๋ค์ด FastAPI ๋ฐฑ์๋์ React ํ๋ก ํธ์๋๋ฅผ ํจ๊ป ๋ฐฐํฌํ๋ ๊ฒฝ์ฐ:
# Dockerfile
FROM python:3.9-slim
WORKDIR /app
# ์์คํ
์์กด์ฑ ์ค์น
RUN apt-get update && apt-get install -y \
build-essential \
curl \
software-properties-common \
&& rm -rf /var/lib/apt/lists/*
# Python ํจํค์ง ์ค์น
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋ ๋ณต์ฌ
COPY . .
# ํฌํธ ๋
ธ์ถ
EXPOSE 7860
# ํฌ์ค์ฒดํฌ
HEALTHCHECK CMD curl --fail http://localhost:7860/_stcore/health
# ์ฑ ์คํ
ENTRYPOINT ["python", "app.py"]
Docker๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ ๊ฒ ์์คํ ๋ ๋ฒจ์ ์ค์ ๊น์ง ์์ ํ ์ ์ดํ ์ ์์ด์. ํ์ง๋ง ๊ทธ๋งํผ ๋ณต์กํ๊ณ ๋๋ฒ๊น ๋ ์ด๋ ค์์ ใ ใ ใ ์ฒ์๋ถํฐ Docker๋ก ์์ํ๋ ๊ฑด ๋น์ถ์ฒ! ๐
โ ๏ธ Docker ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
1. ํฌํธ๋ ๋ฐ๋์ 7860 - Hugging Face Space๋ 7860 ํฌํธ๋ฅผ ์ฌ์ฉํด์
2. ํฌ์ค์ฒดํฌ ํ์ - Space๊ฐ ์ ์ ์๋ํ๋์ง ํ์ธํ๋ ์ฉ๋
3. ์ด๋ฏธ์ง ํฌ๊ธฐ ์ฃผ์ - ๋๋ฌด ํฐ ์ด๋ฏธ์ง๋ ๋น๋ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ค์
4. ๋ก๊ทธ ํ์ธ - ๋น๋ ์คํจ ์ ๋ก๊ทธ๋ฅผ ๊ผผ๊ผผํ ํ์ธํ์ธ์
โ๏ธ Space ์ค์ ๋ฐ ์ต์ ํ
Space๋ฅผ ๋ฐฐํฌํ๋ค๊ณ ๋์ด ์๋์์! ์ ๋๋ก ํ์ฉํ๋ ค๋ฉด ์ฌ๋ฌ ์ค์ ์ ๋ง์ ธ์ค์ผ ํด์. ์ด์ ๋ถํฐ ์ค์ ํ๋ค์ ์๋ ค๋๋ฆด๊ฒ์! ๐ช
๐ง README.md ์์ฑํ๊ธฐ
Space์ ์ฒซ์ธ์์ README.md๊ฐ ๊ฒฐ์ ํด์! ์ฌ๊ธฐ์ ์ฑ ์ค๋ช
, ์ฌ์ฉ๋ฒ, ์์ ๋ฑ์ ์์ฑํ๋ฉด ๋ฐฉ๋ฌธ์๋ค์ด ์ฝ๊ฒ ์ดํดํ ์ ์์ด์.
ํนํ YAML ํค๋๋ฅผ ์ถ๊ฐํ๋ฉด Space์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ ์ ์์ด์:
---
title: ๊ฐ์ ๋ถ์๊ธฐ
emoji: ๐ญ
colorFrom: blue
colorTo: purple
sdk: gradio
sdk_version: 4.8.0
app_file: app.py
pinned: false
license: mit
---
# ๐ญ ํ
์คํธ ๊ฐ์ ๋ถ์๊ธฐ
์ด ์ฑ์ ์
๋ ฅํ ํ
์คํธ์ ๊ฐ์ ์ ๋ถ์ํด๋๋ฆฝ๋๋ค!
## ์ฌ์ฉ ๋ฐฉ๋ฒ
1. ํ
์คํธ ์
๋ ฅ
2. ๋ถ์ ๋ฒํผ ํด๋ฆญ
3. ๊ฒฐ๊ณผ ํ์ธ
## ๊ธฐ์ ์คํ
- Gradio
- Transformers
- PyTorch
์ด๋ ๊ฒ ์์ฑํ๋ฉด Space ์นด๋์ ์ด๋ชจ์ง์ ๊ทธ๋ผ๋์ธํธ ์์์ด ์์๊ฒ ํ์๋ผ์! ๐จ
๐ ์ฑ๋ฅ ์ต์ ํ ํ
1. ๋ชจ๋ธ ์บ์ฑ
๋ชจ๋ธ์ ๋งค๋ฒ ๋ค์ด๋ก๋ํ๋ฉด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ค์. ํ๊ฒฝ๋ณ์๋ก ์บ์ ๋๋ ํ ๋ฆฌ๋ฅผ ์ค์ ํ์ธ์:
import os
os.environ['TRANSFORMERS_CACHE'] = '/tmp/cache'
2. ๊ฒฝ๋ ๋ชจ๋ธ ์ฌ์ฉ
๋ฌด๋ฃ CPU๋ก๋ ํฐ ๋ชจ๋ธ์ ๋๋ฆฌ๊ธฐ ํ๋ค์ด์. DistilBERT ๊ฐ์ ๊ฒฝ๋ ๋ชจ๋ธ์ ์ฌ์ฉํ์ธ์!
3. ๋ฐฐ์น ์ฒ๋ฆฌ
์ฌ๋ฌ ์
๋ ฅ์ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ฉด ํจ์จ์ ์ด์์:
4. ๋น๋๊ธฐ ์ฒ๋ฆฌ
Gradio์ queue() ๋ฉ์๋๋ก ์์ฒญ์ ํ์ ๋ฃ์ด ์ฒ๋ฆฌํ์ธ์.
| ํ๋์จ์ด ์ต์ | ์ฌ์ | ๊ฐ๊ฒฉ | ์ถ์ฒ ์ฉ๋ |
|---|---|---|---|
| CPU Basic (๋ฌด๋ฃ) | 2 vCPU, 16GB RAM | ๋ฌด๋ฃ | ๊ฒฝ๋ ๋ชจ๋ธ, ๋ฐ๋ชจ |
| CPU Upgrade | 8 vCPU, 32GB RAM | $0.03/์๊ฐ | ์คํ ๋ชจ๋ธ |
| T4 GPU | 16GB VRAM | $0.60/์๊ฐ | ๋ํ ๋ชจ๋ธ, ์ด๋ฏธ์ง ์์ฑ |
| A10G GPU | 24GB VRAM | $1.05/์๊ฐ | ์ด๋ํ ๋ชจ๋ธ, ์ค์๊ฐ ์ฒ๋ฆฌ |
์ฒ์์๋ ๋ฌด๋ฃ CPU๋ก ์์ํ๊ณ , ํ์ํ๋ฉด ๋์ค์ ์ ๊ทธ๋ ์ด๋ํ๋ฉด ๋ผ์. ๋๋ถ๋ถ์ ๋ฐ๋ชจ ์ฑ์ ๋ฌด๋ฃ CPU๋ก๋ ์ถฉ๋ถํด์! ๐
๐ ๋ณด์๊ณผ ํ๋ผ์ด๋ฒ์
Space๋ฅผ ๊ณต๊ฐ์ ์ผ๋ก ๋ฐฐํฌํ ๋๋ ๋ณด์๋ ์ ๊ฒฝ ์จ์ผ ํด์. ํนํ API ํค๋ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ๋ค๋ฃฐ ๋๋ ๋์ฑ ์กฐ์ฌํด์ผ ํ๊ณ ์! ๐
๐ Secrets ๊ด๋ฆฌํ๊ธฐ
API ํค๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฝ๋์ ์ง์ ๋ฃ์ผ๋ฉด ์ ๋ผ์! Hugging Face Space๋ Secrets ๊ธฐ๋ฅ์ ์ ๊ณตํด์.
Space ์ค์ ์์ "Repository secrets"์ ๋ค์ด๊ฐ์ ํค-๊ฐ ์์ ์ถ๊ฐํ์ธ์. ๊ทธ๋ฌ๋ฉด ์ฝ๋์์ ์ด๋ ๊ฒ ์ฌ์ฉํ ์ ์์ด์:
import os
# Secrets์์ API ํค ๊ฐ์ ธ์ค๊ธฐ
api_key = os.environ.get("OPENAI_API_KEY")
if api_key is None:
raise ValueError("API ํค๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค!")
์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋์๋ API ํค๊ฐ ๋ ธ์ถ๋์ง ์์์! ๐ก๏ธ
๐ฅ ์ ๊ทผ ์ ์ด
Space์ ๊ณต๊ฐ ๋ฒ์๋ฅผ ์ค์ ํ ์ ์์ด์:
Public - ๋๊ตฌ๋ ์ ๊ทผ ๊ฐ๋ฅ (๊ธฐ๋ณธ๊ฐ)
Private - ๋๋ง ์ ๊ทผ ๊ฐ๋ฅ
Organization - ์กฐ์ง ๋ฉค๋ฒ๋ง ์ ๊ทผ ๊ฐ๋ฅ
๋ฒ ํ ํ
์คํธ๋ ๋ด๋ถ ๋๊ตฌ๋ก ์ฌ์ฉํ ๋๋ Private์ผ๋ก ์ค์ ํ์ธ์!
๐ก ๋ณด์ ์ฒดํฌ๋ฆฌ์คํธ
โ
API ํค๋ Secrets์ ์ ์ฅ
โ
๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ ๋ก๊ทธ์ ์ถ๋ ฅํ์ง ์๊ธฐ
โ
์ฌ์ฉ์ ์
๋ ฅ์ ํญ์ ๊ฒ์ฆํ๊ธฐ
โ
ํ์ผ ์
๋ก๋ ์ ํฌ๊ธฐ์ ํ์ ์ ํ
โ
Rate limiting ์ค์ ํ๊ธฐ
โ
HTTPS ์ฌ์ฉ (์๋์ผ๋ก ์ ์ฉ๋จ)
ํนํ ์ฌ๋ฅ๋ท์์ ์ ๋ฃ ์๋น์ค๋ก ์ ๊ณตํ ๋๋ ๋ณด์์ด ๋์ฑ ์ค์ํด์! ๊ณ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๋ณดํธํด์ผ ์ ๋ขฐ๋ฅผ ์ป์ ์ ์๊ฑฐ๋ ์. ๐
๐ ๋ชจ๋ํฐ๋ง๊ณผ ๋ถ์
Space๋ฅผ ๋ฐฐํฌํ ํ์๋ ์ผ๋ง๋ ๋ง์ ์ฌ๋๋ค์ด ์ฌ์ฉํ๋์ง, ์ด๋ค ๋ฌธ์ ๊ฐ ์๋์ง ๋ชจ๋ํฐ๋งํด์ผ ํด์. Hugging Face๋ ๊ธฐ๋ณธ์ ์ธ ๋ถ์ ๋๊ตฌ๋ฅผ ์ ๊ณตํด์! ๐
๐ Analytics ํ์ฉํ๊ธฐ
Space ํ์ด์ง์ "Analytics" ํญ์์ ์ด๋ฐ ์ ๋ณด๋ค์ ๋ณผ ์ ์์ด์:
โข ๋ฐฉ๋ฌธ์ ์ - ์ผ๋ณ/์ฃผ๋ณ/์๋ณ ๋ฐฉ๋ฌธ์ ํต๊ณ
โข ์ง์ญ ๋ถํฌ - ์ด๋ ๋๋ผ์์ ์ ์ํ๋์ง
โข ๋๋ฐ์ด์ค - ๋ชจ๋ฐ์ผ vs ๋ฐ์คํฌํฑ ๋น์จ
โข Likes - ์ผ๋ง๋ ๋ง์ ์ฌ๋๋ค์ด ์ข์์๋ฅผ ๋๋ ๋์ง
์ด ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ฉด ์ด๋ค ๊ธฐ๋ฅ์ด ์ธ๊ธฐ ์๋์ง, ์ด๋ค ๋ถ๋ถ์ ๊ฐ์ ํด์ผ ํ ์ง ์ ์ ์์ด์! ๐ฏ
๐ ๋ก๊ทธ์ ๋๋ฒ๊น
Space์ "Logs" ํญ์์ ์ค์๊ฐ ๋ก๊ทธ๋ฅผ ๋ณผ ์ ์์ด์. ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์ฌ๊ธฐ์ ํ์ธํ์ธ์!
์ฝ๋์ ๋ก๊น
์ ์ถ๊ฐํ๋ฉด ๋๋ฒ๊น
์ด ํจ์ฌ ์ฌ์์ ธ์:
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def process_input(text):
logger.info(f"์
๋ ฅ ๋ฐ์: {text[:50]}...") # ์ฒ์ 50์๋ง ๋ก๊ทธ
try:
result = model(text)
logger.info("์ฒ๋ฆฌ ์๋ฃ")
return result
except Exception as e:
logger.error(f"์๋ฌ ๋ฐ์: {str(e)}")
raise
์ด๋ ๊ฒ ํ๋ฉด ๋ฌธ์ ๊ฐ ์๊ฒผ์ ๋ ์์ธ์ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์ด์! ๐
๐จ ์ค์ ํ๋ก์ ํธ ์์ด๋์ด
์ด๋ก ์ ์ถฉ๋ถํ ๋ฐฐ์ ์ผ๋ ์ด์ ์ค์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด๋ณผ๊น์? ์ฌ๊ธฐ ๋ช ๊ฐ์ง ์์ด๋์ด๋ฅผ ๋๋ฆด๊ฒ์! ๐ก
ํ ์คํธ ์์ฝ๊ธฐ
๊ธด ๊ธ์ ์ ๋ ฅํ๋ฉด ํต์ฌ๋ง ์์ฝํด์ฃผ๋ ์ฑ. ๋ด์ค ๊ธฐ์ฌ๋ ๋ ผ๋ฌธ ์์ฝ์ ์ ์ฉํด์!
์ด๋ฏธ์ง ์์ฑ๊ธฐ
ํ ์คํธ ์ค๋ช ์ ์ ๋ ฅํ๋ฉด AI๊ฐ ์ด๋ฏธ์ง๋ฅผ ์์ฑํด์ค์. Stable Diffusion ํ์ฉ!
์์ฑ ์ธ์๊ธฐ
์์ฑ ํ์ผ์ ์ ๋ก๋ํ๋ฉด ํ ์คํธ๋ก ๋ณํํด์ค์. Whisper ๋ชจ๋ธ ์ฌ์ฉ!
๋ฒ์ญ๊ธฐ
๋ค๊ตญ์ด ๋ฒ์ญ ์๋น์ค. 100๊ฐ ์ด์์ ์ธ์ด ์ง์ ๊ฐ๋ฅ!
์ฑ๋ด
์ง๋ฌธ์ ๋ต๋ณํ๋ AI ์ฑ๋ด. GPT๋ LLaMA ๋ชจ๋ธ ํ์ฉ!
๋ฐ์ดํฐ ๋ถ์ ๋๊ตฌ
CSV ํ์ผ์ ์ ๋ก๋ํ๋ฉด ์๋์ผ๋ก ๋ถ์ํ๊ณ ์๊ฐํํด์ค์!
๐ ํ๋ก์ ํธ ์์ ํ
์ฒ์์๋ ๊ฐ๋จํ ํ๋ก์ ํธ๋ถํฐ ์์ํ์ธ์! ํ
์คํธ ๊ฐ์ ๋ถ์์ด๋ ์ด๋ฏธ์ง ๋ถ๋ฅ ๊ฐ์ ๊ธฐ๋ณธ์ ์ธ ๊ฒ๋ถํฐ ๋ง๋ค์ด๋ณด๊ณ , ์ ์ ๋ณต์กํ ํ๋ก์ ํธ๋ก ๋์ด๊ฐ๋ ๊ฒ ์ข์์.
๊ทธ๋ฆฌ๊ณ ์ฌ๋ฅ๋ท์์ ์ด๋ฐ AI ๋๊ตฌ๋ค์ ์๋น์ค๋ก ์ ๊ณตํ๋ฉด ์์ต๋ ๋ผ ์ ์์ด์! ์๋ฅผ ๋ค์ด "AI ์ด๋ฏธ์ง ์์ฑ ์๋น์ค" ๊ฐ์ ๊ฑธ ์ฌ๋ฆฌ๋ฉด ๊ด์ฌ ์๋ ์ฌ๋๋ค์ด ๋ง์ ๊ฑฐ์์. ใ
ใ
ใ
๐ฐ
๐ CI/CD์ ์๋ํ
๊ฐ๋ฐ์๋ผ๋ฉด ์๋ํ๋ฅผ ์ฌ๋ํ์ฃ ? ใ ใ ใ Space๋ GitHub Actions ๊ฐ์ CI/CD ๋๊ตฌ์ ์ฐ๋ํ ์ ์์ด์! ๐ค
๐ GitHub์ ์ฐ๋ํ๊ธฐ
Space๋ฅผ GitHub ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ฐ๋ํ๋ฉด ์ฝ๋๋ฅผ GitHub์์ ๊ด๋ฆฌํ๊ณ , ํธ์ํ ๋๋ง๋ค ์๋์ผ๋ก Space์ ๋ฐฐํฌ๋ผ์!
Space ์ค์ ์์ "Link to GitHub"๋ฅผ ํด๋ฆญํ๊ณ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ฐ๊ฒฐํ์ธ์. ๊ทธ๋ฌ๋ฉด ์ด๋ฐ ์ํฌํ๋ก์ฐ๊ฐ ๊ฐ๋ฅํด์ ธ์:
1. ๋ก์ปฌ์์ ์ฝ๋ ์์
2. GitHub์ ํธ์
3. ์๋์ผ๋ก Space์ ๋ฐฐํฌ
4. ํ
์คํธ ๋ฐ ํ์ธ
์์ ์๋ํ! ๊ฐ๋ฐ์์ ๊ฟ์ด์ฃ ? ๐
๐งช ์๋ ํ ์คํธ
GitHub Actions๋ก ์๋ ํ ์คํธ๋ฅผ ์ค์ ํ ์ ์์ด์. .github/workflows/test.yml ํ์ผ์ ๋ง๋ค์ด๋ณด์ธ์:
name: Test
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: 3.9
- name: Install dependencies
run: |
pip install -r requirements.txt
pip install pytest
- name: Run tests
run: pytest tests/
์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๋ฅผ ํธ์ํ ๋๋ง๋ค ์๋์ผ๋ก ํ ์คํธ๊ฐ ์คํ๋ผ์! ๋ฒ๊ทธ๋ฅผ ๋ฏธ๋ฆฌ ์ก์ ์ ์์ฃ . ๐
๐ฐ ์์ตํ ์ ๋ต
Space๋ฅผ ๋ง๋ค์์ผ๋ฉด ์ด์ ๋์ ๋ฒ์ด๋ณผ ์ฐจ๋ก์ฃ ? ใ ใ ใ ์ฌ๋ฌ ๊ฐ์ง ์์ตํ ๋ฐฉ๋ฒ์ด ์์ด์! ๐ธ
1. ํ๋ฆฌ๋ฏธ์ ๊ธฐ๋ฅ ์ ๊ณต
๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๋ฌด๋ฃ๋ก ์ ๊ณตํ๊ณ , ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๋ฃ๋ก ํ๋งคํ๋ ๋ฐฉ์์ด์์. ์๋ฅผ ๋ค์ด:
โข ๋ฌด๋ฃ: ํ๋ฃจ 10ํ ์ฌ์ฉ ์ ํ
โข ์ ๋ฃ: ๋ฌด์ ํ ์ฌ์ฉ + ๊ณ ํ์ง ์ถ๋ ฅ
๊ฒฐ์ ๋ Stripe๋ PayPal์ ์ฐ๋ํ๋ฉด ๋ผ์!
2. API ์๋น์ค ํ๋งค
Space๋ฅผ API๋ก ๋ง๋ค์ด์ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์๊ฒ ํ๋งคํ ์ ์์ด์. ์ฌ์ฉ๋์ ๋ฐ๋ผ ์๊ธ์ ๋ฐ๋ ๊ฑฐ์ฃ !
Hugging Face์ Inference API๋ฅผ ํ์ฉํ๋ฉด ์ฝ๊ฒ ๊ตฌํํ ์ ์์ด์.
3. ์ฌ๋ฅ๋ท์์ ์๋น์ค ์ ๊ณต
์ฌ๋ฅ๋ท์ "AI ์ด๋ฏธ์ง ์์ฑ ์๋น์ค" ๊ฐ์ ๊ฑธ ๋ฑ๋กํ๊ณ , Space๋ฅผ ๋๊ตฌ๋ก ํ์ฉํ๋ ๋ฐฉ์์ด์์!
๊ณ ๊ฐ์ด ์ฃผ๋ฌธํ๋ฉด Space์์ ์์
ํ๊ณ ๊ฒฐ๊ณผ๋ฌผ์ ์ ๋ฌํ๋ฉด ๋ผ์. ์ด๋ฏธ ๋ง๋ค์ด์ง ๋๊ตฌ๊ฐ ์์ผ๋ ์์
์๊ฐ๋ ๋จ์ถ๋๊ณ ํจ์จ์ ์ด์ฃ ! ๐
4. ๊ด๊ณ ์์ต
๋ฐฉ๋ฌธ์๊ฐ ๋ง๋ค๋ฉด ๊ด๊ณ ๋ฅผ ๋ถ์ฌ์ ์์ต์ ๋ผ ์๋ ์์ด์. Google AdSense ๊ฐ์ ๊ฑธ ์ฌ์ฉํ๋ฉด ๋ผ์.
๋ค๋ง ์ฌ์ฉ์ ๊ฒฝํ์ ํด์น์ง ์๋๋ก ์กฐ์ฌํด์ผ ํด์!
๐ก ์์ตํ ํ
์ฒ์๋ถํฐ ๋์ ๋ฒ๋ ค๊ณ ํ์ง ๋ง์ธ์! ๋จผ์ ์ข์ ์ ํ์ ๋ง๋ค๊ณ ์ฌ์ฉ์๋ฅผ ๋ชจ์ผ๋ ๊ฒ ์ฐ์ ์ด์์.
์ฌ์ฉ์๊ฐ 1000๋ช
์ ๋ ๋ชจ์ด๋ฉด ๊ทธ๋๋ถํฐ ์์ตํ๋ฅผ ๊ณ ๋ฏผํด๋ ๋ฆ์ง ์์์. ๋๋ฌด ์ผ์ฐ ์ ๋ฃํํ๋ฉด ์ฌ์ฉ์๋ค์ด ๋ ๋ ์ ์๊ฑฐ๋ ์! ๐
๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฒฉ ์ฑ
์ ํ ๋๋ ๊ฒฝ์ ์๋น์ค๋ค์ ์ฐธ๊ณ ํ์ธ์. ๋๋ฌด ๋น์ธ๋, ๋๋ฌด ์ธ๋ ์ ๋ผ์!
๐จ ์์ฃผ ๋ฐ์ํ๋ ๋ฌธ์ ์ ํด๊ฒฐ๋ฒ
Space๋ฅผ ์ด์ํ๋ค ๋ณด๋ฉด ์ฌ๋ฌ ๋ฌธ์ ๊ฐ ์๊ฒจ์. ๋ฏธ๋ฆฌ ์์๋๋ฉด ๋นํฉํ์ง ์์ ์ ์์ด์! ๐ง
โ ๋ฌธ์ 1: ๋น๋ ์คํจ
์์ธ: requirements.txt์ ๋ฒ์ ์ถฉ๋, ์คํ, ๋๋ฝ๋ ํจํค์ง
ํด๊ฒฐ: ๋ก๊ทธ๋ฅผ ํ์ธํ๊ณ ์๋ฌ ๋ฉ์์ง๋ฅผ ๊ตฌ๊ธ๋งํ์ธ์. ๋๋ถ๋ถ ๋ฒ์ ๋ฌธ์ ์์!
ํ: ๋ก์ปฌ์์ ๋จผ์ ํ
์คํธํ๊ณ ์ฌ๋ฆฌ์ธ์. pip freeze > requirements.txt๋ก ์ ํํ ๋ฒ์ ์ ๊ธฐ๋กํ๋ ๊ฒ ์ข์์.
โ ๋ฌธ์ 2: ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ
์์ธ: ๋ชจ๋ธ์ด ๋๋ฌด ํฌ๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ ๋์
ํด๊ฒฐ: ๋ ์์ ๋ชจ๋ธ์ ์ฌ์ฉํ๊ฑฐ๋ GPU๋ก ์
๊ทธ๋ ์ด๋ํ์ธ์.
ํ: torch.cuda.empty_cache()๋ก GPU ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฆฌํ๊ณ , ์ฌ์ฉํ์ง ์๋ ๋ณ์๋ del๋ก ์ญ์ ํ์ธ์!
โ ๋ฌธ์ 3: ๋๋ฆฐ ์๋ต ์๋
์์ธ: ๋ชจ๋ธ ๋ก๋ฉ ์๊ฐ, ๋คํธ์ํฌ ์ง์ฐ, ๋นํจ์จ์ ์ธ ์ฝ๋
ํด๊ฒฐ: ๋ชจ๋ธ ์บ์ฑ, ๋ฐฐ์น ์ฒ๋ฆฌ, ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ์ฉํ์ธ์.
ํ: Gradio์ queue()์ concurrency_limit๋ฅผ ์ค์ ํ๋ฉด ๋์ ์์ฒญ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ด์!
โ ๋ฌธ์ 4: Space๊ฐ ์๊พธ ์ฌ๋ฆฝ ๋ชจ๋๋ก
์์ธ: ๋ฌด๋ฃ ํ๋์ 48์๊ฐ ๋์ ์ฌ์ฉ์ด ์์ผ๋ฉด ์ฌ๋ฆฝ ๋ชจ๋๋ก ์ ํ๋ผ์
ํด๊ฒฐ: ์ ๋ฃ ํ๋์ผ๋ก ์
๊ทธ๋ ์ด๋ํ๊ฑฐ๋, ์ฃผ๊ธฐ์ ์ผ๋ก ํ์ ๋ณด๋ด๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋์ธ์.
ํ: UptimeRobot ๊ฐ์ ๋ฌด๋ฃ ๋ชจ๋ํฐ๋ง ์๋น์ค๋ก 5๋ถ๋ง๋ค ํ์ ๋ณด๋ด๋ฉด ์ฌ๋ฆฝ ๋ชจ๋๋ฅผ ๋ฐฉ์งํ ์ ์์ด์!
๐ ๊ณ ๊ธ ๊ธฐ๋ฅ ํ์ฉํ๊ธฐ
๊ธฐ๋ณธ์ ์ธ ๋ฐฐํฌ๋ ๋ง์คํฐํ๋ค๋ฉด ์ด์ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค์ ํ์ฉํด๋ณผ ์ฐจ๋ก์์! ์ด๋ฐ ๊ธฐ๋ฅ๋ค์ ์ฐ๋ฉด Space๋ฅผ ํจ์ฌ ๋ ๊ฐ๋ ฅํ๊ฒ ๋ง๋ค ์ ์์ด์. ๐ช
๐ Space ๊ฐ ์ฐ๋
์ฌ๋ฌ Space๋ฅผ ์ฐ๊ฒฐํด์ ๋ณต์กํ ํ์ดํ๋ผ์ธ์ ๋ง๋ค ์ ์์ด์! ์๋ฅผ ๋ค์ด:
Space A: ์ด๋ฏธ์ง ์
์ค์ผ์ผ๋ง
Space B: ์คํ์ผ ๋ณํ
Space C: ์ต์ข
๊ฒฐ๊ณผ๋ฌผ ์์ฑ
Gradio์ gr.Interface.load()๋ก ๋ค๋ฅธ Space๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์ด์:
import gradio as gr
# ๋ค๋ฅธ Space์ ๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ
upscaler = gr.Interface.load("spaces/username/upscaler")
style_transfer = gr.Interface.load("spaces/username/style-transfer")
def pipeline(image):
# 1๋จ๊ณ: ์
์ค์ผ์ผ๋ง
upscaled = upscaler(image)
# 2๋จ๊ณ: ์คํ์ผ ๋ณํ
styled = style_transfer(upscaled)
return styled
demo = gr.Interface(fn=pipeline, inputs="image", outputs="image")
demo.launch()
์ด๋ ๊ฒ ํ๋ฉด ์ฌ๋ฌ ๋ชจ๋ธ์ ์กฐํฉํด์ ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๋ง๋ค ์ ์์ด์! ๐
๐ฑ ๋ชจ๋ฐ์ผ ์ต์ ํ
๋ง์ ์ฌ์ฉ์๊ฐ ๋ชจ๋ฐ์ผ๋ก ์ ์ํ๋๊น ๋ชจ๋ฐ์ผ ์ต์ ํ๋ ์ค์ํด์!
Gradio๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ํ์ด์ง๋ง, ์ถ๊ฐ๋ก ์ด๋ฐ ๊ฒ๋ค์ ์ ๊ฒฝ ์ฐ๋ฉด ์ข์์:
โข ์ด๋ฏธ์ง ํฌ๊ธฐ ์ ํ (๋ชจ๋ฐ์ผ์ ๋์ฉ๋ ์ฒ๋ฆฌ ํ๋ฆ)
โข ๊ฐ๋จํ UI (๋ณต์กํ ๋ ์ด์์์ ๋ชจ๋ฐ์ผ์์ ๋ถํธ)
โข ๋น ๋ฅธ ์๋ต ์๋ (๋ชจ๋ฐ์ผ ๋คํธ์ํฌ๋ ๋๋ฆด ์ ์์)
Streamlit์์๋ st.set_page_config(layout="wide") ๋์ ๊ธฐ๋ณธ ๋ ์ด์์์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ฐ์ผ์์ ๋ ์ ๋ณด์ฌ์!
๐จ ์ปค์คํ CSS
Gradio์ Streamlit ๋ชจ๋ ์ปค์คํ
CSS๋ฅผ ์ง์ํด์! ๋ด ๋ธ๋๋ ์์์ผ๋ก ๊พธ๋ฐ ์ ์์ฃ .
Gradio์์๋ css ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด์:
css = """
.gradio-container {
font-family: 'Noto Sans KR', sans-serif;
}
.gr-button {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border: none;
}
"""
demo = gr.Interface(..., css=css)
Streamlit์์๋ st.markdown()์ผ๋ก CSS๋ฅผ ์ฃผ์ ํ ์ ์์ด์!
๐ค ์ปค๋ฎค๋ํฐ์ ํ์
ํผ์ ๊ฐ๋ฐํ๋ ๊ฒ๋ ์ข์ง๋ง, ์ปค๋ฎค๋ํฐ์ ํจ๊ปํ๋ฉด ํจ์ฌ ๋ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ ์ ์์ด์! Hugging Face๋ ํ๋ฐํ ์ปค๋ฎค๋ํฐ๊ฐ ์๊ฑฐ๋ ์. ๐
๐ฌ ํผ๋๋ฐฑ ๋ฐ๊ธฐ
Space์ "Community" ํญ์ด ์์ด์. ์ฌ๊ธฐ์ ์ฌ์ฉ์๋ค์ด ๋๊ธ์ ๋จ๊ธธ ์ ์์ด์!
ํผ๋๋ฐฑ์ ์ ๊ทน์ ์ผ๋ก ๋ฐ์๋ค์ด๊ณ ๊ฐ์ ํ์ธ์. ์ฌ์ฉ์๋ค์ ์๊ฒฌ์ด ๊ฐ์ฅ ์ค์ํด์! ๐
๊ทธ๋ฆฌ๊ณ Space ์ค๋ช
์ ์ด๋ฉ์ผ์ด๋ ์์
๋ฏธ๋์ด ๋งํฌ๋ฅผ ๋จ๊ฒจ๋๋ฉด ๋ ๋ง์ ํผ๋๋ฐฑ์ ๋ฐ์ ์ ์์ด์.
๐ ์คํ์์ค ๊ธฐ์ฌ
๋ด Space๋ฅผ ์คํ์์ค๋ก ๊ณต๊ฐํ๋ฉด ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ๊ธฐ์ฌํ ์ ์์ด์!
GitHub ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๊ณต๊ฐํ๊ณ , CONTRIBUTING.md ํ์ผ์ ์์ฑํด์ ๊ธฐ์ฌ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํ์ธ์.
์คํ์์ค๋ก ๊ณต๊ฐํ๋ฉด ์ด๋ฐ ์ฅ์ ์ด ์์ด์:
โข ๋ ๋ง์ ์ฌ๋๋ค์ด ์ฌ์ฉ
โข ๋ฒ๊ทธ ๋ฆฌํฌํธ์ ๊ฐ์ ์ ์
โข ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ์ฝ๋ ๊ธฐ์ฌ
โข ํฌํธํด๋ฆฌ์ค๋ก ํ์ฉ ๊ฐ๋ฅ
ํนํ ์ฌ๋ฅ๋ท์์ ๊ฐ๋ฐ์๋ก ํ๋ํ ๋ ์คํ์์ค ํ๋ก์ ํธ๊ฐ ์์ผ๋ฉด ์ ๋ขฐ๋๊ฐ ํ ์ฌ๋ผ๊ฐ์! ๐
๐ ์ฝํ ์คํธ ์ฐธ์ฌ
Hugging Face๋ ์ ๊ธฐ์ ์ผ๋ก AI ์ฝํ
์คํธ๋ฅผ ๊ฐ์ตํด์. Space๋ฅผ ๋ง๋ค์ด์ ์ฐธ์ฌํ๋ฉด ์๊ธ๋ ๋ฐ๊ณ ์ ๋ช
ํด์ง ์๋ ์์ด์!
๊ณผ๊ฑฐ ์ฝํ
์คํธ ์์:
โข Stable Diffusion ํฌ๋ฆฌ์์ดํฐ๋ธ ์ฑ๋ฆฐ์ง
โข ์คํ์์ค AI ๊ฒ์ ์ผ
โข ๋ค๊ตญ์ด NLP ์ฑ๋ฆฐ์ง
์ฝํ
์คํธ ์ ๋ณด๋ Hugging Face ๋ธ๋ก๊ทธ๋ Discord์์ ํ์ธํ ์ ์์ด์! ๐ฏ
๐ ํ์ต ๋ฆฌ์์ค์ ๋ค์ ๋จ๊ณ
์ฌ๊ธฐ๊น์ง ์ฝ์ผ์ จ๋ค๋ฉด Hugging Face Space ๋ง์คํฐ ์์ค์ด์์! ใ ใ ใ ํ์ง๋ง ๋ฐฐ์์๋ ๋์ด ์์ฃ . ๋ ๊ณต๋ถํ๊ณ ์ถ๋ค๋ฉด ์ด๋ฐ ๋ฆฌ์์ค๋ค์ ์ถ์ฒ๋๋ ค์! ๐
๊ณต์ ๋ฌธ์
Hugging Face ๊ณต์ ๋ฌธ์๋ ์ ๋ง ์ ๋์ด ์์ด์. ๋ชจ๋ ๊ธฐ๋ฅ์ด ์์ธํ๊ฒ ์ค๋ช
๋์ด ์์ฃ !
โข huggingface.co/docs
โข gradio.app/docs
โข streamlit.io/docs
์ ํ๋ธ ํํ ๋ฆฌ์ผ
์์์ผ๋ก ๋ฐฐ์ฐ๋ ๊ฒ ํธํ๋ค๋ฉด ์ ํ๋ธ์ ์ข์ ํํ ๋ฆฌ์ผ์ด ๋ง์์!
๊ฒ์์ด:
โข "Hugging Face Space tutorial"
โข "Gradio tutorial"
โข "Deploy ML model"
์ปค๋ฎค๋ํฐ
๋งํ๋ ๋ถ๋ถ์ด ์์ผ๋ฉด ์ปค๋ฎค๋ํฐ์ ๋ฌผ์ด๋ณด์ธ์!
โข Hugging Face Discord
โข Reddit r/MachineLearning
โข Stack Overflow
โข ์ฌ๋ฅ๋ท ์ปค๋ฎค๋ํฐ
๐ ๋ค์ ๋จ๊ณ ๋ก๋๋งต
1. ๊ธฐ์ด ๋ค์ง๊ธฐ - Gradio๋ก ๊ฐ๋จํ ์ฑ 5๊ฐ ๋ง๋ค์ด๋ณด๊ธฐ
2. ์ค๊ธ ๋์ - Streamlit์ผ๋ก ๋์๋ณด๋ ๋ง๋ค๊ธฐ
3. ๊ณ ๊ธ ์ค๋ ฅ - Docker๋ก ๋ณต์กํ ํ๋ก์ ํธ ๋ฐฐํฌ
4. ์ค์ ๊ฒฝํ - ์ฌ๋ฅ๋ท์์ ์ค์ ๊ณ ๊ฐ ํ๋ก์ ํธ ์งํ
5. ์ ๋ฌธ๊ฐ ๋๊ธฐ - ์คํ์์ค ๊ธฐ์ฌ ๋ฐ ์ฝํ
์คํธ ์ฐธ์ฌ
ํ ๋จ๊ณ์ฉ ์ฒ์ฒํ ์ฌ๋ผ๊ฐ์ธ์. ์กฐ๊ธํดํ์ง ๋ง์๊ณ ์! ๐
๐ฏ ์ค์ ์ฒดํฌ๋ฆฌ์คํธ
๋ง์ง๋ง์ผ๋ก Space๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ ์ ํ์ธํด์ผ ํ ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ๋๋ฆด๊ฒ์! ์ด๊ฑธ ๋ค ์ฒดํฌํ๋ฉด ์๋ฒฝํ Space๊ฐ ๋ ๊ฑฐ์์. โ
| ํญ๋ชฉ | ์ฒดํฌ | ์ค๋ช |
|---|---|---|
| ๐ README ์์ฑ | โ | ์ฑ ์ค๋ช , ์ฌ์ฉ๋ฒ, ์์ ํฌํจ |
| ๐ง requirements.txt | โ | ๋ชจ๋ ์์กด์ฑ ๋ช ์, ๋ฒ์ ๊ณ ์ |
| ๐จ UI ๋์์ธ | โ | ์ง๊ด์ ์ด๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์ธํฐํ์ด์ค |
| โก ์ฑ๋ฅ ์ต์ ํ | โ | ์บ์ฑ, ๋ฐฐ์น ์ฒ๋ฆฌ, ๋น๋๊ธฐ ์ฒ๋ฆฌ |
| ๐ ๋ณด์ ์ค์ | โ | API ํค Secrets ์ฒ๋ฆฌ, ์ ๋ ฅ ๊ฒ์ฆ |
| ๐ฑ ๋ชจ๋ฐ์ผ ํ ์คํธ | โ | ๋ชจ๋ฐ์ผ์์ ์ ์ ์๋ ํ์ธ |
| ๐ ์๋ฌ ์ฒ๋ฆฌ | โ | ์์ธ ์ํฉ ์ฒ๋ฆฌ, ์น์ ํ ์๋ฌ ๋ฉ์์ง |
| ๐ ๋ก๊น ์ค์ | โ | ๋๋ฒ๊น ์ ์ํ ๋ก๊ทธ ์ถ๊ฐ |
| ๐งช ํ ์คํธ | โ | ๋ค์ํ ์ ๋ ฅ์ผ๋ก ํ ์คํธ |
| ๐ ๋ผ์ด์ ์ค | โ | ์ ์ ํ ๋ผ์ด์ ์ค ์ ํ |
| ๐จ ๋ธ๋๋ฉ | โ | ๋ก๊ณ , ์์, ํฐํธ ํต์ผ |
| ๐ Analytics | โ | ์ฌ์ฉ๋ ์ถ์ ์ค์ |
๐ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์! ์ฌ๊ธฐ๊น์ง ์ฝ์ผ์
จ๋ค๋ ์ ๋ง ๋๋จํด์! ๐
Hugging Face Space๋ AI ๊ฐ๋ฐ์์๊ฒ ์ ๋ง ๊ฐ๋ ฅํ ๋๊ตฌ์์. ๋ฌด๋ฃ๋ก ์์ํ ์ ์๊ณ , ์๋ฒ ๊ด๋ฆฌ ๊ฑฑ์ ์์ด ๋ด AI ๋ชจ๋ธ์ ์ ์ธ๊ณ์ ๊ณต์ ํ ์ ์์ฃ . ํนํ ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์ AI ๊ด๋ จ ์๋น์ค๋ฅผ ์ ๊ณตํ ๋ Space๋ฅผ ํ์ฉํ๋ฉด ์์
ํจ์จ์ด ์์ฒญ ์ฌ๋ผ๊ฐ์! ๐ช
์ฒ์์๋ ์ด๋ ต๊ฒ ๋๊ปด์ง ์ ์์ง๋ง, ํ๋์ฉ ๋ฐ๋ผํ๋ค ๋ณด๋ฉด ๊ธ๋ฐฉ ์ต์ํด์ง ๊ฑฐ์์. ์์ ํ๋ก์ ํธ๋ถํฐ ์์ํด์ ์ ์ ํฐ ํ๋ก์ ํธ๋ก ๋์ ํด๋ณด์ธ์!
์ฌ๋ฌ๋ถ์ AI ํ๋ก์ ํธ๊ฐ ์ฑ๊ณตํ๊ธธ ์์ํฉ๋๋ค! ํ์ดํ
! ๐โจ
๐ก ์ด ๊ธ์ด ๋์์ด ๋์ จ๋์?
์ฌ๋ฅ๋ท์์ AI/๋จธ์ ๋ฌ๋ ๊ด๋ จ ์ฌ๋ฅ์ ๊ณต์ ํ๊ฑฐ๋
๋ ๋ง์ ๊ฐ๋ฐ ์ง์์ ์ป์ด๋ณด์ธ์!
๐ www.jaenung.net
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.