Hub documentation

Streamlit Spaces

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Spaces์˜ ๊ธฐ๋ณธ ๋‚ด์žฅ SDK๋กœ Streamlit์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ต์…˜์€ ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Streamlit๋กœ Space๋ฅผ ๋ฐฐํฌํ•˜๋ ค๋ฉด Docker SDK๋ฅผ ์„ ํƒํ•œ ํ›„ Streamlit ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

Streamlit Spaces

Streamlit๋Š” ๋ฐ˜์‘ํ˜• ๋ฐฉ์‹์œผ๋กœ Python์„ ์‚ฌ์šฉํ•ด ๊ธฐ๋Šฅ์ ์ธ ์›น ์•ฑ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ์ž์œ ๋„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Streamlit์€ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”์—๋„ ํƒ์›”ํ•˜๋ฉฐ Bokeh, Plotly, Altair์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Spaces์—์„œ Streamlit ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ฝ์–ด๋ณด์„ธ์š”.

์ƒˆ๋กœ์šด Space๋ฅผ ์ƒ์„ฑํ•  ๋•Œ Streamlit์„ SDK๋กœ ์„ ํƒํ•˜๋ฉด README.md ํŒŒ์ผ์˜ YAML ๋ธ”๋ก์—์„œ sdk ์†์„ฑ์„ streamlit์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ์ตœ์‹  ๋ฒ„์ „์˜ Streamlit๋กœ Space๊ฐ€ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. Streamlit ๋ฒ„์ „์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด sdk_version ์†์„ฑ์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Space์—์„œ Streamlit์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด New Space ์–‘์‹์„ ํ†ตํ•ด Space๋ฅผ ์ƒ์„ฑํ•  ๋•Œ SDK๋กœ Streamlit์„ ์„ ํƒํ•˜์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ ์†์„ฑ์ด ํฌํ•จ๋œ YAML ๊ตฌ์„ฑ ๋ธ”๋ก์ด ์žˆ๋Š” README.md๊ฐ€ ํฌํ•จ๋œ ์ €์žฅ์†Œ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค:

sdk: streamlit
sdk_version: 1.25.0 # The latest supported version

sdk_version๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ง€์›๋˜์ง€ ์•Š๋Š” Streamlit ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  Streamlit ๋ฒ„์ „์ด ์ง€์›๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „์„ ํ™•์ธํ•˜๋ ค๋ฉด ์ฐธ์กฐ ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Streamlit์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” Streamlit ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Streamlit Spaces์—๋Š” 8501 ํฌํŠธ๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ ํฌํŠธ). ๋”ฐ๋ผ์„œ Space์— config.toml ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ ํฌํŠธ๊ฐ€ ์žฌ์ •์˜๋˜์ง€ ์•Š๋„๋ก ํ™•์ธํ•˜์„ธ์š”.

์ฒซ ๋ฒˆ์งธ Streamlit Space: ํ•ซ๋„๊ทธ ๋ถ„๋ฅ˜๊ธฐ

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Space๋ฅผ ๋งŒ๋“ค๊ณ , ์„ค์ •ํ•˜๋ฉฐ, ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. Streamlit์„ ์‚ฌ์šฉํ•˜์—ฌ Hot Dog Classifier Space๋ฅผ ๋งŒ๋“ค๊ณ , ์ฃผ์–ด์ง„ ์‚ฌ์ง„์— ํ•ซ๋„๊ทธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” julien-c/hotdog-not-hotdog ๋ชจ๋ธ์„ ๋ฐ๋ชจ๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐ŸŒญ

์™„์„ฑ๋œ ๋ฒ„์ „์€ NimaBoscarino/hotdog-streamlit์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด Streamlit Space ๋งŒ๋“ค๊ธฐ

์ƒˆ๋กœ์šด Space๋ฅผ ์ƒ์„ฑํ•˜๊ณ  SDK๋กœ Streamlit์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. Hugging Face Spaces๋Š” Git ์ €์žฅ์†Œ์ด๋ฏ€๋กœ ์ปค๋ฐ‹์„ ํ‘ธ์‹œํ•˜์—ฌ Space๋ฅผ ์ ์ง„์ ์œผ๋กœ(๊ทธ๋ฆฌ๊ณ  ํ˜‘์—…ํ•˜์—ฌ) ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์†ํ•˜๊ธฐ ์ „์— ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ํŽธ์ง‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด Getting Started with Repositories ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•ด ๋ณด์„ธ์š”.

์˜์กด์„ฑ์„ ์ถ”๊ฐ€

Hot Dog Classifier์—์„œ๋Š” ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๐Ÿค— Transformers pipeline์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ๋จผ์ € ๋ช‡ ๊ฐ€์ง€ ์˜์กด์„ฑ์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ €์žฅ์†Œ์— requirements.txt ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ์•„๋ž˜ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค:

transformers
torch

Spaces ๋Ÿฐํƒ€์ž„์ด ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค!

Streamlit ์•ฑ ๋งŒ๋“ค๊ธฐ

Streamlit ์•ฑ์„ ๋งŒ๋“ค๋ ค๋ฉด ์ €์žฅ์†Œ์— app.py๋ผ๋Š” ์ƒˆ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

import streamlit as st
from transformers import pipeline
from PIL import Image

pipeline = pipeline(task="image-classification", model="julien-c/hotdog-not-hotdog")

st.title("Hot Dog? Or Not?")

file_name = st.file_uploader("Upload a hot dog candidate image")

if file_name is not None:
    col1, col2 = st.columns(2)

    image = Image.open(file_name)
    col1.image(image, use_column_width=True)
    predictions = pipeline(image)

    col2.header("Probabilities")
    for p in predictions:
        col2.subheader(f"{ p['label'] }: { round(p['score'] * 100, 1)}%")

์ด Python ์Šคํฌ๋ฆฝํŠธ๋Š” ๐Ÿค— Transformers pipeline์„ ์‚ฌ์šฉํ•˜์—ฌ Streamlit ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” julien-c/hotdog-not-hotdog ๋ชจ๋ธ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. Streamlit ์•ฑ์€ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๋„๋ก ์š”๊ตฌํ•˜๋ฉฐ, ์—…๋กœ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ hot dog ๋˜๋Š” not hot dog๋กœ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ app.py ํŒŒ์ผ๋กœ ์ €์žฅํ•œ ํ›„ App ํƒญ์„ ๋ฐฉ๋ฌธํ•˜์—ฌ ์•ฑ์„ ์‹คํ–‰ํ•˜๋Š” ๋ชจ์Šต์„ ํ™•์ธํ•ด ๋ณด์„ธ์š”!

๋‹ค๋ฅธ ์›นํŽ˜์ด์ง€์— Streamlit Spaces ์ž„๋ฒ ๋“œ

HTML <iframe> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Streamlit Space๋ฅผ ๋‹ค๋ฅธ ์›นํŽ˜์ด์ง€์— ์ธ๋ผ์ธ ํ”„๋ ˆ์ž„์œผ๋กœ ์ž„๋ฒ ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .hf.space ์ ‘๋ฏธ์‚ฌ๋กœ ๋๋‚˜๋Š” Space์˜ URL์„ ํฌํ•จํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. Space์˜ URL์„ ์ฐพ์œผ๋ ค๋ฉด Spaces ์˜ต์…˜์˜ โ€œEmbed this Spaceโ€ ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ๋ฐ๋ชจ๋Š” ๋‹ค์Œ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์„œ์— ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

<iframe
  src="https://huggingface.co/proxy/NimaBoscarino-hotdog-streamlit.hf.space?embed=true"
  title="My awesome Streamlit Space"
></iframe>

URL์— ?embed=true๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ Streamlit ์•ฑ์˜ ์ž„๋ฒ ๋“œ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ผ๋ถ€ ์—ฌ๋ฐฑ๊ณผ ํ‘ธํ„ฐ๊ฐ€ ์ œ๊ฑฐ๋˜์–ด ์Šฌ๋ฆผํ•œ ์ž„๋ฒ ๋“œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ž๋™ ํฌ๊ธฐ ์กฐ์ ˆ๋˜๋Š” IFrames๋กœ Streamlit Spaces ์ž„๋ฒ ๋“œ

Streamlit์€ 1.17.0๋ถ€ํ„ฐ ์ž๋™ iframe ๋ฆฌ์‚ฌ์ด์ง•์„ ์ง€์›ํ•˜์—ฌ, ์ž„๋ฒ ๋“œ๋œ Streamlit ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝ˜ํ…์ธ  ์–‘์— ๋งž์ถฐ ๋ถ€๋ชจ iframe์˜ ํฌ๊ธฐ๊ฐ€ ์ž๋™์œผ๋กœ ์กฐ์ •๋ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ iFrame Resizer ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•˜๋ฉฐ, ์•„๋ž˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • id์€ ์ž๋™ ๋ฆฌ์‚ฌ์ด์ฆˆ ๋Œ€์ƒ ์ง€์ •์„ ์œ„ํ•ด <iframe />์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • iFrame Resizer๋Š” script ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.
  • iFrameResize() ํ•จ์ˆ˜๋Š” ๋Œ€์ƒ iframe ์š”์†Œ์˜ ID๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›์•„, ํฌ๊ธฐ๊ฐ€ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋„๋ก ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

iFrameResize()์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์— ์˜ต์…˜์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

<iframe
	id="your-iframe-id"
	src="https://<space-subdomain>.hf.space"
	frameborder="0"
	width="850"
	height="450"
></iframe>
<script src="https://cdn.jsdelivr.net/npm/iframe-resizer@4.3.4/js/iframeResizer.min.js"></script>
<script>
  iFrameResize({}, "#your-iframe-id")
</script>

๋˜ํ•œ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•ด ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Update on GitHub