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
- .NET masaüstü geliştirme ve Azure geliştirme iş yüklerinin yüklü olduğu Visual Studio 2022. Bu iş yükünü seçtiğinizde .NET 6 SDK'sı otomatik olarak yüklenir.
- Azure İşlevleri Araçları
- PowerShell
- Önceden eğitilmiş model. Bu önceden eğitilmiş yaklaşım analizi makine öğrenmesi modelini indirin veya kendi modelinizi oluşturmak için ML.NET Yaklaşım Analizi öğreticisini kullanın.
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
Visual Studio 2022'de Yeni proje oluştur iletişim kutusunu açın.
"Yeni proje oluştur" iletişim kutusunda Azure İşlevleri proje şablonunu seçin.
Ad metin kutusuna "SentimentAnalysisFunctionsApp" yazın ve İleri düğmesini seçin.
"Ek bilgi iletişim kutusunda" tüm varsayılan değerleri olduğu gibi bırakın ve Oluştur düğmesini seçin.
Microsoft.ML NuGet Paketini Yükleme
- Çözüm Gezgini'da projenize sağ tıklayın ve NuGet Paketlerini Yönet'i seçin.
- Paket kaynağı olarak "nuget.org" seçeneğini belirleyin.
- "Gözat" sekmesini seçin.
- Microsoft.ML arayın.
- Listeden bu paketi seçin ve Yükle düğmesini seçin.
- Değişiklikleri Önizle iletişim kutusunda Tamam düğmesini seçin
- 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
- 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.
- Önceden oluşturulmuş modelinizi MLModels klasörüne kopyalayın.
- Çö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:
Çözüm Gezgini'da projeye sağ tıklayın ve ardından Yeni Azure İşlevi Ekle'yi>seçin.
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.
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
şeklindedirstatic
. 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:
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.
Çözüm Gezgini'da DataModels dizinine sağ tıklayıp Sınıf Ekle'yi > seçin.
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; }
Çözüm Gezgini'da DataModels dizinine sağ tıklayıp Sınıf Ekle'yi > seçin.
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; } }
SentimentPrediction
SentimentData
özelliğindekiSentimentText
ö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 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
.
Bağımlılık ekleme hakkında daha fazla bilgi edinmek istiyorsanız aşağıdaki bağlantı daha fazla bilgi sağlar.
Çözüm Gezgini'da projeye sağ tıklayın ve ardından Sınıf Ekle'yi>seçin.
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.
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;
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 { } }
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ınprivate readonly string _environment; private readonly string _modelPath;
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"); } }
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 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.
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 PredictionEnginePool
giriş 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:
Uygulamayı çalıştırma
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
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