HuggingFace Space๋ ๊ฐํธํ๊ณ ์ฝ๊ฒ ML ๋ฐ๋ชจ ์ฑ์ ๋ง๋ค ์ ์๋ ๊ณต๊ฐ์ด๋ค.
Space๋ค์ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
๋ณธ ๊ธ์์๋ ์ด๋ฌํ HuggingFace Space๋ฅผ ๋ง๋๋ ๋ฒ์ ๋ํด ๊ฐ๋ตํ ์๊ฐํ๊ณ ์ ํฉ๋๋ค. ๋ณด๋ค ์์ธํ ์ค๋ช ์ ๊ณต์ docs๋ฅผ ์ฐธ๊ณ ๋ฐ๋.
HuggingFace Space๋ฅผ ๋ง๋ค๊ธฐ ์ํด Streamlit๊ณผ Gradio ๋๊ฐ์ง ์ข ๋ฅ์ SDK๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ณด๋ค ๋ํ ์ผํ ์ปค์คํ ์ ์ํด JavaScript๋ HTML์ ์ด์ฉํ ์๋ ์๋ค๊ณ ํ๋ค.
์ด ๊ธ์์๋ Gradio๋ฅผ ์ฌ์ฉํด Space๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ์ต๋๋ค.
1. Space ์์ฑํ๊ธฐ
Space Home์์ Create new Space ๋ฒํผ์ ๋๋ฌ ์๋ก์ด Space๋ฅผ ์์ฑํ ์ ์๋ค.
Space์ ์ด๋ฆ๊ณผ ๋ผ์ด์ผ์ค, SDK, Space๊ฐ ๋์๊ฐ ํ๋์จ์ด ์ข ๋ฅ ๋ฑ์ ์ ํํ ์ ์๋ค.
SDK๋ space๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํ ์ ์๋ ํด์ด๋ค. Streamlit, Gradio๋ฑ์ด ์๋ค.
ํ๋์จ์ด์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ์ต์ ์ธ CPU๋ ๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์๋๋ฐ, CPU ๊ฐฏ์๋ฅผ ๋๋ฆฌ๊ฑฐ๋ GPU๋ฅผ ์ด์ฉํ๋ ค๋ฉด ์ถ๊ฐ ์๊ธ์ ๋ด์ผ ํ๋ค.
Inference๋ง ํ ๊ฑฐ๋ผ๋ฉด ์กฐ๊ธ ๋๋ฆฌ์ง๋ง ๊ธฐ๋ณธ CPU๋ ์ถฉ๋ถํ ๊ฒ ๊ฐ๋ค.
Space๋ฅผ ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์คํํธ ํ์ด์ง๊ฐ ๋ฌ๋ค.
Space์ ์ฝ๋๋ค์ git repository์ ์ ์ฅ๋๋ค. ์ด repository๋ฅผ cloneํด์ ์ฝ๋๋ฅผ ์์ ํ ์ ์๊ณ ,
commit๋ค์ด push๋ ๋๋ง๋ค ํด๋น ๋ด์ฉ์ด space์ ์๋์ผ๋ก ๋ฐ์๋๋ค.
2. Gardio๋ก space ๊พธ๋ฏธ๊ธฐ (๊ธฐ์ด)
์์ฑํ repository๋ฅผ cloneํ๊ณ , ๊ทธ ์์ app.py ํ์ผ์ ์ถ๊ฐํ์ฌ app์ ์คํ์ํฌ ์ ์๋ค.
์์๋ก ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ pushํ๋ฉด,
#app.py
import gradio as gr
def greet(name):
return "Hello " + name + "!!"
iface = gr.Interface(fn=greet, inputs="text", outputs="text")
iface.launch()
HuggingFace Space์์ ์๋์ผ๋ก ๋น๋๊ฐ ์งํ๋๋ค.
๋น๋๊ฐ ์๋ฃ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ๋ฉด์ด ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
3. Gradio Interface
์ ์ฝ๋์์ ์ฌ์ฉํ gradio.Interface๋
ML ๋ชจ๋ธ์ ์ฌ์ฉํ๋ web-based GUI๋ฅผ ์์ฑํ ์ ์๊ฒ ํด์ฃผ๋ class์ด๋ค.
gradio.Interface๋ ์ธ๊ฐ์ง์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋ค.
gradio.Interface(fn, inputs, outputs, ...)
์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ธ fn์ ํด๋น interface๊ฐ ์คํ๋ ๋ ํธ์ถํ ํจ์์ ํด๋นํ๋ค.
fn์ ์ ๋ ฅ ํํ๋ inputs์, fn์ ์ถ๋ ฅ ํํ๋ outputs๋ก ์ง์ ํด ์ฃผ๋ฉด ๋๋ค.
inputs์ outputs๋ ํ๋์ Gradio Component,
ํน์ ๊ฐ Gradio Component์ ํด๋นํ๋ string shortcut์ผ๋ก ์ง์ ํด์ค ์ ์๋ค.
์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
import gradio as gr
def image_classifier(inp):
return {'cat': 0.3, 'dog': 0.7}
demo = gr.Interface(fn=image_classifier, inputs="image", outputs="label")
demo.launch()
์ ์ฝ๋๋ ์ด๋ฏธ์ง(gradio.Image)๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ๊ณ ,
classification label(gradio.label)์ ์ถ๋ ฅํ๋ค.
์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ํํ๋ฅผ list๋ก ์ฃผ์ด์ ์ฌ๋ฌ ๊ฐ์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ์ง์ ํด์ค ์๋ ์๋ค.
import gradio as gr
def greet(name, is_morning, temperature):
salutation = "Good morning" if is_morning else "Good evening"
greeting = f"{salutation} {name}. It is {temperature} degrees today"
celsius = (temperature - 32) * 5 / 9
return greeting, round(celsius, 2)
demo = gr.Interface(
fn=greet,
inputs=["text", "checkbox", gr.Slider(0, 100)],
outputs=["text", "number"],
)
demo.launch()
gradio.Interface์ ๋ํ ๋ณด๋ค ์์ธํ ์ค๋ช ๊ณผ ๊ฐ component์ ์ข ๋ฅ, shortcut์ Gradio Docs์์ ํ์ธํ ์ ์๋ค.
4. ํซ๋๊ทธ ํ๋ณ๊ธฐ ๋ง๋ค๊ธฐ
HuggingFace์ Models์์๋ ์ฌ๋ฌ ์ฌ๋๋ค์ด ์ฌ๋ฆฐ ๋ชจ๋ธ์ ํ์ธํ ์ ์๋ค.
์ด ์ค julien-c๊ฐ ์ ๋ก๋ํ hotdog-not-hotdog ๋ชจ๋ธ์ ์ด์ฉํด ํซ๋๊ทธ ํ๋ณ๊ธฐ Space๋ฅผ ๋ง๋ค์ด ๋ด ์๋ค.
#app.py
import gradio as gr
from transformers import pipeline
pipeline = pipeline(task="image-classification", model="julien-c/hotdog-not-hotdog")
def predict(image):
predictions = pipeline(image)
return {p["label"]: p["score"] for p in predictions}
gr.Interface(
predict,
inputs=gr.inputs.Image(label="Upload hot dog candidate", type="filepath"),
outputs=gr.outputs.Label(num_top_classes=2),
title="Hot Dog? Or Not?",
).launch()
transformers.pipeline์ ์ด์ฉํ๋ฉด ML ํ์ดํ๋ผ์ธ์ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
์ฌ์ฉํ ๋ชจ๋ธ๋ก hotdog-not-hotdog๋ฅผ ์ง์ ํด์ฃผ๊ณ ,
predict ํจ์๋ฅผ ๋ง๋ ํ
gr.Interface์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
Interface์ ์ ๋ ฅ์ผ๋ก๋ ์ด๋ฏธ์ง, ์ถ๋ ฅ์ผ๋ก๋ classification label๋ก ์ง์ ํด์ค๋ค.
์ด ๋ HuggingFace Transformers ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๊ธฐ ๋๋ฌธ์,
๋ค์ dependency๋ฅผ requirements.txt ํ์ผ์ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ค.
#requirements.txt
transformers
torch
app.py ํ์ผ๊ณผ requirements.txt ํ์ผ์ pushํ๊ณ
space๋ฅผ ์๋ก๊ณ ์นจํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ๋ฉด์ ํ์ธํ ์ ์๋ค.
ํซ๋๊ทธ์ธ์ง ์๋์ง ํ๋ณํ๋ ๋ฐ์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
'๐ Python & library > HuggingFace' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[HuggingFace] Trainer ์ฌ์ฉ๋ฒ (0) | 2022.07.23 |
---|---|
[HuggingFace] Tokenizer์ ์ญํ ๊ณผ ๊ธฐ๋ฅ, Token ID, Input ID, Token type ID, Attention Mask (0) | 2022.06.03 |
[HuggingFace] Tokenizer class ์์๋ณด๊ธฐ (0) | 2022.06.03 |
[HuggingFace] Pipeline & AutoClass (0) | 2022.05.31 |