初心者がMLOpsを学習した時にぶち当たった "壁" のお話

3.8K Views

March 21, 23

スライド概要

2022-08-07

JAWS-UG京都【京都駅前会場/オンライン】
オフラインでre:Boot! 最新のAIを本気で学ぼう

の発表資料です。

profile-image

ーーーお仕事についてーーー 【現在(2社目):クラウドエンジニア】 2022/2/1より勤務中 クラウドサービスを利用したシステムの設計、開発、構築の業務を行なっています。 ーーージェンダー・お仕事以外についてーーー 私のジェンダーについて、簡単にまとめると以下のとおりです。 身体的性:男性 性的指向:女性が好き 性自認:Xジェンダー、Non-binary、MtX LGBTQ+:Q また、趣味として女装をやっておりまして、「酒井謎子」(sakai-nako)というハンドルネームで活動しています。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

初心者がMLOpsを学習した時に ぶち当たった "壁" のお話 Fenrir GIMLE 酒井謎子

2.

自己紹介 ● ● ● ● ● ● ● 酒井謎子 (sakai-nako) 1987年生まれ ずっと京の都に住んでいる コンビニバイト10年の後にIT業界に飛び込む(現在6 年目) システムエンジニア (2017.5 ~ 2022.1) ↓ クラウドエンジニア in Fenrir GIMLE (2022.2 ~) 「理想の彼女がいなければ、自分で作ればいいじゃな い」と思い立ち、女装を始めて3年くらい Twitter : @nazonoobasan407 その他SNS等 : lit.link

3.

モチベーションと伝えたいこと モチベーション AI・機械学習・MLOpsの実践を始めていく上でぶつかった壁について伝え、今後この領 域に入っていくエンジニアの、一歩踏み出すハードルを下げたい 伝えたいこと 沼にハマると、やりたかったことや全体像が見えなくなる。 初めのうちは「シンプルに」「End To Endで」一度作り切ってみることが大切。 無理やりにでもアウトプットすれば、何かが変わる。何かが貯まる。

4.

アジェンダ ● ● ● ● 自己紹介 Done! モチベーションと伝えたいこと 全体のAWS構成図 実践したことと、ぶつかった壁 ○ ○ ○ ● データサイエンスの本を読んでみた: 壁1 SageMakerを使って学習・推論をしてみた: 壁2 SageMaker Pipelineを使ってパイプラインを作成してみた これから実践予定のこと ○ ● Done! 学習済みモデルを継続してデプロイする仕組みの構築 まとめ

5.

全体のAWS構成図

6.

実践したこと

7.

データサイエンスの本を読んでみた

9.

データサイエンスの本を読んでみた 私:「ふむふむ、まずは統計学のことが書いてあるな。」 「正規分布?ってなんやろ」 (正規分布について調べ中……) 「調べてなんとなくわかった。続きを読もう。」 「パラメトリック?ノンパラメトリック?ってなんやろ…… 理解できてない単語ばかりやな……」

10.

データサイエンスの本を読んでみた (数時間経過後) 私:「変動係数、特性値、線形結合、合成変量……あー全然わからん! 高校の時もっと数学勉強しとけばよかった……」

11.

データサイエンスの本を読んでみた 壁1 数学・統計学の壁 ● ● ● ずっと文系だった自分にとって数学・統計学の用語は馴染みがなく、スッと理解する ことができない 数式を見ても、「なんやこれ?」状態 単語を調べるのに終始してしまって、中々実践に入っていくことができない

12.

データサイエンスの本を読んでみた 壁1 数学・統計学の壁 ● ● ● ずっと文系だった自分にとって数学・統計学の用語は馴染みがなく、スッと理解する ことができない 数式を見ても、「なんやこれ?」状態 単語を調べるのに終始してしまって、中々実践に入っていくことができない →どう対処したか?

13.

データサイエンスの本を読んでみた 壁1 数学・統計学の壁 私なりの対処法 空き時間・食事の時間にYoutubeで関連の動画を見まくる(たまに倍速で) ● ● 単語のままではいまいちイメージが湧かない。「イメージ」を頭の中に焼き付ける 大変お世話になった(なっている)チャンネル ○ ○ 予備校のノリで学ぶ「大学の数学・物理」 ■ 機械学習の領域以外でもお世話になっています 󰢚 ■ AWS Innovate 2020にも出ておられましたね! AIcia Solid Project ■ 解説が素晴らしくわかりやすい ■ 3Dアバターがかわいい ✨

14.

私:「全ては理解できてないけど、なんとか本を読み終えたで。 後でまた復習はするとして、そろそろ実践もしていかんとな。」 上司:「GIMLEではMLOpsやってるチームあるし、AWSアカウントもあるか ら、そこでSageMaker Studio使って実践してみたら?」 私:「ほんまですか?ありがとうございます!」 「よし、まずは 学習 → モデル作成 → 推論 の一通りの流れをSageMaker Studioでやってみようかな。」

15.

SageMakerを使って学習・推論をしてみた

16.

手順やコードは一部端折っています。 詳細はブログに書きましたので、そちらで!

17.

SageMakerを使って学習・推論をしてみた 構成図

18.

SageMakerを使って学習・推論をしてみた 作業の流れ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 元データを取得して、S3バケットに配置 Athenaでデータベースとテーブルを作成 Pythonライブラリをインストール (⇦ここからSageMaker Studioでの作業) 学習用・検証用・テスト用に分けてデータを取得 分割したデータをS3バケットに配置 学習用アルゴリズムへ入力するためのデータを作成 学習アルゴリズムのコンテナイメージURI取得 学習アルゴリズムの設定 データを投入し、学習させる 推論用エンドポイントを作成 推論用エンドポイントの設定 テスト用データで推論させてみる

19.

SageMakerを使って学習・推論をしてみた 元データを取得して、S3バケットに配置 政府統計の総合窓口(e-Stat)から、「民間給与実態統計調査」のデータを取得

20.

SageMakerを使って学習・推論をしてみた 元データを取得して、S3バケットに配置 年間の平均給与額をCSV形式のファイルに まとめる year,value 1994,4078000 1995,4107000 1996,4118000 1997,4183000 1998,4185000 1999,4032000 2004,3766000 ... 2018,3716000 2019,3879000 2020,3701000

21.

SageMakerを使って学習・推論をしてみた 元データを取得して、S3バケットに配置 S3バケットに配置

22.

SageMakerを使って学習・推論をしてみた Athenaでデータベースとテーブルを作成 出来上がったテーブルがこちらになります

23.

SageMakerを使って学習・推論をしてみた Pythonライブラリのインストール import sys !{sys.executable} -m pip install PyAthena pandas-profiling

24.
[beta]
SageMakerを使って学習・推論をしてみた
学習用・検証用・テスト用に分けてデータを取得
from pyathena import connect
import pandas as pd
# Athenaに接続
conn = connect(
s3_staging_dir='s3://aws-athena-query-results-ap-northeast-1-XXXXXXXXXXXX/',
region_name='ap-northeast-1'
)
# 学習用データを取得・表示
query_train = 'select "value", "year" from "e_stat_go_jp_minkan_kyuyo_db"."e_stat_go_jp_minkan_kyuyo_table" where year < 2012;'
df_train = pd.read_sql(query_train, conn)
# 検証用データを取得・表示
query_validation = 'select "value", "year" from "e_stat_go_jp_minkan_kyuyo_db"."e_stat_go_jp_minkan_kyuyo_table" where 2012 <=
year and year < 2018;'
df_validation = pd.read_sql(query_validation, conn)
# テスト用データを取得・表示
query_test = 'select "value", "year" from "e_stat_go_jp_minkan_kyuyo_db"."e_stat_go_jp_minkan_kyuyo_table" where 2018 <= year;'
df_test = pd.read_sql(query_test, conn)

25.
[beta]
SageMakerを使って学習・推論をしてみた
分割したデータをS3バケットに配置
import sagemaker
# 学習用アルゴリズムへの入力/出力を配置する S3バケット
# Session().default_bucket()を指定すると、 "sagemaker-{region}-{aws-account-id}”という名前の S3バケットが使用される
output_bucket = sagemaker.Session().default_bucket()
# S3バケットのプレフィックス
output_prefix = "sagemaker/aota_liner_learner_4"
# 学習用データの S3上の場所
s3_train_data = f"s3://{output_bucket}/{output_prefix}/train"
# 検証用データの S3上の場所
s3_validation_data = f"s3://{output_bucket}/{output_prefix}/validation"
# 出力されるデータ(モデルなど)の S3上の場所
output_location = f"s3://{output_bucket}/{output_prefix}/output"
# S3上に学習用データと検証用データを配置
df_train.to_csv(f"{s3_train_data}/minkan_kyuyo.csv", index=False, header=False)
df_validation.to_csv(f"{s3_validation_data}/minkan_kyuyo.csv", index=False, header=False)

26.

SageMakerを使って学習・推論をしてみた 学習用アルゴリズムへ入力するためのデータを作成 # SageMakerのSDKを通じて学習用アルゴリズムへ入力するためのデータを作成 # 入力データを、 sagemaker.inputs.TrainingInputという形式( Pythonのクラス)で作成 # 学習用データ train_data = sagemaker.inputs.TrainingInput( s3_train_data, distribution="FullyReplicated", content_type="text/csv", s3_data_type="S3Prefix", record_wrapping=None, compression=None, ) # 検証用データ validation_data = sagemaker.inputs.TrainingInput( s3_data=s3_validation_data , distribution="FullyReplicated", content_type="text/csv", s3_data_type="S3Prefix", record_wrapping=None, compression=None, )

27.

SageMakerを使って学習・推論をしてみた 学習アルゴリズムのコンテナイメージURI取得 import boto3 from sagemaker.image_uris import retrieve # sagemaker.image_uris.retrieveを使用して、線形学習アルゴリズム(linear-learner)のコンテナイメージURIを取得 container = retrieve("linear-learner", boto3.Session().region_name, version="1")

28.

SageMakerを使って学習・推論をしてみた 学習アルゴリズムの設定 sess = sagemaker.Session() role="arn:aws:iam::XXXXXXXXXXXX:role/service-role/AmazonSageMaker-ExecutionRole-20210727T175770" # 学習アルゴリズムを実行するEstimator(推定器)を作成 linear = sagemaker.estimator.Estimator( container, role, instance_count=1, instance_type="ml.m4.xlarge", output_path=output_location, sagemaker_session=sess, ) # 最低限必要なハイパーパラメータを設定 linear.set_hyperparameters( predictor_type="regressor", mini_batch_size=10, )

29.
[beta]
SageMakerを使って学習・推論をしてみた
データを投入し、学習させる
%%time
# ↑学習にかかった時間を計測
from time import gmtime, strftime
# ジョブ名を設定
job_name = "aota-linear-learner-4-" + strftime("%H-%M-%S", gmtime())
# Estimator(推定器)にデータを投入して学習させる
linear.fit(inputs={'train': train_data, 'validation': validation_data}, job_name=job_name, wait=True, logs='All')

30.

SageMakerを使って学習・推論をしてみた 推論用エンドポイントを作成 %%time # ↑エンドポイント作成にかかった時間を計測 # 学習済みのモデルを使って、推論用のエンドポイントを作成 linear_predictor = linear.deploy(initial_instance_count=1, instance_type="ml.t2.medium")

31.

SageMakerを使って学習・推論をしてみた 推論用エンドポイントの設定 from sagemaker.serializers import CSVSerializer from sagemaker.deserializers import JSONDeserializer # エンドポイントで、CSVの入力とJSONでのレスポンスができるように設定 linear_predictor.serializer = CSVSerializer() linear_predictor.deserializer = JSONDeserializer()

32.
[beta]
SageMakerを使って学習・推論をしてみた
テスト用データで推論させてみる
year_list = []
predicted_value_list = []
actual_value_list = []
residual_list = []
for year in df_test['year']:
result = linear_predictor.predict([year])
predicted_value = round(result['predictions'][0]['score'])
actual_value = df_test[df_test['year'] == year]['value'].iloc[-1]
year_list.append(year)
predicted_value_list.append(predicted_value)
actual_value_list.append(actual_value)
residual_list.append(predicted_value - actual_value)
result_df = pd.DataFrame(
data={'year': year_list, 'predicted_value': predicted_value_list, 'actual_value': actual_value_list, 'residual': residual_list}
)
print(result_df)

33.

SageMakerを使って学習・推論をしてみた 私:「よっしゃ、学習 → モデル作成 → 推論 の一通りの流れを試せたぞ。 さっそくブログでアウトプットや!」 (下書きを書いて、レビューをしてもらう) 私:「扱うデータの内容や学習アルゴリズムの詳細、 推論結果の解釈の仕方とかでめっちゃ指摘をいただいてしまった……🥺」 「あれ?私は結局何がしたかったんやっけ……」

34.

SageMakerを使って学習・推論をしてみた 壁2 扱う範囲の広さ・深さの壁 ● 取り扱う要素とその選択の範囲が広く、深い。油断するとすぐに沼にハマり、目的 や全体像を見失ってしまう。

35.

SageMakerを使って学習・推論をしてみた 壁2 扱う範囲の広さ・深さの壁 ● 取り扱う要素とその選択の範囲が広く、深い。油断するとすぐに沼にハマり、目的 や全体像を見失ってしまう。 →どう対処したか?

36.

SageMakerを使って学習・推論をしてみた 壁2 扱う範囲の広さ・深さの壁 私なりの対処法 各論の深堀りは一旦諦めて、「End To Endで」一度作り切ってみる ● ● 全体像をつかむためにも、構成図を片手に「End To Endで」作り切ることを目指す 通しで実践してみて、地図(全体像)がイメージできれば…… ○ ○ ○ ● 現在地(今自分がやっていること)が把握しやすくなる 目的地(やりたいこと)へ辿り着く方法が想起しやすくなる お気に入りの場所(やっていて楽しいこと)が見つけやすくなる 扱うデータの内容や学習アルゴリズムの詳細、推論結果の解釈など、各要素の深 掘りは、その後でもよい

37.

私:「色々あったけど、最初の実践はなんとかアウトプットまでできた。 次はSageMaker Pipelineで学習からモデル登録までのパイプラインを 作ってみよう。」

38.

SageMaker Pipelineを使って パイプラインを作成してみた

39.

SageMaker Pipelineを使ってパイプラインを作成してみた 構成図

40.

SageMaker Pipelineを使ってパイプラインを作成してみた 作業の流れ ※SageMaker Studioで作業実施 1. 2. 3. 4. 5. 6. 7. 8. 9. Pythonライブラリをインストール 学習用・検証用・テスト用に分けてデータを取得 分割したデータをS3バケットに配置 学習用アルゴリズムへ入力するためのデータを作成 学習アルゴリズムのコンテナイメージURI取得 学習アルゴリズムの設定 学習ステップを定義 モデル登録ステップを定義 学習ステップとモデル登録ステップを使って、パイプラインを作成

41.

SageMaker Pipelineを使ってパイプラインを作成してみた 作業の流れ ※SageMaker Studioで作業実施 1. 2. 3. 4. 5. 6. 7. 8. 9. Pythonライブラリをインストール 学習用・検証用・テスト用に分けてデータを取得 分割したデータをS3バケットに配置 先ほどと同じなので、省略 (この手順も含めたブログ執筆予定) 学習用アルゴリズムへ入力するためのデータを作成 学習アルゴリズムのコンテナイメージURI取得 学習アルゴリズムの設定 学習ステップを定義 モデル登録ステップを定義 学習ステップとモデル登録ステップを使って、パイプラインを作成

42.

SageMaker Pipelineを使ってパイプラインを作成してみた 学習ステップを定義 from sagemaker.workflow.steps import TrainingStep # 学習ステップを定義 training_step = TrainingStep( name="Train", estimator=linear, inputs={ "train": train_data, "validation": validation_data, } )

43.

SageMaker Pipelineを使ってパイプラインを作成してみた モデル登録ステップを定義① import time from sagemaker.model import Model from sagemaker.workflow.pipeline_context import PipelineSession timestamp = int(time.time()) # Model Registryに作成するモデルグループの名前 model_package_group_name = f"aota-linear-learner-test-pipeline" # モデルの名前 model_name = "aota-linear-learner-pipeline-test-model-{}".format(timestamp) # モデルを定義 model = Model( name=model_name, image_uri=container, model_data=training_step.properties.ModelArtifacts.S3ModelArtifacts, sagemaker_session=PipelineSession(), role=role, )

44.

SageMaker Pipelineを使ってパイプラインを作成してみた モデル登録ステップを定義② from sagemaker.workflow.model_step import ModelStep # モデル登録ステップを定義 register_step = ModelStep( name="ModelStep", step_args=model.register( content_types=["application/jsonlines"], response_types=["application/jsonlines"], inference_instances=["ml.m4.xlarge"], transform_instances=["ml.m4.xlarge"], model_package_group_name=model_package_group_name ) )

45.

SageMaker Pipelineを使ってパイプラインを作成してみた 学習ステップとモデル登録ステップを使って、パイプラインを作成 from sagemaker.workflow.pipeline import Pipeline # パイプラインの名前 pipeline_name = "aota-linear-learner-pipeline-test2" # パイプラインの定義 pipeline = Pipeline( name=pipeline_name, steps=[training_step, register_step], sagemaker_session=sess, ) # パイプラインの作成 response = pipeline.create(role_arn=role)

46.

SageMaker Pipelineを使ってパイプラインを作成してみた 作成したパイプライン

47.

SageMaker Pipelineを使ってパイプラインを作成してみた 作成したパイプライン

48.

これから実践予定のこと

49.

学習済みモデルを継続してデプロイする仕組みの構築 構成図

50.

まとめ

51.

ぶつかった壁と、私なりの対処法 ● 壁1 数学・統計学の壁 ○ ● 空き時間・食事の時間に Youtubeで関連の動画を見まくる(たまに倍速で) 壁2 扱う範囲の広さ・深さの壁 ○ 各論の深堀りは一旦諦めて、「 End To Endで」一度作り切ってみる

52.

モチベーションと伝えたいこと(再掲) モチベーション AI・機械学習・MLOpsの実践を始めていく上でぶつかった壁について伝え、今後この領 域に入っていくエンジニアの、一歩踏み出すハードルを下げたい 伝えたいこと 沼にハマると、やりたかったことや全体像が見えなくなる。 初めのうちは「シンプルに」「End To Endで」一度作り切ってみることが大切。 無理やりにでもアウトプットすれば、何かが変わる。何かが貯まる。

53.

仲間、募集中です

54.

ありがとうございました