ASP.NET Core Web API'sinde model dağıtma
ASP.NET Core Web API'sini kullanarak web üzerinde önceden eğitilmiş bir ML.NET makine öğrenmesi modeli sunma hakkında bilgi edinin. Web API'si üzerinden model sunma, standart HTTP yöntemleri aracılığıyla tahminler sağlar.
Önkoşullar
- Visual Studio 2022 ile ASP.NET ve web geliştirme iş yükü.
- PowerShell.
- Önceden eğitilmiş model. Kendi modelinizi oluşturmak veya bu önceden eğitilmiş yaklaşım analizi makine öğrenmesi modelini indirmek için ML.NET Yaklaşım Analizi öğreticisini kullanın
ASP.NET Core Web API projesi oluşturma
Visual Studio 2022'yi başlatın ve Yeni proje oluştur'u seçin.
Yeni proje oluştur iletişim kutusunda:
- Arama kutusuna girin
Web API
. - ASP.NET Core Web API şablonunu seçin ve İleri'yi seçin.
- Arama kutusuna girin
Projenizi yapılandırın iletişim kutusunda:
- Projenize SentimentAnalysisWebAPI adını verin.
- İleri'yi seçin.
Ek bilgi iletişim kutusunda:
- Üst düzey deyimleri kullanma seçeneğinin işaretini kaldırın.
- Oluştur'u belirleyin.
Aşağıdaki NuGet paketlerini yükleyin:
Visual Studio'da NuGet paketlerini yükleme hakkında daha fazla ayrıntı için Visual Studio'da NuGet paketini yükleme ve kullanma kılavuzuna bakın.
ASP.NET Core Web API projesine model ekleme
Önceden oluşturulmuş modelinizi SentimentAnalysisWebAPI proje dizininize kopyalayın.
Projenizi model dosyanızı çıkış dizinine kopyalanacak şekilde yapılandırın. Çözüm Gezgini:
- Model zip dosyasına sağ tıklayın ve Özellikler'i seçin.
- Gelişmiş'in altında, Daha yeniyse Çıkış Dizinine Kopyala değerini Kopyala olarak değiştirin.
Veri modelleri oluşturma
Model girişinizin ve çıkışınızın şemasını tanımlamak için bazı sınıflar oluşturmanız gerekir.
Not
Giriş ve çıkış şeması sınıflarınızın özellikleri, modelinizi eğitmek için kullanılan veri kümesi sütunlarına ve makine öğrenmesi görevine (regresyon, sınıflandırma vb.) bağlıdır.
Program.cs dosyanızda:
Deyimleri kullanarak aşağıdakileri ekleyin:
using Microsoft.ML.Data; using Microsoft.Extensions.ML;
Dosyanın en altına aşağıdaki sınıfları ekleyin:
Model girişi
Bu model için giriş, kullanıcı açıklamasını temsil eden bir dize olan tek bir özellik
SentimentText
içerir.public class ModelInput { public string SentimentText; }
Model çıkışı
Model girişi değerlendirdikten sonra üç özelliğe sahip bir tahmin oluşturur:
Sentiment
,Probability
veScore
. Bu durumda ,Sentiment
kullanıcı açıklamasının tahmin edilen yaklaşımıdır veProbability
Score
tahmin için güvenilirlik ölçüleridir.public class ModelOutput { [ColumnName("PredictedLabel")] public bool Sentiment { get; set; } public float Probability { get; set; } public float Score { get; set; } }
PredictionEnginePool'u uygulamada kullanmak üzere kaydetme
Tek bir tahminde bulunmak için bir PredictionEngine
oluşturmanız gerekir. PredictionEngine
iş parçacığı güvenli değildir. Ayrıca, uygulamanızın içinde gerekli olduğu her yerde bunun bir örneğini oluşturmanız gerekir. Uygulamanız büyüdükçe bu işlem yönetilemez hale gelebilir. Gelişmiş performans ve iş parçacığı güvenliği için bağımlılık ekleme ve hizmet birleşimini kullanın. PredictionEnginePool
Bu birleşim, uygulamanız genelinde kullanılmak üzere bir ObjectPool
nesne oluşturur PredictionEngine
.
aşağıdaki bağlantı, ASP.NET Core'da bağımlılık ekleme hakkında daha fazla bilgi edinmek istiyorsanız daha fazla bilgi sağlar.
Program.cs dosyanıza aşağıdaki kodu ekleyin:
builder.Services.AddPredictionEnginePool<ModelInput, ModelOutput>()
.FromFile(modelName: "SentimentAnalysisModel", filePath: "sentiment_model.zip", watchForChanges: true);
Yüksek düzeyde, bu kod el ile yapmak zorunda kalmak yerine uygulama tarafından istendiğinde nesneleri ve hizmetleri daha sonra kullanmak üzere otomatik olarak başlatır.
Makine öğrenmesi modelleri statik değildir. Yeni eğitim verileri kullanıma sunuldukça model yeniden eğitilir ve yeniden dağıtılır. Modelin en son sürümünü uygulamanıza edinmenin bir yolu, uygulamanızı yeniden başlatmak veya yeniden dağıtmaktır. Ancak bu, uygulama kapalı kalma süresine neden olur. Hizmet, PredictionEnginePool
uygulamanızı yeniden başlatmadan veya yeniden dağıtmadan güncelleştirilmiş modeli yeniden yüklemek için bir mekanizma sağlar.
parametresini watchForChanges
olarak true
ayarlayın ve PredictionEnginePool
dosya sistemi değişiklik bildirimlerini dinleyen ve dosyada bir değişiklik olduğunda olayları tetikleyen bir başlatır FileSystemWatcher
. Bu işlem, öğesinin PredictionEnginePool
modeli otomatik olarak yeniden yüklemesini ister.
Değişiklik üzerine uygulama başına birden fazla modelin modelName
yeniden yüklenebilmesi için model parametresiyle tanımlanır.
İpucu
Alternatif olarak, uzaktan depolanan modellerle çalışırken yöntemini kullanabilirsiniz FromUri
. Dosya değişikliği olaylarını izlemek yerine, FromUri
uzak konumu değişiklikler için yoklar. Yoklama aralığı varsayılan olarak 5 dakikadır. Uygulamanızın gereksinimlerine göre yoklama aralığını artırabilir veya azaltabilirsiniz. Aşağıdaki kod örneğinde PredictionEnginePool
, belirtilen URI'de depolanan modeli dakikada bir yoklar.
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));
Tahmin uç noktasını eşleme
Gelen HTTP isteklerinizi işlemek için bir uç nokta oluşturun.
/
Uç noktayı aşağıdakilerle değiştirin:
var predictionHandler =
async (PredictionEnginePool<ModelInput, ModelOutput> predictionEnginePool, ModelInput input) =>
await Task.FromResult(predictionEnginePool.Predict(modelName: "SentimentAnalysisModel", input));
app.MapPost("/predict", predictionHandler);
Uç /predict
nokta HTTP POST isteklerini kabul eder ve sağlanan girişi kullanarak tahmin döndürmek için tahmin altyapısı havuzunu kullanır.
İşiniz bittiğinde Program.cs aşağıdaki gibi görünmelidir:
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; }
}
Web API'lerini yerel olarak test edin
Her şey ayarlandıktan sonra uygulamayı test etme zamanı geldi.
Uygulamayı çalıştırın.
PowerShell'i açın ve PORT'un uygulamanızın dinlediği bağlantı noktası olduğu aşağıdaki kodu girin.
Invoke-RestMethod "https://localhost:<PORT>/predict" -Method Post -Body (@{SentimentText="This was a very bad steak"} | ConvertTo-Json) -ContentType "application/json"
Başarılı olursa çıkış aşağıdaki metne benzer görünmelidir:
sentiment probability score --------- ----------- ----- False 0.5 0
Tebrikler! ASP.NET Core Web API'sini kullanarak İnternet üzerinden tahminlerde bulunmak için modelinize başarıyla hizmet verdiniz.
Sonraki Adımlar
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin