ASP.NET Core: Triển khai model trong ASP.NET Core Web API


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

Bài viết này nhằm tìm hiểu cách phục vụ model học máy ML.NET được đào tạo trước trên web bằng API Web ASP.NET Core. Cung cấp một model qua API web cho phép dự đoán thông qua các phương thức HTTP tiêu chuẩn.

Điều kiện tiên quyết

Tạo dự án ASP.NET Core Web API

1. Khởi động Visual Studio 2022 và chọn Create a new project.

2. Trong hộp thoại Create a new project:

  • Nhập Web API vào hộp tìm kiếm.
  • Chọn mẫu ASP.NET Core Web API và chọn Next.

3. Trong hộp thoại Configure your project:

  • Đặt tên cho dự án của bạn là SentimentAnalysisWebAPI.
  • Chọn Next.

4. Trong hộp thoại Additional information:

  • Bỏ chọn Do not use top-level statements.
  • Chọn Create.

5. Cài đặt các gói NuGet sau:

Để biết thêm chi tiết về cách cài đặt các gói NuGet trong Visual Studio, hãy xem hướng dẫn Cài đặt và sử dụng gói NuGet trong Visual Studio.

Thêm model vào dự án ASP.NET Core Web API

1. Sao chép model dựng sẵn của bạn vào  thư mục dự án SentimentAnalysisWebAPI.

2. Định cấu hình dự án của bạn để sao chép tệp model của bạn vào thư mục đầu ra. Trong Solution Explorer:

  • Nhấp chuột phải vào tệp zip model và chọn Properties.
  • Trong Advanced, thay đổi giá trị của Copy to Output Directory thành Copy if newer.

Tạo model dữ liệu

Bạn cần tạo một số lớp để xác định lược đồ đầu vào và đầu ra của model.

Ghi chú

Các thuộc tính của các lớp lược đồ đầu vào và đầu ra của bạn phụ thuộc vào các cột tập dữ liệu được sử dụng để đào tạo model của bạn cũng như tác vụ học máy (hồi quy, phân loại, v.v.).

Trong tệp Program.cs của bạn:

1. Thêm các câu lệnh sử dụng sau:

using Microsoft.ML.Data;
using Microsoft.Extensions.ML;

2. Ở dưới cùng của tệp, thêm các lớp sau:

Model input

Đối với model này, đầu vào chứa một property duy nhất là SentimentText, đây là một chuỗi đại diện cho comment của người dùng.

public class ModelInput
{
    public string SentimentText;
}

Model output

Sau khi model đánh giá đầu vào, nó sẽ đưa ra một dự đoán với ba thuộc tính: SentimentProbability và Score. Trong trường hợp này thì Sentiment là cảm tính được dự đoán của comment của người dùng và Probability và Score là thước đo độ tin cậy cho dự đoán.

public class ModelOutput
{
    [ColumnName("PredictedLabel")]
    public bool Sentiment { get; set; }

    public float Probability { get; set; }

    public float Score { get; set; }
}

Đăng ký PredictionEnginePool để sử dụng trong ứng dụng

Để đưa ra một dự đoán duy nhất, bạn phải tạo PredictionEnginePredictionEngine không an toàn cho luồng. Ngoài ra, bạn phải tạo một phiên bản của nó ở mọi nơi cần thiết trong ứng dụng của bạn. Khi ứng dụng của bạn phát triển, quá trình này có thể trở nên khó quản lý. Để cải thiện hiệu suất và độ an toàn của luồng, hãy sử dụng kết hợp phép nội xạ phụ thuộc và dịch vụ PredictionEnginePool, dịch vụ này sẽ tạo ra một ObjectPool của  các đối tượng PredictionEngine để sử dụng trong toàn bộ ứng dụng của bạn.

Liên kết sau đây cung cấp thêm thông tin nếu bạn muốn tìm hiểu thêm về Dependency Injection trong ASP.NET Core.

Thêm đoạn mã sau vào file Program.cs của bạn:

builder.Services.AddPredictionEnginePool<ModelInput, ModelOutput>()
    .FromFile(modelName: "SentimentAnalysisModel", filePath: "sentiment_model.zip", watchForChanges: true);

Ở cấp độ cao, mã này tự động khởi tạo các đối tượng và dịch vụ để sử dụng sau này khi được ứng dụng yêu cầu thay vì phải thực hiện thủ công.

Các model học máy không tĩnh. Khi dữ liệu đào tạo mới có sẵn, model được đào tạo lại và triển khai lại. Một cách để tải phiên bản mới nhất của model vào ứng dụng của bạn là khởi động lại hoặc triển khai lại ứng dụng của bạn. Tuy nhiên, điều này giới thiệu thời gian ngừng hoạt động của ứng dụng. Dịch vụ PredictionEnginePool cung cấp cơ chế tải lại model đã cập nhật mà không cần khởi động lại hoặc triển khai lại ứng dụng của bạn.

Đặt tham số watchForChanges thành true và PredictionEnginePool bắt đầu một FileSystemWatcher để lắng nghe thông báo thay đổi hệ thống tệp và phát sinh các sự kiện khi có thay đổi đối với tệp. Điều này sẽ nhắc model PredictionEnginePool tự động tải lại.

Model được xác định bởi tham số modelName để có thể tải lại nhiều model cho mỗi ứng dụng khi thay đổi.

Mẹo

Ngoài ra, bạn có thể sử dụng phương thức FromUri khi làm việc với các model được lưu trữ từ xa. Thay vì theo dõi các sự kiện đã thay đổi tệp, FromUri sẽ thăm dò vị trí từ xa để biết các thay đổi. Khoảng thời gian dành cho điều này mặc định là 5 phút. Bạn có thể tăng hoặc giảm khoảng thời gian này dựa trên yêu cầu của ứng dụng. Trong mẫu code ở bên dưới, PredictionEnginePool sẽ thăm dò model được lưu trữ tại URI được chỉ định mỗi phút.

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

Bản đồ dự đoán điểm cuối

Để xử lý các yêu cầu HTTP đến của bạn, hãy tạo một điểm cuối.

Thay thế điểm cuối / bằng điểm sau:

var predictionHandler =
    async (PredictionEnginePool<ModelInput, ModelOutput> predictionEnginePool, ModelInput input) =>
        await Task.FromResult(predictionEnginePool.Predict(modelName: "SentimentAnalysisModel", input));

app.MapPost("/predict", predictionHandler);

Điểm cuối /predict chấp nhận các yêu cầu HTTP POST và sử dụng nhóm công cụ dự đoán để trả về dự đoán bằng đầu vào được cung cấp.

Khi hoàn tất, file Program.cs của bạn  sẽ giống như sau:

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; }
}

Kiểm tra API web cục bộ

Khi mọi thứ đã được thiết lập thì đã đến lúc ta kiểm tra ứng dụng.

1. Chạy ứng dụng.

2. Mở PowerShell và nhập mã sau trong đó PORT là cổng mà ứng dụng của bạn đang lắng nghe.

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

Nếu thành công, đầu ra sẽ trông giống như văn bản bên dưới:

sentiment probability score
--------- ----------- -----
False         0.5     0

Chúc mừng! Bạn đã phục vụ thành công model của mình để đưa ra dự đoán qua internet bằng API Web ASP.NET Core.

Bước tiếp theo

Nguồn: learn.microsoft.com
» Tiếp: Hướng dẫn tạo API tối thiểu với ASP.NET Core
« Trước: Chọn giữa API dựa trên controller và API tối thiểu
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!