Hub documentation
İlk Docker Space'iniz: T5 ile Metin Üretimi
İlk Docker Space'iniz: T5 ile Metin Üretimi
Aşağıdaki bölümlerde, bir Docker Space oluşturma, yapılandırma ve kodunuzu bu Space'e dağıtma temellerini öğreneceksiniz. FastAPI'yi sunucu olarak kullanarak, girdi metni verildiğinde metin üretebilen google/flan-t5-small modelini demo etmek için Docker ile bir Text Generation Space oluşturacağız.
Bu barındırılan içeriğin tamamlanmış sürümünü burada bulabilirsiniz.
Yeni bir Docker Space oluşturun
Yepyeni bir Space oluşturarak başlayacağız ve SDK olarak Docker'ı seçeceğiz.

Hugging Face Spaces, Git depolarıdır; bu nedenle commit'ler göndererek Space'iniz üzerinde kademeli (ve işbirlikçi) olarak çalışabilirsiniz. Devam etmeden önce dosyaları nasıl oluşturup düzenleyebileceğinizi öğrenmek için Depolarla Başlangıç kılavuzuna göz atın. Arayüz üzerinden çalışmayı tercih ederseniz, işlemleri doğrudan tarayıcıda da yapabilirsiniz.
Yeni bir Space oluştururken SDK olarak Docker seçildiğinde, README.md dosyanızdaki YAML bloğunda sdk özelliği docker olarak ayarlanarak Docker Space'iniz başlatılır.
sdk: dockerSpace'iniz için README.md dosyasının YAML bloğunda app_port özelliğini ayarlayarak varsayılan uygulama portunu değiştirme seçeneğiniz vardır. Varsayılan port 7860'dır.
app_port: 7860Bağımlılıkları ekleyin
Text Generation Space için, Flan T5 adlı bir metin üretme modelini sergileyen bir FastAPI uygulaması geliştireceğiz. Model çıkarımı için modeli kullanmak üzere 🤗 Transformers pipeline kullanacağız. Başlamak için birkaç bağımlılığı kurmamız gerekiyor. Bunu, depomuzda bir requirements.txt dosyası oluşturup aşağıdaki bağımlılıkları ekleyerek yapabiliriz:
fastapi==0.74.*
requests==2.27.*
sentencepiece==0.1.*
torch==1.11.*
transformers==4.*
uvicorn[standard]==0.17.*Bu bağımlılıklar, daha sonra oluşturacağımız Dockerfile içinde yüklenecektir.
Uygulamayı oluşturun
Süreci, bir uç noktanın çalıştığını görmek için sahte bir FastAPI uygulamasıyla başlatalım. İlk adım, bir uygulama dosyası oluşturmaktır; bu durumda dosyaya main.py adını vereceğiz.
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World!"}Dockerfile'ı oluşturun
Docker Space için ana adım, bir Dockerfile oluşturmaktır. Dockerfile'lar hakkında daha fazla bilgiyi burada okuyabilirsiniz. Bu öğreticide FastAPI kullanıyoruz ancak Dockerfile'lar kullanıcılara büyük bir esneklik sağlayarak yeni nesil ML demo'ları oluşturmanıza olanak tanır. Uygulamamız için Dockerfile'ı yazalım
# read the doc: https://huggingface.co/docs/hub/spaces-sdks-docker
# you will also find guides on how best to write your Dockerfile
FROM python:3.9
# The two following lines are requirements for the Dev Mode to be functional
# Learn more about the Dev Mode at https://huggingface.co/dev-mode-explorers
RUN useradd -m -u 1000 user
WORKDIR /app
COPY --chown=user ./requirements.txt requirements.txt
RUN pip install --no-cache-dir --upgrade -r requirements.txt
COPY --chown=user . /app
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
Değişiklikler kaydedildiğinde Space yeniden derlenir ve birkaç saniye içinde demonuz hazır olur! İşte bu aşamada bir örnek sonuç.

Yerel olarak test etme
Gelişmiş kullanıcılar için ipucu (atlayabilirsiniz): Yerel olarak geliştirme yapıyorsanız, yerel ortamda hata ayıklamak için docker build ve docker run komutlarını çalıştırmak için iyi bir andır; ancak değişiklikleri Hub'a gönderip nasıl göründüğünü görmek çok daha kolaydır!
docker build -t fastapi . docker run -it -p 7860:7860 fastapi
Secrets varsa, docker buildx kullanabilir ve gizli bilgileri derleme argümanları olarak iletebilirsiniz.
export SECRET_EXAMPLE="my_secret_value"
docker buildx build --secret id=SECRET_EXAMPLE,env=SECRET_EXAMPLE -t fastapi .ve docker run ile çalıştırın, gizli bilgileri ortam değişkenleri olarak iletin
export SECRET_EXAMPLE="my_secret_value"
docker run -it -p 7860:7860 -e SECRET_EXAMPLE=$SECRET_EXAMPLE fastapiUygulamamıza biraz ML eklemek
Daha önce belirtildiği gibi, fikir metin üretimi için bir Flan T5 modeli kullanmaktır. Bir giriş alanı için bazı HTML ve CSS eklemek isteyeceğiz, bu yüzden index.html, style.css ve script.js dosyalarını içeren static adında bir dizin oluşturalım. Bu aşamada dosya yapınız şu şekilde görünmelidir:
/static /static/index.html /static/script.js /static/style.css Dockerfile main.py README.md requirements.txt
Bunun çalışması için tüm adımları inceleyelim. CSS ve HTML detaylarının bir kısmını atlayacağız. Tüm kodu DockerTemplates/fastapi_t5 Space’indeki Files and versions sekmesinde bulabilirsiniz.
- Çıkarım yapmak için FastAPI uç noktasını yazın
transformers içindeki pipeline bileşenini kullanarak google/flan-t5-small modelini yükleyeceğiz. Girdi alan ve çıkarım çağrısının sonucunu döndüren infer_t5 adında bir uç nokta tanımlayacağız.
from transformers import pipeline
pipe_flan = pipeline("text2text-generation", model="google/flan-t5-small")
@app.get("/infer_t5")
def t5(input):
output = pipe_flan(input)
return {"output": output[0]["generated_text"]}- Sayfanın kodunu içeren basit bir form içerecek şekilde
index.htmldosyasını yazın.
<main>
<section id="text-gen">
<h2>Text generation using Flan T5</h2>
<p>
Model:
<a
href="https://huggingface.co/google/flan-t5-small"
rel="noreferrer"
target="_blank"
>google/flan-t5-small
</a>
</p>
<form class="text-gen-form">
<label for="text-gen-input">Text prompt</label>
<input
id="text-gen-input"
type="text"
value="German: There are many ducks"
/>
<button id="text-gen-submit">Submit</button>
<p class="text-gen-output"></p>
</form>
</section>
</main>main.pydosyasında statik dosyaları bağlayın ve kök rotada html dosyasını gösterin
app.mount("/", StaticFiles(directory="static", html=True), name="static")
@app.get("/")
def index() -> FileResponse:
return FileResponse(path="/app/static/index.html", media_type="text/html")script.jsdosyasında isteği işleyecek şekilde düzenleyin
const textGenForm = document.querySelector(".text-gen-form");
const translateText = async (text) => {
const inferResponse = await fetch(`infer_t5?input=${text}`);
const inferJson = await inferResponse.json();
return inferJson.output;
};
textGenForm.addEventListener("submit", async (event) => {
event.preventDefault();
const textGenInput = document.getElementById("text-gen-input");
const textGenParagraph = document.querySelector(".text-gen-output");
textGenParagraph.textContent = await translateText(textGenInput.value);
});- Doğru dizinlere izinleri verin
İzinler Bölümü'nde belirtildiği gibi, konteyner 1000 kullanıcı kimliğiyle çalışır. Bu, Space'in izin sorunlarıyla karşılaşabileceği anlamına gelir. Örneğin, transformers modelleri indirir ve HF_HOME yolunun altındaki yolda önbelleğe alır. Bunu çözmenin en kolay yolu, doğru izinlere sahip bir kullanıcı oluşturmak ve konteyner uygulamasını çalıştırmak için bu kullanıcıyı kullanmaktır. Bunu Dockerfile'a aşağıdaki satırları ekleyerek yapabiliriz.
# Switch to the "user" user
USER user
# Set home to the user's home directory
ENV HOME=/home/user \
PATH=/home/user/.local/bin:$PATHSon Dockerfile şu şekilde görünmelidir:
# read the doc: https://huggingface.co/docs/hub/spaces-sdks-docker
# you will also find guides on how best to write your Dockerfile
FROM python:3.9
# The two following lines are requirements for the Dev Mode to be functional
# Learn more about the Dev Mode at https://huggingface.co/dev-mode-explorers
RUN useradd -m -u 1000 user
WORKDIR /app
COPY --chown=user ./requirements.txt requirements.txt
RUN pip install --no-cache-dir --upgrade -r requirements.txt
COPY --chown=user . /app
USER user
ENV HOME=/home/user \
PATH=/home/user/.local/bin:$PATH
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]Başarılı! Uygulamanız artık çalışıyor olmalı. Sonucu görmek için DockerTemplates/fastapi_t5 adresine göz atın.

Ne güzel bir yolculuk! Docker Spaces size çok fazla özgürlük tanıdığını ve FastAPI kullanımıyla sınırlı olmadığınızı lütfen unutmayın. Go Endpoint'ten Shiny App'e kadar sınır ay! Bazı resmi örnekleri inceleyebilirsiniz. Gerekirse Space'inizi bir GPU'ya yükseltebilirsiniz 😃
Hata Ayıklama
Space'ınızı Build ve Container günlüklerini kontrol ederek hata ayıklayabilirsiniz. Modalı açmak için Open Logs düğmesine tıklayın.

Her şey yolundaysa, Build sekmesinde Pushing Image ve Scheduling Space ifadelerini görürsünüz.

Container sekmesinde uygulama durumunu görebilirsiniz; bu durumda Uvicorn running on http://0.0.0.0:7860

Ayrıca, Space'inizde Dev Mode'u etkinleştirebilirsiniz. Dev Mode, çalışan Space'inize VSCode veya SSH üzerinden bağlanmanızı sağlar. Daha fazla bilgi için: https://huggingface.co/dev-mode-explorers