---
title: 初心者がMLOpsを学習した時にぶち当たった &quot;壁&quot; のお話
tags:  #機械学習 #mlops  
author: [sakai-nako](https://www.docswell.com/user/sakai-nako)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/PJR6D82Y79.jpg?width=480
description: 2022-08-07  JAWS-UG京都【京都駅前会場／オンライン】 オフラインでre:Boot! 最新のAIを本気で学ぼう  の発表資料です。
published: August 08, 22
canonical: https://www.docswell.com/s/sakai-nako/ZYWWML-2022-08-07_JAWS-UG-Kyoto
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/PJR6D82Y79.jpg)

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


# Page. 2

![Page Image](https://bcdn.docswell.com/page/PEXM18D47X.jpg)

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


# Page. 3

![Page Image](https://bcdn.docswell.com/page/3EKG2KXPJD.jpg)

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


# Page. 4

![Page Image](https://bcdn.docswell.com/page/L73N4Z5475.jpg)

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


# Page. 5

![Page Image](https://bcdn.docswell.com/page/87DWQRD5JG.jpg)

全体のAWS構成図


# Page. 6

![Page Image](https://bcdn.docswell.com/page/VJP9LWXDE8.jpg)

実践したこと


# Page. 7

![Page Image](https://bcdn.docswell.com/page/2EVMQ8LGEQ.jpg)

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


# Page. 8

![Page Image](https://bcdn.docswell.com/page/57GGW53D7L.jpg)

データサイエンスの本を読んでみた
上司：「まずは、これを読んでみるのがいいんじゃ
ない？」
これだけは知っておきたい データサイエンスの基本がわ
かる本
私：「早速ポチりました！」


# Page. 9

![Page Image](https://bcdn.docswell.com/page/4EQX3Z5X7P.jpg)

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


# Page. 10

![Page Image](https://bcdn.docswell.com/page/KJ46139271.jpg)

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


# Page. 11

![Page Image](https://bcdn.docswell.com/page/LE1VG1KK7G.jpg)

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


# Page. 12

![Page Image](https://bcdn.docswell.com/page/GEWLK8DP72.jpg)

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


# Page. 13

![Page Image](https://bcdn.docswell.com/page/47ZMZ8G6E3.jpg)

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


# Page. 14

![Page Image](https://bcdn.docswell.com/page/YJ6NZPYLJV.jpg)

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


# Page. 15

![Page Image](https://bcdn.docswell.com/page/GJ55WKGMJ4.jpg)

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


# Page. 16

![Page Image](https://bcdn.docswell.com/page/9E2NQWYR7R.jpg)

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


# Page. 17

![Page Image](https://bcdn.docswell.com/page/D7YPWLG57M.jpg)

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


# Page. 18

![Page Image](https://bcdn.docswell.com/page/VEN594G4J8.jpg)

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


# Page. 19

![Page Image](https://bcdn.docswell.com/page/Y79Y2QW4E3.jpg)

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


# Page. 20

![Page Image](https://bcdn.docswell.com/page/G7865GNVJD.jpg)

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


# Page. 21

![Page Image](https://bcdn.docswell.com/page/L7L9YGPRER.jpg)

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


# Page. 22

![Page Image](https://bcdn.docswell.com/page/4EMZNQ4P7W.jpg)

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


# Page. 23

![Page Image](https://bcdn.docswell.com/page/PER6D8WYJ9.jpg)

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


# Page. 24

![Page Image](https://bcdn.docswell.com/page/P7XM18P4JX.jpg)

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


# Page. 25

![Page Image](https://bcdn.docswell.com/page/37KG2KDPED.jpg)

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


# Page. 26

![Page Image](https://bcdn.docswell.com/page/LJ3N4ZR4J5.jpg)

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


# Page. 27

![Page Image](https://bcdn.docswell.com/page/8JDWQRY5EG.jpg)

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


# Page. 28

![Page Image](https://bcdn.docswell.com/page/VEP9LW6D78.jpg)

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


# Page. 29

![Page Image](https://bcdn.docswell.com/page/27VMQ83G7Q.jpg)

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


# Page. 30

![Page Image](https://bcdn.docswell.com/page/5JGGW5YDJL.jpg)

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


# Page. 31

![Page Image](https://bcdn.docswell.com/page/47QX3ZMXJP.jpg)

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


# Page. 32

![Page Image](https://bcdn.docswell.com/page/KE4613V2J1.jpg)

SageMakerを使って学習・推論をしてみた
テスト用データで推論させてみる
year_list = []
predicted_value_list = []
actual_value_list = []
residual_list = []
for year in df_test[&#039;year&#039;]:
result = linear_predictor.predict([year])
predicted_value = round(result[&#039;predictions&#039;][0][&#039;score&#039;])
actual_value = df_test[df_test[&#039;year&#039;] == year][&#039;value&#039;].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={&#039;year&#039;: year_list, &#039;predicted_value&#039;: predicted_value_list, &#039;actual_value&#039;: actual_value_list, &#039;residual&#039;: residual_list}
)
print(result_df)


# Page. 33

![Page Image](https://bcdn.docswell.com/page/L71VG13KJG.jpg)

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


# Page. 34

![Page Image](https://bcdn.docswell.com/page/G7WLK8PPJ2.jpg)

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


# Page. 35

![Page Image](https://bcdn.docswell.com/page/4JZMZ8K673.jpg)

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


# Page. 36

![Page Image](https://bcdn.docswell.com/page/YE6NZPQLEV.jpg)

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


# Page. 37

![Page Image](https://bcdn.docswell.com/page/GE55WKRME4.jpg)

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


# Page. 38

![Page Image](https://bcdn.docswell.com/page/972NQWDRJR.jpg)

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


# Page. 39

![Page Image](https://bcdn.docswell.com/page/DJYPWL25JM.jpg)

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


# Page. 40

![Page Image](https://bcdn.docswell.com/page/V7N59484E8.jpg)

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


# Page. 41

![Page Image](https://bcdn.docswell.com/page/YJ9Y2QK473.jpg)

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


# Page. 42

![Page Image](https://bcdn.docswell.com/page/GJ865GRVED.jpg)

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


# Page. 43

![Page Image](https://bcdn.docswell.com/page/LJL9YGKR7R.jpg)

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&quot;aota-linear-learner-test-pipeline&quot;
# モデルの名前
model_name = &quot;aota-linear-learner-pipeline-test-model-{}&quot;.format(timestamp)
# モデルを定義
model = Model(
name=model_name,
image_uri=container,
model_data=training_step.properties.ModelArtifacts.S3ModelArtifacts,
sagemaker_session=PipelineSession(),
role=role,
)


# Page. 44

![Page Image](https://bcdn.docswell.com/page/47MZNQ2PJW.jpg)

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


# Page. 45

![Page Image](https://bcdn.docswell.com/page/P7R6D8MYE9.jpg)

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


# Page. 46

![Page Image](https://bcdn.docswell.com/page/PJXM18V4EX.jpg)

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


# Page. 47

![Page Image](https://bcdn.docswell.com/page/3JKG2KQP7D.jpg)

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


# Page. 48

![Page Image](https://bcdn.docswell.com/page/LE3N4ZP4E5.jpg)

これから実践予定のこと


# Page. 49

![Page Image](https://bcdn.docswell.com/page/8EDWQRL57G.jpg)

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


# Page. 50

![Page Image](https://bcdn.docswell.com/page/V7P9LW2DJ8.jpg)

まとめ


# Page. 51

![Page Image](https://bcdn.docswell.com/page/2JVMQ8DGJQ.jpg)

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


# Page. 52

![Page Image](https://bcdn.docswell.com/page/5EGGW5VDEL.jpg)

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


# Page. 53

![Page Image](https://bcdn.docswell.com/page/4JQX3Z6XEP.jpg)

仲間、募集中です


# Page. 54

![Page Image](https://bcdn.docswell.com/page/K7461342E1.jpg)

ありがとうございました


