Hub documentation

Không gian Docker đầu tiên của bạn: Tạo văn bản với T5

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Không gian Docker đầu tiên của bạn: Tạo văn bản với T5

Trong các phần tiếp theo, bạn sẽ học các kiến thức cơ bản về việc tạo một Docker Space, cấu hình nó và triển khai mã của bạn lên đó. Chúng ta sẽ tạo một Space Text Generation với Docker để demo mô hình google/flan-t5-small, có khả năng tạo văn bản dựa trên một số văn bản đầu vào, sử dụng FastAPI làm máy chủ.

Bạn có thể tìm thấy phiên bản hoàn chỉnh của tài liệu này được lưu trữ tại đây.

Tạo một Space Docker mới

Chúng ta sẽ bắt đầu bằng cách tạo một Space hoàn toàn mới và chọn Docker làm SDK.

Hugging Face Spaces là các kho Git, nghĩa là bạn có thể làm việc trên Space của mình theo từng bước (và hợp tác) bằng cách đẩy các commit. Hãy xem hướng dẫn Bắt đầu với Repositories để tìm hiểu cách tạo và chỉnh sửa tệp trước khi tiếp tục. Nếu bạn thích làm việc với giao diện người dùng, bạn cũng có thể thực hiện công việc trực tiếp trong trình duyệt.

Việc chọn Docker làm SDK khi tạo một Space mới sẽ khởi tạo Docker Space của bạn bằng cách đặt thuộc tính sdk thành docker trong khối YAML của tệp README.md.

sdk: docker

Bạn có thể thay đổi cổng ứng dụng mặc định của Space bằng cách đặt thuộc tính app_port trong khối YAML của tệp README.md. Cổng mặc định là 7860.

app_port: 7860

Thêm các phụ thuộc

Đối với Space Text Generation, chúng ta sẽ xây dựng một ứng dụng FastAPI để giới thiệu mô hình tạo văn bản có tên Flan T5. Đối với suy luận mô hình, chúng ta sẽ sử dụng 🤗 Transformers pipeline để chạy mô hình. Trước tiên, chúng ta cần cài đặt một số thư viện phụ thuộc. Việc này có thể thực hiện bằng cách tạo tệp requirements.txt trong kho lưu trữ của chúng ta và thêm các phụ thuộc sau vào tệp đó:

fastapi==0.74.*
requests==2.27.*
sentencepiece==0.1.*
torch==1.11.*
transformers==4.*
uvicorn[standard]==0.17.*

Các phụ thuộc này sẽ được cài đặt trong Dockerfile mà chúng ta sẽ tạo sau.

Tạo ứng dụng

Hãy bắt đầu quy trình bằng một ứng dụng FastAPI giả lập để kiểm tra xem chúng ta có thể chạy một endpoint hay không. Bước đầu tiên là tạo một tệp ứng dụng, trong trường hợp này, chúng ta sẽ đặt tên là main.py.

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World!"}

Tạo tệp Dockerfile

Bước chính để tạo một Docker Space là tạo một Dockerfile. Bạn có thể đọc thêm về Dockerfile tại đây. Mặc dù chúng ta sử dụng FastAPI trong hướng dẫn này, Dockerfile mang lại sự linh hoạt lớn cho người dùng, cho phép bạn xây dựng thế hệ mới các demo ML. Hãy viết Dockerfile cho ứng dụng của chúng ta

# 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"]

Khi các thay đổi được lưu, Space sẽ được xây dựng lại và demo của bạn sẽ hoạt động sau vài giây! Đây là một kết quả mẫu ở bước này.

Kiểm thử cục bộ

Mẹo cho người dùng nâng cao (bạn có thể bỏ qua): Nếu bạn đang phát triển cục bộ, đây là thời điểm tốt để thực hiện docker build và docker run để gỡ lỗi cục bộ, nhưng thậm chí còn dễ hơn là đẩy các thay đổi lên Hub và xem kết quả!

docker build -t fastapi .
docker run  -it -p 7860:7860 fastapi

Nếu bạn có Secrets, bạn có thể sử dụng docker buildx và truyền các secrets dưới dạng build arguments

export SECRET_EXAMPLE="my_secret_value"
docker buildx build --secret id=SECRET_EXAMPLE,env=SECRET_EXAMPLE -t fastapi .

và chạy bằng docker run bằng cách truyền các bí mật dưới dạng biến môi trường

export SECRET_EXAMPLE="my_secret_value"
docker run -it -p 7860:7860 -e SECRET_EXAMPLE=$SECRET_EXAMPLE fastapi

Thêm một chút ML vào ứng dụng của chúng ta

Như đã đề cập trước đó, ý tưởng là sử dụng một mô hình Flan T5 cho việc tạo văn bản. Chúng ta sẽ cần thêm một số HTML và CSS cho trường nhập liệu, vì vậy hãy tạo một thư mục tên là static chứa các tệp index.html, style.css và script.js. Vào thời điểm này, cấu trúc tệp của bạn nên trông như sau:

/static
/static/index.html
/static/script.js
/static/style.css
Dockerfile
main.py
README.md
requirements.txt

Hãy cùng đi qua tất cả các bước để triển khai hoạt động. Chúng ta sẽ bỏ qua một số chi tiết về CSS và HTML. Bạn có thể tìm thấy toàn bộ mã nguồn trong tab Files and versions của Space DockerTemplates/fastapi_t5.

  1. Viết điểm cuối FastAPI để thực hiện suy luận

Chúng ta sẽ sử dụng pipeline từ transformers để tải mô hình google/flan-t5-small. Chúng ta sẽ đặt một endpoint có tên infer_t5 để nhận đầu vào và trả về kết quả của cuộc gọi suy luận

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. Viết index.html để có một biểu mẫu đơn giản chứa mã của trang.
<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. Trong tệp main.py, hãy gắn các tệp tĩnh và hiển thị tệp html ở tuyến gốc
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. Trong tệp script.js, hãy xử lý yêu cầu
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. Cấp quyền cho các thư mục phù hợp

Như đã thảo luận trong Phần Quyền, container chạy với user ID 1000. Điều đó có nghĩa là Space có thể gặp các vấn đề về quyền. Ví dụ, transformers tải xuống và lưu cache các model trong đường dẫn dưới đường dẫn HF_HOME. Cách đơn giản nhất để giải quyết vấn đề này là tạo một user với các quyền phù hợp và sử dụng user đó để chạy ứng dụng trong container. Chúng ta có thể thực hiện điều này bằng cách thêm các dòng sau vào Dockerfile.

# 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

Dockerfile cuối cùng nên có dạng như sau:


# 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"]

Thành công! Ứng dụng của bạn giờ đã hoạt động! Xem DockerTemplates/fastapi_t5 để xem kết quả cuối cùng.

Thật là một hành trình! Hãy nhớ rằng Docker Spaces mang đến cho bạn nhiều quyền tự do, vì vậy bạn không bị giới hạn trong việc sử dụng FastAPI. Từ một Go Endpoint đến một Shiny App, giới hạn là mặt trăng! Hãy xem một số ví dụ chính thức. Bạn cũng có thể nâng cấp Space của mình lên GPU nếu cần 😃

Gỡ lỗi

Bạn có thể gỡ lỗi Space của mình bằng cách kiểm tra nhật ký Build và Container. Nhấp vào nút Open Logs để mở hộp thoại.

Nếu mọi thứ diễn ra suôn sẻ, bạn sẽ thấy Pushing Image và Scheduling Space trên tab Build

Trên tab Container, bạn sẽ thấy trạng thái ứng dụng, trong trường hợp này là Uvicorn running on http://0.0.0.0:7860

Ngoài ra, bạn có thể bật Dev Mode trên Space của mình. Dev Mode cho phép bạn kết nối với Space đang chạy của mình qua VSCode hoặc SSH. Tìm hiểu thêm tại đây: https://huggingface.co/dev-mode-explorers

Đọc thêm

Update on GitHub