【初心者】機械学習の実装と運用について整理してみた

# 背景・目的
私は、現在データエンジニアリングを生業としています。普段は、データ基盤の構築や、パフォーマンスチューニングなどビックデータに関する業務に従事しています。
ビックデータの収集や、蓄積、分析などの環境構築の経験はそこそこありますが、機械学習による予測や分類などのスキルは持ち合わせていませんでした。
今まで機械学習を避け続けてきましたが、一念発起し学ぼうと思います。

学び方としては、AWS Certified Machine Learning – Specialty（以降、ML試験という。）の勉強を通して、理解を深めていきます。

今回は、**機械学習の実装と運用**について学びたいと思います。

なお、過去の機械学習の調べてみたシリースは下記にまとめています。
- 2.探索的データ分析
- [2.1.モデリング用のデータをサニタイズおよび準備する](https://qiita.com/zumax/items/d763d39e42520016b241)
    - [【初心者】探索的データ解析とは何かを調べてみた](https://qiita.com/zumax/items/52c97307bf18f407bb6e)
    - [【初心者】データのスケーリングを調べてみた](https://qiita.com/zumax/items/ca7184dcf4e7fd242128)
    - [【初心者】データの拡張を調べてみた](https://qiita.com/zumax/items/0727e329f3322897d3e7)
    - [【初心者】データアノテーションを調べてみた](https://qiita.com/zumax/items/d0da86b68b05b99cb23e)
- 2.2.特徴エンジニアリングを実行する
    - [【初心者】特徴量エンジニアリングについて調べてみた](https://qiita.com/zumax/items/3b6e771ef1fcaf3edd91)
    - [【初心者】特徴量エンジニアリング（データのビニング）について調べてみた](https://qiita.com/zumax/items/dc0c86736dd5362cf118)
    - [【初心者】特徴量エンジニアリング（トークナイゼーション）について調べてみた。](https://qiita.com/zumax/items/5286c51ecc0a81b66b87)
    - [【初心者】特徴量エンジニアリング（外れ値）について調べてみた](https://qiita.com/zumax/items/2a07f6d3502fc9a16a44)
    - [【初心者】特徴量エンジニアリング（合成データ）について調べてみた](https://qiita.com/zumax/items/654eae53dae77f222433)
    - [【初心者】特徴量エンジニアリング（ダミー変数[One-Hotエンコーディング]）について調べてみた](https://qiita.com/zumax/items/de5cef1ac4a281400764)
    - [【初心者】特徴量エンジニアリング（次元低減）について調べてみた](https://qiita.com/zumax/items/d92342c3da94020eedec)
- 2.3 機械学習のデータを分析および視覚化する
    - [【初心者】機械学習のデータを分析および視覚化を調べてみた](https://qiita.com/zumax/items/1879441180372858d006)
    - [【初心者】機械学習のクラスタリングを調べてみた](https://qiita.com/zumax/items/41f1366f4f1a00eee1f0)
    - [【初心者】機械学習のクラスタリング（エルボー法）を調べてみた](https://qiita.com/zumax/items/f72941a10a6b9460c5de)
    - [【初心者】機械学習の用途やジャンルを学ぶ](https://qiita.com/zumax/items/b0849a8b21d6a4a1fddb)
- [3.モデリング](https://qiita.com/zumax/items/f0098d9def2702f67536)
- 機械学習プロセス
    - [【初心者】AWS Machine Learning Lensを整理する](https://qiita.com/zumax/items/93f9635b3be51fe483e1)

# 概要
## パフォーマンス、可用性、スケーラビリティ、回復性、耐障害性のための ML ソリューションの構築
### GlueとEMR
MLに必要な処理能力とETLプロセスに必要なものと要件は異なる。
- ETLプロセス
    - 複数の形式からファイルを読み取る
    - 読み取りと書き込みには大量のメモリとディスクI/Oが必要なため、ETLで大量のデータを処理できるSparkなどのフレームワークを使用する。
    - EMRやGlueを使用する
- トレーニング
    - CPUよりもトレーニングに適したGPUが必要になる
    - SageMakerを使用してトレーニングを実施する

### SageMakerエンドポイント
高可用性のMLサービスエンドポイントを確保するにあｈ，複数のAZに用意されたインスタンスにSageMakerエンドポイントをデプロイする。

### SageMaker
SageMakerによりトレーニングと推論の療法のMLのモデルを簡単にコンテナ化できる

### AutoScaling
AutoScalingを使用して、アプリケーションへのトラフィックの変化に応じて
アプリケーションの一部であるSageMakerエンドポイントなどのリソースのオートスケールを設定することでスケーラブルなソリューションを構築できます。

### 可用性と耐障害性に優れた ML アーキテクチャの設計
クライアント→API Gateway→Lambdaにより、入力リクエストをフォーマットし、Webからエンドポイントを呼び出すことができる。

<!--
- Amazon ディープラーニングコンテナ
- AWS ディープラーニング AMI (Amazon Machine Image)
- AWS Auto Scaling
- AWS GPU (P2 と P3) および CPU インスタンス
- Amazon CloudWatch
- AWS CloudTrail
-->


## 特定の問題に対応する適切な ML サービスおよび機能の推奨と実装
### Amazon Machine Learningスタックの3つの階層

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e426df1b-afaf-0322-f618-fbfa03c49542.png)
[【開催報告】2020年 AWS re:Invent Recap 製薬業界 AI/MLセミナー](https://aws.amazon.com/jp/blogs/news/aws-reinvent-recap-aiml-seminar-for-biopharma/)から引用。

- MLフレームワーク + インフラ
    - フレームワークレベルで作業するML専門家を対象としている
    - これらのフレームワークを使用することで以下を実行できる
        - MLモデルの構築
        - トレーニング
        - チューニング
        - デプロイ
- MLサービス
    - 中核をなすのがSageMaker
- AIサービス
    - MLモデルの構築やトレーニングを行うことを希望しない利用者向け
    - これらは全て抽象化されており、NLP、時系列予測など様々な分野で一般的なMLの問題に対処できるように設計された使いやすいサービスが提供されている

<!--
- Amazon SageMaker Spark コンテナ
- Amazon SageMaker で独自のコンテナを構築
- Amazon AI サービス 
    - Amazon Translate
    - Amazon Lex
    - Amazon Polly
    - Amazon Transcribe
    - Amazon Rekognition
    - Amazon Comprehend
-->

### ML ソリューションへの基本的な AWS セキュリティプラクティスの適用
#### Amazon SageMaker のビルトインセキュリティ機能
SageMaker にはビルトインセキュリティ機能が備わっている。
- SageMakerは、S3からデータを取得し、そのデータをトレーニングジョブ環境に渡してから、生成されたモデルをS3に返す。
- この作業は利用者のアカウントで行われSageMakerが管理するアカウントにはデータが保存されない。
- モデルをデプロイする場合は、モデルを提供するインスタンスにロードされるため、予測用エンドポイント呼び出す。
- このプロセスを安全に実行するために、SageMakerはIAMロールベースのアクセス許可に対応しており、S3のアーティファクトを保護する。

#### 利用者が管理するVPCでSageMakerインスタンスを起動できる
- SageMakerノートブックインスタンスを作成すると、VPCアタッチの有無に関わらず、このインスタンスを起動できる。
- プライベートVPC設定を指定するには、モデルの作成時にサブネットとセキュリティグループを指定する。SageMakerはサブネットの1つのセキュリティグループに関連付けられたENIを作成する。

#### SageMakerで保管中のデータも暗号化する
- SageMakerでは、IAMロールで不要なアクセスを防ぐほか、KMSまたは一時キーを使用して保管中のデータを暗号化する。
- 利用者はAWS SigV4認証を使用してノートブックインスタンスに接続できるため、接続の安全性は維持され、作成した APIコールは、SSL接続を介して実行される。

#### モデルのアーティファクトとデータには、暗号化されたS3バケットを使用できる
- SageMakerにおけるデータ暗号化と同様に暗号化されたS3バケットをモデルアーティファクトとデータに使用し、KMSキーをSageMakerノートブック、トレーニングジョブ、ハイパーパラメータのチューニングジョブ、バッチ変換ジョブ、エンドポイントに渡して、アタッチされた MLストレージボリュームを暗号化できる。
- KMSキーを指定しない場合、SageMakerは一時キーを使用してストレージボリュームを暗号化する。一時キーは、ストレージボリュームの暗号化に使用された直後に破棄される。

<!--
- Amazon SageMaker のセキュリティ
- Amazon SageMaker のインフラストラクチャセキュリティ
    - VPC
    - セキュリティグループ
    - NAT ゲートウェイ
    - インターネットゲートウェイ
- AWS Key Management Service (AWS KMS)
- AWS Identity and Access Management (IAM)
-->

### MLソリューションのデプロイと運用
- MLモデルとは、大規模なソフトウェアエコシステムを構成するコンポーネント。
- 通常のソフトウェアエンジニアリングと管理のプラクティスをすべて適用する必要がある。
    - セキュリティ
    - ログ記録とモニタリング
    - タスク管理
    - APIバージョニング
- このエコシステムは、クラウドおよびソフトウェアエンジニアリングプラクティスで管理する必要がある。
    - エンドツーエンドテストおよび A/B テスト
    - API バージョニング (複数のバージョンのモデルが使用されている場合)
    - 信頼性とフェイルオーバー
    - 継続的なメンテナンス
    - 継続的インテグレーション/継続的デプロイ (CI/CD) 

### SageMakerホスティングサービスを使用したモデルの3つのステップ
- SageMakerでモデルを作成する
    - 必要なものは以下の通り
        - モデルアーティファクトを保存するS3パス
        - 推論コードを含むイメージのDockerレジストリパス
- HTTPS エンドポイントのエンドポイント設定を作成
    - 本番用バリアントのモデルに使用する名前
- HTTPS エンドポイントを作成
    - 必要なものは以下の通り
        - 本番用バリアントのモデルに使用する名前
        - SageMakerでは、エンドポイント設定を行う必要があり、このサービスは、MLコンピューティングインスタンスを起動し、設定で指定したモデルをデプロイする。

# 参考
https://d2908q01vomqb2.cloudfront.net/b3f0c7f6bb763af1be91d9e74eabfeb199dc1f1f/2021/02/04/image3.png