Aracılığıyla paylaş


Web hizmeti olarak dağıtılan bir Azure Machine Learning modelini kullanma

Web hizmeti olarak Azure Machine Learning modeli dağıtma işlemi bir REST API uç noktası oluşturur. Bu uç noktaya veri gönderebilir ve model tarafından döndürülen tahmini alabilirsiniz. Bu belgede C#, Go, Java ve Python kullanarak web hizmeti için istemci oluşturmayı öğrenin.

Yerel ortamınıza, Azure Container Instances'a veya Azure Kubernetes Service'e bir model dağıttığınızda bir web hizmeti oluşturursunuz. Azure Machine Learning SDK'sını kullanarak web hizmetine erişmek için kullanılan URI'yi alırsınız. Kimlik doğrulaması etkinse, kimlik doğrulama anahtarlarını veya belirteçlerini almak için SDK'yı da kullanabilirsiniz.

Makine öğrenmesi web hizmeti kullanan bir istemci oluşturmaya yönelik genel iş akışı şu şekildedir:

  1. Bağlantı bilgilerini almak için SDK'yı kullanın.
  2. Model tarafından kullanılan istek verilerinin türünü belirleyin.
  3. Web hizmetini çağıran bir uygulama oluşturun.

İpucu

Bu belgedeki örnekler, OpenAPI (Swagger) belirtimleri kullanılmadan el ile oluşturulur. Dağıtımınız için bir OpenAPI belirtimi etkinleştirdiyseniz, hizmetiniz için istemci kitaplıkları oluşturmak için swagger-codegen gibi araçları kullanabilirsiniz.

Önemli

Bu makaledeki Azure CLI komutlarından bazıları Azure Machine Learning için uzantısını veya v1'i kullanır azure-cli-ml. v1 uzantısı desteği 30 Eylül 2025'te sona erecektir. Bu tarihe kadar v1 uzantısını yükleyebilecek ve kullanabileceksiniz.

30 Eylül 2025'e kadar , veya v2 uzantısına geçmenizi mlöneririz. v2 uzantısı hakkında daha fazla bilgi için bkz . Azure ML CLI uzantısı ve Python SDK v2.

Bağlantı bilgileri

Not

Web hizmeti bilgilerini almak için Azure Machine Learning SDK'sını kullanın. Bu bir Python SDK'dır. Hizmet için bir istemci oluşturmak için herhangi bir dili kullanabilirsiniz.

azureml.core.Webservice sınıfı, istemci oluşturmak için ihtiyacınız olan bilgileri sağlar. Aşağıdaki Webservice özellikler bir istemci uygulaması oluşturmak için kullanışlıdır:

  • auth_enabled- Anahtar kimlik doğrulaması etkinleştirildiyse; Trueaksi takdirde. False
  • token_auth_enabled - Belirteç kimlik doğrulaması etkinse; Trueaksi takdirde , False.
  • scoring_uri - REST API adresi.
  • swagger_uri - OpenAPI belirtiminin adresi. Otomatik şema oluşturmayı etkinleştirdiyseniz bu URI kullanılabilir. Daha fazla bilgi için bkz . Azure Machine Learning ile modelleri dağıtma.

Dağıtılan web hizmetleri için bu bilgileri almanın birkaç yolu vardır:

ŞUNUN IÇIN GEÇERLIDIR: Python SDK azureml v1

  • Bir modeli dağıttığınızda, hizmetle ilgili bilgiler içeren bir Webservice nesne döndürülür:

    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)
    
  • Çalışma alanınızdaki modeller için dağıtılan web hizmetlerinin listesini almak için kullanabilirsiniz Webservice.list . Döndürülen bilgi listesini daraltmak için filtreler ekleyebilirsiniz. Filtrelenebilenler hakkında daha fazla bilgi için Webservice.list başvuru belgelerine bakın.

    services = Webservice.list(ws)
    print(services[0].scoring_uri)
    print(services[0].swagger_uri)
    
  • Dağıtılan hizmetin adını biliyorsanız, yeni bir örneği Webserviceoluşturabilir ve çalışma alanını ve hizmet adını parametre olarak sağlayabilirsiniz. Yeni nesne, dağıtılan hizmet hakkında bilgi içerir.

    service = Webservice(workspace=ws, name='myservice')
    print(service.scoring_uri)
    print(service.swagger_uri)
    

Aşağıdaki tabloda bu URI'lerin nasıl göründüğü gösterilmektedir:

URI türü Örnek
Puanlama URI'si http://104.214.29.152:80/api/v1/service/<service-name>/score
Swagger URI'sı http://104.214.29.152/api/v1/service/<service-name>/swagger.json

İpucu

DAĞıTıMınız için IP adresi farklı olacaktır. Her AKS kümesinin, bu kümeye yapılan dağıtımlar tarafından paylaşılan kendi IP adresi olacaktır.

Güvenli web hizmeti

Dağıtılan web hizmetinin güvenliğini TLS/SSL sertifikası kullanarak sağladıysanız puanlama veya swagger URI'sini kullanarak hizmete bağlanmak için HTTPS kullanabilirsiniz. HTTPS, ikisi arasındaki iletişimi şifreleyerek bir istemci ile web hizmeti arasındaki iletişimin güvenliğini sağlar. Şifreleme aktarım katmanı güvenliği (TLS) kullanır. TLS bazen TLS'nin öncülü olan Güvenli Yuva Katmanı (SSL) olarak da adlandırılır.

Önemli

Azure Machine Learning tarafından dağıtılan web hizmetleri yalnızca TLS sürüm 1.2'i destekler. İstemci uygulaması oluştururken bu sürümü desteklediğine emin olun.

Daha fazla bilgi için bkz. TLS kullanarak Azure Machine Learning aracılığıyla web hizmetinin güvenliğini sağlama.

Hizmetler için kimlik doğrulaması

Azure Machine Learning, web hizmetlerinize erişimi denetlemek için iki yordam sunar.

Kimlik Doğrulama Yöntemi ACI AKS
Anahtar Varsayılan olarak devre dışıdır Varsayılan olarak etkindir
Belirteç Kullanılabilir Değil Varsayılan olarak devre dışıdır

Anahtar veya belirteçle güvenliği sağlanan bir hizmete istek gönderirken, anahtarı veya belirteci geçirmek için Yetkilendirme üst bilgisini kullanın. Anahtar veya belirtecin Bearer <key-or-token> biçiminde olması gerekir. Burada <key-or-token>, anahtar veya belirteç değerinizdir.

Anahtarlar ve belirteçler arasındaki birincil fark, anahtarların statik olması ve el ile yeniden oluşturulabilmesi ve süre sonunda belirteçlerin yenilenmesi gerektiğidir. Anahtar tabanlı kimlik doğrulaması, Azure Container Instance ve Azure Kubernetes Service tarafından dağıtılan web hizmetleri için desteklenir ve belirteç tabanlı kimlik doğrulaması yalnızca Azure Kubernetes Service dağıtımlarında kullanılabilir. Kimlik doğrulamasını yapılandırma hakkında daha fazla bilgi için bkz . Web hizmetleri olarak dağıtılan modeller için kimlik doğrulamasını yapılandırma.

Anahtar ile kimlik doğrulaması

Dağıtım için kimlik doğrulamasını etkinleştirdiğinizde, kimlik doğrulama anahtarlarını otomatik olarak oluşturursunuz.

  • Azure Kubernetes Service'e dağıtım yaparken kimlik doğrulaması varsayılan olarak etkinleştirilir.
  • Azure Container Instances'a dağıtım yaparken kimlik doğrulaması varsayılan olarak devre dışı bırakılır.

Kimlik doğrulamasını auth_enabled denetlemek için, bir dağıtım oluştururken veya güncelleştirirken parametresini kullanın.

Kimlik doğrulaması etkinse, birincil ve ikincil kimlik doğrulama anahtarını almak için yöntemini kullanabilirsiniz get_keys :

primary, secondary = service.get_keys()
print(primary)

Önemli

Bir anahtarı yeniden oluşturmanız gerekiyorsa kullanın service.regen_key.

Belirteç ile kimlik doğrulaması

Bir web hizmeti için belirteç kimlik doğrulamasını etkinleştirdiğinizde, kullanıcının web hizmetine erişmek için bir Azure Machine Learning JWT belirteci sağlaması gerekir.

  • Azure Kubernetes Service'e dağıtım yaparken belirteç kimlik doğrulaması varsayılan olarak devre dışı bırakılır.
  • Azure Container Instances'a dağıtım yaparken belirteç kimlik doğrulaması desteklenmez.

Belirteç kimlik doğrulamasını token_auth_enabled denetlemek için bir dağıtım oluştururken veya güncelleştirirken parametresini kullanın.

Belirteç kimlik doğrulaması etkinleştirildiyse, taşıyıcı belirteci ve bu belirteçlerin süre sonu süresini almak için yöntemini kullanabilirsiniz get_token :

token, refresh_by = service.get_token()
print(token)

Azure CLI ve makine öğrenmesi uzantısına sahipseniz, belirteç almak için aşağıdaki komutu kullanabilirsiniz:

ŞUNLAR IÇIN GEÇERLIDIR: Azure CLI ml uzantısı v1

az ml service get-access-token -n <service-name>

Önemli

Şu anda belirteci almanın tek yolu Azure Machine Learning SDK'sını veya Azure CLI makine öğrenmesi uzantısını kullanmaktır.

Belirtecin refresh_by süresi dolduktan sonra yeni bir belirteç istemeniz gerekir.

Veri isteme

REST API, isteğin gövdesinin aşağıdaki yapıya sahip bir JSON belgesi olmasını bekler:

{
    "data":
        [
            <model-specific-data-structure>
        ]
}

Önemli

Verilerin yapısının, hizmetteki puanlama betiği ve modeliyle eşleşmesi gerekir. Puanlama betiği verileri modele geçirmeden önce değiştirebilir.

İkili veri

Hizmetinizdeki ikili veriler için desteği etkinleştirme hakkında bilgi için bkz . İkili veriler.

İpucu

İkili veriler için desteğin etkinleştirilmesi, dağıtılan model tarafından kullanılan score.py dosyasında gerçekleşir. İstemciden, programlama dilinizin HTTP işlevselliğini kullanın. Örneğin, aşağıdaki kod parçacığı bir JPG dosyasının içeriğini bir web hizmetine gönderir:

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'})

Çıkış noktaları arası kaynak paylaşımı (CORS)

Hizmetinizde CORS desteğini etkinleştirme hakkında bilgi için bkz . Çıkış noktaları arası kaynak paylaşımı.

Hizmeti çağırma (C#)

Bu örnekte, not defteri içinde eğitme örneğinden oluşturulan web hizmetini çağırmak için C# özelliğinin nasıl kullanılacağı gösterilmektedir:

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

Döndürülen sonuçlar aşağıdaki JSON belgesine benzer:

[217.67978776218715, 224.78937091757172]

Hizmeti çağırma (Go)

Bu örnekte, Not defteri içinde eğitme örneğinden oluşturulan web hizmetini çağırmak için Git'in nasıl kullanılacağı gösterilmektedir:

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

Döndürülen sonuçlar aşağıdaki JSON belgesine benzer:

[217.67978776218715, 224.78937091757172]

Hizmeti çağırma (Java)

Bu örnekte, Not defteri içinde eğitme örneğinden oluşturulan web hizmetini çağırmak için Java'nın nasıl kullanılacağı gösterilmektedir:

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

Döndürülen sonuçlar aşağıdaki JSON belgesine benzer:

[217.67978776218715, 224.78937091757172]

Hizmeti çağırma (Python)

Bu örnekte, Not defteri içinde eğitme örneğinden oluşturulan web hizmetini çağırmak için Python'ın nasıl kullanılacağı gösterilmektedir:

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)

Döndürülen sonuçlar aşağıdaki JSON belgesine benzer:

[217.67978776218715, 224.78937091757172]

Web hizmeti şeması (OpenAPI belirtimi)

Dağıtımınızla otomatik şema oluşturmayı kullandıysanız, swagger_uri özelliğini kullanarak hizmet için OpenAPI belirtiminin adresini alabilirsiniz. (Örneğin, print(service.swagger_uri).) Belirtimi almak için bir GET isteği kullanın veya tarayıcıda URI'yi açın.

Aşağıdaki JSON belgesi, bir dağıtım için oluşturulan şema (OpenAPI belirtimi) örneğidir:

{
    "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"
                }
            }
        }
    }
}

Daha fazla bilgi için bkz . OpenAPI belirtimi.

Belirtimden istemci kitaplıkları oluşturabilen bir yardımcı program için bkz . swagger-codegen.

İpucu

Hizmeti dağıttığınızda şema JSON belgesini alabilirsiniz. URI'yi yerel web hizmetinin Swagger dosyasına almak için dağıtılan web hizmetinden (örneğin, service.swagger_uri) swagger_uri özelliğini kullanın.

Hizmeti Power BI’dan kullanma

Power BI'daki verileri tahminlerle zenginleştirmek için, Power BI Azure Machine Learning web hizmetlerinin kullanımını destekler.

Power BI'da tüketim için desteklenen bir web hizmeti oluşturmak için şemanın Power BI'ın gerektirdiği biçimi desteklemesi gerekir. Power BI tarafından desteklenen bir şema oluşturmayı öğrenin.

Web hizmeti dağıtıldıktan sonra Power BI iş akışlarından kullanılabilir. Azure Machine Learning web hizmetini Power BI'dan kullanmayı öğrenin.

Sonraki adımlar

Python ve derin öğrenme modellerinin gerçek zamanlı puanlaması için başvuru mimarisini görüntülemek için Azure mimari merkezine gidin.