Share via


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

ASP.NET Core Web API projesi oluşturma

  1. Visual Studio 2022'yi başlatın ve Yeni proje oluştur'u seçin.

  2. 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.
  3. Projenizi yapılandırın iletişim kutusunda:

    • Projenize SentimentAnalysisWebAPI adını verin.
    • İleri'yi seçin.
  4. Ek bilgi iletişim kutusunda:

    • Üst düzey deyimleri kullanma seçeneğinin işaretini kaldırın.
    • Oluştur'u belirleyin.
  5. 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

  1. Önceden oluşturulmuş modelinizi SentimentAnalysisWebAPI proje dizininize kopyalayın.

  2. 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:

  1. Deyimleri kullanarak aşağıdakileri ekleyin:

    using Microsoft.ML.Data;
    using Microsoft.Extensions.ML;
    
  2. 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, Probabilityve Score. Bu durumda , Sentiment kullanıcı açıklamasının tahmin edilen yaklaşımıdır ve ProbabilityScore 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 PredictionEngineoluş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 trueayarlayı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);

/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.

  1. Uygulamayı çalıştırın.

  2. 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