Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
~第6回 Amazon SageMaker 事例祭り~
初心者でもできた、SageMaker+独自モデルで問い合わせ分類
2019年7月18日
ミスミグループ本社
宋 美沙
自己紹介
宋(そん)美沙
某ECパッケージベンダ(前職)• Javaやさん• 製品開発したり導入PJやったり
ミスミ(2014年~)• CRMシステム開発チーム
✓ +AWS、Python、ML/DL(趣味レベル)✓ MA/顧客データ流通基盤開発✓ レコメンドエンジン
• 先端技術評価チーム(2018年~)✓ +ML/DL(真剣度UP)✓ 新しめ技術の調査、評価、プロトタイプ構築、業務導入✓ ML/DL、5G/IoT関連、量子コンピュータ…
会社紹介
事業• 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/
基本スキーム: 社内リソースにこだわる
•「自信をつける」=社内知見の蓄積、を意識
•基本的に社内で回す。人手不足の壁は外部の力でカバー
•試行錯誤フェーズと効果刈り取りフェーズとで分け、一気に最終成果を狙わない
3
ML活用ナレッジ
技術評価~プロトタイプ
システム構築
外部技術者/企業
社内部門外部SIer
本日の発表事例
•顧客から届く「VOC」(Voice of Customer)の分類支援
4
VOCDB
お問い合わせお問い合わせ対応/履歴データ登録
分析 改善PJ
一歩一歩を小さく刻む
•大きく「技術評価」「プロトタイプ構築」にフェージング
– 「技術評価」フェーズ:プロのレビューとシンプルイスベスト
– 「プロトタイプ構築」フェーズ:(あとで考えよう)
– 両フェーズともコンスタントにユーザ部門へ共有、繰り返しサイクルに巻き込む
5
プロのレビューで能力不足をカバー
あまり凝らない!一般的アルゴリズムで開始
あとで考える(とにかくスタートする)
データ分析アプローチ
検討モデル訓練 精度評価
要件定義 構築システム
評価
技術評価フェーズ
プロトタイプ構築フェーズ
繰り返し
運用
繰り返し
モデル訓練環境
•ベース:Python+Jupyter Notebook+Chainer
•最初はWinローカルでJupyter Notebookを実行
– パワー足りないしGPUも積んでないし…
•次にEC2に移行
– Anaconda、Jupyter Notebook、Chainer、Mecab、…ツール入れんの結構面倒…
– そもそもJupyter上でスクリプト書き書きしてるときと、訓練実行するときとでインスタンスタイプ切り替えるのもすごく面倒…
6
データ分析
アプローチ検討
モデル訓練
精度評価
技術評価フェーズ
Local
Ver1
EC2 S3
Ver2
パワーが… 面倒…
そんなとき
8
「第3回 SageMaker 事例祭り」に参加、「Amazon SageMaker 体験ハンズオン」を受講
即決
・・・あれ? SageMakerでいいんじゃん??
– ポチポチポチで環境立ち上げ• Chainer入ってる
• Jupyter Notebook入ってる
• Jupyter Labも入ってる
– ノートブックインスタンスとは別に、トレーニング用のインスタンスタイプを指定できる
–しかもトレーニングにかかった時間だけ課金
–デプロイするとエンドポイントまで作ってくれる(!!)
9
(↑後回しにしていたプロトタイプ構築フェーズの課題が勝手に消滅)
SageMakerへの移行作業
•移行作業は1日もかからず終了
– SageMaker Notebookインスタンス立ち上げ
– SageMaker用のS3バケットにデータを移す
– Mecab、mecab-python3のインストール
• いささか手間取った(ほとんどここで時間消費)
– Notebook、Pyモジュール資産をコピー
【追加】
•せっかくJupyterLabが使えるので、これまで作っていたNotebook資産をCodeCommitに移して連携
→ CodeCommit上のリポジトリが空の状態で連携すると、JupyterLabからCommit/Push操作できなくなるので注意
10
さて訓練
…がその前に
訓練前の壁(訓練データ編①)
•取り扱う「VOC」データがあまりきれいでない
– 人間が読みやすくなるような区切り記号など
– 顧客からの入力だけでなく、社内担当者間のエスカレーション・申し送り用のテキストも含まれている
13
データ分析
アプローチ検討
モデル訓練
精度評価
技術評価フェーズ
• 顧客入力と担当者入力を分けるのは断念…(精度見て再検討しよう…)
• 普通の前処理工程をひとまず適用- 制御記号、その他記号→半角SP ※ユースケース次第
- ユニコード正規化(NFKC式)
訓練前の壁(訓練データ編②)
•特殊用語
– 社内用語+自社サービス名など特殊な用語が意図しないところで単語分割される
14
データ分析
アプローチ検討
モデル訓練
精度評価
技術評価フェーズ
• システム辞書拡張- ベースはIPADIC- 社内用語、自社サービス名を集めた用語集を
入手してシステム辞書に投入- コストは人手でざっくり付与
訓練前の壁(SageMaker編① )
•Mecab + ipadic + mecab-python3 + genism を、インスタンス立ち上げ後に毎回インストールし直すのがツラい
15
データ分析
アプローチ検討
モデル訓練
精度評価
技術評価フェーズ
• ライフサイクル設定で解決
訓練前の壁(SageMaker編② )
•SageMakerに乗っかるための学習用スクリプトの書き方
– 訓練時には、「model_fn」「input_fn」を含むスクリプトを準備する必要あり
– これができないとSageMakerに移行した意味がない
16
データ分析
アプローチ検討
モデル訓練
精度評価
技術評価フェーズ
• SageMakerに乗っかるための核心部• 唯一(?)の高難易度ポイント• ゼロからは諦めて、処理が近いNLP系サンプルから素直に拝借
• でも一度書いてしまえば分かります
17
すごい勢いで増えてます
サンプル、チュートリアルの在り処
(今度こそ)さて訓練
訓練
•Notebookからの訓練実行はいたってシンプル
– …まあそのために学習用スクリプトを頑張るわけで
※訓練ログなどの取得の仕方は、サンプルなどを参考にして実装してください
19
データ分析
アプローチ検討
モデル訓練
精度評価
技術評価フェーズ
汗と涙のかたまり
精度アップ
SageMakerで提供してくれているやり方は主に2通り
1. 段階的トレーニング
– 組み込みアルゴリズム2種でしか使えないので今回は見送り
2. ハイパーパラメータチューニング
– こちらを採用
– HyperparameterTunerを作って fit 関数を呼んであげるだけで極めて簡単
20
データ分析
アプローチ検討
モデル訓練
精度評価
技術評価フェーズ
これだけ!!
ハイパーパラメータチューニング
•設計ポイント
– hyperparameter_ranges:何回か単発で回した感覚値(適当)
– metric_definitions:素直に評価セットのロス関数
– Strategy:Randomか、Bayesian
• まずRandomで広く探して、そのあとパラメータレンジを絞ってBayesian
•「最善モデル」
– SageMaker側で↑で定めたメトリクスにしたがって選んでくれて、関数一発でデプロイできる
– でも本当にそれでいいのか不安だったので、結局子ジョブ全部の訓練ログをグラフ描画する関数を別途作成して目検
21
データ分析
アプローチ検討
モデル訓練
精度評価
技術評価フェーズ
chainer_tuner = HyperparameterTuner(…)chainer_tuner.fit(…) # HPO実行
chainer_tuner.deploy(…) これだけ!!
ハイパーパラメータチューニングの注意点
• SageMakerが決めた最善モデルをNotebookインスタンスローカルにデプロイして推論テストするときには、ひと手間必要
…だとエラー。
22
データ分析
アプローチ検討
モデル訓練
精度評価
技術評価フェーズ
chainer_tuner = HyperparameterTuner(…)chainer_tuner.fit(…) # HPO実行
chainer_tuner.deploy(initial_instance_count=1,instance_type=‘local’)
• HyperparameterTuner から直接ではなく、① デプロイしたいモデルを決める② モデルアーティファクトを取得する③ ChainerModelを作る④ デプロイ
そんなこんなで
•手こずった箇所はあったものの、なんとか訓練できた
– 評価用データで精度88%
• 教師データが超少ない分類はやはり苦手…
• 今回はあくまでも「お手伝い」レベルでいい
•訓練フェーズ中の頼みの綱
23
データ分析
アプローチ検討
モデル訓練
精度評価
技術評価フェーズ
1. サンプル、チュートリアルからのヒント2. SDKドキュメントをとにかく漁る
• まずは「高レベルSageMaker Python SDK」で探す• そこになくても「AWS SDK for Python」にあったりする
3. 困ったときのサポート頼み
さてデプロイ
デプロイ
•SageMakerの一番の感動ドコロ
– ワンコードで推論用インフラ立ち上げてくれる
– さらにはエンドポイントまで用意してくれる
•「面倒みたくない」ところをAWS側で全部ラップしてくれる
•とはいえ、今回はちょっとだけ面倒
25
• SageMaker標準のインスタンスには載っていないMecabも使いたい
(推論用インスタンスで形態素解析までやらせるのか、というツッコミあるかもですが)
要件定義
構築 運用システム評価
プロトタイプ構築フェーズ
自前コンテナイメージを使ったデプロイ
• 追加ライブラリ(今回はMecab等形態素解析に使うもの)が入ったコンテナイメージを自作して、デプロイ時に指定
– 自作用のテンプレはGithubに上がってたりします
• 例)https://github.com/aws/sagemaker-chainer-container
※ちなみに、訓練時とは異なるスクリプトを推論用に準備した場合もここで指定– 今回は、推論用のスクリプトを書いたり修正したりするときに
(せっかく作った)訓練用スクリプトに影響させたくなかったので、分けました
26
マイ推論イメージ
これだけ!!
要件定義
構築 運用システム評価
プロトタイプ構築フェーズ
自前コンテナイメージを使ったデプロイの注意点
「デプロイする前に、いったんNotebookインスタンス上で推論テストをしたい」…ですよね?
• 自作イメージを指定し、インスタンスタイプを「local」にして、デプロイ実行→
• Notebookインスタンスのディスク容量を増やしてもだめ
– ディスク容量の設定が効くのは「 /dev/nvme1n1 」
– PULL先となる「/dev/nvme0n1p1」のサイズは変わらない
27
理由)イメージサイズが大きすぎて、ディスク容量が足りなくてPULLに失敗
エラー
要件定義
構築 運用システム評価
プロトタイプ構築フェーズ
回避方法
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
要件定義
構築 運用システム評価
プロトタイプ構築フェーズ
そんなこんなで
•デプロイ+エンドポイント作成は(本来は)瞬殺
– 変な横着をしたために手こずった
– 一番手間がかかるところだと思っていたので、心から感動
•推論スクリプトを自作するときも多少脳みそ使いましたが、学習用スクリプトの自作を通過していたのでさほど難易度は高くなし
•やはり困ったときはサポート頼み
– めちゃくちゃお世話になりました
29
要件定義
構築 運用システム評価
プロトタイプ構築フェーズ
さてプロトタイプ
改めて概要
•やりたいこと
– VOCテキストの分類推論、のお手伝い
– 13種類の「上位分類」を推論し、その後ドリルダウンで最終分類を選定
•ユーザ
– 社内担当者ユーザ(日本本社、数名)
•想定利用方法
– 外部システム画面上で表示されるVOCコンテンツをコピペ
– 最終分類の選定後、元の外部システム上にその最終分類を入力
•機能概要
– WebUIでリアルタイム推論
– テキスト入力イベントから、SageMaker推論エンドポイントに送信
– 「上位分類」推論結果をWebUIに表示
– 上位にぶらさがる下位分類をドリルダウンぽく表示
要件定義
構築 運用システム評価
プロトタイプ構築フェーズ
プロトタイプシステム構成図
•プロトタイプシステムだしあまり面倒みたくない→ WebUIも推論もどっちもサーバレスで立ち上げ
•シンプル構成であっという間
•時間かかったのはVue.jsとVuetify(初めて触った)
32
WebBrowserCloudFront
APIGateway
Lambda
SageMaker
推論エンドポイント
推論モデル
WebUI部分
推論部分
Webコンテンツ配信
Webコンテンツ
Web操作ログ
• エンドポイント呼び出し
• 返却データ整形
• JSフレームワーク:Vue.js• UIフレームワーク:Vuetify
推論スクリプト
• 前処理• 推論実行
要件定義
構築 運用システム評価
プロトタイプ構築フェーズ
プロトタイプシステムデモ動画
※諸事情により、α-0版のデモ動画のみとなります
33
要件定義
構築 運用システム評価
プロトタイプ構築フェーズ
プロトタイプのユーザ提供とその後
•とりあえずα-0版でも一定の効果
– 作業時間半減
•ユーザ側担当者と画面を見ながらディスカッション
– 早速「やっぱり別のやりかたのほうがいい」を頂戴する
– ↑動くモノがあると出てきやすい
– MLについても「精度88%」と言われるより、実データを自分が投入してその結果を見たほうが感覚的に分かる
34
要件定義
構築 運用システム評価
プロトタイプ構築フェーズ
• 「スゴい」システムでなくていい、スピードが大事• 早く触ってもらえれば、よりよい適用シーンを早く着想できる
• 最適なユースケースはユーザの中に眠っている
現在取り組んでいること+今後やりたいこと
•「上位分類」以外のレベルでも、ある程度レコード数があるものについては推論モデルを構築
– 複数の推論モデルを同時に呼び出し、当たりがあれば「ドリルダウン」をせずとも選択できるように
•追加学習の自動化
– いまはマニュアル、ハイパーパラメータチューニングなど地味にきつい
•SageMaker Neo
– (まったく別の案件として) IoTエッジ側で動かしたい
•テ、TensorFlow…
35
まとめ①
•SageMaker初心者、MLについては素人+毛の人間でも、簡単なMLシステムは作れる
•正味1ヶ月
– 結局時間がかかったところって訓練だとかMLシステム構築だとか以外のところ(調べ物とかWebUIとか)
•かかったコストは自分の人件費+AWS利用料のみ
•今回は自作したが、ビルトインアルゴリズムを使うならば、MLを全く知らないITエンジニアであっても立派にMLシステムが作れてしまう
– ビルトインでなくても、多くのアルゴリズム実装がGithubなどで入手できる
36
まとめ②
•SageMakerですでに道具は揃っている
•ユーザ企業も自分たちのリソースで(簡単な)MLシステムは作れるし、作るべき
– 「MLよく分からない」という理由で外部に丸投げすると、本当に重要な「正しいユースケース」から離れてしまうことも
※もちろん難しいMLシステムは積極的に外部の知識・リソースを活用するのがよい
•というか「すごいML」以外にシンプルなMLができることってたくさんあるはず
– 今回のケースも「すごいML」の対極だが、効果あり
•「すごいML」をやる前に「MLに慣れておく」のも大事
38
最後に
サポートの方々が親切丁寧で感激しました!
ありがとうございます!
39
ご清聴ありがとうございました