Aracılığıyla paylaş


Makine öğrenmesi işlem hatlarını yayımlama ve izleme

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

Bu makalede, bir makine öğrenmesi işlem hattını iş arkadaşlarınızla veya müşterilerinizle nasıl paylaşacağınız gösterilir.

Makine öğrenmesi işlem hatları, makine öğrenmesi görevleri için yeniden kullanılabilir iş akışlarıdır. İşlem hatlarının avantajlarından biri işbirliğinin artmasıdır. Ayrıca, yeni bir sürüm üzerinde çalışırken müşterilerin geçerli modeli kullanmasına olanak tanıyarak işlem hatlarını da kullanabilirsiniz.

Önkoşullar

İşlem hattı yayımlama

İşlem hattını çalışır duruma getirdikten sonra, farklı girişlerle çalışması için bir işlem hattı yayımlayabilirsiniz. Zaten yayımlanmış bir işlem hattının REST uç noktasının parametreleri kabul etmesi için işlem hattınızı değişkenlik gösterecek bağımsız değişkenler için nesneleri kullanacak PipelineParameter şekilde yapılandırmanız gerekir.

  1. İşlem hattı parametresi oluşturmak için, varsayılan değere sahip bir PipelineParameter nesnesi kullanın.

    from azureml.pipeline.core.graph import PipelineParameter
    
    pipeline_param = PipelineParameter(
      name="pipeline_arg",
      default_value=10)
    
  2. Bu PipelineParameter nesneyi işlem hattındaki adımlardan herhangi birine aşağıdaki gibi parametre olarak ekleyin:

    compareStep = PythonScriptStep(
      script_name="compare.py",
      arguments=["--comp_data1", comp_data1, "--comp_data2", comp_data2, "--output_data", out_data3, "--param1", pipeline_param],
      inputs=[ comp_data1, comp_data2],
      outputs=[out_data3],
      compute_target=compute_target,
      source_directory=project_folder)
    
  3. Çağrıldığında bir parametre kabul edecek bu işlem hattını yayımlayın.

    published_pipeline1 = pipeline_run1.publish_pipeline(
         name="My_Published_Pipeline",
         description="My Published Pipeline Description",
         version="1.0")
    
  4. İşlem hattınızı yayımladıktan sonra kullanıcı arabiriminde de kontrol edebilirsiniz. İşlem Hattı Kimliği, yayımlanan işlem hattının benzersiz olarak tanımlanan kimliğidir.

    Yayımlanan işlem hattı ayrıntılarını gösteren ekran görüntüsü.

Yayımlanan işlem hattını çalıştırma

Yayımlanan tüm işlem hatlarının rest uç noktası vardır. İşlem hattı uç noktasıyla, Python olmayan istemciler de dahil olmak üzere tüm dış sistemlerden işlem hattının çalıştırılmasını tetikleyebilirsiniz. Bu uç nokta, toplu puanlama ve yeniden eğitme senaryolarında "yönetilen yinelenebilirliği" etkinleştirir.

Önemli

İşlem hattınıza erişimi yönetmek için Azure rol tabanlı erişim denetimi (Azure RBAC) kullanıyorsanız işlem hattı senaryonuzun izinlerini (eğitim veya puanlama) ayarlayın.

Önceki işlem hattının çalışmasını çağırmak için bir Microsoft Entra kimlik doğrulama üst bilgi belirteci gerekir. Böyle bir belirteci almak, AzureCliAuthentication sınıf başvurusunda ve Azure Machine Learning'dekimlik doğrulaması not defterinde açıklanmıştır.

from azureml.pipeline.core import PublishedPipeline
import requests

response = requests.post(published_pipeline1.endpoint,
                         headers=aad_token,
                         json={"ExperimentName": "My_Pipeline",
                               "ParameterAssignments": {"pipeline_arg": 20}})

json POST isteğinin bağımsız değişkeni anahtar için ParameterAssignments işlem hattı parametrelerini ve değerlerini içeren bir sözlük içermelidir. Buna ek olarak, json bağımsız değişken aşağıdaki anahtarları içerebilir:

Tuş Açıklama
ExperimentName Bu uç noktayla ilişkilendirilmiş denemenin adı
Description Uç noktayı açıklayan serbest biçimli metin
Tags İstekleri etiketlemek ve açıklama eklemek için kullanılabilen serbest biçimli anahtar-değer çiftleri
DataSetDefinitionValueAssignments Veri kümelerini yeniden eğitmeden değiştirmek için kullanılan sözlük (aşağıdaki tartışmaya bakın)
DataPathAssignments Veri yollarını yeniden eğitmeden değiştirmek için kullanılan sözlük (aşağıdaki tartışmaya bakın)

C kullanarak yayımlanmış işlem hattı çalıştırma#

Aşağıdaki kod, C# dilinden bir işlem hattını zaman uyumsuz olarak çağırmayı gösterir. Kısmi kod parçacığı yalnızca çağrı yapısını gösterir ve bir Microsoft örneğinin parçası değildir. Tam sınıfları veya hata işlemeyi göstermez.

[DataContract]
public class SubmitPipelineRunRequest
{
    [DataMember]
    public string ExperimentName { get; set; }

    [DataMember]
    public string Description { get; set; }

    [DataMember(IsRequired = false)]
    public IDictionary<string, string> ParameterAssignments { get; set; }
}

// ... in its own class and method ... 
const string RestEndpoint = "your-pipeline-endpoint";

using (HttpClient client = new HttpClient())
{
    var submitPipelineRunRequest = new SubmitPipelineRunRequest()
    {
        ExperimentName = "YourExperimentName", 
        Description = "Asynchronous C# REST api call", 
        ParameterAssignments = new Dictionary<string, string>
        {
            {
                // Replace with your pipeline parameter keys and values
                "your-pipeline-parameter", "default-value"
            }
        }
    };

    string auth_key = "your-auth-key"; 
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", auth_key);

    // submit the job
    var requestPayload = JsonConvert.SerializeObject(submitPipelineRunRequest);
    var httpContent = new StringContent(requestPayload, Encoding.UTF8, "application/json");
    var submitResponse = await client.PostAsync(RestEndpoint, httpContent).ConfigureAwait(false);
    if (!submitResponse.IsSuccessStatusCode)
    {
        await WriteFailedResponse(submitResponse); // ... method not shown ...
        return;
    }

    var result = await submitResponse.Content.ReadAsStringAsync().ConfigureAwait(false);
    var obj = JObject.Parse(result);
    // ... use `obj` dictionary to access results
}

Java kullanarak yayımlanmış işlem hattı çalıştırma

Aşağıdaki kod, kimlik doğrulaması gerektiren bir işlem hattı çağrısı gösterir (bkz . Azure Machine Learning kaynakları ve iş akışları için kimlik doğrulamasını ayarlama). İşlem hattınız genel olarak dağıtıldıysa, üreten authKeyçağrılara ihtiyacınız yoktur. Kısmi kod parçacığı Java sınıfını ve özel durum işleme ortak kodunu göstermez. Kod, boş Optionalbir döndürebilen birlikte zincirleme işlevleri için kullanırOptional.flatMap. Kullanımı flatMap kodu kısaltır ve açıklar, ancak özel durumları yuttuğuna getRequestBody() dikkat edin.

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Optional;
// JSON library
import com.google.gson.Gson;

String scoringUri = "scoring-endpoint";
String tenantId = "your-tenant-id";
String clientId = "your-client-id";
String clientSecret = "your-client-secret";
String resourceManagerUrl = "https://management.azure.com";
String dataToBeScored = "{ \"ExperimentName\" : \"My_Pipeline\", \"ParameterAssignments\" : { \"pipeline_arg\" : \"20\" }}";

HttpClient client = HttpClient.newBuilder().build();
Gson gson = new Gson();

HttpRequest tokenAuthenticationRequest = tokenAuthenticationRequest(tenantId, clientId, clientSecret, resourceManagerUrl);
Optional<String> authBody = getRequestBody(client, tokenAuthenticationRequest);
Optional<String> authKey = authBody.flatMap(body -> Optional.of(gson.fromJson(body, AuthenticationBody.class).access_token);;
Optional<HttpRequest> scoringRequest = authKey.flatMap(key -> Optional.of(scoringRequest(key, scoringUri, dataToBeScored)));
Optional<String> scoringResult = scoringRequest.flatMap(req -> getRequestBody(client, req));
// ... etc (`scoringResult.orElse()`) ... 

static HttpRequest tokenAuthenticationRequest(String tenantId, String clientId, String clientSecret, String resourceManagerUrl)
{
    String authUrl = String.format("https://login.microsoftonline.com/%s/oauth2/token", tenantId);
    String clientIdParam = String.format("client_id=%s", clientId);
    String resourceParam = String.format("resource=%s", resourceManagerUrl);
    String clientSecretParam = String.format("client_secret=%s", clientSecret);

    String bodyString = String.format("grant_type=client_credentials&%s&%s&%s", clientIdParam, resourceParam, clientSecretParam);

    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(authUrl))
        .POST(HttpRequest.BodyPublishers.ofString(bodyString))
        .build();
    return request;
}

static HttpRequest scoringRequest(String authKey, String scoringUri, String dataToBeScored)
{
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(scoringUri))
        .header("Authorization", String.format("Token %s", authKey))
        .POST(HttpRequest.BodyPublishers.ofString(dataToBeScored))
        .build();
    return request;

}

static Optional<String> getRequestBody(HttpClient client, HttpRequest request) {
    try {
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        if (response.statusCode() != 200) {
            System.out.println(String.format("Unexpected server response %d", response.statusCode()));
            return Optional.empty();
        }
        return Optional.of(response.body());
    }catch(Exception x)
    {
        System.out.println(x.toString());
        return Optional.empty();
    }
}

class AuthenticationBody {
    String access_token;
    String token_type;
    int expires_in;
    String scope;
    String refresh_token;
    String id_token;
    
    AuthenticationBody() {}
}

Veri kümelerini ve veri yollarını yeniden eğitmeden değiştirme

Farklı veri kümeleri ve veri yolları üzerinde eğitmek ve çıkarım yapmak isteyebilirsiniz. Örneğin, daha küçük bir veri kümesi üzerinde eğitmek ancak veri kümesinin tamamında çıkarım yapmak isteyebilirsiniz. İsteğin DataSetDefinitionValueAssignmentsjson bağımsız değişkenindeki anahtarla veri kümelerini değiştirirsiniz. ile DataPathAssignmentsveri yolları arasında geçiş yapabilirsiniz. Her ikisi için de teknik benzerdir:

  1. İşlem hattı tanımı betiğinizde veri kümesi için bir PipelineParameter oluşturun. içinden veya DatasetConsumptionConfigDataPathPipelineParameteroluşturun:

    tabular_dataset = Dataset.Tabular.from_delimited_files('https://dprepdata.blob.core.windows.net/demo/Titanic.csv')
    tabular_pipeline_param = PipelineParameter(name="tabular_ds_param", default_value=tabular_dataset)
    tabular_ds_consumption = DatasetConsumptionConfig("tabular_dataset", tabular_pipeline_param)
    
  2. ML betiğinizde, kullanarak Run.get_context().input_datasetsdinamik olarak belirtilen veri kümesine erişin:

    from azureml.core import Run
    
    input_tabular_ds = Run.get_context().input_datasets['tabular_dataset']
    dataframe = input_tabular_ds.to_pandas_dataframe()
    # ... etc ...
    

    ML betiğinin () için belirtilen değere eriştiğine DatasetConsumptionConfig ve (tabular_datasettabular_ds_param) değerine eriştiğine PipelineParameter dikkat edin.

  3. İşlem hattı tanımı betiğinizde parametresini PipelineScriptStepolarak ayarlayınDatasetConsumptionConfig:

    train_step = PythonScriptStep(
        name="train_step",
        script_name="train_with_dataset.py",
        arguments=["--param1", tabular_ds_consumption],
        inputs=[tabular_ds_consumption],
        compute_target=compute_target,
        source_directory=source_directory)
    
    pipeline = Pipeline(workspace=ws, steps=[train_step])
    
  4. Çıkarsanan REST çağrınızda veri kümelerini dinamik olarak değiştirmek için kullanın DataSetDefinitionValueAssignments:

    tabular_ds1 = Dataset.Tabular.from_delimited_files('path_to_training_dataset')
    tabular_ds2 = Dataset.Tabular.from_delimited_files('path_to_inference_dataset')
    ds1_id = tabular_ds1.id
    d22_id = tabular_ds2.id
    
    response = requests.post(rest_endpoint, 
                             headers=aad_token, 
                             json={
                                "ExperimentName": "MyRestPipeline",
                               "DataSetDefinitionValueAssignments": {
                                    "tabular_ds_param": {
                                        "SavedDataSetReference": {"Id": ds1_id #or ds2_id
                                    }}}})
    

Showcasing Dataset ve PipelineParameter ile Showcasing DataPath ve PipelineParameter not defterlerinde bu tekniğin tam örnekleri bulunur.

Sürümlenmiş işlem hattı uç noktası oluşturma

Arkasında birden çok yayımlanmış işlem hattı bulunan bir İşlem Hattı Uç Noktası oluşturabilirsiniz. Bu teknik, ML işlem hatlarınızı yineleyip güncelleştirdikçe sabit bir REST uç noktası sağlar.

from azureml.pipeline.core import PipelineEndpoint

published_pipeline = PublishedPipeline.get(workspace=ws, id="My_Published_Pipeline_id")
pipeline_endpoint = PipelineEndpoint.publish(workspace=ws, name="PipelineEndpointTest",
                                            pipeline=published_pipeline, description="Test description Notebook")

İşlem hattı uç noktasına iş gönderme

bir işi bir işlem hattı uç noktasının varsayılan sürümüne gönderebilirsiniz:

pipeline_endpoint_by_name = PipelineEndpoint.get(workspace=ws, name="PipelineEndpointTest")
run_id = pipeline_endpoint_by_name.submit("PipelineEndpointExperiment")
print(run_id)

Ayrıca işi belirli bir sürüme de gönderebilirsiniz:

run_id = pipeline_endpoint_by_name.submit("PipelineEndpointExperiment", pipeline_version="0")
print(run_id)

Rest API kullanılarak da aynı şey gerçekleştirilebilir:

rest_endpoint = pipeline_endpoint_by_name.endpoint
response = requests.post(rest_endpoint, 
                         headers=aad_token, 
                         json={"ExperimentName": "PipelineEndpointExperiment",
                               "RunSource": "API",
                               "ParameterAssignments": {"1": "united", "2":"city"}})

Stüdyoda yayımlanan işlem hatlarını kullanma

Yayımlanmış bir işlem hattını stüdyodan da çalıştırabilirsiniz:

  1. Azure Machine Learning stüdyosu oturum açın.

  2. Çalışma alanınızı görüntüleyin.

  3. Sol tarafta Uç Noktalar'ı seçin.

  4. Üst kısımda İşlem hattı uç noktaları'nı seçin. makine öğrenmesi tarafından yayımlanan işlem hatlarının listesi

  5. İşlem hattı uç noktasının önceki çalıştırmalarının sonuçlarını çalıştırmak, kullanmak veya gözden geçirmek için belirli bir işlem hattı seçin.

Yayımlanan işlem hattını devre dışı bırakma

Bir işlem hattını yayımlanan işlem hatları listenizden gizlemek için, stüdyoda veya SDK'dan devre dışı bırakırsınız:

# Get the pipeline by using its ID from Azure Machine Learning studio
p = PublishedPipeline.get(ws, id="068f4885-7088-424b-8ce2-eeb9ba5381a6")
p.disable()

ile p.enable()yeniden etkinleştirebilirsiniz. Daha fazla bilgi için bkz . PublishedPipeline sınıf başvurusu.

Sonraki adımlar