【小ネタ】[Amazon SageMaker] ハイパーパラメータ調整の結果を一覧してみました

2020.05.01

1 はじめに

CX事業本部の平内(SIN)です。

Amazon SageMaker(以下、SageMaker)では、ハイパーパラメータ調整(以下、HPO)を使用することで、指定範囲のパラメータで多数のトレーニングを実行し、最適なモデルを得ることができます。

HPOについては、下記に詳しく紹介されています。

本稿は、組み込みアルゴリズムの物体検出(object-detection)で、HPOを使用した結果を一覧してみた記録です。

2 コンソール

HPOの結果は、コンソールから確認可能です。

SageMakerHyperparameter tuning jobsメニューから、該当するトレーニングを選択すると、Traning jobsのタブで、実行された各ジョブで、どのような精度だったかを一覧できます。

しかし、それぞれのジョブで、どのようなパラメータが使用されたのかを確認するためには、各ジョブを開いて、Hyperparametersまでスクロールする必要があります。

最適なジョブだけに興味があるのであれば、特に問題ないのですが、どのようなパラメータでどんな結果になったのかを確認するのは、ちょっと大変です。

3 コード

ということで、SDKから、ハイパーパラメータ調整トレーニングにアクセスして、各ジョブで利用されたパラメータを一覧するプログラムを作成してみました。

from boto3.session import Session

session = Session(profile_name='developer')
client = session.client('sagemaker')

# Job名
hyperParameterTuningJobName = 'test-003'

# 単一のJOBを表現するクラス
class Job():
    def __init__(self, summarie):
        self.__name = summarie["TrainingJobName"]
        self.__status = summarie["TrainingJobStatus"]
        self.__mAP = summarie["FinalHyperParameterTuningJobObjectiveMetric"]["Value"]
        self.__params = summarie["TunedHyperParameters"]

    def header(self):
        params = ''
        for key in self.__params.keys():
            params += "\t{:>15}".format(key)

        return "{:>25}\t{:>8}\t{}{}".format("name", "mAP", "", params)

    def string(self):
        #for param in self.__params:
        params = ''
        for key in self.__params.keys():
            val = self.__params[key]
            try:
                val = float(val)
                num = round(val, 4)
                params += "\t{:7.3f}".format(num)
            except:
                params += "\t{:>10}".format(val)
        status = ''
        if(self.__status != 'Completed'):
            status = self.__status

        return "{:>25}\t{:1.3f}\t{:>8}\t{}".format(self.__name, self.__mAP, status, params)

def main():

    jobs = []

    # 全てのJOBを列挙する
    max = 100 # 最大100までしか指定できない
    response = client.list_training_jobs_for_hyper_parameter_tuning_job(
                HyperParameterTuningJobName = hyperParameterTuningJobName,
                MaxResults = max,
            )
    while(True):
        for summarie in response["TrainingJobSummaries"]:
            jobs.append(Job(summarie))

        if('NextToken' in response):
            response = client.list_training_jobs_for_hyper_parameter_tuning_job(
                HyperParameterTuningJobName = hyperParameterTuningJobName,
                MaxResults = max,
                NextToken = response["NextToken"]
            )
        else:
            break

    print(jobs[0].header())
    for job in jobs:
        print(job.string())

main()

実行結果は、以下のようになります。

name   mAP             learning_rate   mini_batch_size  optimizer
test-003-010-580805be   0.000 Stopped   0.086           13.000                adam
test-003-009-b9f74f88   0.686           0.000            9.000                adam
test-003-008-a4a20894   0.244           0.006           12.000             rmsprop
test-003-007-ef5dc64e   0.663           0.000            9.000                adam
test-003-006-95de60e6   0.000           0.004           21.000                 sgd
test-003-005-4bde65d8   0.000 Stopped   0.255           21.000                 sgd
test-003-004-41aba8a7   0.000 Stopped   0.001           20.000            adadelta
test-003-003-e682fb45   0.979           0.005           21.000                 sgd
test-003-002-c76f6290   0.000           0.000           15.000                 sgd
test-003-001-adf15b9d   0.000           0.000           15.000                 sgd

4 最後に

今回は、組み込みアルゴリズムの物体検出(object-detection)で、HPOを使用した結果を一覧してみました。このツールを頼りに、HPOの動作を、色々確認してみたいと思います。