Courses
API (Application Programming Interface) là xương sống của kiến trúc hiện đại vì chúng cho phép các ứng dụng mang tính mô-đun và tách rời. Điều này có nghĩa là bạn có thể xây dựng ứng dụng nhanh chóng và dễ dàng, giúp việc bảo trì và cập nhật trở nên thuận tiện.
API cũng rất quan trọng trong machine learning vì chúng cho phép các ứng dụng khác nhau chia sẻ dữ liệu và phối hợp với nhau, tiết kiệm thời gian và công sức. Có nhiều framework khác nhau để xây dựng API trong Python. Một số framework phổ biến nhất để tạo API trong Python là Django, Flask và FastAPI. Hướng dẫn này đi sâu vào một trong các framework đó có tên là FastAPI.
Nếu bạn muốn tìm hiểu sâu hơn về chủ đề này, tôi gợi ý khóa học: Triển khai AI vào môi trường sản xuất với FastAPI.
API là gì?
API là viết tắt của Application Programming Interface. API là phần mềm trung gian cho phép hai ứng dụng giao tiếp với nhau. Khi bạn sử dụng một ứng dụng trên điện thoại, ứng dụng kết nối Internet và gửi dữ liệu đến máy chủ. Máy chủ xử lý dữ liệu rồi gửi lại điện thoại của bạn. Ứng dụng trên điện thoại sau đó diễn giải dữ liệu và hiển thị cho bạn theo cách dễ đọc.
API giống như người bồi bàn trong nhà hàng. Bồi bàn ghi nhận gọi món của bạn và chuyển đến bếp. Bếp chuẩn bị món ăn rồi gửi lại cho bồi bàn. Bồi bàn sau đó mang đồ ăn tới cho bạn.
Tương tự, API nhận yêu cầu từ một ứng dụng và gửi nó đến máy chủ. Máy chủ xử lý yêu cầu rồi gửi dữ liệu trở lại ứng dụng. Ứng dụng sau đó diễn giải dữ liệu và hiển thị cho người dùng.

Nguồn ảnh: https://www.techfunnel.com/wp-content/uploads/2021/07/api.png
Nếu bạn muốn tìm hiểu thêm về pipeline machine learning, API và MLOps, bạn có thể xem Hướng dẫn Machine Learning, Pipelines, Deployment và MLOps của chúng tôi.
FastAPI là gì
FastAPI là một web framework hiệu năng cao để xây dựng API với Python 3.7+ dựa trên type hint tiêu chuẩn của Python. Nó giúp nhà phát triển xây dựng ứng dụng nhanh chóng và hiệu quả. FastAPI được xây dựng trên máy chủ web Starlette và bao gồm các tính năng giúp việc xây dựng ứng dụng web dễ dàng hơn, như tự động kiểm tra dữ liệu, xử lý lỗi và tài liệu API tương tác.
Chúng ta sẽ xem từng tính năng này trong phần này. Trước hết, hãy điểm qua các tính năng chính theo tài liệu gốc của FastAPI.
- Hiệu năng: Tương đương với NodeJS và ngôn ngữ Go.
- Tốc độ: Tăng tốc độ phát triển lên 2-3 lần.
- Dễ dùng: Hỗ trợ trình soạn thảo tốt. Gợi ý hoàn thành ở mọi nơi. Dễ học và sử dụng.
- Ổn định: Mã sẵn sàng cho sản xuất với tài liệu tương tác tự động.
- Dựa trên OpenAPI: Tương thích hoàn toàn với OpenAPI và JSON Schema.
Cài đặt FastAPI
FastAPI yêu cầu Python 3.7+. Có thể cài đặt bằng pip. Bạn sẽ cần cài FastAPI và máy chủ ASGI `uvicorn`.
``
# install fastapi
pip install fastapi
# install uvicorn
pip install uvicorn
``
Tạo một API đơn giản
Hãy bắt tay ngay vào tạo một API mẫu rất đơn giản. Tôi dùng VS Code để triển khai, nhưng bạn có thể dùng bất kỳ trình soạn thảo nào bạn thích.
```
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
(Ví dụ trích lại từ tài liệu gốc). Cảm ơn @tiangolo.
Bây giờ dùng cửa sổ dòng lệnh, chạy API này với lệnh sau:
```
uvicorn main:app –reload
```
`main` là tên tệp Python, và `app` là biến lưu lớp FastAPI. Bạn có thể đặt tên tùy ý. Khi chạy lệnh trên, bạn sẽ thấy tương tự như sau trong terminal:

Mở liên kết trong trình duyệt của bạn, nếu thấy trang hiển thị `Hello World,` nghĩa là API đã chạy.

Ảnh: Tác giả
Chúc mừng bạn đã xây dựng API đầu tiên.
Tài liệu API tương tác
FastAPI tạo một "schema" chứa tất cả API của bạn theo tiêu chuẩn OpenAPI để định nghĩa API. "Schema" là phần định nghĩa hay mô tả về một thứ gì đó. Không phải mã triển khai, mà chỉ là mô tả trừu tượng. Schema OpenAPI là thứ vận hành hai hệ thống tài liệu tương tác được tích hợp trong FastAPI.
Để xem tài liệu, chỉ cần thêm `/docs` vào url (`http://127.0.0.1:8000/docs`). Liên kết này sẽ hiển thị tài liệu API tương tác tự động.

Ảnh: Tác giả
Nhấp nút `Try it out` ở góc trên bên phải để thử nghiệm API.

Ảnh: Tác giả
Bạn có thể thấy phần thân phản hồi là một dictionary. Đây là kết quả trả về của hàm `read_item` được định nghĩa trong `main.py`. Bạn cũng có thể thấy url yêu cầu `http://127.0.0.1:8000/items/1?q=orange`. `1` và `orange` là các đầu vào của chúng ta cho API.
FastAPI còn có một tài liệu tự động tương tác thay thế. Để xem, truy cập http://127.0.0.1:8000/redoc`. Trông nó như sau:

Ảnh: Tác giả
Các ví dụ nâng cao hơn
Khi xây dựng API, "path" định nghĩa tuyến hay endpoint của yêu cầu. Tuy nhiên, còn một lựa chọn nữa cần đưa ra, đó là “Operation”. Từ `operation` ở đây đề cập đến một trong các "phương thức" HTTP. Bằng cách sử dụng một (hoặc nhiều) "phương thức" này, bạn có thể giao tiếp với từng path được hỗ trợ bởi giao thức HTTP. Thông thường, bạn sẽ dùng:
- POST: để tạo dữ liệu.
- GET: để đọc dữ liệu.
- PUT: để cập nhật dữ liệu.
- DELETE: để xóa dữ liệu.
- Và một vài phương thức nâng cao khác
FastAPI hỗ trợ tất cả các phương thức HTTP.
Việc FastAPI được xây dựng dựa trên type hint của Python là một điểm mấu chốt khác của framework này. Type hint được hỗ trợ từ Python 3.6 trở đi. Type hint là cú pháp chuyên biệt cho phép khai báo kiểu của biến.
Khai báo kiểu cho biến giúp trình soạn thảo và công cụ khác hỗ trợ bạn tốt hơn. Hãy xem một ví dụ nâng cao.
Chúng ta sẽ sửa tệp `main.py` để thêm một yêu cầu `PUT` mới nhận nhiều đầu vào với các kiểu dữ liệu khác nhau.
```
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: Union[bool, None] = None
@app.get("")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
```
(Ví dụ trích lại từ tài liệu gốc). Cảm ơn @tiangolo.
Thay đổi như sau:
Thêm một yêu cầu `put` nhận hai đầu vào. `item_id` là số nguyên và kiểu của `item` trỏ đến lớp tùy chỉnh `Item` được tạo và kế thừa `BaseModel` từ `pydantic`. Lớp `Item` có ba thuộc tính: `name`, `price`, `is_offer`, và tất cả có kiểu dữ liệu khác nhau.
FastAPI sẽ kiểm tra:
- `name` là `str`.
- `price` là `float`.
- `is_offer` là bool, nếu có.
Lợi ích của việc dùng type hint là bạn chỉ cần khai báo một lần kiểu của tham số, body, v.v. như tham số hàm với Python tiêu chuẩn (3.6+). Bạn sẽ nhận được:
- Hỗ trợ từ trình soạn thảo, bao gồm gợi ý hoàn thành, kiểm tra kiểu
- Kiểm tra hợp lệ dữ liệu
- Chuyển đổi dữ liệu đầu vào
- Chuyển đổi dữ liệu đầu ra
- Thông báo lỗi dễ hiểu.
So sánh FastAPI với Django và Flask
Cả ba framework này đều là web framework Python để bạn phát triển ứng dụng web. Mỗi cái có ưu và nhược điểm riêng.
Django là framework đầy đủ tính năng, bao gồm mọi thứ bạn cần để bắt đầu, như ORM tích hợp và bảng quản trị. Nó có thể hơi khó với người mới bắt đầu, nhưng tài liệu toàn diện giúp bạn dễ học.
Flask là microframework gọn nhẹ và dễ bắt đầu. Nó không có nhiều tính năng như Django, nhưng rất phù hợp cho các dự án đơn giản.
FastAPI là framework mới được thiết kế để nhanh và dễ dùng. Nó có các tính năng như kiểm tra dữ liệu tự động và tài liệu hóa.
|
Django |
Flask |
FastAPI |
|
|
Cộng đồng |
Lớn. 66K sao trên GitHub |
Lớn. 61K sao trên GitHub |
Lớn. 50K sao trên GitHub |
|
Hiệu năng |
Django đồ sộ. Không phải tốt nhất về hiệu năng. |
Flask là micro web framework. Hiệu năng tốt hơn Django. |
FastAPI là một trong những web framework nhanh nhất với hỗ trợ async gốc, giúp tăng hiệu quả cho framework. |
|
Hỗ trợ Async |
Có, với độ trễ giới hạn. |
Không. Cần Asyncio |
FastAPI cung cấp hỗ trợ async gốc. |
|
Dễ sử dụng |
Django đồ sộ nên hơi phức tạp để học. |
Flask dễ học và khá trực quan khi sử dụng. |
FastAPI là đơn giản nhất trong ba cái. |
|
Tài liệu tương tác |
Không tương tác |
Không |
Có (OpenAI, Redoc) |
|
Kiểm tra dữ liệu |
Không |
Không |
Có |
Benchmark hiệu năng của FastAPI
Theo kết quả các bài kiểm thử do techempower thực hiện, FastAPI vượt trội hơn tất cả framework khác về hiệu năng tổng thể.

Nguồn: https://www.techempower.com/benchmarks/
Ví dụ: Xây dựng pipeline machine learning end-to-end với PyCaret và triển khai bằng FastAPI
Trong phần này, chúng ta sẽ nhanh chóng xây dựng một pipeline machine learning và sau đó tạo API để phục vụ mô hình. Chúng ta sẽ dùng thư viện Python low-code PyCaret để xây dựng pipeline và tạo API. PyCaret tích hợp với FastAPI, giúp việc tạo và phục vụ mô hình machine learning dưới dạng API trở nên cực kỳ dễ dàng.
PyCaret
PyCaret là thư viện machine learning mã nguồn mở, low-code trong Python, tự động hóa các quy trình làm việc machine learning. Đây là công cụ end-to-end cho machine learning và quản lý mô hình, giúp tăng tốc vòng đời thử nghiệm theo cấp số nhân và nâng cao năng suất của bạn.
```
pip install pycaret
```
```
import pycaret
pycaret.__version__
>>> 2.3.10
```
Chúng ta sẽ dùng bộ dữ liệu `insurance` trong ví dụ này. Đây là bài toán hồi quy để dự đoán chi phí y tế dựa trên tuổi, giới tính, BMI và vùng.
```
from pycaret.datasets import get_data
data = get_data(‘insurance’)
```

Ảnh: Tác giả
Tiếp theo, chúng ta sẽ khởi tạo hàm `setup` từ pycaret. Hàm này khởi tạo thí nghiệm trong PyCaret và tạo pipeline biến đổi dựa trên tất cả tham số được truyền vào hàm.
`setup` phải được chạy trước bất kỳ hàm nào khác. Nó cần hai tham số để hoạt động là `data` và `target`. Tất cả đối số còn lại trong `setup` là tùy chọn. Hàm `setup` chịu trách nhiệm kiểm soát toàn bộ quy trình tiền xử lý dữ liệu. Xem tài liệu PyCaret để có phần tổng hợp đầy đủ về tất cả các quy trình tiền xử lý được hỗ trợ trong PyCaret.
```
from pycaret.regression import *
s = setup(data, target = 'charges')
```

Ảnh: Tác giả Đã rút gọn đầu ra.
Sau khi setup xong, chúng ta có thể bắt đầu huấn luyện và chọn mô hình chỉ với một dòng lệnh: `compare_models`. Thông qua cross-validation, hàm này huấn luyện và đánh giá hiệu năng mô hình của tất cả estimator trong thư viện mô hình. Kết quả là một bảng điểm chứa điểm trung bình thu được từ cross-validation.
Tiền xử lý cho Machine Learning bằng Python
Muốn tìm hiểu thêm cách chuẩn bị dữ liệu đã làm sạch để sẵn sàng cho việc xây dựng mô hình? Hãy tham gia khóa học Tiền xử lý cho Machine Learning bằng Python của chúng tôi.
```
best = compare_models()
```

Ảnh: Tác giả
Dựa trên kết quả này, mô hình hoạt động tốt nhất là `Gradient Boosting Regressor`. Nếu muốn, chúng ta có thể phân tích mô hình qua trực quan hóa và tiếp tục cải thiện hiệu năng thông qua tinh chỉnh siêu tham số hoặc ensemble mô hình, nhưng trong hướng dẫn này chúng ta sẽ không làm vậy.
Chúng ta sẽ đi thẳng vào xây dựng API của mô hình tốt nhất để phục vụ dự đoán trong môi trường sản xuất bằng FastAPI. Hãy nhớ, PyCaret có tích hợp với FastAPI, nên nó có thể tự động tạo REST API từ mô hình bằng hàm `create_api`.
```
create_api (best, 'insurance_prediction_model')
```

Giờ để chạy API này, mở cửa sổ dòng lệnh và điều hướng đến thư mục nơi Notebook của bạn nằm và chạy lệnh sau `python insurance_prediction_model.py`.

Truy cập `http://127.0.0.1:8000/docs` và bạn sẽ thấy giao diện giống như đã thấy trước đó trong hướng dẫn này

Ảnh: Tác giả

Ảnh: Tác giả
Bạn cũng có thể xem tài liệu tương tác thay thế bằng cách truy cập `http://127.0.0.1:8000/redoc’

Ảnh: Tác giả
Hãy nhớ, cả tài liệu tương tác mặc định và redoc đều được vận hành bằng tiêu chuẩn OpenAPI.
Nếu bạn muốn xem tệp mà PyCaret đã tạo khi bạn dùng hàm `create_api`, bạn có thể kiểm tra tệp trong cùng thư mục với Notebook của bạn. Nó trông như thế này:
```
import pandas as pd
from pycaret.regression import load_model, predict_model
from fastapi import FastAPI
import uvicorn
# Create the app
app = FastAPI()
# Load trained Pipeline
model = load_model('my_lr_api')
# Define predict function
@app.post('/predict')
def predict(age, sex, bmi, children, smoker, region):
data = pd.DataFrame([[age, sex, bmi, children, smoker, region]])
data.columns = ['age', 'sex', 'bmi', 'children', 'smoker', 'region']
predictions = predict_model(model, data=data)
return {'prediction': list(predictions['Label'])}
if __name__ == '__main__':
uvicorn.run(app, host='127.0.0.1', port=8000)
```
Kết luận
Bài viết đã thảo luận về khái niệm API và lý do chúng được sử dụng. API quan trọng trong kiến trúc hiện đại vì cho phép các chương trình phần mềm khác nhau chia sẻ dữ liệu và chức năng. Điều này giúp tạo ra các hệ thống phức tạp đáng tin cậy hơn và dễ bảo trì hơn.
Chúng ta sau đó đi sâu vào một framework tương đối mới trong Python có tên FastAPI. FastAPI là một API mới được thiết kế để dễ sử dụng và hiệu quả. Đây là lựa chọn tuyệt vời cho các nhà phát triển muốn tạo API nhanh chóng và dễ dàng.

Lịch sử số sao trên GitHub - tạo bằng star-history.com
Nếu bạn cũng muốn học cách tạo một API đơn giản từ mô hình machine learning trong Python bằng Flask, hãy xem hướng dẫn dễ theo dõi này: Biến mô hình Machine Learning thành API trong Python.
Câu hỏi thường gặp về FastAPI
FastAPI có hỗ trợ asynchronous không?
FastAPI hỗ trợ code bất đồng bộ (asynchronous) sẵn sàng, sử dụng từ khóa async/await của Python.
FastAPI đã sẵn sàng cho môi trường sản xuất chưa?
FastAPI hoàn toàn sẵn sàng cho sản xuất, có tài liệu xuất sắc, hỗ trợ tốt và giao diện dễ dùng.
FastAPI khác Flask như thế nào?
FastAPI hỗ trợ lời gọi bất đồng bộ. Nó gọn nhẹ, nhanh hơn và dễ học hơn Flask. Cả Flask và FastAPI đều có cộng đồng lớn.
FastAPI có máy chủ phát triển tích hợp không?
Không, FastAPI không có máy chủ phát triển tích hợp. Để làm việc này bạn phải dùng `uvicorn`.
FastAPI có hỗ trợ Python 2 không?
Không, FastAPI chỉ khả dụng trên Python 3.6+.
FastAPI chỉ có sẵn cho Python thôi à?
Có
FastAPI có nhanh hơn ngôn ngữ lập trình Go không?
Không. Theo techempower, Golang Fiber là API nhanh thứ 50 trên thế giới. FastAPI xếp hạng 183.
FastAPI có tương thích với Pydantic không?
FastAPI hoàn toàn tương thích (và dựa trên) Pydantic.