Menyebarkan model di ASP.NET Core Web API

Pelajari cara menyajikan model pembelajaran mesin ML.NET yang telah dilatih sebelumnya di web menggunakan ASP.NET Core Web API. Melayani model melalui API web memungkinkan prediksi melalui metode HTTP standar.

Prasyarat

Membuat proyek ASP.NET Core Web API

  1. Mulai Visual Studio 2022 dan pilih Buat proyek baru.

  2. Dalam dialog Buat proyek baru:

    • Masukkan Web API di kotak pencarian.
    • Pilih templat ASP.NET Core Web API dan pilih Berikutnya.
  3. Dalam dialog Konfigurasikan proyek Anda:

    • Beri nama proyek Anda SentimentAnalysisWebAPI.
    • Pilih Selanjutnya.
  4. Dalam dialog Informasi tambahan:

    • Hapus centang Jangan gunakan pernyataan tingkat atas.
    • Pilih Buat.
  5. Instal paket NuGet berikut:

    Untuk detail selengkapnya tentang menginstal paket NuGet di Visual Studio, lihat panduan Menginstal dan menggunakan paket NuGet di Visual Studio .

Menambahkan model ke proyek ASP.NET Core Web API

  1. Salin model bawaan Anda ke direktori proyek SentimentAnalysisWebAPI Anda.

  2. Konfigurasikan proyek Anda untuk menyalin file model Anda ke direktori output. Di Penjelajah Solusi:

    • Klik kanan file zip model dan pilih Properti.
    • Di bawah Tingkat Lanjut, ubah nilai Salin ke Direktori Output menjadi Salin jika lebih baru.

Membuat model data

Anda perlu membuat beberapa kelas untuk menentukan skema input dan output model Anda.

Catatan

Properti kelas skema input dan output Anda bergantung pada kolom himpunan data yang digunakan untuk melatih model Anda serta tugas pembelajaran mesin (regresi, klasifikasi, dll.).

Dalam file Program.cs Anda:

  1. Tambahkan pernyataan penggunaan berikut ini:

    using Microsoft.ML.Data;
    using Microsoft.Extensions.ML;
    
  2. Di bagian bawah file, tambahkan kelas berikut:

    Input model

    Untuk model ini, input berisi satu properti SentimentText yang merupakan string yang mewakili komentar pengguna.

    public class ModelInput
    {
        public string SentimentText;
    }
    

    Output model

    Setelah model mengevaluasi input, model menghasilkan prediksi dengan tiga properti: Sentiment, Probability, dan Score. Dalam hal ini, Sentiment adalah sentimen yang diprediksi dari komentar pengguna dan Probability dan Score merupakan langkah-langkah keyakinan untuk prediksi.

    public class ModelOutput
    {
        [ColumnName("PredictedLabel")]
        public bool Sentiment { get; set; }
    
        public float Probability { get; set; }
    
        public float Score { get; set; }
    }
    

Mendaftarkan PredictionEnginePool untuk digunakan dalam aplikasi

Untuk membuat satu prediksi, Anda harus membuat PredictionEngine. PredictionEngine tidak aman untuk utas. Selain itu, Anda harus membuat instansnya di mana pun diperlukan dalam aplikasi Anda. Saat aplikasi Anda berkembang, proses ini bisa menjadi tidak terkendali. Untuk meningkatkan performa dan keamanan utas, gunakan kombinasi injeksi dependensi dan layanan PredictionEnginePool, yang membuat ObjectPool dari objek PredictionEngine untuk digunakan di seluruh aplikasi Anda.

Tautan berikut ini menyediakan informasi selengkapnya jika Anda ingin mempelajari selengkapnya tentang injeksi dependensi di ASP.NET Core.

Tambahkan kode berikut ke file Program.cs Anda:

builder.Services.AddPredictionEnginePool<ModelInput, ModelOutput>()
    .FromFile(modelName: "SentimentAnalysisModel", filePath: "sentiment_model.zip", watchForChanges: true);

Pada tingkat tinggi, kode ini menginisialisasi objek dan layanan secara otomatis untuk digunakan nanti ketika diminta oleh aplikasi alih-alih harus melakukannya secara manual.

Model pembelajaran mesin tidak statis. Saat data pelatihan baru tersedia, model dilatih kembali dan disebarkan ulang. Salah satu cara untuk mendapatkan versi terbaru model ke dalam aplikasi Anda adalah dengan memulai ulang atau menyebarkan ulang aplikasi Anda. Namun, ini memperkenalkan waktu henti aplikasi. Layanan ini PredictionEnginePool menyediakan mekanisme untuk memuat ulang model yang diperbarui tanpa memulai ulang atau menyebarkan ulang aplikasi Anda.

Atur watchForChanges parameter ke true, dan PredictionEnginePool memulai FileSystemWatcher yang mendengarkan pemberitahuan perubahan sistem file dan menaikkan peristiwa ketika ada perubahan pada file. Ini meminta PredictionEnginePool untuk memuat ulang model secara otomatis.

Model ini diidentifikasi oleh modelName parameter sehingga lebih dari satu model per aplikasi dapat dimuat ulang setelah perubahan.

Tip

Atau, Anda dapat menggunakan FromUri metode saat bekerja dengan model yang disimpan dari jarak jauh. Daripada menonton peristiwa yang diubah file, FromUri polling lokasi jarak jauh untuk perubahan. Interval polling default ke 5 menit. Anda dapat meningkatkan atau mengurangi interval polling berdasarkan persyaratan aplikasi Anda. Dalam sampel kode di bawah ini, polling PredictionEnginePool model yang disimpan di URI yang ditentukan setiap menit.

services.AddPredictionEnginePool<SentimentData, SentimentPrediction>()
  .FromUri(
      modelName: "SentimentAnalysisModel",
      uri:"https://github.com/dotnet/samples/raw/main/machine-learning/models/sentimentanalysis/sentiment_model.zip",
      period: TimeSpan.FromMinutes(1));

Memetakan titik akhir prediksi

Untuk memproses permintaan HTTP masuk Anda, buat titik akhir.

/ Ganti titik akhir dengan yang berikut ini:

var predictionHandler =
    async (PredictionEnginePool<ModelInput, ModelOutput> predictionEnginePool, ModelInput input) =>
        await Task.FromResult(predictionEnginePool.Predict(modelName: "SentimentAnalysisModel", input));

app.MapPost("/predict", predictionHandler);

Titik /predict akhir menerima permintaan HTTP POST dan menggunakan kumpulan mesin prediksi untuk mengembalikan prediksi menggunakan input yang disediakan.

Setelah selesai, Program.cs Anda akan terlihat seperti berikut ini:

using Microsoft.ML.Data;
using Microsoft.Extensions.ML;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddPredictionEnginePool<ModelInput, ModelOutput>()
    .FromFile(modelName: "SentimentAnalysisModel", filePath: "sentiment_model.zip", watchForChanges: true);

var app = builder.Build();

var predictionHandler =
    async (PredictionEnginePool<ModelInput, ModelOutput> predictionEnginePool, ModelInput input) =>
        await Task.FromResult(predictionEnginePool.Predict(modelName: "SentimentAnalysisModel", input));

app.MapPost("/predict", predictionHandler);

app.Run();

public class ModelInput
{
    public string SentimentText;
}

public class ModelOutput
{
    [ColumnName("PredictedLabel")]
    public bool Sentiment { get; set; }

    public float Probability { get; set; }

    public float Score { get; set; }
}

Menguji API web secara lokal

Setelah semuanya disiapkan, saatnya untuk menguji aplikasi.

  1. Jalankan aplikasi lagi.

  2. Buka PowerShell dan masukkan kode berikut di mana PORT adalah port yang didengarkan aplikasi Anda.

    Invoke-RestMethod "https://localhost:<PORT>/predict" -Method Post -Body (@{SentimentText="This was a very bad steak"} | ConvertTo-Json) -ContentType "application/json"
    

    Jika berhasil, output akan terlihat mirip dengan teks di bawah ini:

    sentiment probability score
    --------- ----------- -----
    False         0.5     0
    

Selamat! Anda telah berhasil melayani model Anda untuk membuat prediksi melalui internet menggunakan ASP.NET Core Web API.

Langkah berikutnya