Share via


Modeli Azure İşlevleri’ne dağıtma

AZURE İŞLEVLERI sunucusuz bir ortam aracılığıyla HTTP üzerinden tahminler için önceden eğitilmiş ML.NET makine öğrenmesi modelini dağıtmayı öğrenin.

Önkoşullar

Azure İşlevleri örneğe genel bakış

Bu örnek, metnin yaklaşımını pozitif veya negatif olarak kategorilere ayırmak için önceden eğitilmiş ikili sınıflandırma modeli kullanan bir C# HTTP Tetikleyicisi Azure İşlevleri uygulamasıdır. Azure İşlevleri, bulutta yönetilen sunucusuz bir ortamda küçük kod parçalarını büyük ölçekte çalıştırmanın kolay bir yolunu sağlar. Bu örneğin kodu GitHub'daki dotnet/machinelearning-samples deposunda bulunabilir.

Azure İşlevleri proje oluşturma

  1. Visual Studio 2022'de Yeni proje oluştur iletişim kutusunu açın.

  2. "Yeni proje oluştur" iletişim kutusunda Azure İşlevleri proje şablonunu seçin.

  3. Ad metin kutusuna "SentimentAnalysisFunctionsApp" yazın ve İleri düğmesini seçin.

  4. "Ek bilgi iletişim kutusunda" tüm varsayılan değerleri olduğu gibi bırakın ve Oluştur düğmesini seçin.

  5. Microsoft.ML NuGet Paketini Yükleme

    1. Çözüm Gezgini'da projenize sağ tıklayın ve NuGet Paketlerini Yönet'i seçin.
    2. Paket kaynağı olarak "nuget.org" seçeneğini belirleyin.
    3. "Gözat" sekmesini seçin.
    4. Microsoft.ML arayın.
    5. Listeden bu paketi seçin ve Yükle düğmesini seçin.
    6. Değişiklikleri Önizle iletişim kutusunda Tamam düğmesini seçin
    7. Listelenen paketlerin lisans koşullarını kabul ediyorsanız Lisans Kabulü iletişim kutusunda Kabul Ediyorum düğmesini seçin.

    Microsoft.Extensions.ML, Microsoft.Extensions.DependencyInjection ve Microsoft.Azure.Functions.Extensions NuGet paketlerini yüklemek için aynı adımları izleyin.

Projeye önceden eğitilmiş model ekleme

  1. Derleme öncesi modelinizi kaydetmek için projenizde MLModels adlı bir dizin oluşturun: Çözüm Gezgini projenize sağ tıklayın ve Yeni Klasör Ekle'yi > seçin. "MLModels" yazın ve Enter tuşuna basın.
  2. Önceden oluşturulmuş modelinizi MLModels klasörüne kopyalayın.
  3. Çözüm Gezgini'de, önceden oluşturulmuş model dosyanıza 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.

Yaklaşımı analiz etmek için Azure İşlevi oluşturma

Yaklaşımı tahmin etmek için bir sınıf oluşturun. Projenize yeni bir sınıf ekleyin:

  1. Çözüm Gezgini'da projeye sağ tıklayın ve ardından Yeni Azure İşlevi Ekle'yi>seçin.

  2. Yeni Öğe Ekle iletişim kutusunda Azure İşlevi'ni seçin ve Ad alanını AnalyzeSentiment.cs olarak değiştirin. Ardından Ekle düğmesini seçin.

  3. Yeni Azure İşlevi iletişim kutusunda Http Tetikleyicisi'ni seçin ve Yetkilendirme düzeyi açılan listesinden Anonim'i seçin. Ardından Tamam düğmesini seçin.

    AnalyzeSentiment.cs dosyası kod düzenleyicisinde açılır. aşağıdaki using deyimini AnalyzeSentiment.cs en üstüne ekleyin:

    using System;
    using System.IO;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Extensions.Http;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Extensions.Logging;
    using Newtonsoft.Json;
    using Microsoft.Extensions.ML;
    using SentimentAnalysisFunctionsApp.DataModels;
    

    Varsayılan olarak sınıfı AnalyzeSentiment şeklindedir static. Anahtar sözcüğünü static sınıf tanımından kaldırdığınızdan emin olun.

    public class AnalyzeSentiment
    {
    
    }
    

Veri modelleri oluşturma

Giriş verileriniz ve tahminleriniz için bazı sınıflar oluşturmanız gerekir. Projenize yeni bir sınıf ekleyin:

  1. Veri modellerinizi kaydetmek için projenizde DataModels adlı bir dizin oluşturun: Çözüm Gezgini projenize sağ tıklayın ve Yeni Klasör Ekle'yi > seçin. "DataModels" yazın ve Enter tuşuna basın.

  2. Çözüm Gezgini'da DataModels dizinine sağ tıklayıp Sınıf Ekle'yi > seçin.

  3. Yeni Öğe Ekle iletişim kutusunda Sınıf'ı seçin ve Ad alanını SentimentData.cs olarak değiştirin. Ardından Ekle düğmesini seçin.

    SentimentData.cs dosyası kod düzenleyicisinde açılır. aşağıdaki using deyimini SentimentData.cs en üstüne ekleyin:

    using Microsoft.ML.Data;
    

    Mevcut sınıf tanımını kaldırın ve SentimentData.cs dosyasına aşağıdaki kodu ekleyin:

    public class SentimentData
    {
        [LoadColumn(0)]
        public string SentimentText;
    
        [LoadColumn(1)]
        [ColumnName("Label")]
        public bool Sentiment;
    }
    
  4. Çözüm Gezgini'da DataModels dizinine sağ tıklayıp Sınıf Ekle'yi > seçin.

  5. Yeni Öğe Ekle iletişim kutusunda Sınıf'ı seçin ve Ad alanını SentimentPrediction.cs olarak değiştirin. Ardından Ekle düğmesini seçin. SentimentPrediction.cs dosyası kod düzenleyicisinde açılır. aşağıdaki using deyimini SentimentPrediction.cs en üstüne ekleyin:

    using Microsoft.ML.Data;
    

    Mevcut sınıf tanımını kaldırın ve SentimentPrediction.cs dosyasına aşağıdaki kodu ekleyin:

    public class SentimentPrediction : SentimentData
    {
    
        [ColumnName("PredictedLabel")]
        public bool Prediction { get; set; }
    
        public float Probability { get; set; }
    
        public float Score { get; set; }
    }
    

    SentimentPredictionSentimentData özelliğindeki SentimentText özgün verilere ve model tarafından oluşturulan çıktıya erişim sağlayan öğesini devralır.

PredictionEnginePool hizmetini 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 .

Bağımlılık ekleme hakkında daha fazla bilgi edinmek istiyorsanız aşağıdaki bağlantı daha fazla bilgi sağlar.

  1. Çözüm Gezgini'da projeye sağ tıklayın ve ardından Sınıf Ekle'yi>seçin.

  2. Yeni Öğe Ekle iletişim kutusunda Sınıf'ı seçin ve Ad alanını Startup.cs olarak değiştirin. Ardından Ekle düğmesini seçin.

  3. aşağıdaki using deyimlerini Startup.cs en üstüne ekleyin:

    using Microsoft.Azure.Functions.Extensions.DependencyInjection;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.ML;
    using SentimentAnalysisFunctionsApp;
    using SentimentAnalysisFunctionsApp.DataModels;
    using System.IO;
    using System;
    
  4. using deyimlerinin altındaki mevcut kodu kaldırın ve aşağıdaki kodu ekleyin:

    [assembly: FunctionsStartup(typeof(Startup))]
    namespace SentimentAnalysisFunctionsApp
    {
        public class Startup : FunctionsStartup
        {
    
        }
    }
    
  5. Uygulamanın çalıştığı ortamı ve modelin sınıfının içinde Startup bulunduğu dosya yolunu depolamak için değişkenler tanımlayın

    private readonly string _environment;
    private readonly string _modelPath;
    
  6. Bunun altında ve _modelPath değişkenlerinin _environment değerlerini ayarlamak için bir oluşturucu oluşturun. Uygulama yerel olarak çalışırken, varsayılan ortam Geliştirme'dir.

    public Startup()
    {
        _environment = Environment.GetEnvironmentVariable("AZURE_FUNCTIONS_ENVIRONMENT");
    
        if (_environment == "Development")
        {
            _modelPath = Path.Combine("MLModels", "sentiment_model.zip");
        }
        else
        {
            string deploymentPath = @"D:\home\site\wwwroot\";
            _modelPath = Path.Combine(deploymentPath, "MLModels", "sentiment_model.zip");
        }
    }
    
  7. Ardından, oluşturucunun PredictionEnginePool altına hizmeti kaydetmek için adlı Configure yeni bir yöntem ekleyin.

    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddPredictionEnginePool<SentimentData, SentimentPrediction>()
            .FromFile(modelName: "SentimentAnalysisModel", filePath: _modelPath, 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.

builder.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));

Modeli işleve yükleme

AnalyzeSentiment sınıfına aşağıdaki kodu ekleyin:

public AnalyzeSentiment(PredictionEnginePool<SentimentData, SentimentPrediction> predictionEnginePool)
{
    _predictionEnginePool = predictionEnginePool;
}

Bu kod, bağımlılık ekleme yoluyla elde ettiğiniz işlevin oluşturucusunun geçirerek öğesini atar PredictionEnginePool .

Tahminlerde bulunmak için modeli kullanma

AnalyzeSentiment sınıfında run yönteminin mevcut uygulamasını aşağıdaki kodla değiştirin:

public async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req,
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    // Parse HTTP Request Body
    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    SentimentData data = JsonConvert.DeserializeObject<SentimentData>(requestBody);

    //Make Prediction
    SentimentPrediction prediction = _predictionEnginePool.Predict(modelName: "SentimentAnalysisModel", example: data);

    //Convert prediction to string
    string sentiment = Convert.ToBoolean(prediction.Prediction) ? "Positive" : "Negative";

    //Return Prediction
    return new OkObjectResult(sentiment);
}

Run Yöntemi yürütürken, HTTP isteğinden gelen veriler seri durumdan çıkarılır ve için PredictionEnginePoolgiriş olarak kullanılır. Yöntemi Predict daha sonra sınıfında kayıtlı Startup kullanarak SentimentAnalysisModel tahminler yapmak için çağrılır ve başarılı olursa sonuçları kullanıcıya geri döndürür.

Yerel olarak test edin

Artık her şey ayarlandı, uygulamayı test etme zamanı geldi:

  1. Uygulamayı çalıştırma

  2. PowerShell'i açın ve kodu PORT'un uygulamanızın üzerinde çalıştığı bağlantı noktası olduğu istemine girin. Bağlantı noktası genellikle 7071'dir.

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

    Başarılı olursa çıkış aşağıdaki metne benzer görünmelidir:

    Negative
    

Tebrikler! Azure İşlevi'ni kullanarak İnternet üzerinden tahminlerde bulunmak için modelinize başarıyla hizmet verdiniz.

Sonraki Adımlar