Microsoft Azure ML Service 프레임워크

Microsoft Azure ML 서비스를 사용하여 페이로드 로깅, 피드백 로깅을 수행하고 모델 평가를 위한 성능 정확도, 런타임 편향 탐지, 설명 가능성 및 자동 편향 제거 기능을 측정할 수 있습니다.

모델 평가에는 다음 Microsoft Azure Machine Learning 서비스 프레임워크가 지원됩니다:

표 1. 프레임워크 지원 세부사항

프레임워크 지원 세부사항
프레임워크 문제점 유형 데이터 유형
네이티브 분류 구조화됨
scikit-learn 분류 구조화됨
scikit-learn 회귀 구조화됨

드리프트 발견 모델을 생성하려면 노트북에서 scikit-learn 버전 0.20.2를 사용해야 합니다.

Azure 자동화된 Machine Learning 관리 엔드포인트와 모델 평가를 위한 노트북으로 Azure 모델을 관리합니다.

Microsoft Azure ML 서비스 추가

다음 방법 중 하나를 사용하여 Microsoft Azure ML Service에서 작동하도록 모델 평가를 구성할 수 있습니다.

Azure ML 서비스와 상호 작용하는 데 필요한 다양한 REST 엔드포인트가 호출됩니다. 이를 위해서는 Azure Machine Learning 서비스를 연결해야 합니다.

  1. Azure Active Directory 서비스 프린시펄 작성
  2. UI 또는 Python SDK를 통해 Azure ML Service 서비스 바인딩을 추가할 때 자격 증명 세부 정보를 지정하세요.

JSON 요청 및 응답 파일에 대한 요구사항

Azure ML Service에서 모델 평가를 수행하려면 만든 웹 서비스 배포가 특정 요구 사항을 충족해야 합니다. 사용자가 생성하는 웹 서비스 배포는 다음 요구 사항에 따라 JSON 요청을 수락하고 JSON 응답을 반환해야 합니다.

필수 웹 서비스 JSON 요청 형식

  • REST API 요청 본문은 JSON 오브젝트의 한 JSON 배열이 포함된 JSON 문서여야 합니다.
  • JSON 배열의 이름은 "input"로 지정되어야 합니다.
  • 각 JSON 객체는 단순한 키-값 쌍만 포함할 수 있으며, 값은 문자열, 숫자, true, false, 또는 null
  • 값은 JSON 오브젝트 또는 배열이 아니어야 합니다.
  • 배열에 포함된 각 JSON 객체는 값이 없는null 키가 있든 없든 상관없이 모두 동일한 키(따라서 키의 개수도 동일)를 지정해야 합니다

다음 샘플 JSON 파일은 선행 요구사항을 충족하며 자체 JSON 요청 파일 작성을 위한 템플리트로 사용될 수 있습니다.

{
  "input": [
    {
      "field1": "value1",
      "field2": 31,
      "field3": true,
      "field4": 2.3
    },
    {
      "field1": "value2",
      "field2": 15,
      "field3": false,
      "field4": 0.1
    },
    {
      "field1": null,
      "field2": 5,
      "field3": true,
      "field4": 6.1
    }
  ]
}

필수 웹 서비스 JSON 응답 형식

JSON 응답 파일을 작성할 때 다음과 같은 항목에 유의하십시오.

  • REST API 응답 본문은 JSON 오브젝트의 한 JSON 배열이 포함된 JSON 문서여야 합니다.

  • JSON 배열의 이름은 "output"로 지정되어야 합니다.

  • 각 JSON 객체는 키-값 쌍만 포함할 수 있으며, 값은 문자열, 숫자, true, false null,, 또는 다른 JSON 객체나 배열을 포함하지 않는 배열일 수 있습니다

  • 값은 JSON 오브젝트가 아니어야 합니다.

  • 배열에 포함된 각 JSON 객체는 값이 null 없는 키가 있든 없든 상관없이 모두 동일한 키(및 키의 개수)를 지정해야 합니다

  • 분류 모델의 경우: 웹 서비스는 각 클래스에 대한 확률의 배열을 리턴해야 하고 확률의 순서는 배열의 각 JSON 오브젝트에 대해 일관되어야 합니다.

    • 예: 클래스가 Risk 또는 No Risk인 신용 위험을 예측하는 2진 분류 모델을 가지고 있다고 가정해 봅니다.
    • "output" 배열에서 다시 리턴된 모든 결과의 경우 오브젝트는 다음 양식의 고정 순서로 확률을 포함하는 키-값 쌍을 포함해야 합니다.
    {
    "output": [
      {
        "Scored Probabilities": ["Risk" probability,"No Risk" probability
        ]
        },
        {
          "Scored Probabilities": ["Risk" probability,"No Risk" probability
            ]
           }
        ]
    

Azure ML Studio와 Service 모두에서 사용되는 Azure 머신러닝 시각화 도구와의 일관성을 유지하려면 다음 키 이름을 사용하십시오:

  • 모델의 예측 값을 표시하는 출력 키의 키 이름 "Scored Labels"
  • 각 클래스의 확률 배열을 나타내는 출력 키의 키 이름 "Scored Probabilities"

다음 샘플 JSON 파일은 선행 요구사항을 충족하며 자체 JSON 응답 파일 작성을 위한 템플리트로 사용될 수 있습니다.

{
  "output": [
    {
      "Scored Labels": "No Risk",
      "Scored Probabilities": [
        0.8922524675865824,
        0.10774753241341757
      ]
    },
    {
      "Scored Labels": "No Risk",
      "Scored Probabilities": [
        0.8335192848546905,
        0.1664807151453095
      ]
    }
  ]
}

샘플 노트북

다음 노트북은 Microsoft Azure ML 서비스로 작업하는 방법을 보여줍니다.

Microsoft Azure ML 서비스 인스턴스 지정

모델 평가를 구성하는 첫 번째 단계는 Microsoft Azure ML Service 인스턴스를 지정하는 것입니다. Azure ML 서비스 인스턴스는 AI 모델 및 배치를 저장하는 위치입니다.

AI 모델과 배포는 모델 평가를 위해 Azure ML Service 인스턴스에 연결됩니다. 서비스를 연결하려면 구성 탭 아이콘 구성 탭으로 이동하여 머신 러닝 공급자를 추가하고 편집 아이콘 편집 아이콘을 클릭합니다. 이름과 설명, 그리고 환경이 사전 운영(Pre-production) 인지 운영(Production) 인지 여부 외에도 다음 정보를 반드시 제공해야 합니다:

  • 클라이언트 ID: 클라이언트 ID의 실제 문자열 값이며 사용자의 신원을 확인하고 Azure 서비스에 대해 작성하는 호출을 인증하고 이 호출에 권한을 부여합니다.
  • 클라이언트 시크릿: 시크릿의 실제 문자열 값이며 사용자의 신원을 확인하고 Azure 서비스에 대해 작성하는 호출을 인증하고 이 호출에 권한을 부여합니다.
  • 테넌트: 테넌트 ID는 사용자의 조직에 해당하며 Azure AD의 전용 인스턴스입니다. 테넌트 ID를 확인하려면 계정 이름 위에 마우스를 올려 디렉터리 및 테넌트 ID를 확인하거나, Azure 포털에서 [ Azure ]( Active Directory ) > [Properties] > [Directory ID]를 선택하세요.
  • 구독 ID: Microsoft Azure 구독을 고유하게 식별하는 구독 자격 증명입니다. 구독 IDforms는 모든 서비스 호출의 URI 파트를 구성합니다.

Microsoft Azure 자격 증명을 획득하는 방법에 대한 지침은 ‘포털을 사용하여 리소스에 액세스할 수 있는 Azure AD 애플리케이션 및 서비스 주체 생성하기’ 문서를 참조하십시오.

이제 배치된 모델을 선택하고 모니터를 구성할 준비가 되었습니다. 대시 보드에 모델을 배포하고 대시보드에 추가를 클릭하면 됩니다. 모니터링할 배포를 선택한 다음 ‘구성’을 클릭합니다.

자세한 내용은 ‘모니터 구성’을 참조하십시오.

Microsoft Azure ML 서비스 엔진을 사용하여 페이로드 로깅

Microsoft Azure ML Service 엔진을 추가하세요

IBM 가 아닌 Watson Machine Learning 엔진은 Custom으로 바인딩되며, 메타데이터로 구성됩니다. IBM 가 아닌 Watson Machine Learning 서비스와는 직접 연동되지 않습니다.

service_type = "azure_machine_learning_service"
added_service_provider_result = wos_client.service_providers.add(
        name=SERVICE_PROVIDER_NAME,
        description=SERVICE_PROVIDER_DESCRIPTION,
        service_type = service_type,
        credentials=AzureCredentials(
            subscription_id= AZURE_ENGINE_CREDENTIALS['subscription_id'],
            client_id = AZURE_ENGINE_CREDENTIALS['client_id'],
            client_secret= AZURE_ENGINE_CREDENTIALS['client_secret'],
            tenant = AZURE_ENGINE_CREDENTIALS['tenant']
        ),
        background_mode=False
    ).result

다음 명령을 사용하여 서비스 바인딩을 볼 수 있습니다.

client.service_providers.list()

샘플 출력:

uid	                                   name	                      service_type	                   created
410e730f-8462-45fe-8b41-a029d6d6043a	My Azure ML Service engine azure_machine_learning_service2019-06-10T22:10:29.398Z

Microsoft Azure ML 서비스 구독 추가

구독 추가

asset_deployment_details = wos_client.service_providers.list_assets(data_mart_id=data_mart_id, service_provider_id=service_provider_id).result
asset_deployment_details

deployment_id=''
for model_asset_details in asset_deployment_details['resources']:
    if model_asset_details['metadata']['guid']==deployment_id:
        break

azure_asset = Asset(
            asset_id=model_asset_details["entity"]["asset"]["asset_id"],
            name=model_asset_details["entity"]["asset"]["name"],
            url=model_asset_details["entity"]["asset"]["url"],
            asset_type=model_asset_details['entity']['asset']['asset_type'] if 'asset_type' in model_asset_details['entity']['asset'] else 'model',
            input_data_type=InputDataType.STRUCTURED,
            problem_type=ProblemType.BINARY_CLASSIFICATION
        )

deployment_scoring_endpoint = model_asset_details['entity']['scoring_endpoint']
scoring_endpoint = ScoringEndpointRequest(url = model_asset_details['entity']['scoring_endpoint']['url'],request_headers = model_asset_details['entity']['scoring_endpoint']['request_headers'],
                                                 credentials = None)

deployment = AssetDeploymentRequest(
    deployment_id=model_asset_details['metadata']['guid'],
    url=model_asset_details['metadata']['url'],
    name=model_asset_details['entity']['name'],
    description=model_asset_details['entity']['description'],
    deployment_type=model_asset_details['entity']['type'],
    scoring_endpoint = scoring_endpoint
)

asset_properties = AssetPropertiesRequest(
        label_column="Risk ",
        prediction_field='Scored Labels',
        probability_fields=['Scored Probabilities'],
        training_data_reference=training_data_reference,
        training_data_schema=None,
        input_data_schema=None,
        output_data_schema=None,
    )

subscription_details = wos_client.subscriptions.add(
        data_mart_id=data_mart_id,
        service_provider_id=service_provider_id,
        asset=azure_asset,
        deployment=deployment,
        asset_properties=asset_properties,
        background_mode=False
).result

구독 목록 가져오기

subscription_id = subscription_details.metadata.id
subscription_id

details: wos_client.subscriptions.get(subscription_id).result.to_dict()

페이로드 로깅 사용 설정

구독에서 페이로드 로깅 사용 설정

payload_data_set_id = None
payload_data_set_id = wos_client.data_sets.list(type=DataSetTypes.PAYLOAD_LOGGING,
                                                target_target_id=subscription_id,
                                                target_target_type=TargetTypes.SUBSCRIPTION).result.data_sets[0].metadata.id

로깅 세부사항 가져오기

subscription.payload_logging.get_details()

스코어링 및 페이로드 로깅

모델을 스코어링하십시오. 전체 예제는 ‘ Azure Machine Learning 서비스 엔진 사용’ 노트북을 참조하십시오.

페이로드 로깅 테이블에 요청 및 응답 저장:

wos_client.data_sets.store_records(data_set_id=payload_data_set_id, request_body=[PayloadRecord(
           scoring_id=str(uuid.uuid4()),
           request=request_data,
           response=response_data,
           response_time=460
)])

Python 이외의 언어의 경우, REST API를 사용하여 페이로드를 기록할 수도 있습니다.