다음을 통해 공유


자습서 2: 기능을 사용하여 모델 실험 및 학습(미리 보기)

이 자습서 시리즈는 프로토타입 제작, 학습, 운영화 등 기계 학습 수명 주기의 모든 단계를 기능이 원활하게 통합하는 방법을 보여 줍니다.

첫 번째 자습서에서는 사용자 지정 변환을 사용하여 기능 집합 사양을 만드는 방법을 보여 줍니다. 그런 다음, 해당 기능 집합을 사용하여 학습 데이터를 생성하고, 구체화를 사용하도록 설정하고, 백필을 수행하는 방법을 보여 주었습니다. 이 자습서에서는 구체화를 사용하도록 설정하고 백필을 수행하는 방법을 보여 줍니다. 또한 모델 성능을 개선시키는 방법으로 기능을 실험하는 방법을 보여 줍니다.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • 기존 사전 계산 값을 기능으로 사용하여 새로운 accounts 기능 집합 사양을 프로토타입화합니다. 그런 다음 로컬 기능 집합 사양을 기능 저장소에 기능 집합으로 등록합니다. 이 프로세스는 사용자 지정 변환이 포함된 기능 집합을 만든 첫 번째 자습서와 다릅니다.
  • transactionsaccounts 기능 집합에서 모델의 기능을 선택하고 기능 검색 사양으로 저장합니다.
  • 기능 검색 사양을 사용하여 새 모델을 학습하는 학습 파이프라인을 실행합니다. 이 파이프라인은 기본 제공된 기능 검색 구성 요소를 사용하여 학습 데이터를 생성합니다.

필수 조건

이 자습서를 진행하기 전에 시리즈의 첫 번째 자습서를 완료해야 합니다.

설정

  1. Azure Machine Learning Spark Notebook을 구성합니다.

    새 Notebook을 만들고 이 자습서의 지침을 단계별로 실행할 수 있습니다. featurestore_sample/notebooks 디렉터리에서 2.Experiment-train-models-using-features.ipynb라는 기존 Notebooks를 열고 실행할 수도 있습니다. sdk_only 또는 sdk_and_cli를 선택할 수 있습니다. 이 자습서를 열어두고 설명서 링크와 추가 설명을 참조하세요.

    1. 상단 메뉴의 컴퓨팅 드롭다운 목록에서 Azure Machine Learning Serverless Spark 아래의 서버리스 Spark 컴퓨팅을 선택합니다.

    2. 세션 구성:

      1. 도구 모음에 세션 구성이 표시되면 선택합니다.
      2. Python 패키지 탭에서 Conda 파일 업로드를 선택합니다.
      3. 첫 번째 자습서에서 업로드한conda.yml 파일을 업로드합니다.
      4. 옵션으로 세션 제한 시간(유휴 시간)을 늘려 자주 필요한 재실행을 방지할 수 있습니다.
  2. Spark 세션을 시작합니다.

    # run this cell to start the spark session (any code block will start the session ). This can take around 10 mins.
    print("start spark session")
  3. 샘플의 루트 디렉터리를 설정합니다.

    import os
    
    # please update the dir to ./Users/<your_user_alias> (or any custom directory you uploaded the samples to).
    # You can find the name from the directory structure in the left nav
    root_dir = "./Users/<your_user_alias>/featurestore_sample"
    
    if os.path.isdir(root_dir):
        print("The folder exists.")
    else:
        print("The folder does not exist. Please create or fix the path")
  4. CLI를 설정합니다.

    해당 없음.


  1. 프로젝트 작업 영역 변수를 초기화합니다.

    이는 현재 작업 영역이며 자습서 Notebook은 이 리소스에서 실행됩니다.

    ### Initialize the MLClient of this project workspace
    import os
    from azure.ai.ml import MLClient
    from azure.ai.ml.identity import AzureMLOnBehalfOfCredential
    
    project_ws_sub_id = os.environ["AZUREML_ARM_SUBSCRIPTION"]
    project_ws_rg = os.environ["AZUREML_ARM_RESOURCEGROUP"]
    project_ws_name = os.environ["AZUREML_ARM_WORKSPACE_NAME"]
    
    # connect to the project workspace
    ws_client = MLClient(
        AzureMLOnBehalfOfCredential(), project_ws_sub_id, project_ws_rg, project_ws_name
    )
  2. 기능 저장소 변수를 초기화합니다.

    첫 번째 자습서에서 featurestore_name 만든 내용을 반영하도록 값과 featurestore_location 값을 업데이트해야 합니다.

    from azure.ai.ml import MLClient
    from azure.ai.ml.identity import AzureMLOnBehalfOfCredential
    
    # feature store
    featurestore_name = (
        "<FEATURESTORE_NAME>"  # use the same name from part #1 of the tutorial
    )
    featurestore_subscription_id = os.environ["AZUREML_ARM_SUBSCRIPTION"]
    featurestore_resource_group_name = os.environ["AZUREML_ARM_RESOURCEGROUP"]
    
    # feature store ml client
    fs_client = MLClient(
        AzureMLOnBehalfOfCredential(),
        featurestore_subscription_id,
        featurestore_resource_group_name,
        featurestore_name,
    )
  3. 기능 저장소 사용량 클라이언트를 초기화합니다.

    # feature store client
    from azureml.featurestore import FeatureStoreClient
    from azure.ai.ml.identity import AzureMLOnBehalfOfCredential
    
    featurestore = FeatureStoreClient(
        credential=AzureMLOnBehalfOfCredential(),
        subscription_id=featurestore_subscription_id,
        resource_group_name=featurestore_resource_group_name,
        name=featurestore_name,
    )
  4. 프로젝트 작업 영역에 cpu-cluster라는 컴퓨팅 클러스터를 만듭니다.

    학습/일괄 처리 유추 작업을 실행할 때 이 컴퓨팅 클러스터가 필요합니다.

    from azure.ai.ml.entities import AmlCompute
    
    cluster_basic = AmlCompute(
        name="cpu-cluster-fs",
        type="amlcompute",
        size="STANDARD_F4S_V2",  # you can replace it with other supported VM SKUs
        location=ws_client.workspaces.get(ws_client.workspace_name).location,
        min_instances=0,
        max_instances=1,
        idle_time_before_scale_down=360,
    )
    ws_client.begin_create_or_update(cluster_basic).result()

로컬 환경에서 계정 기능 집합 만들기

첫 번째 자습서에서는 사용자 지정 변환이 있는 transactions 기능 집합을 만들었습니다. 여기에서는 미리 계산된 값을 사용하는 accounts 기능 집합을 만듭니다.

미리 계산된 기능을 온보딩하려면 변환 코드를 작성하지 않고도 기능 집합 사양을 만들 수 있습니다. 기능 집합 사양을 사용하여 완전한 로컬 개발 환경에서 기능 집합을 개발하고 테스트합니다.

기능 저장소에 연결할 필요가 없습니다. 이 절차에서는 기능 집합 사양을 로컬로 만든 다음 그 값을 샘플링합니다. 관리되는 네트워크 격리 기능을 활용하려면 기능 자산 정의를 사용하여 기능 집합 사양을 기능 저장소에 등록해야 합니다. 이 자습서의 이후 단계에서는 자세한 내용을 제공합니다.

  1. 계정의 원본 데이터를 탐색합니다.

    참고 항목

    이 Notebook은 공개적으로 액세스할 수 있는 Blob 컨테이너에 호스트된 샘플 데이터를 사용합니다. wasbs 드라이버만 Spark에서 읽을 수 있습니다. 고유한 원본 데이터를 사용하여 기능 집합을 만들 때 Azure Data Lake Storage Gen2 계정에서 해당 기능 집합을 호스트하고 데이터 경로에서 드라이버를 사용합니다 abfss .

    accounts_data_path = "wasbs://data@azuremlexampledata.blob.core.windows.net/feature-store-prp/datasources/accounts-precalculated/*.parquet"
    accounts_df = spark.read.parquet(accounts_data_path)
    
    display(accounts_df.head(5))
  2. 미리 계산된 기능에서 로컬로 accounts 기능 집합 사양을 만듭니다.

    미리 계산된 기능을 참조하므로 여기서는 변환 코드가 필요하지 않습니다.

    from azureml.featurestore import create_feature_set_spec, FeatureSetSpec
    from azureml.featurestore.contracts import (
        DateTimeOffset,
        Column,
        ColumnType,
        SourceType,
        TimestampColumn,
    )
    from azureml.featurestore.feature_source import ParquetFeatureSource
    
    
    accounts_featureset_spec = create_feature_set_spec(
        source=ParquetFeatureSource(
            path="wasbs://data@azuremlexampledata.blob.core.windows.net/feature-store-prp/datasources/accounts-precalculated/*.parquet",
            timestamp_column=TimestampColumn(name="timestamp"),
        ),
        index_columns=[Column(name="accountID", type=ColumnType.string)],
        # account profiles in the source are updated once a year. set temporal_join_lookback to 365 days
        temporal_join_lookback=DateTimeOffset(days=365, hours=0, minutes=0),
        infer_schema=True,
    )
  3. 기능 집합 사양으로 내보냅니다.

    기능 집합 사양을 기능 저장소에 등록하려면 기능 집합 사양을 특정 형식으로 저장해야 합니다.

    다음 셀을 실행한 후 생성된 accounts 기능 집합 사양을 검사합니다. 사양을 보려면 파일 트리에서 featurestore/featuresets/accounts/spec/FeatureSetSpec.yaml 파일을 엽니다.

    사양에는 다음과 같은 중요한 요소가 있습니다.

    • source: 스토리지 리소스에 대한 참조입니다. 이 경우 Blob Storage 리소스의 Parquet 파일입니다.

    • features: 기능 및 해당 데이터 형식의 목록입니다. 변환 코드를 제공하는 경우 코드는 기능 및 데이터 형식에 매핑되는 DataFrame을 반환해야 합니다. 제공된 변환 코드가 없으면 시스템은 기능과 데이터 형식을 원본에 매핑하는 쿼리를 빌드합니다. 이 경우 기능이 미리 계산되므로 생성된 accounts 기능 집합 사양에는 변환 코드가 포함되지 않습니다.

    • index_columns: 기능 집합의 값에 액세스하는 데 필요한 조인 키입니다.

    자세한 내용은 관리되는 네트워크 격리 최상위 엔터티 이해 및 CLI(v2) 기능 집합 사양 YAML 스키마 리소스를 방문하세요.

    추가적인 이점으로 지속성은 소스 제어를 지원합니다.

    미리 계산된 기능을 참조하므로 여기서는 변환 코드가 필요하지 않습니다.

    import os
    
    # create a new folder to dump the feature set spec
    accounts_featureset_spec_folder = root_dir + "/featurestore/featuresets/accounts/spec"
    
    # check if the folder exists, create one if not
    if not os.path.exists(accounts_featureset_spec_folder):
        os.makedirs(accounts_featureset_spec_folder)
    
    accounts_featureset_spec.dump(accounts_featureset_spec_folder, overwrite=True)

로컬에서 등록되지 않은 기능을 실험해보고 준비가 되면 기능 저장소에 등록

기능을 개발할 때 기능 저장소에 등록하거나 클라우드에서 학습 파이프라인을 실행하기 전에 로컬로 테스트하고 유효성을 검사할 수 있습니다. 등록되지 않은 로컬 기능 집합(accounts)와 기능 저장소에 등록된 기능 집합(transactions)의 조합은 기계 학습 모델에 대한 학습 데이터를 생성합니다.

  1. 모델의 기능을 선택합니다.

    # get the registered transactions feature set, version 1
    transactions_featureset = featurestore.feature_sets.get("transactions", "1")
    # Notice that account feature set spec is in your local dev environment (this notebook): not registered with feature store yet
    features = [
        accounts_featureset_spec.get_feature("accountAge"),
        accounts_featureset_spec.get_feature("numPaymentRejects1dPerUser"),
        transactions_featureset.get_feature("transaction_amount_7d_sum"),
        transactions_featureset.get_feature("transaction_amount_3d_sum"),
        transactions_featureset.get_feature("transaction_amount_7d_avg"),
    ]
  2. 학습 데이터를 로컬에서 생성합니다.

    이 단계에서는 설명 목적으로 학습 데이터를 생성합니다. 옵션으로 여기에서 모델을 로컬로 학습할 수 있습니다. 이 자습서의 이후 단계에서는 클라우드에서 모델을 학습하는 방법을 설명합니다.

    from azureml.featurestore import get_offline_features
    
    # Load the observation data. To understand observatio ndata, refer to part 1 of this tutorial
    observation_data_path = "wasbs://data@azuremlexampledata.blob.core.windows.net/feature-store-prp/observation_data/train/*.parquet"
    observation_data_df = spark.read.parquet(observation_data_path)
    obs_data_timestamp_column = "timestamp"
    # generate training dataframe by using feature data and observation data
    training_df = get_offline_features(
        features=features,
        observation_data=observation_data_df,
        timestamp_column=obs_data_timestamp_column,
    )
    
    # Ignore the message that says feature set is not materialized (materialization is optional). We will enable materialization in the next part of the tutorial.
    display(training_df)
    # Note: display(training_df.head(5)) displays the timestamp column in a different format. You can can call training_df.show() to see correctly formatted value
  3. 기능 저장소에 accounts 기능 집합을 등록합니다.

    기능 정의를 로컬로 실험한 후 적절한 것으로 보이는 경우 기능 집합 자산 정의를 기능 저장소에 등록할 수 있습니다.

    from azure.ai.ml.entities import FeatureSet, FeatureSetSpecification
    
    accounts_fset_config = FeatureSet(
        name="accounts",
        version="1",
        description="accounts featureset",
        entities=[f"azureml:account:1"],
        stage="Development",
        specification=FeatureSetSpecification(path=accounts_featureset_spec_folder),
        tags={"data_type": "nonPII"},
    )
    
    poller = fs_client.feature_sets.begin_create_or_update(accounts_fset_config)
    print(poller.result())
  4. 등록된 기능 집합을 가져와서 테스트해 보세요.

    # look up the featureset by providing name and version
    accounts_featureset = featurestore.feature_sets.get("accounts", "1")

학습 실험 실행

이 단계에서는 기능 목록을 선택하고, 학습 파이프라인을 실행하고, 모델을 등록합니다. 모델이 원하는 대로 작동할 때까지 이러한 단계를 반복할 수 있습니다.

  1. 선택적으로 기능 저장소 UI에서 기능을 발견합니다.

    첫 번째 자습서에서는 transactions 기능 집합을 등록할 때 이 단계를 다루었습니다. accounts 기능 집합도 있으므로 사용 가능한 기능을 찾아볼 수 있습니다.

    1. Azure Machine Learning 글로벌 방문 페이지로 이동합니다.
    2. 왼쪽 창에서 기능 저장소를 선택합니다.
    3. 기능 저장소 목록에서 이전에 만든 기능 저장소를 선택합니다.

    UI에는 만든 기능 집합과 엔터티가 표시됩니다. 기능 정의를 탐색하려면 기능 집합을 선택합니다. 전역 검색 상자를 사용하여 기능 저장소 전체에서 기능 집합을 검색할 수 있습니다.

  2. 선택적으로 SDK에서 기능을 찾아보세요.

    # List available feature sets
    all_featuresets = featurestore.feature_sets.list()
    for fs in all_featuresets:
        print(fs)
    
    # List of versions for transactions feature set
    all_transactions_featureset_versions = featurestore.feature_sets.list(
        name="transactions"
    )
    for fs in all_transactions_featureset_versions:
        print(fs)
    
    # See properties of the transactions featureset including list of features
    featurestore.feature_sets.get(name="transactions", version="1").features
  3. 모델의 기능을 선택하고 모델을 기능 검색 사양으로 내보냅니다.

    이전 단계에서는 로컬 실험 및 테스트를 위해 등록된 기능 집합과 등록되지 않은 기능 집합의 조합에서 기능을 선택했습니다. 이제 클라우드에서 실험해 볼 수 있습니다. 선택한 기능을 기능 검색 사양으로 저장한 다음 학습 및 유추를 위해 MLOps(기계 학습 작업) 또는 CI/CD(연속 통합 및 지속적인 업데이트) 흐름에서 사양을 사용하면 모델 제공 민첩성이 향상됩니다.

    1. 모델의 기능을 선택합니다.

      # you can select features in pythonic way
      features = [
          accounts_featureset.get_feature("accountAge"),
          transactions_featureset.get_feature("transaction_amount_7d_sum"),
          transactions_featureset.get_feature("transaction_amount_3d_sum"),
      ]
      
      # you can also specify features in string form: featurestore:featureset:version:feature
      more_features = [
          f"accounts:1:numPaymentRejects1dPerUser",
          f"transactions:1:transaction_amount_7d_avg",
      ]
      
      more_features = featurestore.resolve_feature_uri(more_features)
      
      features.extend(more_features)
    2. 선택한 기능을 기능 검색 사양으로 내보냅니다.

      기능 검색 사양은 모델과 관련된 기능 목록의 이식 가능 정의입니다. 이는 기계 학습 모델의 개발 및 운영을 간소화하는 데 도움이 될 수 있습니다. 이는 학습 데이터를 생성하는 학습 파이프라인에 대한 입력이 됩니다. 그런 다음 모델과 함께 패키지합니다.

      유추 단계에서는 기능 검색을 사용하여 기능을 찾습니다. 이는 기계 학습 수명 주기의 모든 단계를 통합합니다. 실험하고 배포하는 동안 학습/유추 파이프라인에 대한 변경 내용을 최소한으로 유지할 수 있습니다.

      기능 검색 사양 및 기본 제공 기능 검색 구성 요소의 사용은 선택 사항입니다. 앞에서 설명한 것처럼 get_offline_features() API를 직접 사용할 수 있습니다. 모델을 사용하여 패키지할 때 사양의 이름은 feature_retrieval_spec.yaml이어야 합니다. 이렇게 하면 시스템이 이를 인식할 수 있습니다.

      # Create feature retrieval spec
      feature_retrieval_spec_folder = root_dir + "/project/fraud_model/feature_retrieval_spec"
      
      # check if the folder exists, create one if not
      if not os.path.exists(feature_retrieval_spec_folder):
          os.makedirs(feature_retrieval_spec_folder)
      
      featurestore.generate_feature_retrieval_spec(feature_retrieval_spec_folder, features)

파이프라인을 사용하여 클라우드에서 학습하고 모델을 등록합니다.

이 절차에서는 학습 파이프라인을 수동으로 트리거합니다. 프로덕션 시나리오에서는 CI/CD 파이프라인이 원본 리포지토리의 기능 검색 사양 변경 내용에 따라 이를 트리거할 수 있습니다. 만족스러우면 모델을 등록할 수 있습니다.

  1. 학습 파이프라인 실행.

    학습 파이프라인에는 다음 단계가 있습니다.

    1. 기능 검색: 입력의 경우 이 기본 제공 구성 요소는 기능 검색 사양, 관찰 데이터 및 타임스탬프는 열 이름을 사용합니다. 그런 다음 학습 데이터를 출력으로 생성합니다. 이 단계는 관리 Spark 작업으로 실행됩니다.

    2. 학습: 학습 데이터를 기반으로 모델을 학습한 후 모델(아직 등록되지 않음)을 생성하는 단계입니다.

    3. 평가: 이 단계에서는 모델 성능과 품질이 임계값 내에 있는지 여부의 유효성을 검사합니다. (이 자습서에서는 설명을 위한 자리 표시자 단계입니다.)

    4. 모델 등록: 모델을 등록하는 단계입니다.

      참고 항목

      두 번째 자습서에서는 백필 작업을 실행하여 transactions 기능 집합에 대한 데이터를 구체화했습니다. 기능 검색 단계에서는 이 기능 집합에 대한 오프라인 저장소의 기능 값을 읽습니다. get_offline_features() API를 사용하는 경우에도 동작은 동일합니다.

      from azure.ai.ml import load_job  # will be used later
      
      training_pipeline_path = (
          root_dir + "/project/fraud_model/pipelines/training_pipeline.yaml"
      )
      training_pipeline_definition = load_job(source=training_pipeline_path)
      training_pipeline_job = ws_client.jobs.create_or_update(training_pipeline_definition)
      ws_client.jobs.stream(training_pipeline_job.name)
      # Note: First time it runs, each step in pipeline can take ~ 15 mins. However subsequent runs can be faster (assuming spark pool is warm - default timeout is 30 mins)
    5. 학습 파이프라인과 모델을 검사합니다.

      • 파이프라인 단계를 표시하려면 웹 보기 파이프라인에 대한 하이퍼링크를 선택하고 새 창에서 엽니다.
  2. 모델 아티팩트에서 기능 검색 사양을 사용합니다.

    1. 현재 작업 영역의 왼쪽 창에서 마우스 오른쪽 단추로 모델을 선택합니다.
    2. 새 탭이나 창에서 열기를 선택합니다.
    3. fraud_model을 선택합니다.
    4. 아티팩트를 선택합니다.

    기능 검색 사양은 모델과 함께 패키지로 제공됩니다. 학습 파이프라인의 모델 등록 단계에서 이 단계를 처리했습니다. 실험 중에 기능 검색 사양을 만들었습니다. 이제 모델 정의의 일부입니다. 다음 자습서에서는 추론 프로세스에서 이를 사용하는 방법을 알아보세요.

기능 집합 및 모델 종속성 보기

  1. 모델과 관련된 기능 집합 목록을 봅니다.

    동일한 모델 페이지에서 기능 집합 탭을 선택합니다. 이 탭에는 기능 집합과 accounts 기능 집합이 transactions 모두 표시됩니다. 이 모델은 이러한 기능 집합에 따라 달라집니다.

  2. 기능 집합을 사용하는 모델 목록을 확인합니다.

    1. 기능 저장소 UI를 엽니다(이 자습서의 앞부분에서 설명함).
    2. 왼쪽 창에서 기능 집합를 선택합니다.
    3. 기능 집합을 선택합니다.
    4. 모델 탭을 선택합니다.

    모델이 등록되었을 때 기능 검색 사양에 따라 이 목록이 결정되었습니다.

정리

시리즈의 다섯 번째 자습서에서는 리소스를 삭제하는 방법을 설명합니다.

다음 단계