Azure Machine Learning-modell felhasználása webszolgáltatásként
Ha egy Azure Machine Learning-modellt webszolgáltatásként helyez üzembe, létrejön egy REST API-végpont. Adatokat küldhet ennek a végpontnak, és megkaphatja a modell által visszaküldött előrejelzést. Ebben a dokumentumban megtudhatja, hogyan hozhat létre ügyfeleket a webszolgáltatáshoz a C#, a Go, a Java és a Python használatával.
Webszolgáltatást akkor hoz létre, ha modellt helyez üzembe a helyi környezetben, az Azure Container Instancesben vagy az Azure Kubernetes Service-ben. Az Azure Machine Learning SDK-val lekérheti a webszolgáltatás eléréséhez használt URI-t. Ha a hitelesítés engedélyezve van, az SDK-val is lekérheti a hitelesítési kulcsokat vagy jogkivonatokat.
A gépi tanulási webszolgáltatást használó ügyfelek létrehozásának általános munkafolyamata a következő:
- Kérdezze le a kapcsolati adatokat az SDK-val.
- Határozza meg a modell által használt kérelemadatok típusát.
- Hozza létre a webszolgáltatást meghívó alkalmazást.
Tipp.
A dokumentumban szereplő példák manuálisan jönnek létre az OpenAPI (Swagger) specifikációinak használata nélkül. Ha engedélyezte az üzemelő példány OpenAPI-specifikációját, az olyan eszközökkel, mint a swagger-codegen , ügyfélkódtárakat hozhat létre a szolgáltatáshoz.
Fontos
A cikkben szereplő Azure CLI-parancsok némelyike az azure-cli-ml
Azure Machine Learning bővítményét vagy v1-et használja. A v1-bővítmény támogatása 2025. szeptember 30-án megszűnik. Addig a dátumig telepítheti és használhatja a v1-bővítményt.
Javasoljuk, hogy 2025. szeptember 30-a előtt váltsa át a ml
(vagy v2) bővítményt. További információ a v2-es bővítményről: Azure ML CLI-bővítmény és Python SDK v2.
Kapcsolati információk
Feljegyzés
A webszolgáltatás adatainak lekéréséhez használja az Azure Machine Learning SDK-t. Ez egy Python SDK. A szolgáltatáshoz bármilyen nyelven létrehozhat ügyfelet.
Az azureml.core.Webservice osztály az ügyfél létrehozásához szükséges információkat tartalmazza. Az ügyfélalkalmazások létrehozásához az alábbi Webservice
tulajdonságok hasznosak:
auth_enabled
- Ha a kulcshitelesítés engedélyezve van,True
ellenkező esetbenFalse
.token_auth_enabled
- Ha a jogkivonat-hitelesítés engedélyezve van,True
ellenkező esetbenFalse
.scoring_uri
- A REST API-cím.swagger_uri
- Az OpenAPI specifikációjának címe. Ez az URI akkor érhető el, ha engedélyezte az automatikus sémagenerálást. További információ: Modellek üzembe helyezése az Azure Machine Learning használatával.
Ezeket az információkat többféleképpen is lekérheti az üzembe helyezett webszolgáltatások esetében:
A KÖVETKEZŐKRE VONATKOZIK: Python SDK azureml v1
Modell üzembe helyezésekor a rendszer visszaad egy
Webservice
objektumot a szolgáltatással kapcsolatos információkkal: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)
A munkaterületen lévő modellekhez telepített webszolgáltatások listájának lekérésére használható
Webservice.list
. Szűrők hozzáadásával szűkítheti a visszaadott információk listáját. A szűréssel kapcsolatos további információkért tekintse meg a Webservice.list referenciadokumentációját.services = Webservice.list(ws) print(services[0].scoring_uri) print(services[0].swagger_uri)
Ha ismeri az üzembe helyezett szolgáltatás nevét, létrehozhat egy új példányt
Webservice
, és paraméterekként megadhatja a munkaterület és a szolgáltatás nevét. Az új objektum információkat tartalmaz az üzembe helyezett szolgáltatásról.service = Webservice(workspace=ws, name='myservice') print(service.scoring_uri) print(service.swagger_uri)
Az alábbi táblázat az alábbi URI-k megjelenését mutatja be:
URI-típus | Példa |
---|---|
Pontozási URI | 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 |
Tipp.
Az IP-cím eltérő lesz az üzembe helyezéshez. Minden AKS-fürtnek saját IP-címe lesz, amelyet az adott fürtön üzemelő példányok osztanak meg.
Biztonságos webszolgáltatás
Ha az üzembe helyezett webszolgáltatást TLS/SSL-tanúsítvánnyal védte, https használatával csatlakozhat a szolgáltatáshoz a pontozó vagy a swagger URI használatával. A HTTPS a kettő közötti kommunikáció titkosításával segíti az ügyfél és a webszolgáltatás közötti kommunikáció védelmét. A titkosítás a Transport Layer Security (TLS) protokollt használja. A TLS-t néha még mindig biztonságos szoftvercsatornák rétegének (SSL) nevezik, amely a TLS elődje volt.
Fontos
Az Azure Machine Learning által üzembe helyezett webszolgáltatások csak a TLS 1.2-es verzióját támogatják. Ügyfélalkalmazás létrehozásakor győződjön meg arról, hogy támogatja ezt a verziót.
További információért lásd: TLS használata webszolgáltatás védelméhez az Azure Machine Learning szolgáltatás segítségével.
Szolgáltatások hitelesítése
Az Azure Machine Learning két módszert kínál a webszolgáltatásokhoz való hozzáférés szabályozására.
Hitelesítési módszer | ACI | AKS |
---|---|---|
Kulcs | Alapértelmezés szerint le van tiltva | Alapértelmezés szerint engedélyezett |
Jogkivonat | Nem elérhető | Alapértelmezés szerint le van tiltva |
Amikor egy kulccsal vagy jogkivonattal védett szolgáltatásnak küld kérést, az Engedélyezési fejléc használatával adja át a kulcsot vagy a jogkivonatot. A kulcsot vagy jogkivonatot Bearer <key-or-token>
formátumban kell megadni, amelyben a <key-or-token>
a kulcs vagy jogkivonat értéke.
A kulcsok és a jogkivonatok közötti elsődleges különbség az, hogy a kulcsok statikusak, és manuálisan újragenerálhatók, és a jogkivonatokat a lejáratkor frissíteni kell. A kulcsalapú hitelesítés az Azure Container Instance és az Azure Kubernetes Service által üzembe helyezett webszolgáltatások esetében támogatott, a tokenalapú hitelesítés pedig csak az Azure Kubernetes Service üzemelő példányaihoz érhető el. A hitelesítés konfigurálásáról további információt a webszolgáltatásként üzembe helyezett modellek hitelesítésének konfigurálása című témakörben talál.
Hitelesítés kulcsokkal
Amikor engedélyezi a hitelesítést egy központi telepítéshez, automatikusan létrehozza a hitelesítési kulcsokat.
- A hitelesítés alapértelmezés szerint engedélyezve van az Azure Kubernetes Service-ben való üzembe helyezéskor.
- A hitelesítés alapértelmezés szerint le van tiltva az Azure Container Instancesben való üzembe helyezéskor.
A hitelesítés szabályozásához használja a paramétert az auth_enabled
üzembe helyezés létrehozásakor vagy frissítésekor.
Ha a hitelesítés engedélyezve van, a get_keys
metódussal lekérhet egy elsődleges és másodlagos hitelesítési kulcsot:
primary, secondary = service.get_keys()
print(primary)
Fontos
Ha újra kell létrehoznia egy kulcsot, használja a következőt service.regen_key
: .
Hitelesítés jogkivonatokkal
Amikor engedélyezi a jogkivonat-hitelesítést egy webszolgáltatáshoz, a felhasználónak meg kell adnia egy Azure Machine Learning JWT-jogkivonatot a webszolgáltatásnak a hozzáféréshez.
- A jogkivonat-hitelesítés alapértelmezés szerint le van tiltva az Azure Kubernetes Service-ben való üzembe helyezéskor.
- A jogkivonat-hitelesítés nem támogatott az Azure Container Instancesben való üzembe helyezéskor.
A jogkivonat-hitelesítés szabályozásához használja a token_auth_enabled
paramétert az üzembe helyezés létrehozásakor vagy frissítésekor.
Ha a jogkivonat-hitelesítés engedélyezve van, a metódussal lekérheti a get_token
tulajdonosi jogkivonatot és a jogkivonatok lejárati idejét:
token, refresh_by = service.get_token()
print(token)
Ha rendelkezik az Azure CLI-vel és a gépi tanulási bővítményrel, a következő paranccsal szerezhet be egy jogkivonatot:
A KÖVETKEZŐRE VONATKOZIK: Azure CLI ml-bővítmény 1-es verzió
az ml service get-access-token -n <service-name>
Fontos
A jogkivonat lekérésének jelenleg csak az Azure Machine Learning SDK vagy az Azure CLI machine learning bővítmény használatával lehet lekérni.
Új jogkivonatot kell kérnie a jogkivonat refresh_by
ideje után.
Adatok kérése
A REST API elvárja, hogy a kérés törzse egy JSON-dokumentum legyen, amely a következő struktúrával rendelkezik:
{
"data":
[
<model-specific-data-structure>
]
}
Fontos
Az adatok struktúrájának meg kell egyeznie a szolgáltatásban elvárt pontozási szkripttel és modellel. A pontozási szkript módosíthatja az adatokat, mielőtt továbbítaná azokat a modellnek.
Bináris adatok
A bináris adatok szolgáltatásbeli támogatásának engedélyezéséről további információt a Bináris adatok című témakörben talál.
Tipp.
A bináris adatok támogatásának engedélyezése az üzembe helyezett modell által használt score.py fájlban történik. Az ügyféltől használja a programozási nyelv HTTP-funkcióit. A következő kódrészlet például egy JPG-fájl tartalmát küldi el egy webszolgáltatásnak:
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'})
Eltérő eredetű erőforrások megosztása (CORS)
A CORS-támogatás szolgáltatásban való engedélyezéséről további információt a Forrásközi erőforrás-megosztás című témakörben talál.
Szolgáltatás meghívása (C#)
Ez a példa bemutatja, hogyan hívhatja meg a C#-ot a Betanított jegyzetfüzet példában létrehozott webszolgáltatás meghívásához:
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);
}
}
}
}
A visszaadott eredmények a következő JSON-dokumentumhoz hasonlóak:
[217.67978776218715, 224.78937091757172]
Szolgáltatás meghívása (Go)
Ez a példa bemutatja, hogyan hívhatja meg a betanított jegyzetfüzetben létrehozott webszolgáltatást a Go használatával:
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))
}
A visszaadott eredmények a következő JSON-dokumentumhoz hasonlóak:
[217.67978776218715, 224.78937091757172]
Szolgáltatás meghívása (Java)
Ez a példa bemutatja, hogyan hívhatja meg a Java használatával a Betanított jegyzetfüzetben létrehozott webszolgáltatást:
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());
}
}
A visszaadott eredmények a következő JSON-dokumentumhoz hasonlóak:
[217.67978776218715, 224.78937091757172]
Szolgáltatás meghívása (Python)
Ez a példa bemutatja, hogyan hívhatja meg a Pythont a Betanítása jegyzetfüzetben példaként létrehozott webszolgáltatás meghívására:
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)
A visszaadott eredmények a következő JSON-dokumentumhoz hasonlóak:
[217.67978776218715, 224.78937091757172]
Webszolgáltatás-séma (OpenAPI-specifikáció)
Ha automatikus sémalétrehozást használt az üzembe helyezés során, a swagger_uri tulajdonság használatával lekérheti a szolgáltatás OpenAPI-specifikációjának címét. (Például. print(service.swagger_uri)
) Használjon GET kérést, vagy nyissa meg az URI-t egy böngészőben a specifikáció lekéréséhez.
Az alábbi JSON-dokumentum egy példa egy üzembe helyezéshez létrehozott sémára (OpenAPI-specifikációra):
{
"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"
}
}
}
}
}
További információ: OpenAPI-specifikáció.
Az ügyfélkódtárakat a specifikációból létrehozó segédprogramért lásd a swagger-codegen című témakört.
Tipp.
A szolgáltatás üzembe helyezése után lekérheti a séma JSON-dokumentumát. Az üzembe helyezett webszolgáltatás swagger_uri tulajdonságával (például service.swagger_uri
) lekérheti az URI-t a helyi webszolgáltatás Swagger-fájljához.
Szolgáltatás felhasználása a Power BI-ból
A Power BI támogatja az Azure Machine Learning webszolgáltatások felhasználását a Power BI-adatok előrejelzésekkel való bővítéséhez.
A Power BI-ban használathoz támogatott webszolgáltatás létrehozásához a sémának támogatnia kell a Power BI által megkövetelt formátumot. Megtudhatja, hogyan hozhat létre Power BI által támogatott sémát.
A webszolgáltatás az üzembe helyezése után a Power BI-adatfolyamokból használható. Ismerje meg, hogyan használható Azure Machine Learning webszolgáltatás a Power BI-ból.
Következő lépések
A Python- és mélytanulási modellek valós idejű pontozásához használható referenciaarchitektúrát az Azure Architektúraközpontban tekintheti meg.