Публикация API-интерфейсов машинного обучения с использованием Python Flask Framework

машинное обучение искусственный интеллект Программа перевода самородков Python API

В этой статье описывается, как предоставлять модели машинного обучения внешнему миру через REST API Python Flask.

Source: Pixabay

Колба как ееОфициальный сайтСказал, весело и легко установить. Действительно, этот микрофреймворк Python предоставляет эффективный способ аннотировать функции Python с помощью конечных точек REST. В настоящее время я использую Flask для публикации API модели машинного обучения, к которому могут обращаться сторонние бизнес-приложения.

Этот пример основан на XGBoost.

Для лучшей поддержки кода я рекомендую использовать отдельный блокнот Jupyter для публикации API модели машинного обучения. Импортируйте Flask и модуль CORS Flask:

from flask import Flask, jsonify, request
from flask_cors import CORS, cross_origin

import pickle
import pandas as pd

Эта модель используетНабор данных о диабете индейцев пима(База данных по диабету индейцев пима). Данные в формате CSV можно загрузить сздесьскачать. Чтобы создать переменную типа Pandas dataframe для использования в качестве моделипредсказыватьНа входе функции нам нужно определить массив, содержащий имена столбцов набора данных:

# 获取请求头中的 payload
headers = ['times_pregnant', 'glucose', 'blood_pressure', 'skin_fold_thick', 'serum_insuling', 'mass_index', 'diabetes_pedigree', 'age']

Загрузите предварительно обученную модель с помощью Pickle:

# 使用 Pickle 加载预训练模型
with open(f'diabetes-model.pkl', 'rb') as f:
    model = pickle.load(f)

Хорошей практикой является тестовый запуск и проверка правильности работы модели. Сначала создайте кадр данных с массивом имен столбцов и массивом данных (используя новые данные, которых нет в обучающем или тестовом наборе данных). Затем вызовите две функции -model.predictиmodel.predict_probaлюбой из . я обычно предпочитаюmodel.predict_proba, который возвращает вероятность того, что прогнозируемый результат равен 0 или 1, что помогает объяснить результаты в диапазоне (например, от 0,25 до 0,75). Наконец, создайте кадр данных Pandas с примером полезной нагрузки, а затем выполните прогнозы модели:

# 用数据帧测试模型
input_variables = pd.DataFrame([[1, 106, 70, 28, 135, 34.2, 0.142, 22]],
                                columns=headers, 
                                dtype=float,
                                index=['input'])

# 获取模型的预测结果
prediction = model.predict(input_variables)
print("Prediction: ", prediction)
prediction_proba = model.predict_proba(input_variables)
print("Probabilities: ", prediction_proba)

Ниже показано, как написан Flask API. Обязательно включите CORS, иначе вызовы API с других хостов не будут успешными. Закомментируйте функцию, которую вы хотите предоставить через REST API, и укажите имя конечной точки и поддерживаемый метод REST (в данном случае POST). Получите данные полезной нагрузки из запроса, затем создайте кадр данных Pandas и выполните модель.predict_probaфункция:

app = Flask(__name__)
CORS(app)

@app.route("/katana-ml/api/v1.0/diabetes", methods=['POST'])
def predict():
    payload = request.json['data']
    values = [float(i) for i in payload.split(',')]
    
    input_variables = pd.DataFrame([values],
                                columns=headers, 
                                dtype=float,
                                index=['input'])

    # 获取模型的预测结果
    prediction_proba = model.predict_proba(input_variables)
    prediction = (prediction_proba[0])[1]
    
    ret = '{"prediction":' + str(float(prediction)) + '}'
    
    return ret

# 运行 REST 接口,port=5000 用于直接测试
if __name__ == "__main__":
    app.run(debug=False, host='0.0.0.0', port=5000)

Результат функции создается в виде строки JSON и возвращается в качестве ответа. Я запускаю Flask в контейнере Docker, поэтому я использую 0.0.0.0 в качестве IP-адреса хоста, на котором он работает. Порт 5000 отображается как внешний порт, чтобы разрешить вызовы извне.

Хотя запуск интерфейса Flask непосредственно в блокноте Jupyter также возможен, я бы рекомендовал преобразовать его в скрипт Python и запускать из командной строки как службу. Использование Юпитераnbconvertкоманда, чтобы преобразовать его в скрипт Python:

jupyter nbconvert — to python diabetes_redsamurai_endpoint_db.ipynb

Программы Flask можно запускать в фоновом режиме с помощью диспетчера процессов PM2. Таким образом, вы можете запустить конечную точку как службу и включить несколько процессов, работающих на разных портах (для балансировки нагрузки). Команда запуска PM2:

pm2 start diabetes_redsamurai_endpoint_db.py

pm2 monitМожет отображать информацию о запущенных процессах:

Используйте Postman для вызова модели классификации машинного обучения REST API, предоставляемой Flask:

Дополнительная информация:

Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.