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
- Visual Studio 2022 dengan beban kerja ASP.NET serta pengembangan web.
- PowerShell.
- Model yang telah dilatih sebelumnya. Gunakan tutorial analisis sentimen ML.NET untuk membangun model Anda sendiri atau mengunduh model pembelajaran mesin analisis sentimen yang telah dilatih sebelumnya
Membuat proyek ASP.NET Core Web API
Mulai Visual Studio 2022 dan pilih Buat proyek baru.
Dalam dialog Buat proyek baru:
- Masukkan
Web API
di kotak pencarian. - Pilih templat ASP.NET Core Web API dan pilih Berikutnya.
- Masukkan
Dalam dialog Konfigurasikan proyek Anda:
- Beri nama proyek Anda SentimentAnalysisWebAPI.
- Pilih Selanjutnya.
Dalam dialog Informasi tambahan:
- Hapus centang Jangan gunakan pernyataan tingkat atas.
- Pilih Buat.
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
Salin model bawaan Anda ke direktori proyek SentimentAnalysisWebAPI Anda.
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:
Tambahkan pernyataan penggunaan berikut ini:
using Microsoft.ML.Data; using Microsoft.Extensions.ML;
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
, danScore
. Dalam hal ini,Sentiment
adalah sentimen yang diprediksi dari komentar pengguna danProbability
danScore
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.
Jalankan aplikasi lagi.
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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk