Chuyển đến nội dung chính

Cách triển khai LLM với BentoML: Hướng dẫn từng bước

Hướng dẫn này chỉ cho bạn cách xây dựng ứng dụng AI hỏi–đáp, phục vụ cục bộ và triển khai lên BentoCloud — tất cả chỉ với vài dòng Python.
· 7 phút đọc

Khám phá cùng AI

Nhiều nhà khoa học dữ liệu và kỹ sư machine learning gặp khó khăn với các công cụ như Docker, Kubernetes và Terraform, cũng như trong việc xây dựng hạ tầng an toàn cho mô hình AI.

BentoML đơn giản hóa quy trình này, cho phép bạn xây dựng, phục vụ và triển khai ứng dụng AI chỉ với vài dòng mã Python.

Hướng dẫn này cung cấp lộ trình từng bước dành cho những ai muốn tự triển khai ứng dụng AI của mình, có thể truy cập ở mọi nơi qua một lệnh CURL đơn giản. Bạn sẽ tìm hiểu về framework BentoML, tạo ứng dụng AI hỏi–đáp chạy cục bộ và triển khai mô hình Phi 3 mini trên BentoCloud.

BentoML là gì?

BentoML là một framework phục vụ và triển khai machine learning giúp tinh gọn việc triển khai và mở rộng mô hình AI. Nó tự động hóa các tác vụ như tạo Docker image, thiết lập instance, quản lý hạ tầng và bảo mật, cùng những tính năng thiết yếu để có một server sẵn sàng cho sản xuất.

Với BentoML, bạn có thể phát triển và triển khai mô hình AI tùy chỉnh, mô hình tiền huấn luyện hoặc các giải pháp fine-tune trong vài phút với mã Python đơn giản. Nó cung cấp sự linh hoạt để mở rộng hiệu quả trong môi trường đám mây của bạn đồng thời đảm bảo bạn duy trì toàn quyền kiểm soát bảo mật và tuân thủ.

BentoML là một phần của bộ công cụ MLOps. Khám phá các công cụ MLOps hàng đầu khác cho việc huấn luyện, theo dõi, triển khai, điều phối, kiểm thử, giám sát và quản lý hạ tầng bằng cách đọc blog Top 15 công cụ LLMOps để xây dựng ứng dụng AI năm 2024.

Sơ đồ: BentoML hoạt động như thế nào

BentoML hoạt động như thế nào | Nguồn ảnh: BentoML

Ngôi sao của hệ sinh thái Bento là nền tảng đám mây: BentoCloud là phần mở rộng của framework BentoML, cung cấp thêm công cụ và dịch vụ giúp việc triển khai, giám sát và mở rộng mô hình AI trở nên dễ dàng hơn nữa. 

Khi đăng ký, người dùng có thể nhận tín dụng miễn phí để bắt đầu, khiến đây trở thành lựa chọn hấp dẫn cho nhà phát triển và doanh nghiệp.

Nếu bạn không thiên về kỹ thuật và đang tìm giải pháp no-code/low-code để phát triển ứng dụng LLM, tôi khuyến nghị làm theo hướng dẫn Local AI với Docker, n8n, Qdrant và Ollama.

Bắt đầu với BentoML

Trong phần này, chúng ta sẽ phục vụ một ứng dụng AI đơn giản nhận câu hỏi và ngữ cảnh từ người dùng rồi tạo ra câu trả lời.

Chúng ta sẽ bắt đầu bằng cách cài đặt BentoML, PyTorch và thư viện Transformers bằng pip. Chạy các lệnh sau trong terminal:  

$ pip install bentoml
$ pip install torch
$ pip install transformers

Tiếp theo, chúng ta sẽ tạo tệp service.py để định nghĩa server AI. 

Sử dụng các lệnh của BentoML, chúng ta sẽ import pipeline của Transformers, cho phép tải mô hình và suy luận chỉ với 2 dòng mã.

Chúng ta sẽ thiết lập ví dụ đầu vào văn bản và ngữ cảnh, cấu hình dịch vụ BentoML với các tham số như số CPU và thời gian chờ lưu lượng, và khởi tạo lớp Question_Answering bằng pipeline Transformers.

Cuối cùng, chúng ta sẽ tạo một API tên là generate(), nhận đầu vào và trả về câu trả lời đã tạo.

from __future__ import annotations

import bentoml

with bentoml.importing():
    from transformers import pipeline


EXAMPLE_INPUT = "How can I generate a secure password?"
EXAMPLE_CONTEXT = """
To generate a secure password, you can use tools like the LastPass Password Generator.
These tools create strong, random passwords that help prevent security threats by ensuring your accounts are protected against hacking attempts.
A secure password typically includes a mix of uppercase and lowercase letters, numbers, and special characters. Avoid using easily guessable information like names or birthdays.
Using a password manager like LastPass can also help you store and manage these secure passwords effectively.
"""



@bentoml.service(
    resources={"cpu": "4"},
    traffic={"timeout": 10},
)
class Question_Answering:
    def __init__(self) -> None:
        # Load model into pipeline
        self.pipe = pipeline(
            "question-answering",
            model="deepset/roberta-base-squad2",
        )

    @bentoml.api
    def generate(
        self,
        text: str =EXAMPLE_INPUT,
        doc: str = EXAMPLE_CONTEXT,
    ) -> str:
        result = self.pipe(question=text, context=doc)
        return result["answer"]

Phục vụ dịch vụ AI cục bộ bằng cách gõ lệnh sau trong terminal: 

$ bentoml serve service:Question_Answering 

Như bạn thấy, chúng ta đã cung cấp lệnh với tên tệp (service) và tên lớp Python (Question_Answering ) để suy luận mô hình AI.

Trong vài giây, nó sẽ tạo một URL mà bạn có thể sao chép và dán lên trình duyệt để truy cập server BentoML:

[cli] Starting production HTTP BentoServer from "app:Question_Answering" listening on http://localhost:3000 (Press CTRL+C to quit)

Server BentoML khá giống với FastAPI swagger UI.

Bento server: Swager UI.

Hãy kiểm thử server bằng tùy chọn “Try it out”. 

Dịch vụ AI của chúng ta hoạt động tốt và đã tạo ra câu trả lời chính xác:

Testing the API using SwagerUI.

Chúng ta cũng có thể truy cập server AI bằng lệnh CURL. Hãy đặt một câu hỏi khác và cung cấp ngữ cảnh:

curl -X 'POST' \
  'http://localhost:3000/generate' \
  -H 'accept: text/plain' \
  -H 'Content-Type: application/json' \
  -d '{
  "text": "How can I buy a cheap car?",
  "doc": "Start by setting a budget and exploring sources like online marketplaces (Craigslist, Facebook Marketplace, Cars.com), local dealerships, or government auctions. Inspect the car thoroughly for issues like rust or mechanical problems, and consider bringing a trusted mechanic to avoid future repair costs. Research the reliability of specific brands and models using tools like Kelley Blue Book or Consumer Reports. Finally, negotiate the price to secure the best deal. Following these steps can help you find a dependable car within your budget."
}'

Dịch vụ AI của chúng ta hoạt động trơn tru, và chỉ mất 1 giây để tạo phản hồi ngay cả trên CPU:

negotiate the price

Triển khai Phi 3 Mini 4k Instruct trên BentoCloud

Đã đến lúc xây dựng một ứng dụng AI với mô hình ngôn ngữ lớn (LLM) đúng nghĩa và triển khai nó trên BentoML với nỗ lực và tài nguyên tối thiểu. 

Chúng ta sẽ dùng framework vLLM để tạo suy luận LLM thông lượng cao và triển khai trên một phiên bản GPU trên BentoCloud. Nghe có vẻ phức tạp, nhưng BentoCloud xử lý phần lớn công việc nặng nhọc, bao gồm thiết lập hạ tầng, để bạn có thể tập trung xây dựng và triển khai dịch vụ.

1. Nhân bản dự án vLLM của BentoML

BentoML cung cấp rất nhiều mã ví dụ và tài nguyên cho các dự án LLM khác nhau. Để bắt đầu, chúng ta sẽ clone repository BentoVLLM. 

Đi tới dự án Phi 3 Mini 4k, và cài đặt tất cả thư viện Python cần thiết:

$ git clone https://github.com/bentoml/BentoVLLM.git
$ cd BentoVLLM/phi-3-mini-4k-instruct
$ pip install -r requirements.txt

Cấu trúc thư mục dự án sẽ trông như thế này với đầy đủ các tệp:

Thư mục dự án với đầy đủ các tệp cần thiết.

2. Sửa đổi bentofile.yaml

Chúng ta sẽ chỉnh sửa bentofile.yaml để thay đổi tên owner và stage. 

bentofile.yaml đơn giản hơn Dockerfile và sử dụng các lệnh khác nhau để thiết lập hạ tầng cấu hình môi trường và server; bạn có thể học tất cả lệnh từ tùy chọn build của Bento.

service: 'service:VLLM'
labels:
  owner: Abid
  stage: Guide
include:
  - '*.py'
  - 'bentovllm_openai/*.py'
python:
  requirements_txt: './requirements.txt'
  lock_packages: false
docker:
  python_version: "3.11"

3. Tìm hiểu tệp service.py

Chúng ta sẽ không thay đổi tệp service.py, thay vào đó sẽ tìm hiểu về nó. 

  1. Mã tạo một server có thể nhận câu hỏi hoặc prompt từ người dùng và tạo phản hồi bằng mô hình AI tiền huấn luyện (Phi-3-mini-4k-instruct). 
  2. Nó dùng @bentoml.service để xử lý triển khai và quản lý tài nguyên, như thiết lập GPU và quản lý lưu lượng.
  3. API generate được định nghĩa bằng decorator @bentoml.api. Nó nhận prompt của người dùng, một system prompt tùy chọn và giới hạn token tối đa làm đầu vào, sau đó truyền tới engine suy luận vLLM để tạo phản hồi.  
  4. Phương thức generate stream đầu ra của mô hình theo từng phần, tạo token ngay khi có sẵn.
import uuid
from typing import AsyncGenerator, Optional

import bentoml
from annotated_types import Ge, Le
from typing_extensions import Annotated

from bentovllm_openai.utils import openai_endpoints


MAX_TOKENS = 1024

PROMPT_TEMPLATE = """<|system|>
{system_prompt}<|end|>
<|user|>
{user_prompt}<|end|>
<|assistant|>
"""

SYSTEM_PROMPT = """You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure that your responses are socially unbiased and positive in nature.

If a question does not make any sense, or is not factually coherent, explain why instead of answering something not correct. If you don't know the answer to a question, please don't share false information."""

MODEL_ID = "microsoft/Phi-3-mini-4k-instruct"

@openai_endpoints(model_id=MODEL_ID)
@bentoml.service(
    name="bentovllm-phi-3-mini-4k-instruct-service",
    traffic={
        "timeout": 300,
        "concurrency": 256, # Matches the default max_num_seqs in the VLLM engine
    },
    resources={
        "gpu": 1,
        "gpu_type": "nvidia-tesla-t4",
    },
)
class VLLM:

    def __init__(self) -> None:
        from transformers import AutoTokenizer
        from vllm import AsyncEngineArgs, AsyncLLMEngine

        ENGINE_ARGS = AsyncEngineArgs(
            model=MODEL_ID,
            max_model_len=MAX_TOKENS,
            dtype="half",
            enable_prefix_caching=True,
            disable_sliding_window=True,
        )

        self.engine = AsyncLLMEngine.from_engine_args(ENGINE_ARGS)

        self.tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)

    @bentoml.api
    async def generate(
        self,
        prompt: str = "Explain superconductors in plain English",
        system_prompt: Optional[str] = SYSTEM_PROMPT,
        max_tokens: Annotated[int, Ge(128), Le(MAX_TOKENS)] = MAX_TOKENS,
    ) -> AsyncGenerator[str, None]:
        from vllm import SamplingParams

        SAMPLING_PARAM = SamplingParams(max_tokens=max_tokens)

        if system_prompt is None:
            system_prompt = SYSTEM_PROMPT
   
        prompt = PROMPT_TEMPLATE.format(user_prompt=prompt, system_prompt=system_prompt)
        stream = await self.engine.add_request(uuid.uuid4().hex, prompt, SAMPLING_PARAM)

        cursor = 0
        async for request_output in stream:
            text = request_output.outputs[0].text
            yield text[cursor:]
            cursor = len(text)

Tôi khuyến nghị theo học lộ trình kỹ năng Developing AI Applications để học cách tạo ứng dụng tích hợp AI với các công cụ nhà phát triển mới nhất, bao gồm OpenAI API, Hugging Face và LangChain.

4. Thiết lập cho BentoCloud

Vào bentofile.yaml và thêm biến môi trường cho token Hugging Face ở dòng cuối. Điều này sẽ giúp chúng ta tải mô hình một cách an toàn mà không gặp sự cố từ máy chủ Hugging Face:

envs:
  - name: HF_TOKEN

Đăng nhập vào BentoCloud bằng CLI:

$ bentoml cloud login

Công cụ sẽ yêu cầu bạn tạo tài khoản rồi tạo API token. 

Tạo khóa API cho BentoCloud.

Sau khi tạo API token thành công, bạn sẽ thấy thông báo thành công trong terminal:

Đăng nhập BentoCloud thành công trong terminal.

5. Triển khai trên BentoCloud

Trước khi triển khai dịch vụ AI lên BentoCloud, chúng ta cần tạo một biến môi trường trong BentoCloud bằng cách vào tab "Secrets" và cung cấp tên khóa cùng khóa API của Hugging Face.

Thiết lập Secrets trong BentoCloud.

Sau đó, dùng lệnh sau để triển khai dịch vụ AI:

$ bentoml deploy . --secret huggingface

Sẽ mất vài phút để tải mô hình và thiết lập môi trường chạy server.

Triển khai dịch vụ vLLM trên BentoCloud.

Bạn có thể kiểm tra trạng thái dịch vụ AI của mình bằng cách vào tab “Deployments”.

Xây dựng container cho BentoCloud.

Bạn cũng có thể kiểm tra toàn bộ log và quan sát những gì diễn ra ở hậu trường.

Kiểm tra log build cho BentoCloud.

6. Truy cập dịch vụ AI đã triển khai

Khi dịch vụ AI được triển khai thành công, chúng ta sẽ bắt đầu kiểm thử dịch vụ vLLM Phi 3 Mini.

Để bắt đầu, bạn có thể đơn giản nhấp vào tab “Playground” dưới mục “Deployments”, nhập prompt, rồi bấm nút “submit” để tạo phản hồi. Phản hồi sẽ được stream theo thời gian thực.

Kiểm thử ứng dụng LLM trên playground của BentoCloud.Chúng ta cũng có thể dùng client Python của BentoML để truy cập mô hình đã triển khai và tạo phản hồi. Cách này giúp bạn tích hợp dịch vụ AI vào ứng dụng của mình:

import bentoml

with bentoml.SyncHTTPClient(
    "https://bentovllm-phi-3-mini-4-k-instruct-service-ka76-39800880.mt-guc1.bentoml.ai"
) as client:
    response = client.generate(
        prompt="What is the largest lake in the world?"
    )
    for chunk in response:
        print(chunk, end="", flush=True)

Ảnh minh họa phản hồi LLM được tạo trong terminal.

Cách phổ biến và đơn giản nhất để truy cập dịch vụ AI từ bất kỳ hệ điều hành nào là dùng lệnh CURL trong terminal:

$ curl -s -X POST \
    'https://bentovllm-phi-3-mini-4-k-instruct-service-ka76-39800880.mt-guc1.bentoml.ai/generate' \
    -H 'Content-Type: application/json' \
    -d '{
        "prompt": "What is the largest lake in the world?"
    }' 

Ảnh terminal kiểm thử dịch vụ AI bằng lệnh CURL.

7. Quan sát (Observability)

Vào tab "Monitoring" và xem toàn bộ thống kê liên quan tới LLM, yêu cầu người dùng, phần cứng và các phân tích giám sát khác giúp bạn đánh giá hiệu năng của server AI. 

Bạn cũng có thể kiểm tra tab "Logs" hoặc dùng BentoML CLI để tạo log theo thời gian thực.

Bảng điều khiển quan sát của BentoML.

Phục vụ và triển khai mô hình chỉ là một phần của pipeline MLOps. Bằng cách hoàn thành khóa học Fully Automated MLOps, bạn có thể học cách xây dựng kiến trúc MLOps, kỹ thuật CI/CD/CM/CT và các mẫu tự động hóa để triển khai hệ thống ML có thể tạo ra giá trị lâu dài. 

Kết luận

Nếu bạn muốn tìm hiểu thêm về hệ sinh thái BentoML, cách tốt nhất là bắt tay xây dựng và triển khai dịch vụ AI của riêng bạn. Bạn nhận được tín dụng miễn phí, cho phép dùng GPU và CPU để khám phá nhiều dịch vụ. Điều này có thể bao gồm ứng dụng Retrieval-Augmented Generation (RAG), function calling, Agentic LLMs hoặc ứng dụng đa phương thức xử lý hình ảnh và văn bản để tạo phản hồi.

Trong hướng dẫn thực hành này, chúng ta đã tìm hiểu về BentoML và cách phục vụ bất kỳ ứng dụng AI nào cục bộ chỉ với vài dòng mã. Sau đó, chúng ta dùng engine suy luận vLLM để xây dựng một dịch vụ BentoML và triển khai nó lên BentoCloud chỉ với vài bước đơn giản.

Hãy cân nhắc theo học lộ trình nghề nghiệp Associate AI Engineer for Developers để học cách tích hợp AI vào ứng dụng phần mềm bằng API và thư viện mã nguồn mở.

Abid Ali Awan

Tác giả

Abid Ali Awan

Là một nhà khoa học dữ liệu được chứng nhận, tôi đam mê tận dụng công nghệ tiên tiến để tạo ra các ứng dụng học máy đổi mới. Với nền tảng vững chắc về nhận dạng giọng nói, phân tích và báo cáo dữ liệu, MLOps, AI hội thoại và NLP, tôi đã rèn giũa kỹ năng phát triển các hệ thống thông minh có thể tạo ra tác động thực sự. Bên cạnh chuyên môn kỹ thuật, tôi cũng là một người truyền đạt tốt, có khả năng chắt lọc các khái niệm phức tạp thành ngôn ngữ rõ ràng, súc tích. Nhờ đó, tôi trở thành một blogger được nhiều người quan tâm trong lĩnh vực khoa học dữ liệu, chia sẻ góc nhìn và kinh nghiệm với cộng đồng các chuyên gia dữ liệu ngày càng lớn. Hiện tại, tôi tập trung vào sáng tạo và biên tập nội dung, làm việc với các mô hình ngôn ngữ lớn để phát triển nội dung mạnh mẽ và hấp dẫn, giúp doanh nghiệp và cá nhân tận dụng tối đa dữ liệu của mình.

Chủ đề

Liên quan