モデルフュージョン
複雑なエッジ環境では、エッジが地理的に変化し、各エッジが他のエッジと比較して独自の環境コンテキストに基づいたバラバラのデータを収集し、トレーニングを行っている可能性があります。そのバラバラな機械学習モデルのエッジデータを融合することで、個々のエッジモデルから恩恵を受け、改善された集約モデルを学習することができます。しかし、いくつかの重要な課題があります。
- セキュリティとプライバシー。個々のエッジのデータには、生の状態では他者と共有すべきでないプライベートなデータが含まれている可能性があります。
- データ共有のないコラボレーション。プライベートなエッジデータを共有しなくても、他のエッジモデルから学習することで、個々のエッジモデルを強化したい場合があります。
- スケーリング。マルチエッジ・クラウド・アーキテクチャでは、データの安全性を維持しながら、モデルのトレーニングをコア・クラウド・センターから拡張したいと考えています。
このチュートリアルでは、Model Fusion APIを使用して、AI機械学習モデルが以下のような複数のエッジに分散したデータから学習する方法を学びます。
- 生データを共有せずにエッジからモデル学習を集約することで、データのプライバシーをより確実に守ることができます。
- モデルを共有した上でのエッジの独立学習
- エッジからのモデルアンサンブル
Model Fusion APIは、このような目的のために設計されており、以下のような連携したDataOpsアルゴリズムのセットを実装しています。
- データのプライバシーを維持しつつ、機械学習エッジモデルを融合した集合体を作成する。
- 個々のエッジモデルを、データプライバシーを維持したまま改良します。
モデルフュージョンAPIは、各エージェントがエッジモデルとなる分散型マルチエージェントトレーニングの手法である連合学習を使用しています。各ラウンドにおいて、エージェントのランダムなサブセットが選択され、モデルトレーニングを行い、データのプライバシーを確保するために、パラメータ(モデルの重み)の更新のみを共有します。さらに、モデルのパラメータ集約を最適化し、必要な場合にのみ集約が行われるようにしています。例えば、異なるエージェントが似たようなデータを持っている場合、モデルパラメータの集約量は少なくなります。連携学習は、分散型エッジAIの安全なモデル学習方法です。データを共有しなくても、共有学習が可能です。
再び、モバイルやロボットのIoTデバイスなど、ネットワーク内に数十万台のエッジデバイスを持つ大企業に勤める機械学習エンジニアのミーラの例を紹介します。彼女と彼女のチームは、地理的に異なる場所にある様々なエッジデバイスに、何百もの機械学習モデルを展開しています。エッジデータの一部を分析したところ、一部のエッジデバイスのパフォーマンスが他のデバイスよりも優れていることがわかりました。そのため、類似したエッジデバイスのセットの中で、最も優れた機械学習モデルから学習したいと考えています。
このチュートリアルでは、Edge AI Model Fusion APIを使用して、2つのエッジモデル(どちらも畳み込みニューラルネットワーク(CNN))を集約する方法をステップバイステップで説明します。以下は、APIの使用を開始するための完全なPythonノートブックです。このチュートリアルでは、IBM API HubプラットフォームでEdge AIのトライアル・サブスクリプションにアクセスするなど、いくつかの基本的な手順についても説明します。
このチュートリアルではPythonノートブックを使用していますが、お好みの統合開発環境(IDE)で実行することができます。
前提条件¶
このチュートリアルを完了するには、以下のものが必要です。
- IBM ID
- Python 3
- PythonノートブックIDE
見積もり時間¶
このチュートリアルを完了するには、約30分かかります。
手順¶
ステップ 1.環境設定¶
環境を整えるために
-
Edge AI APIのドキュメントページに移動し、Get trial subscriptionをクリックします。
-
すでにIBM IDを持っている場合は、登録ページでログインします。そうでない場合は、自分で新しいIBM IDを作成します。
-
ログインすると、システムはお客様にトライアルサブスクリプションの権利を与え、My IBM ページに移動します。「Trial for Edge AI API」タイルを探して、「Launch」をクリックします。
-
「My APIs」ページで、「Edge AI」タイルをクリックします。ページが開いたら、[Key management]セクションを見つけ、行を展開してClient IDとClient secretの両方を確認し、可視性(目)アイコンをクリックして実際の値を表示します。これらの値は、このチュートリアルで使用するAPIキーなので、メモしておいてください。
-
受け取ったAPIキーの値を含むconfig.jsonファイルを作成します。
-
pip を使って、Python パッケージ
requests
をインストールします。
Step 2.Model Fusion APIを起動します。¶
APIドキュメントページで、Model Fusion APIを探します。
<スクリーンショットの追加
Step 3.Python ノートブックの例¶
このPythonノートブックの例では、2つのCNNエッジモデルから集約融合モデルを作成しています。お好みのPythonノートブックIDEを使ってノートブックを作業することができます。
モデルフュージョン¶
Model Fusionは、エッジ環境での連合学習のためのフレームワークです。連合学習とは、各参加ノード(またはパーティ)がローカルにデータを保持し、学習プロトコルを通じて他の参加者と対話する分散型の機械学習プロセスです。連携学習の背景には、データを他者と共有したくないというニーズがありますが、これは主にプライバシーと機密性への懸念によるものです。
Model Fusionの要件¶
Federated Learningでは、モデルフュージョンのために、すべての関係者が同じモデルアーキテクチャを使用する必要があります。この例では、すべての関係者が使用するPytorch CNNを定義します。
アグリゲータ用のパラメータを用意する¶
アグリゲータはフュージョンアルゴリズムの実行を担当し、登録されている相手に問い合わせをして、連携学習の処理を行います。送信されるクエリは、モデルやアルゴリズムの種類によって異なります。融合ハンドラクラスで指定された融合アルゴリズムに従って、モデルの更新情報が集約されます。
構成要素¶
アグリゲータの構成を設定するパラメータの一覧を以下に示します。
fusion_algorithm
:フェデレーションの学習プロセスにおける融合アルゴリズムの名前です。オプションには'fedavg'
,'iter_avg'
,'doc2vec'
があります。`fedavg
:fedavg` 融合アルゴリズムは,機械学習モデルをフェデレーション学習で学習するためのよく知られた方法です.アグリゲータは、各ラウンドにおいて、更新されたローカルモデルの重みとサンプルサイズをすべてのパーティに要求し、学習に使用されたサンプルサイズに基づいて、収集されたモデルの重みに対して加重平均集計を行います。そして,グローバルモデルの重みは,収集されたすべてのローカルモデルの重みの加重平均によって更新されます。iter_avg
:この反復型平均融合アルゴリズムは,グローバルトレーニングラウンドごとに,登録されているすべての当事者にクエリを反復的に送信して情報を求め,当事者から収集した情報を用いてグローバルモデルを更新します。具体的には、アグリゲータは、各ラウンドにおいて、更新されたローカルモデルの重みをすべてのパーティに要求し、その後、収集されたモデルの重みに対して単純な平均化集計を行います。そして、グローバルモデルのウェイトは、収集されたすべてのローカルモデルのウェイトの平均値によって更新されます。- doc2vec
:
doc2vecは,
word2vecと同様に,テキスト文書のベクトル埋め込みを学習する教師なしアルゴリズムです.doc2vec
のモデルの融合方法は、フェデレーション平均化アルゴリズムをセマンティックなベクトル埋め込みの設定に適応させたものです。 model_type
:融合に使用するモデルのタイプです。オプションには 'keras'
,'pytorch'
,'doc2vec'
があります。`model_file
:model_file`: 保存された初期モデルで、アグリゲータが各パーティに配布し、各パーティのプライベートデータセットで個別にトレーニングを行います。model_fileはユーザーによって定義されます。num_parties
: 融合に参加するノードの数です。融合に参加するノードの数です。 *rounds
: 融合のラウンド数です。*rounds
: 融合を完了するまでのラウンド数。epochs
: エポック数です。各融合ラウンドで学習するエポック数です。learning_rate
: 学習率。学習に使用するパーティの学習率です。optimizer
: オプティマイザーの名前です。学習に使用するオプティマイザーの名前です (doc2vec
には適用されません)。KerasやPyTorchのライブラリで使用されている名前である必要がある(例:PyTorchの場合はoptim.Adam)。
アグリゲーターの起動¶
アグリゲータの設定ファイルを定義すると、edgeai_model_fusion
サービスからアグリゲータを起動することができます。このサービスが成功すると、パーティがアグリゲータに登録するためのIDが返されます。
各パーティのローカルデータを用意する¶
各政党は独立してモデルを学習するために独自のデータセットを保持しているので、MNISTデータセットのサブセットを各政党ごとに入手し、一様に分割します。
Start party nodes¶
フェデレーションに参加するために各パーティを起動します。アグリゲータへの登録には、以下のパラメータが必要です。
aggregator_id
:融合のために接続するアグリゲータのIDです。data
:学習するデータファイルのパスです。data_handler_class_name
: 学習するデータハンドラの名前です。学習するデータハンドラの名前です。モデルフュージョンでは、データを前処理するためにdata_handlerが必要です。APIには、Kerasモデルの'cifar10_keras'や'mnist_keras'、PyTorchモデルの'mnist_pytorch'、doc2vec
の'20_newsgroup'や'wikipedia'などの一般的なデータセット用のハンドラーが含まれています。カスタムのdatahandler
が提供されている場合は、そのクラスの名前を列挙する必要があります。custom_data_handler
(オプション):ユーザーが作成したトレーニング用のデータハンドラのPythonモジュールへのパスです。カスタマーデータハンドラーの作成方法については、こちらを参照してください。NEED LINK
成功すると、サービスに登録できる残りの相手の数が通知されます。
連携学習(Model Fusion)の開始¶
アグリゲータへの登録が完了したら、連携学習を開始します。ここでは、model_fusion
サービスにtrain
コマンドを発行して学習を開始します。
正しいアグリゲータを登録するためには、aggregator_id
パラメータが必要です。トレーニングが成功すると、サービスはフュージョンによって得られたグローバルモデルのモデルウェイトを返す必要があります。
注:APIドキュメントのページには、Try this APIという機能があり、これはRESTクライアントのUIです。これを使えば、同じコンテキストでドキュメントを読んでAPIを呼び出すことができます。
まとめ¶
このチュートリアルでは、API キーを保護し、IBM Cloud にホストされている Edge AI API を簡単に呼び出す方法を説明しました。スイートに含まれるAPIは、アプリケーションのニーズに合わせてさまざまなアルゴリズムを呼び出すのに役立ちます。ご質問やご相談がありましたら、EdgeAI.User@ibm.com。