Выйдите за рамки Jupyter Notebooks!

Введение

Вы разработали свою причудливую модель машинного обучения. И сейчас? Как другие люди могут с ним взаимодействовать? Оставлять его в блокноте Jupyter — не лучшее решение.

Но как это сделать? Есть много способов. AWS, Google Cloud, Beam — что угодно. Я знаю, вы, вероятно, не захотите тратить деньги на свой хобби-проект. Итак, где можно развернуть его бесплатно?

Что ж, хорошие новости: Render, PaaS, предлагает (щедрый) бесплатный уровень для ваших хобби-проектов. Когда я искал альтернативу Heroku, я нашел Render. Он зарекомендовал себя как лучший для хобби-проектов без затрат денег (здесь сломался студент 😢)

В этой статье я покажу вам, как легко настроить и развернуть ваши модели в Render. Мы будем использовать FastAPI и сериализованную модель из scikit-learn.

Исходный код можно найти на GitHub.

**Я не связан с Render**

Настройка нашего API машинного обучения

Для нашего варианта использования я уже обучил базовую модель LinearRegression с помощью scikit-learn на наборе данных по жилищному строительству Калифорнии. Я использовал функцию total_rooms только для прогнозирования median_house_value. Наша цель — не оптимизировать нашу модель, а развернуть ее. Вы можете найти файл .joblib в моем репозитории.

Сначала создайте общедоступный репозиторий GitHub и клонируйте его. Я назвал свой render-test-app.

Затем установите необходимые пакеты ниже. Очень важно использовать точные версии, поскольку Render работает на Python 3.7.10. Я уже пережил за тебя головную боль.

fastapi==0.103.1
scikit-learn==1.0.2
uvicorn==0.22.0

Нам понадобится uvicorn в качестве веб-сервера для FastAPI.

Создайте файл с именем main.py и определите следующие конечные точки:

#main.py
import numpy as np
from fastapi import FastAPI
from joblib import load

app = FastAPI()

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

@app.get("/predict")
async def predict(total_rooms: int):
    model = load("model.joblib")
    prediction = model.predict(np.array(total_rooms).reshape(1,-1))[0]
    return {"prediction": prediction}