Hub documentation

İlk Docker Space'iniz: T5 ile Metin Üretimi

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

İ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: docker

Space'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: 7860

Bağı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 fastapi

Uygulamamı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.

  1. Çı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"]}
  1. Sayfanın kodunu içeren basit bir form içerecek şekilde index.html dosyası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>
  1. main.py dosyası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")
  1. script.js dosyası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);
});
  1. 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:$PATH

Son 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

Daha Fazla Oku

Update on GitHub