제퍼넷 로고

Amazon SageMaker Model Monitor 및 Debugger를 사용하여 잘못된 모델 예측 감지 및 분석

시간

컨볼 루션 신경망 (CNN)은 이미지 분류 및 객체 감지와 같은 작업에서 최첨단 결과를 달성합니다. 거리에서 교통 표지판과 물체를 감지하는 자율 주행, 이미지 기반 데이터의 이상을보다 정확하게 분류하기위한 건강 관리, 재고 관리를위한 소매와 같은 다양한 응용 분야에서 사용됩니다.

그러나 CNN은 블랙 박스 역할을하며 예측 방법을 이해하는 것이 중요한 응용 프로그램에서는 문제가 될 수 있습니다. 또한 모델이 배포 된 후 추론에 사용 된 데이터는 모델이 학습 된 데이터와는 매우 다른 분포를 따를 수 있습니다. 이 현상은 일반적으로 데이터 드리프트잘못된 모델 예측으로 이어질 수 있습니다. 이러한 맥락에서, 잘못된 모델 예측으로 이어지는 것을 이해하고 설명 할 수있는 것이 중요합니다.

같은 기술 클래스 활성화 맵솔 리언 스지도 CNN 모델이 결정을 내리는 방법을 시각화 할 수 있습니다. 히트 맵으로 렌더링 된 이러한 맵은 예측에 중요한 이미지 부분을 나타냅니다. 다음 예제 이미지는 독일 교통 표지 데이터 세트 : 왼쪽의 이미지는 미세 조정 된 입력입니다. 레스넷 모델, 이미지 클래스 25 (도로 작업)를 예측합니다. 오른쪽 이미지는 히트 맵으로 오버레이 된 입력 이미지를 보여줍니다. 여기서 빨간색은 클래스 25를 예측하기 위해 가장 관련성이 높은 픽셀을 나타내며 가장 관련이 적은 픽셀을 나타냅니다.

CNN의 결정을 시각화하는 것은 모델이 잘못된 예측을하고 이유를 명확하지 않은 경우 특히 유용합니다. 또한 훈련 데이터 세트에 더 많은 대표적인 샘플이 필요한지 또는 데이터 세트에 편향이 있는지 여부를 파악하는 데 도움이됩니다. 예를 들어, 도로 교통에서 장애물을 찾기위한 물체 감지 모델이 있고 훈련 데이터 세트에 여름철에 채취 한 샘플 만 포함 된 경우, 물체가 눈으로 덮일 수 있다는 사실을 알지 못했기 때문에 겨울철에는 제대로 작동하지 않을 수 있습니다.

이 게시물에서는 교통 표지 분류를위한 모델을 배포하고 설정했습니다. Amazon SageMaker 모델 모니터 지속적으로 낮은 예측 점수 또는 특정 이미지 클래스의 과잉 예측과 ​​같은 예기치 않은 모델 동작을 자동으로 감지합니다. 모델 모니터가 문제를 감지하면 Amazon SageMaker 디버거 배포 된 모델에 대한 시각적 설명을 얻습니다. 추론 중에 텐서를 방출하도록 엔드 포인트를 업데이트하고 해당 텐서를 사용하여 Saliency Map을 계산하여이를 수행 할 수 있습니다. 이 게시물에 나열된 여러 단계와 결과를 재현하려면 리포지토리를 복제하십시오. 아마존 세이지 메이커 분석 모델 예측 귀하의에 Amazon SageMaker 노트북 인스턴스 또는 당신의 내에서 아마존 세이지 메이커 스튜디오 노트북을 실행하십시오.

SageMaker 모델 정의

이 게시물은 레스넷18 를 사용하여 43 개의 교통 표지판 카테고리를 구분하도록 훈련 된 모델 독일 교통 표지 데이터 세트 [2]. 입력 이미지가 주어지면 모델은 다른 이미지 클래스에 대한 확률을 출력합니다. 각 클래스는 다른 교통 표지 카테고리에 해당합니다. 모델을 미세 조정하고 가중치를 GitHub 레포.

모델을 배포하기 전에 아마존 세이지 메이커가중치를 보관하고 업로드해야합니다. 아마존 단순 스토리지 서비스 (아마존 S3). Jupyter 노트북 셀에 다음 코드를 입력하십시오.

sagemaker_session.upload_data(path='model.tar.gz', key_prefix='model')

너는 사용한다 Amazon SageMaker 호스팅 서비스 모델로부터 예측을 얻기 위해 지속적 엔드 포인트를 설정합니다. 따라서 모델 아카이브의 Amazon S3 경로를 사용하는 PyTorch 모델 객체를 정의해야합니다. 정의 entry_point file pretrained_model.py 그 구현 model_fntransform_fn 기능. 호스팅하는 동안 이러한 기능을 사용하여 모델이 추론 컨테이너 내에 올바르게로드되고 들어오는 요청이 올바르게 처리되는지 확인합니다. 다음 코드를 참조하십시오.

from sagemaker.pytorch.model import PyTorchModel model = PyTorchModel(model_data = 's3://' + sagemaker_session.default_bucket() + '/model/model.tar.gz', role = role, framework_version = '1.5.0', source_dir='entry_point', entry_point = 'pretrained_model.py', py_version='py3')

모델 모니터 설정 및 모델 배포

모델 모니터는 생산에서 기계 학습 모델을 자동으로 모니터링하고 데이터 품질 문제가 감지되면이를 알려줍니다. 이 솔루션에서는 엔드 포인트의 입력 및 출력을 캡처하고 모니터링 모니터를 작성하여 모델 모니터가 수집 된 데이터 및 모델 예측을 검사 할 수 있습니다. 그만큼 DataCaptureConfig API는 Model Monitor가 대상 Amazon S3 버킷에 저장하는 입력 및 출력의 일부를 지정합니다. 다음 예제에서 샘플링 백분율은 50 %로 설정됩니다.

from sagemaker.model_monitor import DataCaptureConfig data_capture_config = DataCaptureConfig( enable_capture=True, sampling_percentage=50, destination_s3_uri='s3://' + sagemaker_session.default_bucket() + '/endpoint/data_capture'
)

에 엔드 포인트를 배포하려면 ml.m5.xlarge 예를 들어 다음 코드를 입력하십시오.

predictor = model.deploy(initial_instance_count=1, instance_type='ml.m5.xlarge', data_capture_config=data_capture_config) endpoint_name = predictor.endpoint 

테스트 이미지로 추론 실행

이제 직렬화 된 입력 이미지가 포함 된 페이로드로 엔드 포인트를 호출 할 수 있습니다. 엔드 포인트는 transform_fn 모델 유추를 수행하기 전에 데이터를 전처리하는 기능. 엔드 포인트는 이미지 스트림의 예측 된 클래스를 JSON 문자열로 인코딩 된 정수 목록으로 리턴합니다. 다음 코드를 참조하십시오.

#invoke payload
response = runtime.invoke_endpoint(EndpointName=endpoint_name, Body=payload)
response_body = response['Body'] #get results
result = json.loads(response_body.read().decode())

이제 테스트 이미지와 예상 클래스를 시각화 할 수 있습니다. 다음 시각화에서 교통 표지 이미지는 예측을 위해 엔드 포인트로 전송 된 것이며 최상위 레이블은 엔드 포인트에서 수신 된 해당 예측입니다. 다음 이미지는 엔드 포인트가 클래스 23 (Slippery road).

다음 이미지는 엔드 포인트가 클래스 25를 올바르게 예측했음을 보여줍니다 (Road work).

모델 모니터 스케줄 작성

다음으로 Model Monitor를 사용하여 모니터링 스케줄을 설정하는 방법을 보여줍니다. 모델 모니터는 내장 컨테이너를 제공하여 기준 평균, Quantile 및 표준 편차와 같은 제약 조건 및 통계를 계산합니다. 그런 다음 모니터링 일정 정기적으로 처리 작업을 시작하여 수집 된 데이터를 검사하고 지정된 제약 조건과 데이터를 비교하고 위반 보고서를 생성합니다.

이 사용 사례에서는 간단한 모델 상태 검사를 수행하는 사용자 지정 컨테이너를 만듭니다. 평가 예측 된 이미지 클래스를 계산하는 스크립트. 모형이 다른 거리보다 특정 도로 표지판을 더 자주 예측하거나 신뢰 점수가 지속적으로 낮 으면 문제를 나타냅니다.

예를 들어, 주어진 입력 이미지에서 모델은 신뢰도 점수를 기반으로 순위가 지정된 예측 클래스 목록을 반환합니다. 상위 50 개의 예측이 관련없는 클래스에 해당하는 경우 각각 신뢰 점수가 XNUMX % 미만입니다 (예 : Stop sign 첫 번째 예측으로 Turn left 두 번째로 Speed limit 180 km/h 세 번째로), 당신은 그 예측을 신뢰하고 싶지 않을 수 있습니다.

사용자 정의 컨테이너 작성 및 업로드에 대한 자세한 정보 Amazon Elastic Container Registry (Amazon ECR) 참조 수첩. 다음 코드는 Amazon ECR에서 Docker 이미지의 위치와 평가 스크립트에 필요한 환경 변수를 나타내는 모델 모니터 객체를 생성합니다. 컨테이너의 진입 점 파일은 평가 스크립트입니다.

monitor = ModelMonitor( role=role, image_uri='%s.dkr.ecr.us-west-2.amazonaws.com/sagemaker-processing-container:latest' %my_account_id, instance_count=1, instance_type='ml.m5.xlarge', env={'THRESHOLD':'0.5'}
)

다음으로 모델 모니터 일정 엔드 포인트로. 시간 단위로 사용자 정의 컨테이너를 실행합니다. 다음 코드를 참조하십시오.

from sagemaker.model_monitor import CronExpressionGenerator
from sagemaker.processing import ProcessingInput, ProcessingOutput destination = 's3://' + sagemaker_session.default_bucket() + '/endpoint/monitoring_schedule'
processing_output = ProcessingOutput(output_name='model_outputs', source='/opt/ml/processing/outputs', destination=destination)
output = MonitoringOutput(source=processing_output.source, destination=processing_output.destination) monitor.create_monitoring_schedule( output=output, endpoint_input=predictor.endpoint, schedule_cron_expression=CronExpressionGenerator.hourly()
)

앞에서 설명한 것처럼 스크립트 evaluation.py 간단한 모델 온 전성 검사를 수행합니다. 모델 예측을 계산합니다. 모델 모니터는 모델 입력 및 출력을 Amazon S3에서 JSON 형식의 파일로 저장합니다. 그들은 아래의 처리 용기에 다운로드됩니다. /opt/ml/processing/input. 그런 다음 다음을 통해 예측을로드 할 수 있습니다. ['captureData']['endpointOutput']['data']. 다음 코드를 참조하십시오.

for file in files: content = open(file).read() for entry in content.split('n'): prediction = json.loads(entry)['captureData']['endpointOutput']['data']

CloudWatch 및 SageMaker Studio에서 처리 작업의 상태를 추적 할 수 있습니다. 다음 스크린 샷에서 SageMaker Studio는 문제가 없음을 보여줍니다.

예기치 않은 모델 동작 캡처

이제 일정이 정의되었으므로 모델을 실시간으로 모니터링 할 준비가되었습니다. 설정에서 예기치 않은 동작을 캡처 할 수 있는지 확인하려면 잘못된 예측을 시행합니다. 이를 위해 우리는 AdvBox 툴킷 [3], 픽셀 수준에서 섭동을 일으켜 모델이 더 이상 올바른 클래스를 인식하지 못합니다. 이러한 섭동은 적의 공격일반적으로 인간 관찰자에게는 보이지 않습니다. 다음과 같이 예측 된 일부 테스트 이미지를 변환했습니다. Stop 표지판. 다음 이미지 세트에서 이미지는 원본이고 가운데는 적대적인 이미지이며 오른쪽은 두 이미지의 차이입니다. 원본과 적대적 이미지는 비슷해 보이지만 적대적 이미지는 올바르게 분류되지 않았습니다.

다음 이미지 세트는 잘못 분류 된 다른 기호를 보여줍니다.

Model Monitor는 다음 처리 작업을 예약 할 때 Amazon S3에서 캡처 및 저장된 예측을 분석합니다. 작업은 예측 된 이미지 클래스를 계산합니다. 한 클래스가 시간의 50 % 이상을 예측하면 문제가 발생합니다. 적대적 이미지를 엔드 포인트로 보냈으므로 이제 이미지 클래스 14에 대해 비정상적인 카운트를 볼 수 있습니다 (Stop). SageMaker Studio에서 처리 작업의 상태를 추적 할 수 있습니다. 다음 스크린 샷에서 SageMaker Studio는 마지막 예약 된 작업이 문제를 발견했음을 보여줍니다.

자세한 내용은 아마존 클라우드 워치 로그 : 처리 작업은 키가 43 개의 이미지 클래스 중 하나이고 값이 개수 인 사전을 인쇄합니다. 예를 들어 다음 출력에서 ​​엔드 포인트는 이미지 클래스 9 (No passing) 두 번 및 클래스 14에 대한 비정상 카운트 (Stop). 이 클래스는 322 개의 총 예측 중 400 배를 예측했으며 이는 50 % 임계 값보다 높습니다. 사전 값도 CloudWatch 지표로 저장되므로 메트릭 데이터의 그래프 작성 CloudWatch 콘솔을 사용합니다.

Warning: Class 14 ('Stop sign') predicted more than 80 % of the time which is above the threshold
Predicted classes {9: 2, 19: 2, 25: 1, 14: 322, 13: 5, 5: 1, 8: 10, 18: 1, 31: 4, 26: 8, 33: 4, 36: 4, 29: 20, 12: 8, 22: 4, 6: 4}

처리 작업에서 문제가 발견되었으므로 이제 더 많은 통찰력을 얻을 차례입니다. 앞의 테스트 이미지를 볼 때 원본 이미지와 적대적 이미지 사이에는 큰 차이가 없습니다. 모델에서 본 내용을 더 잘 이해하기 위해 종이에 설명 된 기술을 사용할 수 있습니다 신경망 시각화를위한 완전한 그라디언트 표현 [1] : 입력 지형지 물 및 중요 지형지 물의 중요도 점수를 사용합니다. 다음 섹션에서는 모델 자체를 수정하지 않고도 이러한 변수를 텐서로 쉽게 검색하도록 디버거를 구성하는 방법을 보여줍니다. 또한 이러한 텐서를 사용하여 Saliency Map을 계산하는 방법에 대해 자세히 설명합니다.

디버거 후크 구성 작성

텐서를 검색하려면 사전 훈련 된 모델 Python 스크립트를 업데이트해야합니다. pretrained_model.py처음에 Amazon SageMaker PyTorch 모델을 설정하기 위해 실행했습니다. 디버거를 만들었습니다 후크 구성 in model_fn후크는 매개 변수에 맞춤 문자열을 가져옵니다. include_regex, 수집하려는 텐서의 전체 또는 부분 이름의 정규식을 전달합니다. 다음 섹션에서는 돌출 맵을 계산하는 방법을 자세히 보여줍니다. 계산에는 다음과 같은 중간 레이어의 바이어스와 기울기가 필요합니다. BatchNorm 다운 샘플링 레이어 및 모델 입력. 텐서를 얻으려면 다음 정규식을 표시하십시오.

'.*bn|.*bias|.*downsample|.*ResNet_input|.*image'

텐서를 Amazon SageMaker 기본 버킷에 저장합니다. 다음 코드를 참조하십시오.

def model_fn(model_dir): #load model model = resnet.resnet18() model.load_state_dict(torch.load(model_dir)) model.eval() #hook configuration save_config = smd.SaveConfig(mode_save_configs={ smd.modes.PREDICT: smd.SaveConfigMode(save_interval=1) }) hook = Hook("s3://" + sagemaker_session.default_bucket() + "tensors", save_config=save_config, include_regex='.*bn|.*bias|.*downsample|.*ResNet_input|.*image' ) #register hook hook.register_module(model) #set mode hook.set_mode(modes.PREDICT) return model 

새 진입 점 스크립트를 사용하여 새 PyTorch 모델 작성 pretrained_model_with_debugger_hook.py:

model = PyTorchModel(model_data = 's3://' + sagemaker_session.default_bucket() + '/model/model.tar.gz', role = role, framework_version = '1.3.1', source_dir='code', entry_point = 'pretrained_model_with_debugger_hook.py', py_version='py3')

새로운 PyTorch를 사용하여 기존 엔드 포인트 업데이트 model 디버거 후크를 사용하여 수정 된 모델 스크립트를 사용한 오브젝트 :

predictor = model.deploy( instance_type = 'ml.m5.xlarge', initial_instance_count=1, endpoint_name=endpoint_name, data_capture_config=data_capture_config, update_endpoint=True)

이제 추론 요청이있을 때마다 엔드 포인트는 텐서를 기록하고 Amazon S3에 업로드합니다. 이제 돌출 맵을 계산하여 모델에서 시각적 설명을 얻을 수 있습니다.

디버거를 사용하여 잘못된 예측 분석

분류 모델은 일반적으로 0과 1 사이의 확률 배열을 출력합니다. 여기서 각 항목은 데이터 집합의 레이블에 해당합니다. 예를 들어 MNIST (10 클래스), 모델은 숫자 8 [0.08, 0, 0, 0, 0, 0, 0.12, 0, 0.5, 0.3]을 사용하여 입력 이미지에 대해 다음 예측을 생성 할 수 있습니다. 이는 이미지가 0으로 예측됨을 의미합니다. 확률 8 %, 확률 6 % 12, 확률 8 % 50, 확률 9 % 돌출 맵을 생성하려면 확률이 가장 높은 클래스 (이 사용 사례의 경우 클래스 30)를 가져와 점수를 네트워크의 이전 레이어에 다시 매핑하여이 예측에 중요한 뉴런을 식별하십시오. CNN은 여러 계층으로 구성되므로 각 값이 예측에 기여한 방식을 보여주는 각 중간 값에 대한 중요도 점수가 계산됩니다.

중요도 점수를 결정하기 위해 입력과 관련하여 모델에서 예측 된 결과의 그라디언트를 사용할 수 있습니다. 그라디언트는 입력이 변경 될 때 출력이 얼마나 많이 변경되는지 보여줍니다. 그것들을 기록하려면 backward 레이어 출력에 연결하고 추론 중에 역방향 호출을 트리거합니다. 관련 텐서를 캡처하도록 디버거 후크를 구성했습니다.

끝점을 업데이트하고 일부 추론 요청을 수행 한 후 시험체 만들기디버거가 저장 한 데이터에 액세스하고 쿼리하고 필터링 할 수 있습니다. 다음 코드를 참조하십시오.

from smdebug.trials import create_trial trial = create_trial('s3://' + sagemaker_session.default_bucket() + '/endpoint/tensors')

디버거를 사용하면 다음을 통해 데이터에 액세스 할 수 있습니다 trial.tensor().value(). 예를 들어, 첫 번째 추론 요청의 첫 번째 BatchNorm 계층의 바이어스 텐서를 가져 오려면 다음 코드를 입력하십시오.

trial.tensor('ResNet_bn1.bias').value(step_num=0, mode=modes.PREDICT).

기능 trial.steps(mode=modes.PREDICT) 기록 된 추론 요청 수에 해당하는 사용 가능한 단계 수를 반환합니다.

다음 단계에서는 입력 그라디언트 및 기능 수준 바이어스 그라디언트를 집계하는 FullGrad 방법을 기반으로 Saliency 맵을 계산합니다.

암시 적 바이어스 계산

FullGrad 방법에서 BatchNorm ResNet18의 레이어는 암시 적 바이어스를 도입합니다. 레이어의 연속 평균, 분산 및 가중치를 검색하여 암시 적 바이어스를 계산할 수 있습니다. 다음 코드를 참조하십시오.

weight = trial.tensor(weight_name).value(step_num=step, mode=modes.PREDICT)
running_var = trial.tensor(running_var_name).value(step_num=step, mode=modes.PREDICT)
running_mean = trial.tensor(running_mean_name).value(step_num=step, mode=modes.PREDICT)
implicit_bias = - running_mean / np.sqrt(running_var) * weight

그라디언트 및 바이어스 곱하기

바이어스는 명시 적 및 암시 적 바이어스의 합입니다. 피쳐 맵과 관련하여 출력의 그라디언트를 검색하고 바이어스 및 그라디언트의 곱을 계산할 수 있습니다. 다음 코드를 참조하십시오.

gradient = trial.tensor(gradient_name).value(step_num=step, mode=modes.PREDICT)
bias = trial.tensor(bias_name).value(step_num=step, mode=modes.PREDICT) bias = bias + implicit_bias
bias_gradient = normalize(np.abs(bias * gradient))

보간 및 집계

중간 레이어는 일반적으로 입력 이미지와 크기가 같지 않으므로 보간해야합니다. 모든 바이어스 그라디언트에 대해이 작업을 수행하고 결과를 집계합니다. 전체 합계는 원래 입력 이미지에서 히트 맵으로 오버레이하는 돌출 맵입니다. 다음 코드를 참조하십시오.

for channel in range(bias_gradient.shape[1]): interpolated = scipy.ndimage.zoom(bias_gradient[0,channel,:,:], image_size/bias_gradient.shape[2], order=1) saliency_map += interpolated 

결과

이 섹션에는 모델이 정지 신호로 분류 한 적대적 이미지의 예가 포함되어 있습니다. 오른쪽 이미지는 Saliency Map과 함께 오버레이 된 모델 입력을 보여줍니다. 빨간색은 모델 예측에 가장 큰 영향을 미치는 부분을 나타내며 픽셀 섭동의 위치를 ​​나타낼 수 있습니다. 예를 들어 모델에서 관련 개체 기능이 더 이상 고려되지 않으며 대부분의 경우 신뢰 점수가 낮다는 것을 알 수 있습니다.

비교를 위해 원본 이미지 (비 적대적)로 추론을 수행합니다. 다음 이미지 세트에서 왼쪽의 이미지는 예측 된 이미지 클래스에 대한 적대적 이미지 및 해당 Saliency 맵입니다. Stop. 오른쪽 이미지는 원래 입력 이미지 (비 적대적)와 예측 된 이미지 클래스 (지상 진실 레이블에 해당)의 해당 돌출 맵을 보여줍니다. 비 적대적 이미지의 경우 모델은 관련 객체 특징에만 초점을 맞추므로 높은 확률로 올바른 이미지 클래스를 예측합니다. 적대적 이미지의 경우, 모델은 관련 픽셀 이외의 다른 많은 특징들을 고려하는데, 이는 임의의 픽셀 섭동에 의해 발생합니다.

요약

이 게시물에서는 Amazon SageMaker 모델 모니터 및 Amazon SageMaker 디버거를 사용하여 예기치 않은 모델 동작을 자동으로 감지하고 CNN에서 시각적 설명을 얻는 방법을 설명했습니다. 자세한 내용은 GitHub 레포.

참고자료


저자에 관하여

나탈리 라우 슈마 이어 AWS의 응용 과학자이며 고객이 딥 러닝 애플리케이션을 개발할 수 있도록 도와줍니다.

비 카스 쿠마르 확장 가능한 딥 러닝 시스템을 구축하고 딥 러닝 모델에 대한 통찰력을 제공하는 데 중점을 둔 AWS Deep Learning의 수석 소프트웨어 엔지니어입니다. 이 전에 Vikas는 분산 데이터베이스 및 서비스 검색 소프트웨어를 구축하는 작업을했습니다. 여가 시간에는 독서와 음악을 즐깁니다.

사 타달 바타 차 르지 AWS AI의 주요 제품 관리자입니다. 그는 SageMaker와 같은 프로젝트에서 기계 학습 엔진 PM 팀을 이끌고 TensorFlow, PyTorch 및 MXNet과 같은 기계 학습 프레임 워크를 최적화합니다.

출처 : https://aws.amazon.com/blogs/machine-learning/detecting-and-analyzing-incorrect-model-predictions-with-amazon-sagemaker-model-monitor-and-debugger/

spot_img

VC 카페

VC 카페

최신 인텔리전스

spot_img