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
Tüm işlem hattı kaynaklarınızı barındıracak bir Azure Machine Learning çalışma alanı oluşturma
Geliştirme ortamınızı Azure Machine Learning SDK'sını yükleyecek şekilde yapılandırın veya SDK zaten yüklü bir Azure Machine Learning işlem örneği kullanın
Aşağıdaki Öğretici: Toplu puanlama için Azure Machine Learning işlem hattı oluşturma gibi bir makine öğrenmesi işlem hattı oluşturun ve çalıştırın. Diğer seçenekler için bkz . Azure Machine Learning SDK'sı ile makine öğrenmesi işlem hatları oluşturma ve çalıştırma
İş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.
İş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)
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)
Ç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")
İş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ı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ş Optional
bir 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 DataSetDefinitionValueAssignments
json
bağımsız değişkenindeki anahtarla veri kümelerini değiştirirsiniz. ile DataPathAssignments
veri yolları arasında geçiş yapabilirsiniz. Her ikisi için de teknik benzerdir:
İşlem hattı tanımı betiğinizde veri kümesi için bir
PipelineParameter
oluşturun. içinden veyaDatasetConsumptionConfig
DataPath
PipelineParameter
oluş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)
ML betiğinizde, kullanarak
Run.get_context().input_datasets
dinamik 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_dataset
tabular_ds_param
) değerine eriştiğinePipelineParameter
dikkat edin.İşlem hattı tanımı betiğinizde parametresini
PipelineScriptStep
olarak 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])
Çı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:
Azure Machine Learning stüdyosu oturum açın.
Çalışma alanınızı görüntüleyin.
Sol tarafta Uç Noktalar'ı seçin.
Üst kısımda İşlem hattı uç noktaları'nı seçin.
İş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
- Makine öğrenmesi işlem hatlarını daha fazla keşfetmek için GitHub'da bu Jupyter not defterlerini kullanın.
- azureml-pipelines-core paketi ve azureml-pipelines-steps paketi için SDK başvuru yardımına bakın.
- İşlem hatlarında hata ayıklama ve sorun giderme hakkında ipuçları için nasıl yapılır bölümüne bakın.