FastAPI: Framework API untuk Melayani Produk Data Pembelajaran Mesin

Mar 22 2023
Saat ini sebagian besar model pembelajaran mesin disajikan dalam produksi sebagai layanan. Metode ini memisahkan aplikasi klien dari model pembelajaran mesin melalui Application Programming Interface (API).
Foto oleh Chris Ried di Unsplash

Saat ini sebagian besar model pembelajaran mesin disajikan dalam produksi sebagai layanan. Metode ini memisahkan aplikasi klien dari model pembelajaran mesin melalui Application Programming Interface (API).

Pada artikel ini, saya akan memandu Anda melalui konsep API, kemampuan pengubah game FastAPI, dan melayani produk data pembelajaran mesin kami dengan FastAPI.

Apa itu API?

Antarmuka pemrograman aplikasi ( API ) adalah antarmuka perangkat lunak untuk dua atau lebih aplikasi untuk berkomunikasi satu sama lain.

Cara termudah untuk memahami apa itu API adalah dengan membayangkan diri Anda di restoran. Anda memasuki restoran, menemukan meja Anda, dan menerima menu. Di menu, ada nama, deskripsi, dan harga makanan. Anda memilih kombinasi Anda dan Anda ingin memberikan perintah. Tapi bagaimana permintaan Anda akan dikirimkan ke koki? Koki tidak bisa datang ke ruang makan dan Anda tidak bisa pergi ke dapur. Anda membutuhkan seseorang untuk mendapatkan permintaan Anda dan mengirimkannya ke dapur dan nanti saat makanan sudah siap bawa ke meja Anda. Ya, Anda membutuhkan pramusaji atau pramusaji!

Analogi yang sama berlaku untuk aplikasi. Untuk membuat aplikasi berbicara satu sama lain atau mendapatkan permintaan mereka dan memposting keluarannya, API berfungsi sebagai orang tengah.

Contoh API

Google Maps: Google Maps melayani berbagai API dalam aplikasi. Saat Anda menelusuri kota, area, atau lingkungan tempat tinggal, cuaca, kualitas udara, dan bahkan selama masa covid menghasilkan infeksi terbaru. Dengan cara yang sama, saat Anda mencari tempat makan, Google Maps menunjukkan restoran, kafe, menunya, jam buka, dan bahkan jika tersedia opsi reservasi online melalui aplikasi pihak ketiga.

Aplikasi perjalanan: Booking.com, Trivago, Expedia, dan lainnya menawarkan pengalaman perjalanan ujung ke ujung saat ini. Saat Anda memeriksa aplikasi mereka, Anda dapat memesan hotel, membeli tiket pesawat, menyewa mobil, atau membuat reservasi di acara mencicipi anggur. Tak satu pun dari barang-barang ini dimiliki dan dikelola secara langsung oleh perusahaan-perusahaan ini. Mereka mendapatkan permintaan Anda dan membuat koneksi ke aplikasi lain yang menyajikan informasi ini.

FastAPI

FastAPI adalah kerangka kerja Web untuk mengembangkan RESTful API dengan Python. FastAPI mengembangkan basis penggunanya setiap hari. Tidak hanya insinyur perangkat lunak tetapi juga ilmuwan data, insinyur pembelajaran mesin, dan insinyur data sudah mulai menggunakan FastAPI. Gerakan revolusioner yang mendorong semua orang data untuk bermigrasi dari Flask dan Django ke FastAPI dalam waktu singkat.

Tangkapan layar dari — https://fastapi.tiangolo.com/

Kemampuan GAME Changer dari FastAPI

Permintaan sinkron vs asinkron

Sebelum membahas definisi teknis, mari kembali ke contoh restoran kita.

Anda memberikan pesanan Anda kepada pelayan dan dia memberi tahu Anda bahwa hanya ada satu juru masak di dapur dan dia sudah memiliki 5 permintaan dalam antrian ! Anda mulai menunggu pesanan Anda diantarkan. Setelah 30 menit dengan permintaan maaf, makanan Anda tiba. Anda belajar bahwa satu orang seberapa cepat dia tidak dapat menangani 10 meja pada waktu yang sama. Ini adalah permintaan sinkron.

Lain kali Anda ingin mencoba restoran lain. Sebelum memberikan pesanan Anda, Anda bertanya kepada pelayan berapa banyak juru masak yang mereka miliki. Pelayan menertawakan Anda dan memberi tahu Anda bahwa “Kami memiliki 5 juru masak di dapur dan mereka sedang menunggu untuk melayani Anda, Tuan. Kami bukan amatir!” Anda memberikan pesanan Anda dan 10 menit kemudian Anda mendapatkan permintaan Anda. Anda melihat sekeliling dan melihat bahwa meja lain juga disajikan. Ini adalah permintaan asinkron.

Panggilan API sinkron adalah pola desain tempat situs panggilan diblokir sambil menunggu kode yang dipanggil selesai. Dengan panggilan API asinkron, situs panggilan tidak diblokir saat menunggu kode yang dipanggil selesai, sebaliknya, utas panggilan diberi tahu saat balasan tiba.

Dalam kondisi beban yang lebih berat, akan lebih efisien untuk mengirimkan beberapa panggilan asinkron dan memeriksa status secara berkala daripada menunggu setiap panggilan selesai sebelum mengirimkan panggilan berikutnya.

from fastapi import FastAPI

app = FastAPI()

async def get_restaurant_working_hours():
    # some operations
    pass


@app.get("/")
async def get_resturant_reservation_details():
    results = await restaurant_working_hours() # waits for the defined function
    # some operations 
    
    return results

FastAPI mendukung validasi parameter string dan numerik.

Contoh validasi string

Pada contoh di bawah ini, saya telah menambahkan batasan string dengan panjang minimal 5 karakter dan maksimal 100 karakter. Ketika saya memanggil titik akhir ini melalui Postman dan mengirimkan teks dengan ukuran 3, ia mengeluarkan pengecualian seperti di bawah ini.

from typing import Optional
from fastapi import FastAPI, Query
import uvicorn

app = FastAPI()

@app.get("/orders/")
async def read_orders(query: Optional[str] = Query(None, min_length=5, max_length=100)): #defining the constraints
    results = {"order": [{"order_id": "Order_1"}, {"order_id": "Order_2"}]}
    return results
    if query:
        results.update({"query": query})

if __name__ == "__main__":
    uvicorn.run("parameter-validations:app")

      
                
Screenshot created by the author

Pada contoh di bawah ini, saya telah menambahkan batasan numerik dengan nilai minimal 1 dan maksimal 100. Saat saya memanggil titik akhir ini melalui Postman dan meneruskan 0, pengecualian akan muncul seperti di bawah ini.

from typing import Optional
from fastapi import FastAPI, Query
import uvicorn
app = FastAPI()

@app.get("/orders/")
async def read_items(order_count: int = Query(gt=1, lt=100)): # defining the constraints
    results = {"order_count": order_count}
    return results

if __name__ == "__main__":
    uvicorn.run("parameter-validations:app")

      
                
Screenshot created by the author

Pydantic adalah pustaka Python yang digunakan untuk melakukan serialisasi dan validasi data.

FastAPI memiliki integrasi dengan Pydantic . Ini memastikan saat runtime untuk mengurai, mengevaluasi, dan memberi tahu pengguna melalui IDE tentang kesalahan terkait tipe.

Di bawah ini Anda dapat menemukan contoh pesan kesalahan;

fastapi.exceptions.FastAPIError: Invalid args for response field! Hint: check that False is a valid Pydantic field type. If you are using a return type annotation that is not a valid Pydantic field (e.g. Union[Response, dict, None]) you can disable generating the response model from the type annotation with the path operation decorator parameter response_model=None. Read more: https://fastapi.tiangolo.com/tutorial/response-model/

Membangun produk data membutuhkan banyak tim yang berbeda untuk bekerja sama; misalnya ilmu data, pembelajaran mesin, rekayasa perangkat lunak, dll. Dalam kolaborasi lintas fungsi ini, penyelarasan penanganan kesalahan dan pengiriman pesan menjadi sangat penting. FastAPI mendukung penanganan kesalahan khusus dengan pesan dan kode status.

from fastapi import FastAPI, HTTPException
import uvicorn

app = FastAPI()

cities = {1: "Berlin", 2: "Hamburg", 3: "München"}


@app.get("/cities/{city_id}")
async def read_city_id(city_id: int):

    if city_id not in cities:
        raise HTTPException(status_code=404, detail="City id is not found") # status code and error message is defined

    results = {"city": cities[city_id]}
    return results


if __name__ == "__main__":
    uvicorn.run("error-message:app")

      
                
Screenshot created by the author

FastAPI mendukung pengembang dengan titik akhir yang interaktif dan mudah diuji secara otomatis di browser. Dengan mengikuti tautan di bawah ini, Anda akan diarahkan ke rute yang Anda buat.

http://localhost:8000/docs

      
                
Screenshot created by the author

Tangkapan layar dibuat oleh penulis

Dokumentasi memungkinkan pengguna untuk menguji titik akhir yang dibuat. Anda hanya perlu mengklik tombol "Cobalah" .

Tangkapan layar dibuat oleh penulis

Untuk menguji validasi numerik, saya meneruskan 0 ke jumlah pesanan dan API mengembalikan pesan kesalahan dan status 422 secara otomatis.

Model pembelajaran mesin melayani dengan FastAPI

Karena kami telah mempelajari dasar-dasar FastAPI, kami siap menggunakannya untuk melayani model pembelajaran mesin kami.

Dalam contoh ini, saya menggunakan kumpulan data mobil bekas untuk memprediksi nilai mobil. Kumpulan data berisi karakteristik tentang mobil dari merek hingga berapa kilometer yang ditempuh dengan mobil tersebut. Untuk menyederhanakan contoh, saya tidak akan membagikan pembersihan data, persiapan data, dan langkah-langkah pembuatan model tetapi menyajikan semuanya dalam file acar.

Kode Python memuat file acar, membuat titik akhir prediksi, dan mengembalikan prediksi harga mobil.

from fastapi import FastAPI
import joblib
import numpy as np
import pandas as pd
import uvicorn

# passing title, version and description parameters to the class object
app = FastAPI(
    title="Car Price Prediction",
    version="1.0",
    description="Model type: Linear Regression",
)

# loading previously saved pickle file
model = joblib.load("./LinearRegressionModel.pkl")

# creating predict end point
@app.get("/api/predict")
async def predict(
    name: str, company: str, year: int, kms_driven: float, fuel_type: str
):
    result = model.predict(
        pd.DataFrame(
            columns=["name", "company", "year", "kms_driven", "fuel_type"],
            data=np.array([name, company, year, kms_driven, fuel_type]).reshape(1, 5),
        )
    )[0]
    return result


if __name__ == "__main__":
    uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)

      
                
Screenshot created by the author
Screenshot created by the author

Kesimpulan

FastAPI telah menjadi kerangka kerja masuk untuk tujuan penyajian API di domain data. Setiap hari saya membaca artikel lain bahwa tim data bermigrasi ke FastAPI dan betapa mereka mendapat manfaat dari perubahan ini. Saya menantikan untuk melihat lebih banyak pembaruan dalam beberapa bulan dan tahun mendatang.

Kudos to Sebastián Ramírez , timnya, dan semua kontributor!

Terima kasih banyak telah membaca

Untuk seri Produk Data saya , Anda dapat memeriksa tautan di bawah ini;

Manajer Produk Data: Pekerjaan Paling Penting di Abad ke-21

Pemikiran Produk untuk Tim Data

Apakah Anda Ingin Melihat Menu “Produk Data” Kami?

Revolusi Produk Data

Anda dapat menemukan saya di Linkedin dan Mentoring Club