41
~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた、SageMaker+独自モデルで 問い合わせ分類 2019年7月18日 ミスミグループ本社 美沙

~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

~第6回 Amazon SageMaker 事例祭り~

初心者でもできた、SageMaker+独自モデルで問い合わせ分類

2019年7月18日

ミスミグループ本社

宋 美沙

Page 2: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

自己紹介

宋(そん)美沙

某ECパッケージベンダ(前職)• Javaやさん• 製品開発したり導入PJやったり

ミスミ(2014年~)• CRMシステム開発チーム

✓ +AWS、Python、ML/DL(趣味レベル)✓ MA/顧客データ流通基盤開発✓ レコメンドエンジン

• 先端技術評価チーム(2018年~)✓ +ML/DL(真剣度UP)✓ 新しめ技術の調査、評価、プロトタイプ構築、業務導入✓ ML/DL、5G/IoT関連、量子コンピュータ…

Page 3: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

会社紹介

事業• B2B生産材プラットフォーム

• メーカー事業(FA事業/金型部品事業)• 流通事業• 顧客業務支援

事業特徴• 少量多品種

• 2,070万点、800垓バリエーション(1垓=1兆 * 1億)

• 3,324メーカー• 「確実短納期一個流し」

設立 1963年2月23日

売上高(連結)

331,936百万円※2019年3月期

従業員数(連結)

12,300名※2019年3末時点

株式会社ミスミグループ本社「ものづくりの、明日を支える。」

▶ECサイト「MiSUMi-VONA」https://jp.misumi-ec.com/

Page 4: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

基本スキーム: 社内リソースにこだわる

•「自信をつける」=社内知見の蓄積、を意識

•基本的に社内で回す。人手不足の壁は外部の力でカバー

•試行錯誤フェーズと効果刈り取りフェーズとで分け、一気に最終成果を狙わない

3

ML活用ナレッジ

技術評価~プロトタイプ

システム構築

外部技術者/企業

社内部門外部SIer

Page 5: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

本日の発表事例

•顧客から届く「VOC」(Voice of Customer)の分類支援

4

VOCDB

お問い合わせお問い合わせ対応/履歴データ登録

分析 改善PJ

Page 6: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

一歩一歩を小さく刻む

•大きく「技術評価」「プロトタイプ構築」にフェージング

– 「技術評価」フェーズ:プロのレビューとシンプルイスベスト

– 「プロトタイプ構築」フェーズ:(あとで考えよう)

– 両フェーズともコンスタントにユーザ部門へ共有、繰り返しサイクルに巻き込む

5

プロのレビューで能力不足をカバー

あまり凝らない!一般的アルゴリズムで開始

あとで考える(とにかくスタートする)

データ分析アプローチ

検討モデル訓練 精度評価

要件定義 構築システム

評価

技術評価フェーズ

プロトタイプ構築フェーズ

繰り返し

運用

繰り返し

Page 7: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

モデル訓練環境

•ベース:Python+Jupyter Notebook+Chainer

•最初はWinローカルでJupyter Notebookを実行

– パワー足りないしGPUも積んでないし…

•次にEC2に移行

– Anaconda、Jupyter Notebook、Chainer、Mecab、…ツール入れんの結構面倒…

– そもそもJupyter上でスクリプト書き書きしてるときと、訓練実行するときとでインスタンスタイプ切り替えるのもすごく面倒…

6

データ分析

アプローチ検討

モデル訓練

精度評価

技術評価フェーズ

Local

Ver1

EC2 S3

Ver2

パワーが… 面倒…

Page 8: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

そんなとき

Page 9: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

8

「第3回 SageMaker 事例祭り」に参加、「Amazon SageMaker 体験ハンズオン」を受講

Page 10: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

即決

・・・あれ? SageMakerでいいんじゃん??

– ポチポチポチで環境立ち上げ• Chainer入ってる

• Jupyter Notebook入ってる

• Jupyter Labも入ってる

– ノートブックインスタンスとは別に、トレーニング用のインスタンスタイプを指定できる

–しかもトレーニングにかかった時間だけ課金

–デプロイするとエンドポイントまで作ってくれる(!!)

9

(↑後回しにしていたプロトタイプ構築フェーズの課題が勝手に消滅)

Page 11: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

SageMakerへの移行作業

•移行作業は1日もかからず終了

– SageMaker Notebookインスタンス立ち上げ

– SageMaker用のS3バケットにデータを移す

– Mecab、mecab-python3のインストール

• いささか手間取った(ほとんどここで時間消費)

– Notebook、Pyモジュール資産をコピー

【追加】

•せっかくJupyterLabが使えるので、これまで作っていたNotebook資産をCodeCommitに移して連携

→ CodeCommit上のリポジトリが空の状態で連携すると、JupyterLabからCommit/Push操作できなくなるので注意

10

Page 12: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

さて訓練

Page 13: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

…がその前に

Page 14: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

訓練前の壁(訓練データ編①)

•取り扱う「VOC」データがあまりきれいでない

– 人間が読みやすくなるような区切り記号など

– 顧客からの入力だけでなく、社内担当者間のエスカレーション・申し送り用のテキストも含まれている

13

データ分析

アプローチ検討

モデル訓練

精度評価

技術評価フェーズ

• 顧客入力と担当者入力を分けるのは断念…(精度見て再検討しよう…)

• 普通の前処理工程をひとまず適用- 制御記号、その他記号→半角SP ※ユースケース次第

- ユニコード正規化(NFKC式)

Page 15: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

訓練前の壁(訓練データ編②)

•特殊用語

– 社内用語+自社サービス名など特殊な用語が意図しないところで単語分割される

14

データ分析

アプローチ検討

モデル訓練

精度評価

技術評価フェーズ

• システム辞書拡張- ベースはIPADIC- 社内用語、自社サービス名を集めた用語集を

入手してシステム辞書に投入- コストは人手でざっくり付与

Page 16: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

訓練前の壁(SageMaker編① )

•Mecab + ipadic + mecab-python3 + genism を、インスタンス立ち上げ後に毎回インストールし直すのがツラい

15

データ分析

アプローチ検討

モデル訓練

精度評価

技術評価フェーズ

• ライフサイクル設定で解決

Page 17: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

訓練前の壁(SageMaker編② )

•SageMakerに乗っかるための学習用スクリプトの書き方

– 訓練時には、「model_fn」「input_fn」を含むスクリプトを準備する必要あり

– これができないとSageMakerに移行した意味がない

16

データ分析

アプローチ検討

モデル訓練

精度評価

技術評価フェーズ

• SageMakerに乗っかるための核心部• 唯一(?)の高難易度ポイント• ゼロからは諦めて、処理が近いNLP系サンプルから素直に拝借

• でも一度書いてしまえば分かります

Page 18: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

17

すごい勢いで増えてます

サンプル、チュートリアルの在り処

Page 19: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

(今度こそ)さて訓練

Page 20: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

訓練

•Notebookからの訓練実行はいたってシンプル

– …まあそのために学習用スクリプトを頑張るわけで

※訓練ログなどの取得の仕方は、サンプルなどを参考にして実装してください

19

データ分析

アプローチ検討

モデル訓練

精度評価

技術評価フェーズ

汗と涙のかたまり

Page 21: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

精度アップ

SageMakerで提供してくれているやり方は主に2通り

1. 段階的トレーニング

– 組み込みアルゴリズム2種でしか使えないので今回は見送り

2. ハイパーパラメータチューニング

– こちらを採用

– HyperparameterTunerを作って fit 関数を呼んであげるだけで極めて簡単

20

データ分析

アプローチ検討

モデル訓練

精度評価

技術評価フェーズ

これだけ!!

Page 22: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

ハイパーパラメータチューニング

•設計ポイント

– hyperparameter_ranges:何回か単発で回した感覚値(適当)

– metric_definitions:素直に評価セットのロス関数

– Strategy:Randomか、Bayesian

• まずRandomで広く探して、そのあとパラメータレンジを絞ってBayesian

•「最善モデル」

– SageMaker側で↑で定めたメトリクスにしたがって選んでくれて、関数一発でデプロイできる

– でも本当にそれでいいのか不安だったので、結局子ジョブ全部の訓練ログをグラフ描画する関数を別途作成して目検

21

データ分析

アプローチ検討

モデル訓練

精度評価

技術評価フェーズ

chainer_tuner = HyperparameterTuner(…)chainer_tuner.fit(…) # HPO実行

chainer_tuner.deploy(…) これだけ!!

Page 23: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

ハイパーパラメータチューニングの注意点

• SageMakerが決めた最善モデルをNotebookインスタンスローカルにデプロイして推論テストするときには、ひと手間必要

…だとエラー。

22

データ分析

アプローチ検討

モデル訓練

精度評価

技術評価フェーズ

chainer_tuner = HyperparameterTuner(…)chainer_tuner.fit(…) # HPO実行

chainer_tuner.deploy(initial_instance_count=1,instance_type=‘local’)

• HyperparameterTuner から直接ではなく、① デプロイしたいモデルを決める② モデルアーティファクトを取得する③ ChainerModelを作る④ デプロイ

Page 24: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

そんなこんなで

•手こずった箇所はあったものの、なんとか訓練できた

– 評価用データで精度88%

• 教師データが超少ない分類はやはり苦手…

• 今回はあくまでも「お手伝い」レベルでいい

•訓練フェーズ中の頼みの綱

23

データ分析

アプローチ検討

モデル訓練

精度評価

技術評価フェーズ

1. サンプル、チュートリアルからのヒント2. SDKドキュメントをとにかく漁る

• まずは「高レベルSageMaker Python SDK」で探す• そこになくても「AWS SDK for Python」にあったりする

3. 困ったときのサポート頼み

Page 25: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

さてデプロイ

Page 26: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

デプロイ

•SageMakerの一番の感動ドコロ

– ワンコードで推論用インフラ立ち上げてくれる

– さらにはエンドポイントまで用意してくれる

•「面倒みたくない」ところをAWS側で全部ラップしてくれる

•とはいえ、今回はちょっとだけ面倒

25

• SageMaker標準のインスタンスには載っていないMecabも使いたい

(推論用インスタンスで形態素解析までやらせるのか、というツッコミあるかもですが)

要件定義

構築 運用システム評価

プロトタイプ構築フェーズ

Page 27: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

自前コンテナイメージを使ったデプロイ

• 追加ライブラリ(今回はMecab等形態素解析に使うもの)が入ったコンテナイメージを自作して、デプロイ時に指定

– 自作用のテンプレはGithubに上がってたりします

• 例)https://github.com/aws/sagemaker-chainer-container

※ちなみに、訓練時とは異なるスクリプトを推論用に準備した場合もここで指定– 今回は、推論用のスクリプトを書いたり修正したりするときに

(せっかく作った)訓練用スクリプトに影響させたくなかったので、分けました

26

マイ推論イメージ

これだけ!!

要件定義

構築 運用システム評価

プロトタイプ構築フェーズ

Page 28: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

自前コンテナイメージを使ったデプロイの注意点

「デプロイする前に、いったんNotebookインスタンス上で推論テストをしたい」…ですよね?

• 自作イメージを指定し、インスタンスタイプを「local」にして、デプロイ実行→

• Notebookインスタンスのディスク容量を増やしてもだめ

– ディスク容量の設定が効くのは「 /dev/nvme1n1 」

– PULL先となる「/dev/nvme0n1p1」のサイズは変わらない

27

理由)イメージサイズが大きすぎて、ディスク容量が足りなくてPULLに失敗

エラー

要件定義

構築 運用システム評価

プロトタイプ構築フェーズ

Page 29: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

回避方法

1)Docker Rootを「/dev/nvme1n1」上のディレクトリに変更

→PULLできるようになった。が、今度は推論が動かない…

【理由】SageMakerユーザのロール権限ではないクレデンシャルで、推論用スクリプトをS3からダウンロードしようとしている

【さらに回避】Docker Root変更後に、ネットワーク設定を再実行

• 「chainer_mnist」サンプルに含まれている「setup.sh」を実行

2)EFS ファイルシステムをノートブックにマウントする

→未トライ。詳細はAWSブログで↓

28

botocore.exceptions.ClientError: An error occurred (403) when calling the

HeadObject operation: Forbidden

要件定義

構築 運用システム評価

プロトタイプ構築フェーズ

Page 30: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

そんなこんなで

•デプロイ+エンドポイント作成は(本来は)瞬殺

– 変な横着をしたために手こずった

– 一番手間がかかるところだと思っていたので、心から感動

•推論スクリプトを自作するときも多少脳みそ使いましたが、学習用スクリプトの自作を通過していたのでさほど難易度は高くなし

•やはり困ったときはサポート頼み

– めちゃくちゃお世話になりました

29

要件定義

構築 運用システム評価

プロトタイプ構築フェーズ

Page 31: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

さてプロトタイプ

Page 32: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

改めて概要

•やりたいこと

– VOCテキストの分類推論、のお手伝い

– 13種類の「上位分類」を推論し、その後ドリルダウンで最終分類を選定

•ユーザ

– 社内担当者ユーザ(日本本社、数名)

•想定利用方法

– 外部システム画面上で表示されるVOCコンテンツをコピペ

– 最終分類の選定後、元の外部システム上にその最終分類を入力

•機能概要

– WebUIでリアルタイム推論

– テキスト入力イベントから、SageMaker推論エンドポイントに送信

– 「上位分類」推論結果をWebUIに表示

– 上位にぶらさがる下位分類をドリルダウンぽく表示

要件定義

構築 運用システム評価

プロトタイプ構築フェーズ

Page 33: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

プロトタイプシステム構成図

•プロトタイプシステムだしあまり面倒みたくない→ WebUIも推論もどっちもサーバレスで立ち上げ

•シンプル構成であっという間

•時間かかったのはVue.jsとVuetify(初めて触った)

32

WebBrowserCloudFront

APIGateway

Lambda

SageMaker

推論エンドポイント

推論モデル

WebUI部分

推論部分

Webコンテンツ配信

Webコンテンツ

Web操作ログ

• エンドポイント呼び出し

• 返却データ整形

• JSフレームワーク:Vue.js• UIフレームワーク:Vuetify

推論スクリプト

• 前処理• 推論実行

要件定義

構築 運用システム評価

プロトタイプ構築フェーズ

Page 34: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

プロトタイプシステムデモ動画

※諸事情により、α-0版のデモ動画のみとなります

33

要件定義

構築 運用システム評価

プロトタイプ構築フェーズ

Page 35: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

プロトタイプのユーザ提供とその後

•とりあえずα-0版でも一定の効果

– 作業時間半減

•ユーザ側担当者と画面を見ながらディスカッション

– 早速「やっぱり別のやりかたのほうがいい」を頂戴する

– ↑動くモノがあると出てきやすい

– MLについても「精度88%」と言われるより、実データを自分が投入してその結果を見たほうが感覚的に分かる

34

要件定義

構築 運用システム評価

プロトタイプ構築フェーズ

• 「スゴい」システムでなくていい、スピードが大事• 早く触ってもらえれば、よりよい適用シーンを早く着想できる

• 最適なユースケースはユーザの中に眠っている

Page 36: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

現在取り組んでいること+今後やりたいこと

•「上位分類」以外のレベルでも、ある程度レコード数があるものについては推論モデルを構築

– 複数の推論モデルを同時に呼び出し、当たりがあれば「ドリルダウン」をせずとも選択できるように

•追加学習の自動化

– いまはマニュアル、ハイパーパラメータチューニングなど地味にきつい

•SageMaker Neo

– (まったく別の案件として) IoTエッジ側で動かしたい

•テ、TensorFlow…

35

Page 37: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

まとめ①

•SageMaker初心者、MLについては素人+毛の人間でも、簡単なMLシステムは作れる

•正味1ヶ月

– 結局時間がかかったところって訓練だとかMLシステム構築だとか以外のところ(調べ物とかWebUIとか)

•かかったコストは自分の人件費+AWS利用料のみ

•今回は自作したが、ビルトインアルゴリズムを使うならば、MLを全く知らないITエンジニアであっても立派にMLシステムが作れてしまう

– ビルトインでなくても、多くのアルゴリズム実装がGithubなどで入手できる

36

Page 38: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

【お役立ちサイト】 Papers with Code

•https://paperswithcode.com/

37

Page 39: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

まとめ②

•SageMakerですでに道具は揃っている

•ユーザ企業も自分たちのリソースで(簡単な)MLシステムは作れるし、作るべき

– 「MLよく分からない」という理由で外部に丸投げすると、本当に重要な「正しいユースケース」から離れてしまうことも

※もちろん難しいMLシステムは積極的に外部の知識・リソースを活用するのがよい

•というか「すごいML」以外にシンプルなMLができることってたくさんあるはず

– 今回のケースも「すごいML」の対極だが、効果あり

•「すごいML」をやる前に「MLに慣れておく」のも大事

38

Page 40: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

最後に

サポートの方々が親切丁寧で感激しました!

ありがとうございます!

39

Page 41: ~第6回 Amazon SageMaker 事例祭り~ 初心者でもできた … · 2020. 9. 5. · –変な横着をしたために手こずった –一番手間がかかるところだと思っていたので、心から感動

ご清聴ありがとうございました