CLI ile modelleri eğitma (v2)

ŞUNLAR IÇIN GEÇERLIDIR:Azure CLI ml uzantısı v2 (geçerli)

Azure Machine Learning CLI (v2), azure işlemde ölçeği artırıp genişletirken model yaşam döngüsünün izlenebilmesini ve denetlenebilmesini sağlarken model eğitim sürecini hızlandırmanızı sağlayan bir Azure CLI uzantısıdır.

Makine öğrenmesi modelini eğitmak genellikle yinelemeli bir işlemdir. Modern araçlar, daha büyük modelleri daha hızlı bir şekilde eğitmek için her zamankinden daha kolay hale getirir. Hiper parametre ayarlama ve hatta algoritma seçimi gibi daha önce yorucu el ile gerçekleştirilen işlemler genellikle otomatiktir. Azure Machine Learning CLI (v2) ile işlerinizi (ve modellerinizi) hiper parametre süpürmeleriyle bir çalışma alanında izleyebilir, yüksek performanslı Azure işlem ölçeğini artırabilir ve dağıtılmış eğitimi kullanarak ölçeği genişletebilirsiniz.

Önkoşullar

İpucu

şema doğrulaması ve iş YAME'leri için otomatik tamamlama ile tam özellikli bir geliştirme ortamı için Visual Studio Code ve Azure Machine Learning uzantısını kullanın.

Örnekleri kopyalama deposu

Eğitim örneklerini çalıştırmak için önce örnek deposunu kopyalayın ve dizinine cli geçin:

git clone --depth 1 https://github.com/Azure/azureml-examples
cd azureml-examples/cli

Kopyaları kullanarak --depth 1 yalnızca depoya yapılan en son işlemeyi kullanarak işlemi tamamlama süresini kısaltabilirsiniz.

İşlem oluşturma

Komut satırından bir Azure Machine Learning işlem kümesi oluşturabilirsiniz. Örneğin, aşağıdaki komutlar adlı bir küme ve adlı cpu-clustergpu-clusterbir küme oluşturur.


az ml compute create -n cpu-cluster --type amlcompute --min-instances 0 --max-instances 8

az ml compute create -n gpu-cluster --type amlcompute --min-instances 0 --max-instances 4 --size Standard_NC12

Bu noktada cpu-cluster işlem için sizden ücret alınmaz ve gpu-cluster bir iş gönderilene kadar sıfır düğümde kalırsınız. AmlCompute maliyetini yönetme ve iyileştirme hakkında daha fazla bilgi edinin.

Bu makaledeki aşağıdaki örnek işler veya gpu-cluster'lerinden cpu-cluster birini kullanır. Bu makaledeki örnek işlerde bu adları kümelerinizin adıyla gerektiği şekilde ayarlayın. İşlem oluşturma seçenekleri hakkında daha fazla ayrıntı için kullanın az ml compute create -h .

Merhaba dünya

Azure Machine Learning CLI (v2) için işler YAML biçiminde yazılır. İş toplamları:

  • Çalıştırılacaklar
  • Nasıl çalıştırılır?
  • Nerede çalıştırılır?

"Merhaba dünya" işinin üçü de vardır:

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: echo "hello world"
environment:
  image: library/python:latest
compute: azureml:cpu-cluster

Uyarı

Python, işler için kullanılan ortama yüklenmelidir. Gerekirse yüklemek için Dockerfile'ınızı çalıştırın apt-get update -y && apt-get install python3 -y veya Python'ın zaten yüklü olduğu bir temel görüntüden türetin.

İpucu

Tüm $schema: örnekler, Azure Machine Learning uzantısıyla VSCode'da YAML dosyaları yazarken şema doğrulamasına ve otomatik tamamlamaya olanak tanır.

Çalıştırabileceğiniz:

az ml job create -f jobs/basics/hello-world.yml --web

İpucu

parametresi, --web varsayılan web tarayıcınızı kullanarak Azure Machine Learning studio'da işinizi açmaya çalışır. --stream parametresi, konsola günlük akışı yapmak ve diğer komutları engellemek için kullanılabilir.

Oluşturma veya güncelleştirmede değerleri geçersiz kılma

YAML iş belirtimi değerleri, iş oluşturulurken veya güncelleştirilirken kullanılarak --set geçersiz kılınabilir. Örneğin:

az ml job create -f jobs/basics/hello-world.yml \
  --set environment.image="python:3.8" \
  --web

İş adları

ve dışındaki create komutların çoğuaz ml job, stüdyoda bir işin adı veya "Çalıştırma Kimliği" olan öğesini gerektirir--name/-n.list Çalışma alanı başına benzersiz olması gerektiğinden name , genellikle oluşturma sırasında işin özelliğini doğrudan ayarlamamalısınız. Azure Machine Learning, CLI'da iş oluşturma çıkışından veya studio ve MLflow API'lerindeki "Run ID" özelliğini kopyalayarak elde edilebilen ayarlanmamışsa iş adı için rastgele bir GUID oluşturur.

Betiklerdeki ve CI/CD akışlarındaki işleri otomatikleştirmek için, ekleyerek --query name -o tsvçıkışı sorgulayıp çıkararak bir işin adını oluşturulduğunda yakalayabilirsiniz. Ayrıntılar kabuğa göre değişir, ancak Bash için:

run_id=$(az ml job create -f jobs/basics/hello-world.yml --query name -o tsv)

Ardından , showveya streamgibi updatesonraki komutlarda kullanın$run_id:

az ml job show -n $run_id --web

İşleri düzenleme

İşleri düzenlemek için bir görünen ad, deneme adı, açıklama ve etiketler ayarlayabilirsiniz. Açıklamalar, stüdyoda markdown söz dizimini destekler. Bu özellikler bir iş oluşturulduktan sonra değiştirilebilir. Tam bir örnek:

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: echo "hello world"
environment:
  image: library/python:latest
compute: azureml:cpu-cluster
tags:
  hello: world
display_name: hello-world-example
experiment_name: hello-world-example
description: |
  # Azure Machine Learning "hello world" job

  This is a "hello world" job running in the cloud via Azure Machine Learning!

  ## Description

  Markdown is supported in the studio for job descriptions! You can edit the description there or via CLI.

Bu işi çalıştırabilirsiniz; burada bu özellikler stüdyoda hemen görünür hale gelir:

az ml job create -f jobs/basics/hello-world-org.yml --web

kullanarak --set iş oluşturulduktan sonra değiştirilebilir değerleri güncelleştirebilirsiniz:

az ml job update -n $run_id --set \
  display_name="updated display name" \
  experiment_name="updated experiment name" \
  description="updated description"  \
  tags.hello="updated tag"

Ortam değişkenleri

İşinizde kullanılacak ortam değişkenlerini ayarlayabilirsiniz:

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: echo $hello_env_var
environment:
  image: library/python:latest
compute: azureml:cpu-cluster
environment_variables:
  hello_env_var: "hello world"

Bu işi çalıştırabilirsiniz:

az ml job create -f jobs/basics/hello-world-env-var.yml --web

Uyarı

içindeki bağımsız değişkenleri commandparametreleştirmek için kullanmanız inputs gerekir. Girişlere ve çıkışlara bakın.

Modelleri ve kaynak kodunu izleme

Üretim makine öğrenmesi modellerinin denetlenebilir olması gerekir (yeniden üretilmiyorsa). Belirli bir modelin kaynak kodunu izlemek çok önemlidir. Azure Machine Learning, kaynak kodunuzun anlık görüntüsünü alır ve iş kapsamında tutar. Ayrıca, git deposundan iş çalıştırıyorsanız kaynak depo ve işleme izlenir.

İpucu

Örnek deposunu takip edip çalıştırıyorsanız, şu ana kadar çalıştırılan işlerden herhangi birinde kaynak depoyu ve işlemeyi stüdyoda görebilirsiniz.

Bir işteki alanı, kaynak kod dizinine giden yol olarak değeriyle belirtebilirsiniz code . dizinin anlık görüntüsü alınır ve iş ile birlikte karşıya yüklenir. Dizinin içeriği doğrudan işin çalışma dizininden kullanılabilir.

Uyarı

Kaynak kod, model eğitimi için büyük veri girişleri içermemelidir. Bunun yerine veri girişlerini kullanın. Dosyaları anlık görüntünün dışında tutmak için kaynak kod dizinindeki bir .gitignore dosyayı kullanabilirsiniz. Anlık görüntü boyutu sınırları 300 MB veya 2000 dosyadır.

Şimdi kodu belirten bir işe bakalım:

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: python hello-mlflow.py
code: src
environment: azureml:AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest
compute: azureml:cpu-cluster

Python betiği yerel kaynak kodu dizinindedir. Komut daha sonra betiği çalıştırmak için çağrır python . Aynı desen diğer programlama dilleri için de uygulanabilir.

Uyarı

Bu makalede gösterilen "merhaba" iş ailesi tanıtım amaçlıdır ve önerilen en iyi yöntemleri izlemesi gerekmez. && Bir dizide çok sayıda komut çalıştırmak için veya benzer bir komut kullanılması önerilmez. Bunun yerine, komutlarını kaynak kod dizinindeki bir betik dosyasına yazmayı ve betiği içinde commandçağırmayı göz önünde bulundurun. üzerinde bağımlılıkların command, üzerinden pip installgösterildiği gibi yüklenmesi önerilmez; bunun yerine tüm iş bağımlılıkları ortamınızın bir parçası olarak belirtilmelidir. Ayrıntılar için bkz. CLI (v2) ile ortamları yönetme .

MLflow ile model izleme

Modellerde yineleme yaparken, veri bilimciler model parametrelerini ve eğitim ölçümlerini takip edebilmektedir. Azure Machine Learning, bir işe modellerin, yapıtların, ölçümlerin ve parametrelerin günlüğe kaydedilmesini sağlamak için MLflow izlemesiyle tümleşir. Python betiklerinizde MLflow'u kullanmak için eğitim kodunuza ekleyin import mlflow ve api'leri veya mlflow.autolog() API'leri arayınmlflow.log_*.

Uyarı

mlflow MLflow izleme özellikleri için ve azureml-mlflow paketleri Python ortamınıza yüklenmelidir.

İpucu

Çağrı mlflow.autolog() birçok popüler çerçeve için desteklenir ve günlüğün çoğunluğunu sizin için halleder.

Şimdi yukarıdaki işte çağrılan ve bir parametreyi, ölçümü ve yapıtı günlüğe kaydetmek için kullanılan mlflow Python betiğine göz atalım:

# imports
import os
import mlflow

from random import random

# define functions
def main():
    mlflow.log_param("hello_param", "world")
    mlflow.log_metric("hello_metric", random())
    os.system(f"echo 'hello world' > helloworld.txt")
    mlflow.log_artifact("helloworld.txt")


# run functions
if __name__ == "__main__":
    # run main function
    main()

Bu işi, izlendiği ve denetlenebileceği Azure Machine Learning aracılığıyla bulutta çalıştırabilirsiniz:

az ml job create -f jobs/basics/hello-mlflow.yml --web

MLflow ile ölçümleri sorgulama

İşleri çalıştırdıktan sonra, işlerin çalıştırma sonuçlarını ve günlüğe kaydedilen ölçümlerini sorgulamak isteyebilirsiniz. Python bu görev için CLI'dan daha uygundur. Çalıştırmaları ve ölçümlerini mlflow aracılığıyla sorgulayabilir ve analiz için Pandas veri çerçeveleri gibi tanıdık nesnelere yükleyebilirsiniz.

İlk olarak Azure Machine Learning çalışma alanınız için MLflow izleme URI'sini alın:

az ml workspace show --query mlflow_tracking_uri -o tsv

MLflow içeri aktarılmış bir Python ortamından içinde bu komutun mlflow.set_tracking_uri(<YOUR_TRACKING_URI>) çıkışını kullanın. MLflow çağrıları artık Azure Machine Learning çalışma alanınızdaki işlere karşılık gelir.

Girişler ve çıkışlar

İşler genellikle giriş ve çıkışlara sahiptir. Girişler, hiper parametre iyileştirmesi için süpürülebilen model parametreleri veya işlem hedefine bağlanan veya indirilen bulut veri girişleri olabilir. Çıkışlar (ölçümleri yoksayma), varsayılan çıkışlara veya adlandırılmış bir veri çıkışına yazılabilen veya kopyalanabilen yapıtlardır.

Değişmez değer girişleri

Değişmez değer girişleri doğrudan komutunda çözümlenir. "Merhaba dünya" işimizi değişmez değerleri kullanacak şekilde değiştirebilirsiniz:

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: |
  echo ${{inputs.hello_string}}
  echo ${{inputs.hello_number}}
environment:
  image: library/python:latest
inputs:
  hello_string: "hello world"
  hello_number: 42
compute: azureml:cpu-cluster

Bu işi çalıştırabilirsiniz:

az ml job create -f jobs/basics/hello-world-input.yml --web

Girişleri geçersiz kılmak için kullanabilirsiniz --set :

az ml job create -f jobs/basics/hello-world-input.yml --set \
  inputs.hello_string="hello there" \
  inputs.hello_number=24 \
  --web

İşlere değişmez değer girişleri, model eğitimine yönelik hiper parametre taramaları için arama alanı girişlerine dönüştürülebilir .

Arama alanı girişleri

Süpürme işi için, seçilecek değişmez değer girişleri için bir arama alanı belirtebilirsiniz. Arama alanı girişleri için tüm seçenekler için süpürme işi YAML söz dizimi başvurusuna bakın.

Şimdi kavramı bağımsız değişkenleri alan ve rastgele bir ölçümü günlüğe kaydeden basit bir Python betiğiyle gösterelim:

# imports
import os
import mlflow
import argparse

from random import random

# define functions
def main(args):
    # print inputs
    print(f"A: {args.A}")
    print(f"B: {args.B}")
    print(f"C: {args.C}")

    # log inputs as parameters
    mlflow.log_param("A", args.A)
    mlflow.log_param("B", args.B)
    mlflow.log_param("C", args.C)

    # log a random metric
    mlflow.log_metric("random_metric", random())


def parse_args():
    # setup arg parser
    parser = argparse.ArgumentParser()

    # add arguments
    parser.add_argument("--A", type=float, default=0.5)
    parser.add_argument("--B", type=str, default="hello world")
    parser.add_argument("--C", type=float, default=1.0)

    # parse args
    args = parser.parse_args()

    # return args
    return args


# run script
if __name__ == "__main__":
    # parse args
    args = parse_args()

    # run main function
    main(args)

Buna karşılık gelen bir süpürme işi oluşturun:

$schema: https://azuremlschemas.azureedge.net/latest/sweepJob.schema.json
type: sweep
trial:
  command: >-
    python hello-sweep.py
    --A ${{inputs.A}}
    --B ${{search_space.B}}
    --C ${{search_space.C}}
  code: src
  environment: azureml:AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest
inputs:
  A: 0.5
compute: azureml:cpu-cluster
sampling_algorithm: random
search_space:
  B:
    type: choice
    values: ["hello", "world", "hello_world"]
  C:
    type: uniform
    min_value: 0.1
    max_value: 1.0
objective:
  goal: minimize
  primary_metric: random_metric
limits:
  max_total_trials: 4
  max_concurrent_trials: 2
  timeout: 3600
display_name: hello-sweep-example
experiment_name: hello-sweep-example
description: Hello sweep job example.

Ve çalıştırın:

az ml job create -f jobs/basics/hello-sweep.yml --web

Veri girişleri

Veri girişleri, iş işleminin yerel dosya sistemindeki bir yola çözümlenir. şimdi adresinde genel olarak bir blob kapsayıcısında https://azuremlexamples.blob.core.windows.net/datasets/iris.csvbarındırılan klasik Iris veri kümesiyle gösterelim.

Iris CSV dosyasının yolunu bağımsız değişken olarak alan, bir veri çerçevesine okuyan, ilk 5 satırı yazdıran ve dizine outputs kaydeden bir Python betiği yazabilirsiniz.

# imports
import os
import argparse

import pandas as pd

# define functions
def main(args):
    # read in data
    df = pd.read_csv(args.iris_csv)

    # print first 5 lines
    print(df.head())

    # ensure outputs directory exists
    os.makedirs("outputs", exist_ok=True)

    # save data to outputs
    df.to_csv("outputs/iris.csv", index=False)


def parse_args():
    # setup arg parser
    parser = argparse.ArgumentParser()

    # add arguments
    parser.add_argument("--iris-csv", type=str)

    # parse args
    args = parser.parse_args()

    # return args
    return args


# run script
if __name__ == "__main__":
    # parse args
    args = parse_args()

    # run main function
    main(args)

Verileri yerel dosya sistemine bağlayacak veya indirecek Azure depolama URI girişleri belirtilebilir. Tek bir dosya belirtebilirsiniz:

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: |
  echo "--iris-csv: ${{inputs.iris_csv}}"
  python hello-iris.py --iris-csv ${{inputs.iris_csv}}
code: src
inputs:
  iris_csv:
    type: uri_file 
    path: https://azuremlexamples.blob.core.windows.net/datasets/iris.csv
environment: azureml:AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest
compute: azureml:cpu-cluster

Ve çalıştırın:

az ml job create -f jobs/basics/hello-iris-file.yml --web

Veya klasörün tamamını belirtin:

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: |
  ls ${{inputs.data_dir}}
  echo "--iris-csv: ${{inputs.data_dir}}/iris.csv"
  python hello-iris.py --iris-csv ${{inputs.data_dir}}/iris.csv
code: src
inputs:
  data_dir:
    type: uri_folder 
    path: wasbs://datasets@azuremlexamples.blob.core.windows.net/
environment: azureml:AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest
compute: azureml:cpu-cluster

Ve çalıştırın:

az ml job create -f jobs/basics/hello-iris-folder.yml --web

Verinin type tek bir dosyaya veya type: uri_folder klasöre işaret edip etmediğine type: uri_file karşılık gelen giriş alanını doğru belirttiğinizden emin olun. Alan atlanırsa varsayılan type değer olur uri_folder.

Özel veriler

Bir veri deposu aracılığıyla Azure Machine Learning'e bağlı Azure Blob Depolama veya Azure Data Lake Storage'daki özel veriler için giriş verileri biçimindeki azureml://datastores/<DATASTORE_NAME>/paths/<PATH_TO_DATA> Azure Machine Learning URI'lerini kullanabilirsiniz. Örneğin, Iris CSV dosyasını adlı veri deposuna workspaceblobstore karşılık gelen Blob kapsayıcısında adlı /example-data/ bir dizine yüklerseniz, önceki bir işi veri deposundaki dosyayı kullanacak şekilde değiştirebilirsiniz:

Uyarı

Iris CSV'sini içinde workspaceblobstoreaynı konuma kopyalamadıysanız bu işleri çalıştırmak sizin için başarısız olur.

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: |
  echo "--iris-csv: ${{inputs.iris_csv}}"
  python hello-iris.py --iris-csv ${{inputs.iris_csv}}
code: src
inputs:
  iris_csv:
    type: uri_file 
    path: azureml://datastores/workspaceblobstore/paths/example-data/iris.csv
environment: azureml:AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest
compute: azureml:cpu-cluster

Veya dizinin tamamı:

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: |
  ls ${{inputs.data_dir}}
  echo "--iris-csv: ${{inputs.data_dir}}/iris.csv"
  python hello-iris.py --iris-csv ${{inputs.data_dir}}/iris.csv
code: src
inputs:
  data_dir:
    type: uri_folder 
    path: azureml://datastores/workspaceblobstore/paths/example-data/
environment: azureml:AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest
compute: azureml:cpu-cluster

Varsayılan çıkışlar

./outputs ve ./logs dizinleri, Azure Machine Learning tarafından özel muamele alır. İşiniz sırasında bu dizinlere herhangi bir dosya yazarsanız, iş tamamlandıktan sonra bunlara erişmeye devam edebilmeniz için bu dosyalar işe yüklenir. Klasör ./outputs işin sonunda karşıya yüklenirken, klasörüne yazılan ./logs dosyalar gerçek zamanlı olarak karşıya yüklenir. İş sırasında günlük akışı yapmak istiyorsanız tensorboard günlükleri gibi ikincisini kullanın.

Ayrıca, otomatik kaydetme veya mlflow.log_* yapıt günlüğü için MLflow'dan günlüğe kaydedilen tüm dosyalar da otomatik olarak kalıcı hale getirilecektir. Yukarıda belirtilenler ve ./logs dizinlerle ./outputs birlikte, bu dosya ve dizin kümesi bu işin varsayılan yapıt konumuna karşılık gelen bir dizinde kalıcı hale gelir.

"hello world" işini, dosyasına yazdırmak yerine varsayılan outputs dizinindeki bir dosyaya çıkış olarak stdoutdeğiştirebilirsiniz:

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: echo "hello world" > ./outputs/helloworld.txt
environment:
  image: library/python:latest
compute: azureml:cpu-cluster

Bu işi çalıştırabilirsiniz:

az ml job create -f jobs/basics/hello-world-output.yml --web

Ve dizininde <RUN_ID>/outputs/ bulunacağı günlükleri helloworld.txt indirin:

az ml job download -n $run_id

Veri çıkışları

Adlandırılmış veri çıkışları belirtebilirsiniz. Bu, varsayılan veri deposunda varsayılan olarak okunacak/yazılacak bir dizin oluşturur.

Adlandırılmış bir veri çıkışına yazmak için önceki "merhaba dünya" işini değiştirebilirsiniz:

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: echo "hello world" > ${{outputs.hello_output}}/helloworld.txt
outputs:
  hello_output:
environment:
  image: python
compute: azureml:cpu-cluster

Hello işlem hatları

İşlem hattı işleri birden çok işi paralel veya sıralı olarak çalıştırabilir. İşlem hattındaki adımlar arasında giriş/çıkış bağımlılıkları varsa, bağımlı adım diğer adım tamamlandıktan sonra çalıştırılır.

Bir "merhaba dünya" işini iki işe bölebilirsiniz:

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
display_name: hello_pipeline
jobs:
  hello_job:
    command: echo "hello"
    environment: azureml:AzureML-sklearn-0.24-ubuntu18.04-py37-cpu@latest
    compute: azureml:cpu-cluster
  world_job:
    command: echo "world"
    environment: azureml:AzureML-sklearn-0.24-ubuntu18.04-py37-cpu@latest
    compute: azureml:cpu-cluster

Ve çalıştırın:

az ml job create -f jobs/basics/hello-pipeline.yml --web

İşlem hedefi bunu yapmak için kullanılabilir kaynaklara sahipse sırasıyla "merhaba" ve "dünya" işleri paralel olarak çalıştırılır.

İşlem hattındaki adımlar arasında veri geçirmek için, "hello" işinde bir veri çıkışı ve öncekinin çıktısına başvuran "world" işinde buna karşılık gelen bir giriş tanımlayın:

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
display_name: hello_pipeline_io
jobs:
  hello_job:
    command: echo "hello" && echo "world" > ${{outputs.world_output}}/world.txt
    environment: azureml:AzureML-sklearn-0.24-ubuntu18.04-py37-cpu@latest
    compute: azureml:cpu-cluster
    outputs:
      world_output:
  world_job:
    command: cat ${{inputs.world_input}}/world.txt
    environment: azureml:AzureML-sklearn-0.24-ubuntu18.04-py37-cpu:23
    compute: azureml:cpu-cluster
    inputs:
      world_input: ${{parent.jobs.hello_job.outputs.world_output}}

Ve çalıştırın:

az ml job create -f jobs/basics/hello-pipeline-io.yml --web

Bu kez, "merhaba" işi tamamlandıktan sonra "dünya" işi çalıştırılır.

Bir işlem hattındaki işler arasında ortak ayarların çoğaltılmasını önlemek için bunları işlerin dışında ayarlayabilirsiniz:

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
display_name: hello_pipeline_settings

settings:
  default_datestore: azureml:workspaceblobstore
  default_compute: azureml:cpu-cluster
jobs:
  hello_job:
    command: echo 202204190 & echo "hello"
    environment: azureml:AzureML-sklearn-0.24-ubuntu18.04-py37-cpu:23
  world_job:
    command: echo 202204190 & echo "hello"
    environment: azureml:AzureML-sklearn-0.24-ubuntu18.04-py37-cpu:23

Şunu çalıştırabilirsiniz:

az ml job create -f jobs/basics/hello-pipeline-settings.yml --web

Tek bir işteki ilgili ayar, işlem hattı işinin ortak ayarlarını geçersiz kılar. Şimdiye kadarki kavramlar , "A", "B" ve "C" işleriyle üç adımlı bir işlem hattı işi olarak birleştirilebilir. "C" işinin "B" işine bir veri bağımlılığı vardır, ancak "A" işi bağımsız olarak çalıştırılabilir. "A" işi ayrıca ayrı ayrı ayarlanmış bir ortam kullanır ve girişlerinden birini en üst düzey işlem hattı işi girişine bağlar:

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
display_name: hello_pipeline_abc
compute: azureml:cpu-cluster
  
inputs:
  hello_string_top_level_input: "hello world"
jobs:
  a:
    command: echo hello ${{inputs.hello_string}}
    environment: azureml:AzureML-sklearn-0.24-ubuntu18.04-py37-cpu@latest
    inputs:
      hello_string: ${{parent.inputs.hello_string_top_level_input}}
  b:
    command: echo "world" >> ${{outputs.world_output}}/world.txt
    environment: azureml:AzureML-sklearn-0.24-ubuntu18.04-py37-cpu@latest
    outputs:
      world_output:
  c:
    command: echo ${{inputs.world_input}}/world.txt
    environment: azureml:AzureML-sklearn-0.24-ubuntu18.04-py37-cpu@latest
    inputs:
      world_input: ${{parent.jobs.b.outputs.world_output}}

Şunu çalıştırabilirsiniz:

az ml job create -f jobs/basics/hello-pipeline-abc.yml --web

Modeli eğitme

Azure Machine Learning'de bir modeli eğitmek için kullanabileceğiniz iki yöntem vardır:

  1. Verilerinizle modelleri eğitmek ve sizin için en iyi modeli elde etmek için otomatik ML'yi kullanabilirsiniz. Bu yaklaşım, hiper parametreleri ayarlamaya yönelik yinelemeli işlemi otomatikleştirerek ve farklı algoritmaları deneyerek üretkenliği en üst düzeye çıkarır.
  2. Modeli kendi özel eğitim betiğinizle eğitin. Bu yaklaşım en fazla denetimi sunar ve eğitiminizi özelleştirmenizi sağlar.

Otomatik ML ile model eğitin

Otomatik ML, eğitim algoritmalarının tam olarak nasıl çalıştığını bilmeniz gerekmediğinden modeli eğitmek için en kolay yoldur, ancak yalnızca eğitim/doğrulama/test veri kümelerinizi ve 'ML Görevi', 'hedef sütun', 'birincil ölçüm, 'zaman aşımı' vb. gibi bazı temel yapılandırma parametrelerini sağlamanız gerekir ve hizmet birden çok modeli eğitip sizin için çeşitli algoritmaları ve hiper parametre birleşimlerini dener.

CLI (v2) aracılığıyla otomatik ML ile eğitirken yalnızca bir oluşturmanız gerekir. AutoML yapılandırmasına sahip YAML dosyası ve bunu eğitim işi oluşturma ve gönderme için CLI'ya sağlayın.

Aşağıdaki örnekte sınıflandırma modelini eğiten bir AutoML yapılandırma dosyası gösterilmektedir.

  • Birincil ölçüm şu şekildedir: accuracy
  • Eğitimin süresi 180 dakikadır
  • Eğitim verileri "./training-mltable-folder" klasöründedir. Otomatik ML işleri yalnızca biçimindeki MLTableverileri kabul etti.
$schema: https://azuremlsdk2.blob.core.windows.net/preview/0.0.1/autoMLJob.schema.json
type: automl

experiment_name: dpv2-cli-automl-classifier-experiment
# name: dpv2-cli-classifier-train-job-basic-01
description: A Classification job using bank marketing

compute: azureml:cpu-cluster

task: classification
primary_metric: accuracy

target_column_name: "y"
training_data:
  path: "./training-mltable-folder"
  type: mltable

limits:
  timeout_minutes: 180
  max_trials: 40
  enable_early_termination: true

featurization:
  mode: auto

MLTable tanımından bahsedilen, eğitim veri dosyasına işaret eden şeydir; bu durumda otomatik olarak karşıya yüklenecek yerel bir .csv dosyasıdır:

paths:
  - file: ./bank_marketing_train_data.csv
transformations:
  - read_delimited:
        delimiter: ','
        encoding: 'ascii'

Son olarak, bu CLI komutuyla çalıştırabilirsiniz (AutoML işini oluşturabilirsiniz):

/> az ml job create --file ./hello-automl-job-basic.yml 

Veya varsayılan çalışma alanını kullanmak yerine açıkça çalışma alanı kimlikleri sağlıyorsanız aşağıdaki gibi:

/> az ml job create --file ./hello-automl-job-basic.yml --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]

Regresyon, zaman serisi tahmini, görüntü sınıflandırması, nesne algılama, NLP metin sınıflandırması vb. gibi diğer ML görevlerini kullanarak ek AutoML modeli eğitim örneklerini araştırmak için AutoML CLI örneklerinin tam listesine bakın.

Modeli özel betikle eğitin

Kendi özel betiğinizi kullanarak eğitim yaparken ihtiyacınız olan ilk şey python betiğidir (.py), bu nedenle Iris CSV'de bir modeli eğitmek için MLflow izlemeli bir Python betiğine kod sklearn ekleyelim:

# imports
import os
import mlflow
import argparse

import pandas as pd

from sklearn.svm import SVC
from sklearn.model_selection import train_test_split

# define functions
def main(args):
    # enable auto logging
    mlflow.autolog()

    # setup parameters
    params = {
        "C": args.C,
        "kernel": args.kernel,
        "degree": args.degree,
        "gamma": args.gamma,
        "coef0": args.coef0,
        "shrinking": args.shrinking,
        "probability": args.probability,
        "tol": args.tol,
        "cache_size": args.cache_size,
        "class_weight": args.class_weight,
        "verbose": args.verbose,
        "max_iter": args.max_iter,
        "decision_function_shape": args.decision_function_shape,
        "break_ties": args.break_ties,
        "random_state": args.random_state,
    }

    # read in data
    df = pd.read_csv(args.iris_csv)

    # process data
    X_train, X_test, y_train, y_test = process_data(df, args.random_state)

    # train model
    model = train_model(params, X_train, X_test, y_train, y_test)


def process_data(df, random_state):
    # split dataframe into X and y
    X = df.drop(["species"], axis=1)
    y = df["species"]

    # train/test split
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=random_state
    )

    # return split data
    return X_train, X_test, y_train, y_test


def train_model(params, X_train, X_test, y_train, y_test):
    # train model
    model = SVC(**params)
    model = model.fit(X_train, y_train)

    # return model
    return model


def parse_args():
    # setup arg parser
    parser = argparse.ArgumentParser()

    # add arguments
    parser.add_argument("--iris-csv", type=str)
    parser.add_argument("--C", type=float, default=1.0)
    parser.add_argument("--kernel", type=str, default="rbf")
    parser.add_argument("--degree", type=int, default=3)
    parser.add_argument("--gamma", type=str, default="scale")
    parser.add_argument("--coef0", type=float, default=0)
    parser.add_argument("--shrinking", type=bool, default=False)
    parser.add_argument("--probability", type=bool, default=False)
    parser.add_argument("--tol", type=float, default=1e-3)
    parser.add_argument("--cache_size", type=float, default=1024)
    parser.add_argument("--class_weight", type=dict, default=None)
    parser.add_argument("--verbose", type=bool, default=False)
    parser.add_argument("--max_iter", type=int, default=-1)
    parser.add_argument("--decision_function_shape", type=str, default="ovr")
    parser.add_argument("--break_ties", type=bool, default=False)
    parser.add_argument("--random_state", type=int, default=42)

    # parse args
    args = parser.parse_args()

    # return args
    return args


# run script
if __name__ == "__main__":
    # parse args
    args = parse_args()

    # run main function
    main(args)

Scikit-learn çerçevesi MLflow tarafından otomatiklolama için desteklenir, bu nedenle betikteki tek mlflow.autolog() bir çağrı tüm model parametrelerini, eğitim ölçümlerini, model yapıtlarını ve bazı ek yapıtları günlüğe kaydeder (bu durumda karışıklık matrisi görüntüsü).

Bunu bulutta çalıştırmak için iş olarak belirtin:

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
code: src
command: >-
  python main.py 
  --iris-csv ${{inputs.iris_csv}}
  --C ${{inputs.C}}
  --kernel ${{inputs.kernel}}
  --coef0 ${{inputs.coef0}}
inputs:
  iris_csv: 
    type: uri_file
    path: wasbs://datasets@azuremlexamples.blob.core.windows.net/iris.csv
  C: 0.8
  kernel: "rbf"
  coef0: 0.1
environment: azureml:AzureML-sklearn-0.24-ubuntu18.04-py37-cpu@latest
compute: azureml:cpu-cluster
display_name: sklearn-iris-example
experiment_name: sklearn-iris-example
description: Train a scikit-learn SVM on the Iris dataset.

Ve çalıştırın:

az ml job create -f jobs/single-step/scikit-learn/iris/job.yml --web

Modeli kaydetmek için çalıştırmadan model dosyalarını model kayıt defterine yükleyebilirsiniz:

az ml model create -n sklearn-iris-example -v 1 -p runs:/$run_id/model --type mlflow_model

Komut işlerini çalıştırmak için yapılandırılabilir seçeneklerin tam kümesi için bkz. komut işi YAML şema başvurusu.

Hiper parametreleri süpürme

Önceki işi hiper parametreleri süpürecek şekilde değiştirebilirsiniz:

$schema: https://azuremlschemas.azureedge.net/latest/sweepJob.schema.json
type: sweep
trial:
  code: src
  command: >-
    python main.py 
    --iris-csv ${{inputs.iris_csv}}
    --C ${{search_space.C}}
    --kernel ${{search_space.kernel}}
    --coef0 ${{search_space.coef0}}
  environment: azureml:AzureML-sklearn-0.24-ubuntu18.04-py37-cpu@latest
inputs:
  iris_csv: 
    type: uri_file
    path: wasbs://datasets@azuremlexamples.blob.core.windows.net/iris.csv
compute: azureml:cpu-cluster
sampling_algorithm: random
search_space:
  C:
    type: uniform
    min_value: 0.5
    max_value: 0.9
  kernel:
    type: choice
    values: ["rbf", "linear", "poly"]
  coef0:
    type: uniform
    min_value: 0.1
    max_value: 1
objective:
  goal: minimize
  primary_metric: training_f1_score
limits:
  max_total_trials: 20
  max_concurrent_trials: 10
  timeout: 7200
display_name: sklearn-iris-sweep-example
experiment_name: sklearn-iris-sweep-example
description: Sweep hyperparemeters for training a scikit-learn SVM on the Iris dataset.

Ve çalıştırın:

az ml job create -f jobs/single-step/scikit-learn/iris/job-sweep.yml --web

İpucu

İlerleme durumunu izlemek ve parametre grafiklerini görüntülemek için stüdyodaki "Alt çalıştırmalar" sekmesini denetleyin..

Süpürme işleri için yapılandırılabilir seçeneklerin tamamı için süpürme işi YAML şema başvurusuna bakın.

Dağıtılmış eğitim

Azure Machine Learning PyTorch, TensorFlow ve MPI tabanlı dağıtılmış eğitimi destekler. Ayrıntılar için komut işi YAML söz dizimi başvurusunun dağıtılmış bölümüne bakın.

Örnek olarak, dağıtılmış PyTorch kullanarak CIFAR-10 veri kümesinde bir kıvrımlı sinir ağı (CNN) eğitebilirsiniz. Tam betiği örnek deposunda bulabilirsiniz.

içindeki torchvision CIFAR-10 veri kümesi, dizini içeren cifar-10-batches-py bir dizin girişi olarak bekler. Sıkıştırılmış kaynağı indirebilir ve yerel bir dizine ayıklayabilirsiniz:


mkdir data

wget "https://azuremlexamples.blob.core.windows.net/datasets/cifar-10-python.tar.gz"

tar -xvzf cifar-10-python.tar.gz -C data

Ardından yerel dizinden varsayılan veri deposuna yüklenecek bir Azure Machine Learning veri varlığı oluşturun:


az ml data create --name cifar-10-example --version 1 --set path=data

İsteğe bağlı olarak, yerel dosyayı ve dizini kaldırın:


rm cifar-10-python.tar.gz

rm -r data

Kayıtlı veri varlıkları, bir iş girişi için alanı kullanılarak path işe giriş olarak kullanılabilir. Biçimi şeklindedir azureml:<data_name>:<data_version>, bu nedenle yeni oluşturulan CIFAR-10 veri kümesi için şeklindedir azureml:cifar-10-example:1. Veri varlığının en son sürümüne azureml:<data_name>@latest başvurmak istiyorsanız isteğe bağlı olarak söz dizimini kullanabilirsiniz. Azure ML bu başvuruyu açık sürüme çözümler.

Veri varlığı hazırken, modelimizi eğitmek için dağıtılmış bir PyTorch işi yazabilirsiniz:

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
code: src
command: >-
  python train.py 
  --epochs ${{inputs.epochs}}
  --learning-rate ${{inputs.learning_rate}}
  --data-dir ${{inputs.cifar}}
inputs:
  epochs: 1
  learning_rate: 0.2
  cifar: 
     type: uri_folder
     path: azureml:cifar-10-example:1
environment: azureml:AzureML-pytorch-1.9-ubuntu18.04-py37-cuda11-gpu@latest
compute: azureml:gpu-cluster
distribution:
  type: pytorch 
  process_count_per_instance: 1
resources:
  instance_count: 2
display_name: pytorch-cifar-distributed-example
experiment_name: pytorch-cifar-distributed-example
description: Train a basic convolutional neural network (CNN) with PyTorch on the CIFAR-10 dataset, distributed via PyTorch.

Ve çalıştırın:

az ml job create -f jobs/single-step/pytorch/cifar-distributed/job.yml --web

Eğitim işlem hattı oluşturma

Yukarıdaki CIFAR-10 örneği, işlem hattı işine iyi bir şekilde çevrilir. Önceki iş, bir işlem hattında düzenleme için üç işe ayrılabilir:

  • İndirmek ve ayıklamak için bash betiği çalıştırmak için "get-data" cifar-10-batches-py
  • Verileri almak ve dağıtılmış PyTorch ile bir modeli eğitmek için "train-model"
  • Verileri ve eğitilen modeli alıp doğruluğu değerlendirmek için "değerlendirme modeli"

Hem "train-model" hem de "eval-model" "get-data" işinin çıkışına bağımlı olacaktır. Buna ek olarak, "eval-model" "train-model" işinin çıkışına bağımlı olacaktır. Bu nedenle üç iş sırayla çalışır.

İşlem hatları, yeniden kullanılabilir bileşenler kullanılarak da yazılabilir. Daha fazla bilgi için bkz. Azure Machine Learning CLI (Önizleme) ile bileşen tabanlı makine öğrenmesi işlem hatları oluşturma ve çalıştırma.

Sonraki adımlar