2019年のSageMakerのハンズオンで遭遇したエラー (2021年4月執筆)を対処した件について
はじめに
こんにちは
Watanabe Jin (@Sicut_study)です。
以前はQiitaで記事を上げていましたが、徐々にZennにも移行していきたいなと考えており、少しマイナーなところの記事を上げたいと思います。
もしかしたら、これで困る人はいないかもしれませんが、誰かの参考になればと思います。
さて、本日起きたトラブルですが、
Amazon SageMaker 機械学習エンジニア向け体験ハンズオン
こちらを行ったところ、序盤でエラーがでて進めず、そちらを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にも同じ話題が上がっております。
解決するには、SageMaker 1.72にバージョンをダウングレードする必要があります。
コードの初めの行に
!pip install sagamaker==1.72
といれて、リスタートカーネルを行うことでエラーが起きなくなります。
終わりに
初めてZennを投稿してみました。
少しマイナーどころからあげて、すこしずつ移行していこうかなと考えています。
やはりまだQiitaが見てくれる人が多くて見てくれそうな記事はそちらに投稿しようかなという感じですが、先輩がそちらにZennに移したほうがいいよと言われたのでこちらも頑張りたいです。
AWSをほぼやったことがなく、わからないことばかりですが、SageMaker使えるようになりたいと思うのでいろいろハンズオンをあさったり触ったりしたいと思います。
Discussion