Korzystanie z modelu usługi Azure Machine Learning wdrożonego jako usługa internetowa
Wdrożenie modelu usługi Azure Machine Learning jako usługi internetowej powoduje utworzenie punktu końcowego interfejsu API REST. Można wysłać dane do tego punktu końcowego i otrzymać prognozę zwróconą przez model. Z tego dokumentu dowiesz się, jak tworzyć klientów dla usługi internetowej przy użyciu języków C#, Go, Java i Python.
Usługa sieci Web jest tworzona podczas wdrażania modelu w środowisku lokalnym, Azure Container Instances, Azure Kubernetes Service lub programowalnych w terenie macierzy bramek (FPGA). Identyfikator URI używany do uzyskiwania dostępu do usługi internetowej jest pobierany przy użyciu zestawu SDK usługi Azure Machine Learning. Jeśli uwierzytelnianie jest włączone, możesz również użyć zestawu SDK, aby uzyskać klucze uwierzytelniania lub tokeny.
Ogólny przepływ pracy tworzenia klienta korzystającego z usługi sieci Web uczenia maszynowego to:
- Użyj zestawu SDK, aby uzyskać informacje o połączeniu.
- Ustal typ danych żądania używanych przez model.
- Utwórz aplikację wywołującą usługę internetową.
Porada
Przykłady w tym dokumencie są tworzone ręcznie bez użycia specyfikacji openAPI (Swagger). Jeśli włączono specyfikację interfejsu OpenAPI dla wdrożenia, możesz użyć narzędzi, takich jak swagger-codegen , aby utworzyć biblioteki klienta dla usługi.
Ważne
Niektóre polecenia interfejsu wiersza polecenia platformy Azure w tym artykule używają azure-cli-ml
rozszerzenia , lub v1 dla usługi Azure Machine Learning. Obsługa rozszerzenia w wersji 1 zakończy się 30 września 2025 r. Będzie można zainstalować rozszerzenie v1 i używać go do tej daty.
Zalecamy przejście do ml
rozszerzenia , lub v2 przed 30 września 2025 r. Aby uzyskać więcej informacji na temat rozszerzenia w wersji 2, zobacz Rozszerzenie interfejsu wiersza polecenia usługi Azure ML i zestaw Python SDK w wersji 2.
Informacje o połączeniu
Uwaga
Użyj zestawu SDK usługi Azure Machine Learning, aby uzyskać informacje o usłudze internetowej. Jest to zestaw SDK języka Python. Do utworzenia klienta usługi można użyć dowolnego języka.
Klasa azureml.core.Webservice zawiera informacje potrzebne do utworzenia klienta. Webservice
Następujące właściwości są przydatne do tworzenia aplikacji klienckiej:
auth_enabled
- Jeśli jest włączone uwierzytelnianie klucza,True
; w przeciwnym razie ,False
.token_auth_enabled
- Jeśli jest włączone uwierzytelnianie tokenu,True
; w przeciwnym razie .False
scoring_uri
— Adres interfejsu API REST.swagger_uri
- Adres specyfikacji OpenAPI. Ten identyfikator URI jest dostępny, jeśli włączono automatyczne generowanie schematu. Aby uzyskać więcej informacji, zobacz Wdrażanie modeli za pomocą usługi Azure Machine Learning.
Istnieje kilka sposobów pobierania tych informacji dla wdrożonych usług internetowych:
DOTYCZY:Zestaw SDK języka Python w wersji 1
Podczas wdrażania modelu
Webservice
obiekt jest zwracany z informacjami o usłudze:service = Model.deploy(ws, "myservice", [model], inference_config, deployment_config) service.wait_for_deployment(show_output = True) print(service.scoring_uri) print(service.swagger_uri)
Webservice.list
Służy do pobierania listy wdrożonych usług internetowych dla modeli w obszarze roboczym. Możesz dodać filtry, aby zawęzić listę zwracanych informacji. Aby uzyskać więcej informacji na temat tego, co można filtrować, zobacz dokumentację referencyjną Webservice.list .services = Webservice.list(ws) print(services[0].scoring_uri) print(services[0].swagger_uri)
Jeśli znasz nazwę wdrożonej usługi, możesz utworzyć nowe wystąpienie
Webservice
programu i podać nazwę obszaru roboczego i usługi jako parametry. Nowy obiekt zawiera informacje o wdrożonej usłudze.service = Webservice(workspace=ws, name='myservice') print(service.scoring_uri) print(service.swagger_uri)
W poniższej tabeli przedstawiono, jak wyglądają te identyfikatory URI:
Typ identyfikatora URI | Przykład |
---|---|
Identyfikator URI oceniania | http://104.214.29.152:80/api/v1/service/<service-name>/score |
Swagger URI | http://104.214.29.152/api/v1/service/<service-name>/swagger.json |
Porada
Adres IP będzie inny dla danego wdrożenia. Każdy klaster usługi AKS będzie miał własny adres IP, który jest współużytkowany przez wdrożenia w tym klastrze.
Zabezpieczona usługa internetowa
Jeśli wdrożona usługa internetowa została zabezpieczona przy użyciu certyfikatu TLS/SSL, możesz użyć protokołu HTTPS , aby nawiązać połączenie z usługą przy użyciu identyfikatora URI oceniania lub struktury Swagger. Protokół HTTPS pomaga zabezpieczyć komunikację między klientem a usługą internetową przez szyfrowanie komunikacji między nimi. Szyfrowanie używa protokołu Transport Layer Security (TLS). Protokół TLS jest czasami nazywany protokołem Secure Sockets Layer (SSL), który był poprzednikiem protokołu TLS.
Ważne
Usługi internetowe wdrożone przez usługę Azure Machine Learning obsługują tylko protokół TLS w wersji 1.2. Podczas tworzenia aplikacji klienckiej upewnij się, że obsługuje tę wersję.
Aby uzyskać więcej informacji, zobacz Zabezpieczanie usługi internetowej za pomocą usługi Azure Machine Learning przy użyciu protokołu TLS.
Uwierzytelnianie dla usług
Usługa Azure Machine Learning udostępnia dwa sposoby kontrolowania dostępu do usług internetowych.
Metoda uwierzytelniania | ACI | AKS |
---|---|---|
Klucz | Domyślnie wyłączone | Domyślnie włączone |
Token | Niedostępny | Domyślnie wyłączone |
Podczas wysyłania żądania do usługi zabezpieczonej kluczem lub tokenem użyj nagłówka Autoryzacja , aby przekazać klucz lub token. Klucz lub token musi być sformatowany jako Bearer <key-or-token>
, gdzie <key-or-token>
to Twój klucz lub wartość tokenu.
Podstawową różnicą między kluczami i tokenami jest to, że klucze są statyczne i można je ponownie wygenerować ręcznie, a tokeny należy odświeżyć po wygaśnięciu. Uwierzytelnianie oparte na kluczach jest obsługiwane w przypadku usługi Azure Container Instance i Azure Kubernetes Service wdrożonych usług internetowych, a uwierzytelnianie oparte na tokenach jest dostępne tylko w przypadku wdrożeń Azure Kubernetes Service. Aby uzyskać więcej informacji na temat konfigurowania uwierzytelniania, zobacz Konfigurowanie uwierzytelniania dla modeli wdrożonych jako usługi internetowe.
Uwierzytelnianie za pomocą kluczy
Po włączeniu uwierzytelniania dla wdrożenia automatycznie utworzysz klucze uwierzytelniania.
- Uwierzytelnianie jest domyślnie włączone podczas wdrażania w Azure Kubernetes Service.
- Uwierzytelnianie jest domyślnie wyłączone podczas wdrażania w Azure Container Instances.
Aby kontrolować uwierzytelnianie, użyj parametru auth_enabled
podczas tworzenia lub aktualizowania wdrożenia.
Jeśli uwierzytelnianie jest włączone, możesz użyć get_keys
metody w celu pobrania podstawowego i pomocniczego klucza uwierzytelniania:
primary, secondary = service.get_keys()
print(primary)
Ważne
Jeśli musisz ponownie wygenerować klucz, użyj polecenia service.regen_key
.
Uwierzytelnianie za pomocą tokenów
Po włączeniu uwierzytelniania tokenu dla usługi internetowej użytkownik musi podać token JWT usługi Azure Machine Learning do usługi internetowej, aby uzyskać do niej dostęp.
- Uwierzytelnianie tokenu jest domyślnie wyłączone podczas wdrażania w Azure Kubernetes Service.
- Uwierzytelnianie tokenu nie jest obsługiwane podczas wdrażania w Azure Container Instances.
Aby kontrolować uwierzytelnianie tokenu, użyj parametru token_auth_enabled
podczas tworzenia lub aktualizowania wdrożenia.
Jeśli uwierzytelnianie tokenu jest włączone, możesz użyć get_token
metody , aby pobrać token elementu nośnego i że tokeny wygasają:
token, refresh_by = service.get_token()
print(token)
Jeśli masz interfejs wiersza polecenia platformy Azure i rozszerzenie uczenia maszynowego, możesz użyć następującego polecenia, aby uzyskać token:
DOTYCZY:Rozszerzenie uczenia maszynowego platformy Azure w wersji 1
az ml service get-access-token -n <service-name>
Ważne
Obecnie jedynym sposobem pobrania tokenu jest użycie zestawu SDK usługi Azure Machine Learning lub rozszerzenia uczenia maszynowego interfejsu wiersza polecenia platformy Azure.
Będzie konieczne zażądanie nowego tokenu po upłynięciu czasu odświeżania refresh_by
tokenu.
Żądanie danych
Interfejs API REST oczekuje, że treść żądania będzie dokumentem JSON z następującą strukturą:
{
"data":
[
<model-specific-data-structure>
]
}
Ważne
Struktura danych musi odpowiadać oczekiwanemu skryptowi oceniania i modelowi w usłudze. Skrypt oceniania może zmodyfikować dane przed przekazaniem ich do modelu.
Dane binarne
Aby uzyskać informacje na temat włączania obsługi danych binarnych w usłudze, zobacz Dane binarne.
Porada
Włączenie obsługi danych binarnych odbywa się w pliku score.py używanym przez wdrożony model. Z poziomu klienta użyj funkcji HTTP języka programowania. Na przykład poniższy fragment kodu wysyła zawartość pliku JPG do usługi internetowej:
import requests
# Load image data
data = open('example.jpg', 'rb').read()
# Post raw data to scoring URI
res = request.post(url='<scoring-uri>', data=data, headers={'Content-Type': 'application/> octet-stream'})
Współużytkowanie zasobów między źródłami (CORS)
Aby uzyskać informacje na temat włączania obsługi mechanizmu CORS w usłudze, zobacz Współużytkowanie zasobów między źródłami.
Wywoływanie usługi (C#)
W tym przykładzie pokazano, jak za pomocą języka C# wywołać usługę internetową utworzoną na podstawie przykładu Trenowanie w notesie :
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using Newtonsoft.Json;
namespace MLWebServiceClient
{
// The data structure expected by the service
internal class InputData
{
[JsonProperty("data")]
// The service used by this example expects an array containing
// one or more arrays of doubles
internal double[,] data;
}
class Program
{
static void Main(string[] args)
{
// Set the scoring URI and authentication key or token
string scoringUri = "<your web service URI>";
string authKey = "<your key or token>";
// Set the data to be sent to the service.
// In this case, we are sending two sets of data to be scored.
InputData payload = new InputData();
payload.data = new double[,] {
{
0.0199132141783263,
0.0506801187398187,
0.104808689473925,
0.0700725447072635,
-0.0359677812752396,
-0.0266789028311707,
-0.0249926566315915,
-0.00259226199818282,
0.00371173823343597,
0.0403433716478807
},
{
-0.0127796318808497,
-0.044641636506989,
0.0606183944448076,
0.0528581912385822,
0.0479653430750293,
0.0293746718291555,
-0.0176293810234174,
0.0343088588777263,
0.0702112981933102,
0.00720651632920303
}
};
// Create the HTTP client
HttpClient client = new HttpClient();
// Set the auth header. Only needed if the web service requires authentication.
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authKey);
// Make the request
try {
var request = new HttpRequestMessage(HttpMethod.Post, new Uri(scoringUri));
request.Content = new StringContent(JsonConvert.SerializeObject(payload));
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var response = client.SendAsync(request).Result;
// Display the response from the web service
Console.WriteLine(response.Content.ReadAsStringAsync().Result);
}
catch (Exception e)
{
Console.Out.WriteLine(e.Message);
}
}
}
}
Zwrócone wyniki są podobne do następującego dokumentu JSON:
[217.67978776218715, 224.78937091757172]
Wywoływanie usługi (Go)
W tym przykładzie pokazano, jak za pomocą języka Go wywołać usługę internetową utworzoną na podstawie przykładu Trenowanie w notesie :
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
// Features for this model are an array of decimal values
type Features []float64
// The web service input can accept multiple sets of values for scoring
type InputData struct {
Data []Features `json:"data",omitempty`
}
// Define some example data
var exampleData = []Features{
[]float64{
0.0199132141783263,
0.0506801187398187,
0.104808689473925,
0.0700725447072635,
-0.0359677812752396,
-0.0266789028311707,
-0.0249926566315915,
-0.00259226199818282,
0.00371173823343597,
0.0403433716478807,
},
[]float64{
-0.0127796318808497,
-0.044641636506989,
0.0606183944448076,
0.0528581912385822,
0.0479653430750293,
0.0293746718291555,
-0.0176293810234174,
0.0343088588777263,
0.0702112981933102,
0.00720651632920303,
},
}
// Set to the URI for your service
var serviceUri string = "<your web service URI>"
// Set to the authentication key or token (if any) for your service
var authKey string = "<your key or token>"
func main() {
// Create the input data from example data
jsonData := InputData{
Data: exampleData,
}
// Create JSON from it and create the body for the HTTP request
jsonValue, _ := json.Marshal(jsonData)
body := bytes.NewBuffer(jsonValue)
// Create the HTTP request
client := &http.Client{}
request, err := http.NewRequest("POST", serviceUri, body)
request.Header.Add("Content-Type", "application/json")
// These next two are only needed if using an authentication key
bearer := fmt.Sprintf("Bearer %v", authKey)
request.Header.Add("Authorization", bearer)
// Send the request to the web service
resp, err := client.Do(request)
if err != nil {
fmt.Println("Failure: ", err)
}
// Display the response received
respBody, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(respBody))
}
Zwrócone wyniki są podobne do następującego dokumentu JSON:
[217.67978776218715, 224.78937091757172]
Wywoływanie usługi (Java)
W tym przykładzie pokazano, jak za pomocą języka Java wywołać usługę internetową utworzoną na podstawie przykładu Trenowanie w notesie :
import java.io.IOException;
import org.apache.http.client.fluent.*;
import org.apache.http.entity.ContentType;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
public class App {
// Handle making the request
public static void sendRequest(String data) {
// Replace with the scoring_uri of your service
String uri = "<your web service URI>";
// If using authentication, replace with the auth key or token
String key = "<your key or token>";
try {
// Create the request
Content content = Request.Post(uri)
.addHeader("Content-Type", "application/json")
// Only needed if using authentication
.addHeader("Authorization", "Bearer " + key)
// Set the JSON data as the body
.bodyString(data, ContentType.APPLICATION_JSON)
// Make the request and display the response.
.execute().returnContent();
System.out.println(content);
}
catch (IOException e) {
System.out.println(e);
}
}
public static void main(String[] args) {
// Create the data to send to the service
JSONObject obj = new JSONObject();
// In this case, it's an array of arrays
JSONArray dataItems = new JSONArray();
// Inner array has 10 elements
JSONArray item1 = new JSONArray();
item1.add(0.0199132141783263);
item1.add(0.0506801187398187);
item1.add(0.104808689473925);
item1.add(0.0700725447072635);
item1.add(-0.0359677812752396);
item1.add(-0.0266789028311707);
item1.add(-0.0249926566315915);
item1.add(-0.00259226199818282);
item1.add(0.00371173823343597);
item1.add(0.0403433716478807);
// Add the first set of data to be scored
dataItems.add(item1);
// Create and add the second set
JSONArray item2 = new JSONArray();
item2.add(-0.0127796318808497);
item2.add(-0.044641636506989);
item2.add(0.0606183944448076);
item2.add(0.0528581912385822);
item2.add(0.0479653430750293);
item2.add(0.0293746718291555);
item2.add(-0.0176293810234174);
item2.add(0.0343088588777263);
item2.add(0.0702112981933102);
item2.add(0.00720651632920303);
dataItems.add(item2);
obj.put("data", dataItems);
// Make the request using the JSON document string
sendRequest(obj.toJSONString());
}
}
Zwrócone wyniki są podobne do następującego dokumentu JSON:
[217.67978776218715, 224.78937091757172]
Wywoływanie usługi (Python)
W tym przykładzie pokazano, jak za pomocą języka Python wywołać usługę internetową utworzoną na podstawie przykładu Trenowanie w notesie :
import requests
import json
# URL for the web service
scoring_uri = '<your web service URI>'
# If the service is authenticated, set the key or token
key = '<your key or token>'
# Two sets of data to score, so we get two results back
data = {"data":
[
[
0.0199132141783263,
0.0506801187398187,
0.104808689473925,
0.0700725447072635,
-0.0359677812752396,
-0.0266789028311707,
-0.0249926566315915,
-0.00259226199818282,
0.00371173823343597,
0.0403433716478807
],
[
-0.0127796318808497,
-0.044641636506989,
0.0606183944448076,
0.0528581912385822,
0.0479653430750293,
0.0293746718291555,
-0.0176293810234174,
0.0343088588777263,
0.0702112981933102,
0.00720651632920303]
]
}
# Convert to JSON string
input_data = json.dumps(data)
# Set the content type
headers = {'Content-Type': 'application/json'}
# If authentication is enabled, set the authorization header
headers['Authorization'] = f'Bearer {key}'
# Make the request and display the response
resp = requests.post(scoring_uri, input_data, headers=headers)
print(resp.text)
Zwrócone wyniki są podobne do następującego dokumentu JSON:
[217.67978776218715, 224.78937091757172]
Schemat usługi internetowej (specyfikacja interfejsu OpenAPI)
Jeśli podczas wdrażania użyto automatycznego generowania schematu, możesz uzyskać adres specyfikacji Interfejsu OpenAPI dla usługi przy użyciu właściwości swagger_uri. (Na przykład print(service.swagger_uri)
.) Użyj żądania GET lub otwórz identyfikator URI w przeglądarce, aby pobrać specyfikację.
Poniższy dokument JSON jest przykładem schematu (specyfikacja interfejsu OpenAPI) wygenerowanego dla wdrożenia:
{
"swagger": "2.0",
"info": {
"title": "myservice",
"description": "API specification for Azure Machine Learning myservice",
"version": "1.0"
},
"schemes": [
"https"
],
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"securityDefinitions": {
"Bearer": {
"type": "apiKey",
"name": "Authorization",
"in": "header",
"description": "For example: Bearer abc123"
}
},
"paths": {
"/": {
"get": {
"operationId": "ServiceHealthCheck",
"description": "Simple health check endpoint to ensure the service is up at any given point.",
"responses": {
"200": {
"description": "If service is up and running, this response will be returned with the content 'Healthy'",
"schema": {
"type": "string"
},
"examples": {
"application/json": "Healthy"
}
},
"default": {
"description": "The service failed to execute due to an error.",
"schema": {
"$ref": "#/definitions/ErrorResponse"
}
}
}
}
},
"/score": {
"post": {
"operationId": "RunMLService",
"description": "Run web service's model and get the prediction output",
"security": [
{
"Bearer": []
}
],
"parameters": [
{
"name": "serviceInputPayload",
"in": "body",
"description": "The input payload for executing the real-time machine learning service.",
"schema": {
"$ref": "#/definitions/ServiceInput"
}
}
],
"responses": {
"200": {
"description": "The service processed the input correctly and provided a result prediction, if applicable.",
"schema": {
"$ref": "#/definitions/ServiceOutput"
}
},
"default": {
"description": "The service failed to execute due to an error.",
"schema": {
"$ref": "#/definitions/ErrorResponse"
}
}
}
}
}
},
"definitions": {
"ServiceInput": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "integer",
"format": "int64"
}
}
}
},
"example": {
"data": [
[ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 ]
]
}
},
"ServiceOutput": {
"type": "array",
"items": {
"type": "number",
"format": "double"
},
"example": [
3726.995
]
},
"ErrorResponse": {
"type": "object",
"properties": {
"status_code": {
"type": "integer",
"format": "int32"
},
"message": {
"type": "string"
}
}
}
}
}
Aby uzyskać więcej informacji, zobacz Specyfikacja interfejsu OpenAPI.
Aby uzyskać narzędzie, które może tworzyć biblioteki klienckie na podstawie specyfikacji, zobacz swagger-codegen.
Porada
Po wdrożeniu usługi możesz pobrać dokument JSON schematu. Użyj właściwości swagger_uri z wdrożonej usługi internetowej (na przykład service.swagger_uri
), aby pobrać identyfikator URI do pliku Swagger lokalnej usługi internetowej.
Korzystanie z usługi z poziomu usługi Power BI
Usługa Power BI obsługuje wzbogacanie danych o przewidywania dzięki korzystaniu z usług internetowych usługi Azure Machine Learning.
Aby wygenerować usługę internetową obsługiwaną do użycia w usłudze Power BI, schemat musi obsługiwać format wymagany przez usługę Power BI. Dowiedz się, jak utworzyć schemat obsługiwany przez usługę Power BI.
Po wdrożeniu usługi internetowej może być ona używana przez przepływy danych usługi Power BI. Dowiedz się, jak korzystać z usługi internetowej Azure Machine Learning za pomocą usługi Power BI.
Następne kroki
Aby wyświetlić architekturę referencyjną oceniania modeli języka Python i uczenia głębokiego w czasie rzeczywistym, przejdź do centrum architektury platformy Azure.