SageMaker에서 만든 Experiments 지우기

소개



AWS의 Sagemaker가 게시된 후 Experiments를 만들거나,
Autopilot을 사용해 보는 것이 아닐까요?

다만, 여러가지 시험해 보고 쓰레기의 Experiments가 서서히 모여 온 것이 아닐까요?
이제 사용하지 않게 된 Experiments를 지우자! 나는 그렇게 생각한 이유입니다.

Studio에서 지울 수 없습니다.





GUI로 지울 수 있으면 좋은데 아무래도 지우는 방법은 없을 것 같습니다. (2020/3/4 현재)

API로 지우기



여러가지 조사하고 있으면 API를 사용하면 지울 것 같습니다.
다음을 실행!
import boto3

EXPERIMENT_NAME = '<Experiment名>'

client = boto3.client('sagemaker')

client.delete_experiment(
    ExperimentName=EXPERIMENT_NAME
)
ClientError: An error occurred (ValidationException) when calling the DeleteExperiment operation: Experiment 'arn:aws:sagemaker:us-east-2:<ID>:experiment/<Experiment名>' has trials and cannot be deleted.

분명히 평가판을 지워야 할 것 같습니다.
공식 에도 쓰여졌습니다.

이제 이 앞을 시도한 분은 알겠다고 생각합니다만, 트라이얼도 지울 수 없습니다.
연관된 Trial Component의 연관을 제거해야 합니다.
여기까지 하면 Trial을 삭제할 수 있습니다.
나머지는 모든 Trial을 삭제하기만 하면 됩니다.

마지막으로 작성한 코드는 다음과 같습니다.
import boto3

EXPERIMENT_NAME = '<Experiment名>'
MAX_RESULTS = 100 # 一度の検索で取得する数
TRY_NUM = 10 # 再実行も含めて実行する数

client = boto3.client('sagemaker')

def delete_experiment(experiment_name, max_results):
    while True:
        # Trial listの取得
        trial_list = client.list_trials(
            ExperimentName=experiment_name,
            MaxResults=max_results,
        )
        trial_num = len(trial_list['TrialSummaries'])

        # 全てのTrialを消したら処理終了
        if trial_num == 0:
            break

        print("Info: Number of trials left: Over {}".format(trial_num))
        # Trial component listの取得
        for trial in trial_list['TrialSummaries']:
            trial_name = trial['TrialName']
            trial_component_list = client.list_trial_components(
                TrialName=trial_name,
                MaxResults=max_results,
            )

            # 関連付けを外す
            for trial_component in trial_component_list['TrialComponentSummaries']:
                trial_component_name = trial_component['TrialComponentName']
                response = client.disassociate_trial_component(
                    TrialComponentName=trial_component_name,
                    TrialName=trial_name
                )

            # Trialの削除
            client.delete_trial(
                TrialName=trial_name
            )
            print("Info: Trial deleted. [{}]".format(trial_name))

    # 全てのTrialを消したらExperimentを削除
    client.delete_experiment(
        ExperimentName=experiment_name
    )
    print("Info: Experiment deleted. [{}]".format(experiment_name))

for i in range(1, TRY_NUM + 1):
    try:
        # Experimentが存在したら削除処理を実行
        experiment_list_all = client.list_experiments(
            MaxResults = MAX_RESULTS
        )
        experiment_name_list = [experiment['ExperimentName'] for experiment in experiment_list_all['ExperimentSummaries']]
        if EXPERIMENT_NAME in experiment_name_list:
            delete_experiment(EXPERIMENT_NAME, MAX_RESULTS)
    except Exception as e:
        print("Error: {}".format(e))
        print("Try: {i}/{max}".format(i=i, max=TRY_NUM))
    except Exception as e:
        print(e)

몇 가지 보충합니다.

MAX_RESULTS는 무엇을 지정합니까?



Trial 및 Trial Component 목록을 가져올 때,
얻을 수 있는 수에 한계가 있습니다.
현재는 한 번의 API 실행으로 최대 100건까지만 얻을 수 있습니다.
그래서 일단 MAX_RESULTS로서 100의 값을 넣고 있습니다.
그 때문에, Trial을 취득하는 곳은 무한 루프해 모든 Trial을 삭제할 때까지 실행하게 되어 있습니다.
Autopilot을 사용하면 100개 이상 Trial이 만들어지는 것은 상당히 당연하다고 생각하기 때문에. .
정말로 엄밀하게 한다면 Trial Component의 리스트를 취득할 때도 무한 루프로 해야 한다고 생각합니다만,
현재 하나의 Trial로 100개 이상의 Trial Component를 만드는 것은 별로 없을까,
일단 Trial의 리스트 취득시만 무한 루프 시키는 형태로 했습니다.

TRY_NUM은 무엇을 지정합니까?



이 처리는 여러 번 재시도 동작을 수행하는 처리를 포함합니다. (리트라이 횟수는 스스로 필요하다고 생각하는 수를 지정해 주세요.)
이 이유로는, Disassociate의 처리를 실시할 때에 가끔 왠지 실패해 버리는군요.
몇 번이나 시도해 보았습니다. 간격으로 10 번에 한 번 정도입니다. (하지만 정말 횟수는 변덕입니다)
다음과 같은 오류가 발생합니다.
ClientError: An error occurred (ThrottlingException) when calling the DisassociateTrialComponent operation (reached max retries: 4): Rate exceeded

Disassociate의 처리 자체가 실패하기 쉬운지, 내부에서도 재 시도를 실시하고 있습니다만,
4회까지만 실시할 수 있습니다.
API로 재시도 횟수를 지정하거나 좀 더 재시도 횟수를 늘려 주면 됩니다만. . .

참고



리트라이의 처리는 하기 사이트를 참고로 했습니다.
htps : // 우야마자 k. 하테나 bぉg. 코m/엔트리/2017/01/17/170235

좋은 웹페이지 즐겨찾기