2019年のSageMakerのハンズオンで遭遇したエラー (2021年4月執筆)を対処した件について

5 min read読了の目安(約4900字

はじめに

こんにちは
Watanabe Jin (@Sicut_study)です。
以前はQiitaで記事を上げていましたが、徐々にZennにも移行していきたいなと考えており、少しマイナーなところの記事を上げたいと思います。
もしかしたら、これで困る人はいないかもしれませんが、誰かの参考になればと思います。

さて、本日起きたトラブルですが、
Amazon SageMaker 機械学習エンジニア向け体験ハンズオン

https://pages.awscloud.com/event_JAPAN_hands-on-ml_ondemand.html

こちらを行ったところ、序盤でエラーがでて進めず、そちらをAWSに問い合わせて解決しましたので解決方法を載せたいと思います。

私が記事を書いていますのは2021年4月23日です。これ以降にまたライブラリが変わるなどで使用できない可能性もありますのでご注意ください。

私が勤務している会社で、機械学習のプロダクトを作っていこうとなっていますが、そのための環境としてAWSを使うのも1つの手になりそうということで、とりあえずネットにあるハンズオンをしようとなったのですが、エラーが序盤から出ており、なかなか進めずに苦労しました。

結果AWSに直接問い合わせることで解決しましたので、まとめます。

1年以上前のハンズオンになりますので、いまのバージョンではいろいろ不具合がでてしまうのが原因となっています。

この古いハンズオンをいまからやる人がどれだけいるかは不明ですが、役に立てば幸いです。

起きていたエラー

このハンズオンで行われる、random_cut_forest.ipynbを利用して行われる異常検知(一番初めに扱うファイル)で以下の2つのエラーが発生します。

後述しますが、初めにセルを1つ追加して

!pip install sagemaker==1.72

を実行することで、エラーを手順通りに対処することができます。

1. 3行目'Series' object has no attribute 'as_matrix'

3行目のコードでエラーが発生しました。

from sagemaker import RandomCutForest
from sagemaker import get_execution_role
from sagemaker import Session

sess = Session()
bucket = sess.default_bucket()
prefix = 'notebook/rcf/taxi'

# specify general training job information
rcf = RandomCutForest(role=get_execution_role(),
                      train_instance_count=1,
                      train_instance_type='ml.m4.xlarge',
                      data_location=('s3://{}/{}/'+data_dir).format(bucket, prefix),
                      output_path='s3://{}/{}/output'.format(bucket, prefix),
                      num_samples_per_tree=512,
                      num_trees=50)

# automatically upload the training data to S3 and run the training job
rcf.fit(rcf.record_set(taxi_data.value.as_matrix().reshape(-1,1)))

エラーは以下の通り

train_instance_count has been renamed in sagemaker>=2.
See: https://sagemaker.readthedocs.io/en/stable/v2.html for details.
train_instance_type has been renamed in sagemaker>=2.
See: https://sagemaker.readthedocs.io/en/stable/v2.html for details.
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-3-906e26861145> in <module>
     17 
     18 # automatically upload the training data to S3 and run the training job
---> 19 rcf.fit(rcf.record_set(taxi_data.value.as_matrix().reshape(-1,1)))

~/anaconda3/envs/python3/lib/python3.6/site-packages/pandas/core/generic.py in __getattr__(self, name)
   5139             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   5140                 return self[name]
-> 5141             return object.__getattribute__(self, name)
   5142 
   5143     def __setattr__(self, name: str, value) -> None:

AttributeError: 'Series' object has no attribute 'as_matrix'

Python3.7では、pandasでas_matrix()メソッドが非推奨になっています。故に使えない。
以下のようにas_matrix()valuesに変更することで動くようになります。

from sagemaker import RandomCutForest
from sagemaker import get_execution_role
from sagemaker import Session

sess = Session()
bucket = sess.default_bucket()
prefix = 'notebook/rcf/taxi'

# specify general training job information
rcf = RandomCutForest(role=get_execution_role(),
                      train_instance_count=1,
                      train_instance_type='ml.m4.xlarge',
                      data_location=('s3://{}/{}/'+data_dir).format(bucket, prefix),
                      output_path='s3://{}/{}/output'.format(bucket, prefix),
                      num_samples_per_tree=512,
                      num_trees=50)

# automatically upload the training data to S3 and run the training job
# valuesに変更
rcf.fit(rcf.record_set(taxi_data.value.values.reshape(-1,1)))

以下のコードでもas_matrix()が利用されているので、valuesに変更してください。
(values()ではないので注意)

2. can't set attribute

7行目でエラーが発生します。

from sagemaker.predictor import csv_serializer, json_deserializer

rcf_inference.content_type = 'text/csv'
rcf_inference.serializer = csv_serializer
rcf_inference.accept = 'application/json'
rcf_inference.deserializer = json_deserializer

エラーは以下の通り

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-6baf8918ddf5> in <module>
      1 from sagemaker.predictor import csv_serializer, json_deserializer
      2 
----> 3 rcf_inference.content_type = 'text/csv'
      4 rcf_inference.serializer = csv_serializer
      5 rcf_inference.accept = 'application/json'

AttributeError: can't set attribute

これはSageMakerのバージョンが古いことによって起きているエラーでAWSのformにも同じ話題が上がっております。

https://forums.aws.amazon.com/thread.jspa?threadID=333494

解決するには、SageMaker 1.72にバージョンをダウングレードする必要があります。
コードの初めの行に

!pip install sagamaker==1.72

といれて、リスタートカーネルを行うことでエラーが起きなくなります。

終わりに

初めてZennを投稿してみました。
少しマイナーどころからあげて、すこしずつ移行していこうかなと考えています。
やはりまだQiitaが見てくれる人が多くて見てくれそうな記事はそちらに投稿しようかなという感じですが、先輩がそちらにZennに移したほうがいいよと言われたのでこちらも頑張りたいです。

AWSをほぼやったことがなく、わからないことばかりですが、SageMaker使えるようになりたいと思うのでいろいろハンズオンをあさったり触ったりしたいと思います。