[ad_1]
Bước 1: Tạo API
FastAPI giúp việc lấy tập lệnh Python hiện có trở nên cực kỳ dễ dàng và biến nó thành API với một vài dòng mã bổ sung. Đây là những gì nó trông giống như thế này.
Trước tiên chúng ta sẽ nhập một số thư viện tiện dụng.
from fastapi import FastAPI
import polars as pl
from sentence_transformers import SentenceTransformer
from sklearn.metrics import DistanceMetric
import numpy as np
from app.capabilities import returnSearchResultIndexes
Tiếp theo, chúng ta sẽ xác định các khối xây dựng của chức năng tìm kiếm ngữ nghĩa. Cụ thể là mô hình nhúng văn bản, phần nhúng tiêu đề và bản ghi của video mà chúng tôi muốn tìm kiếm và thước đo khoảng cách để đánh giá video nào phù hợp nhất với truy vấn của người dùng. Nếu bạn muốn tìm hiểu sâu hơn về tìm kiếm ngữ nghĩa, tôi đã thảo luận nó trong bài viết trước đây.
# outline mannequin information
model_name = 'all-MiniLM-L6-v2'# load mannequin
mannequin = SentenceTransformer(model_name)
# load video index
df = pl.scan_parquet('app/knowledge/video-index.parquet')
# create distance metric object
dist_name = 'manhattan'
dist = DistanceMetric.get_metric(dist_name)
Bây giờ, chúng tôi xác định các hoạt động API của mình. Ở đây, chúng ta sẽ tạo 3 yêu cầu GET. Cái đầu tiên được hiển thị trong khối mã bên dưới.
# create FastAPI object
app = FastAPI()# API operations
@app.get("/")
def health_check():
return {'health_check': 'OK'}
Trong khối ở trên, chúng ta khởi tạo một ứng dụng FastAPI mới bằng cách sử dụng FastAPI() class và sau đó tạo điểm cuối “kiểm tra tình trạng”.
Để làm điều này, chúng tôi xác định một hàm Python không nhận dữ liệu đầu vào nhưng trả về một từ điển có khóa “health_check” và giá trị “OK”. Để biến hàm này thành điểm cuối API, chúng ta chỉ cần thêm một trình trang trí vào hàm đó và chỉ định đường dẫn của điểm cuối. Ở đây, chúng ta sử dụng gốc, tức là “/”.
Hãy xem một ví dụ khác. Ở đây, chúng ta sẽ có một điểm cuối được gọi là thông tin trả về nhiều thông tin hơn về API.
@app.get("/information")
def information():
return {'identify': 'yt-search', 'description': "Search API for Shaw Talebi's YouTube movies."}
Chúng ta có thể thấy rằng điểm cuối này rất giống với việc kiểm tra sức khỏe. Tuy nhiên, cái này nằm ở điểm cuối “/information”.
Cuối cùng, hãy tạo điểm cuối tìm kiếm, điểm cuối này sẽ trả về tiêu đề và ID của các video phù hợp nhất với một truy vấn của người dùng.
@app.get("/search")
def search(question: str):
idx_result = returnSearchResultIndexes(question, df, mannequin, dist)
return df.choose(('title', 'video_id')).acquire()(idx_result).to_dict(as_series=False)
Đối với điểm cuối này, chúng tôi yêu cầu đầu vào: truy vấn của người dùng. Sau đó, điều này được chuyển đến một hàm Python khác được xác định trong một tập lệnh khác thực hiện tất cả các phép toán đằng sau tìm kiếm. Mặc dù tôi sẽ không đi sâu vào chi tiết ở đây nhưng người đọc tò mò có thể xem mã trên GitHub hoặc hướng dẫn mã của chức năng tìm kiếm trên YouTube.
Vì hàm này chỉ trả về số hàng của kết quả tìm kiếm trong df dataframe, chúng ta cần sử dụng kết quả đầu ra này để lấy tiêu đề và ID video mà chúng ta quan tâm, sau đó trả về chúng dưới dạng từ điển Python. Điều quan trọng là tất cả kết quả đầu ra của điểm cuối API của chúng tôi đều là từ điển vì chúng tuân thủ định dạng JSON tiêu chuẩn cho API.
Lưu ý rằng các khối mã ở trên đã tham chiếu hai tệp bên ngoài: ứng dụng/hàm.py Và ứng dụng/dữ liệu/video-index.parquetngụ ý cấu trúc thư mục sau.
Để chạy API này cục bộ, chúng ta có thể điều hướng đến thư mục gốc và chạy lệnh sau.
uvicorn app.important:app --host 0.0.0.0 --port 8080
uvicorn là một Thư viện Python cho phép chúng tôi chạy các ứng dụng net giống như cái chúng tôi đã tạo bằng FastAPI. Lệnh này sẽ chạy API cục bộ tại http://0.0.0.0:8080. Lý do chúng tôi sử dụng máy chủ và cổng này sẽ rõ ràng hơn sau này khi chúng tôi triển khai trên Google Cloud Run.
Bước 2: Tạo hình ảnh Docker
Vâng, API của chúng tôi chạy cục bộ! Hãy thực hiện bước tiếp theo để chạy nó trên đám mây.
Chúng tôi thực hiện việc này bằng cách tạo hình ảnh Docker cho API của mình. Điều này sẽ yêu cầu chúng tôi tạo thêm 3 tệp: Dockerfile, yêu cầu.txtVà ứng dụng/__init__.py. Thư mục của chúng ta sẽ trông như thế này.
Các Dockerfile chứa hướng dẫn từng bước để chạy hình ảnh Docker của chúng tôi. yêu cầu.txt chỉ định các thư viện Python (có phiên bản) cần thiết để chạy API của chúng tôi. Cuối cùng, ứng dụng/__init__.py đánh dấu ứng dụng thư mục dưới dạng gói Python, đảm bảo rằng Python có thể tìm và nhập đúng mã API của chúng tôi khi chạy trong vùng chứa.
Đây là những gì bên trong của Dockerfile giống như.
# begin from python base picture
FROM python:3.10-slim# change working listing
WORKDIR /code
# add necessities file to picture
COPY ./necessities.txt /code/necessities.txt
# set up python libraries
RUN pip set up --no-cache-dir --upgrade -r /code/necessities.txt
# add python code
COPY ./app/ /code/app/
# specify default instructions
CMD ("uvicorn", "app.important:app", "--host", "0.0.0.0", "--port", "8080")
Dòng đầu tiên khởi động hình ảnh của chúng tôi lên trên hình ảnh hiện có đã cài đặt Python 3.10. Tiếp theo, chúng tôi thay đổi thư mục làm việc của mình từ nguồn gốc ĐẾN /mã số.
Sau đó chúng tôi sao chép yêu cầu.txt tập tin từ cơ sở mã của chúng tôi sang hình ảnh Docker. Với điều này, chúng tôi có thể cài đặt các yêu cầu của mình bằng cách sử dụng pip.
Tiếp theo, chúng tôi sao chép tất cả mã cho API của mình.
Lưu ý: chúng tôi đã sao chép và cài đặt các gói Python trước mọi thứ khác vì điều này cho phép chúng tôi lưu vào bộ đệm cài đặt các yêu cầu. Điều này rất hữu ích vì nó tránh phải chờ vài phút để cài đặt các phần phụ thuộc khi chạy nhanh hình ảnh Docker của chúng tôi trong quá trình phát triển.
Cuối cùng, chúng tôi chỉ định lệnh mặc định giống như lệnh chúng tôi đã chạy cục bộ để chạy API của mình.
Bước 3: Triển khai lên Google Cloud
Tại thời điểm này, chúng ta có thể xây dựng Docker picture và đẩy nó lên Trung tâm Docker, chúng tôi có thể dễ dàng triển khai trên nhiều dịch vụ đám mây khác nhau. Tuy nhiên, tôi sẽ làm theo một chiến lược thay thế ở đây.
Thay vào đó, tôi sẽ đẩy tất cả mã của chúng tôi lên GitHub, từ đó chúng tôi có thể triển khai trực tiếp vùng chứa lên Google Cloud Run. Điều này có hai lợi ích chính.
Đầu tiênnó tránh giải quyết những khác biệt về kiến trúc hệ thống giữa hệ thống cục bộ của bạn và những gì Google Cloud Run sử dụng (điều này đặc biệt là một vấn đề đối với tôi vì Mac chạy trên ARM64). Thứ haiviệc triển khai từ kho lưu trữ GitHub cho phép triển khai liên tục, vì vậy nếu muốn cập nhật API, chúng tôi chỉ cần đẩy mã mới vào kho lưu trữ của mình và một vùng chứa mới sẽ tự động được tạo ra.
Chúng tôi bắt đầu bằng cách tạo một kho lưu trữ GitHub mới.
Sau đó, chúng tôi sao chép kho lưu trữ, thêm mã của mình và đẩy mã đó trở lại GitHub. Đây là cấu trúc thư mục sau khi thêm mã.
Với mã đã có, chúng tôi có thể tạo dự án Google Cloud Platform mới. Chúng tôi làm điều này bằng cách đi đến Bảng điều khiển GCPnhấp vào danh sách dự án của chúng tôi và chọn “DỰ ÁN MỚI”.
Khi dự án của chúng tôi đã được tạo, chúng tôi có thể mở nó và nhập “cloud run” vào thanh tìm kiếm.
Khi nó mở ra, chúng tôi sẽ nhấp vào “TẠO DỊCH VỤ”. Điều này sẽ mở ra một trang để chúng tôi định cấu hình dịch vụ của mình.
Đầu tiên, chúng tôi chọn tùy chọn triển khai dịch vụ của mình từ GitHub. Sau đó nhấp vào “THIẾT LẬP VỚI BUILD CLOUD”.
Đối với nguồn kho lưu trữ, chúng tôi sẽ chọn GitHub và chọn kho lưu trữ chúng tôi vừa tạo.
Chúng tôi sẽ rời chi nhánh như ^chính$ và chọn “Loại bản dựng” làm Dockerfile.
Tiếp theo, chúng ta quay lại màn hình cấu hình dịch vụ. Chúng ta có thể đặt tên cho dịch vụ theo bất cứ tên nào chúng ta thích (tôi để nó là dịch vụ được tạo tự động). Đối với khu vực, tôi để nó như vậy trung tâm chúng tôi1 bởi vì đây là Cấp 1, cung cấp các tùy chọn điện toán rẻ nhất (về cơ bản là miễn phí cho ví dụ này).
Để đơn giản hóa mọi thứ, tôi sẽ “Cho phép các lệnh gọi không được xác thực”. Tất nhiên rồi, bạn sẽ muốn yêu cầu xác thực cho hầu hết các hệ thống. Sau đó, để mọi thứ khác làm mặc định.
Cuối cùng, dưới “(Các) Vùng chứa, Khối, Kết nối mạng, Bảo mật”, hãy chỉnh sửa vùng chứa để có 1 GiB bộ nhớ. Chúng tôi phải để PORT là 8080 vì đó là những gì chúng tôi đã định cấu hình trong Dockerfile của mình.
Chúng ta có thể để mọi thứ khác làm mặc định và nhấn “TẠO” ở cuối màn hình. Sau vài phút, vùng chứa sẽ hoạt động!
Sau đó, chúng tôi có thể truy cập API bằng URL được chỉ định ở gần đầu trang. Nhấp vào liên kết sẽ mở ra điểm cuối gốc, đó là kiểm tra tình trạng của chúng tôi.
Chúng tôi có thể chạy yêu cầu GET tới API tìm kiếm theo cách thủ công bằng URL sau: (your-app-url-here)/search?question=LLMs. Điều này sẽ tìm kiếm các video có liên quan đến LLM.
Phần thưởng: tích hợp vào giao diện người dùng
Khi phần phụ trợ API của chúng tôi được thiết lập, chúng tôi có thể kết nối nó với giao diện thân thiện với người dùng. Tôi làm điều đó thông qua Ôm không gian khuôn mặtcái mà lưu trữ ứng dụng ML hoàn toàn miễn phí.
Đây là kết quả tìm kiếm tương tự thông qua giao diện người dùng. Bạn có thể thử nghiệm với giao diện người dùng đây và xem mã đây.
Khoa học dữ liệu không chỉ đơn thuần là đào tạo những mô hình ưa thích. Đó là về việc giải quyết vấn đề và tạo ra giá trị. Thông thường, điều này đòi hỏi chúng ta phải triển khai các mô hình vào những môi trường mà chúng có thể tạo ra tác động lớn nhất. Ở đây, chúng tôi đã giới thiệu chiến lược 3 bước đơn giản để triển khai các mô hình ML bằng FastAPI, Docker và GCP.
Trong khi điều này kết thúc Khoa học dữ liệu toàn ngăn xếp loạt bài này được kèm theo một Danh sách phát YouTube với một video thưởng về thử nghiệm liên quan đến việc tạo ra công cụ tìm kiếm này.
Thông tin thêm về Khoa học dữ liệu toàn ngăn xếp 👇
Khoa học dữ liệu toàn ngăn xếp
[ad_2]
Source link