Federated Learning Demo アプリを動かしてみよう

# はじめに
最近**Fedarated Learning**という考え方が提唱されています。学習そのものは、分散したノードで行い、学習済みモデルは、すべての学習データを反映した全体的なものにするという考え方です。
IBMでは、その考え方に基づいたAPIをライブラリとして実装し、すでにデモプログラムが動くようになっています。
これからご紹介するのは、そのデモプログラムで、コメントを日本語化したものです。
**Fedarated Learning**がどんなものか、試してみたい方は、是非、このコードを実行してみて下さい。

# Federated Learningとは

Federated Learningは、当事者がデータを共有せずにデータを活用したい場合に適しています。
例えば、航空会社連合が、世界的なパンデミックが航空会社の遅延にどのように影響するかをモデル化したいとします。
フェデレーションに参加している各パーティは、データを移動したり共有したりすることなく、データを使用して共通のモデルを学習することができます。
結果として得られたモデルは、スコアリングデータに対してより正確な予測を提供するために展開することができ、連合の各メンバーにより良い結果と洞察力を与えることができます。

この図は、連合した当事者が、データを互いに共有することなく、共通のモデルを訓練するためにデータを送信する方法を示しています。アグリゲータはモデルの更新を管理します。

![スクリーンショット 2021-01-06 16.22.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/fa3e443b-dc3b-4e75-1ba4-4eb1df89b07e.png)

中央のアグリゲーターは、各パーティに対して、問い合わせ(Q)を行います。各パーティは、自分のローカルのデータで作成したモデルに基づき、問い合わせに対する回答を返します。(R1からRNまで)
アグリゲーターは、問い合わせ結果を総合して、中央のモデルを学習させます。

より詳細な説明については、以下を参照して下さい。

https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fed-lea.html?audience=wdp

# 動作確認済み環境
動作は、Watson Studio上のJupyter Notebookで確認しています。
IBM Cloud上で必要なサービスはCloud Object Storage、Watson Studio、Watson Machine Learningのみです。すべて、クレジットカード登録なしのライトアカウントで利用できますので、このデモも、ライトアカウントで試してみることが可能です。

# サンプルnotebook
サンプルNotebookは以下の2つになります。

[Part1](https://github.com/makaishi2/sample-data/blob/master/notebooks/Federeted%20Learning%20デモ%20Part1.ipynb)
[Part2](https://github.com/makaishi2/sample-data/blob/master/notebooks/Feraration%20Learning%20デモ%20Part2.ipynb)

# 概要紹介
NotebookはPart1とPart2に分かれています。
**Part1**では、Federation Learningのための枠組みを作ります。
**Part2**では、アグリゲーターが各パーティと通信して、実際の学習を行います。
Federated Learning実施時には、IBM社が提供しているライブラリである、``ibmfl``が用いられています。


# 実習ステップ1
それでは、実習をはじめましょう。

## Notebookの読み込み
最初にWatson Studioのプロジェクト管理画面から「Projectに追加」->「Notebook」を選択します。
Notebook名入力画面になったら、下のように各項目を入力します。

① 「URLから」タブを選択
② 名前に「FL Part1」を入力
③ URL欄に以下のURLをコピペして入力
https://raw.githubusercontent.com/makaishi2/sample-data/master/notebooks/Federeted%20Learning%20%E3%83%87%E3%83%A2%20Part1.ipynb
④ 「作成」ボタンをクリック

![スクリーンショット 2021-01-06 12.54.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/78ed75d9-35b3-bd95-2222-07c069fa110e.png)

正しく読み込めると下のような画面になります。
![スクリーンショット 2021-01-06 12.55.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/4c3a4a12-5412-6adf-0b74-fba1c81ace1f.png)



## 共通設定
``IAM_APIKEY``、``CLOUD_USERID``、``PROJECT_ID``の3つのパラメータを設定します。

![スクリーンショット 2021-01-06 15.22.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/f0d9b336-2598-446d-b0f3-0d6d7703127c.png)


#### IAM_APIKEY
**IAM_APIKEY**は、下のリンクから「IBM Cloud APIキーの作成」ボタンをクリックして作成します。

https://cloud.ibm.com/iam/apikeys

#### CLOUD_USERID

**CLOUD_USERID**は、下のリンクから、アカウントオーナーのリンクをクリックします。

https://cloud.ibm.com/iam/users

下の管理画面で、右上の「**詳細**」ボタンをクリックします。

![スクリーンショット 2021-01-06 13.00.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/17bad32d-89d5-69e6-ae54-8ef2d206353e.png)

すると、下のように**IAM ID**が表示されるので、この値を用います。

![スクリーンショット 2021-01-06 13.00.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/34f4b41a-034e-84a4-efcf-068f0a40639c.png)

#### PROJECT_ID
NotebookのURLをテキストエディタに貼り付けます。このとき、赤枠で囲んだ部分がProject_IDになるので、このテキストをコピペします。

![スクリーンショット 2021-01-06 15.06.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/d7f38dfd-56fc-cda4-aa22-6c9373a24b5f.png)

## WML設定
Watson Machine Learningのサイトをダラスにしている場合、修正は不要です。

![スクリーンショット 2021-01-06 15.22.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/96e0f8af-6340-becf-0c12-133cba351a7c.png)


## COS設定
COSに関しては、資格情報取得の前に、COSにバケットを作るところから始める必要があります。
目的は違うのですが、ちょうど下記手順の１章がそのまま該当するので、この手順に従って下さい。

https://qiita.com/makaishi2/items/d2f5fa23cbc2255ab476#1-cos%E5%81%B4%E3%81%AE%E4%BD%9C%E6%A5%AD

これで、Notebook設定に必要な「**バケット名**(COS_BUCKET)」「**資格情報**(COS_ACCESS_KEY_IDとCOS_SECRET_ACCESS_KEY)」「**エンドポイントURL**(COS_ENDPOINT_URL)」のすべての情報が入手できるはずです。

![スクリーンショット 2021-01-06 15.22.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/78188048-05b3-3682-48e0-e6ba2472ea3f.png)

## Notebookの実行
これでNotebook実行に際して必要な事前準備はすべて完了です。
あとは、Notebook内の指示に従って、上から順にセルを実行して下さい。

一番下の方に「**4.1　トレーニングジョブのステータス取得**」というセルがあります。

![スクリーンショット 2021-01-06 15.27.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/2e8a87fa-aa3d-d8ba-2bdb-2179be52852b.png)

このセルは１分おきに繰り返し実行して、 最後、Statusが**accepting_parties**となるのを待ちます。

![スクリーンショット 2021-01-06 15.25.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/6fb9c867-39e1-edf8-bbe1-7f5702dee73c.png)

このセルが実行エラーになった場合は、上の設定のどこかに誤りがありますので、記事を参考に一つ一つ見直すようにして下さい。
COSのエンドポイントURLが間違えやすい箇所のようです。(回復力によってURLが別になる)

ステータスが正しく変わったら、下記の一番下のセルを実行し、出力結果をコピーしてテキストエディタなどに保存します。
この結果は、**Part 2**でそのまま利用することになります。

![スクリーンショット 2021-01-06 15.31.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/b21ca038-8bf6-d3d9-f7e5-d2f02606baac.png)


# 実習ステップ2

## Notebookの読み込み
Notebook読み込み手順はPart1とほぼ同じです。
Notebook名入力画面になったら、下のように各項目を入力します。

① 「URLから」タブを選択
② 名前に「FL Part2」を入力
③ URL欄に以下のURLをコピペして入力
https://raw.githubusercontent.com/makaishi2/sample-data/master/notebooks/Federeted%20Learning%20%E3%83%87%E3%83%A2%20Part2.ipynb
④ 「作成」ボタンをクリック

正しく読み込まれると、下のような画面になります。

![スクリーンショット 2021-01-06 16.09.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/a8be4c71-9530-128b-5f70-5e2ec4654dc4.png)


## セルの設定
Notebook上部の下記のセルを、Part1で取得した情報にまるごと置き換えます。

![スクリーンショット 2021-01-06 16.11.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/a3d0343d-b8e0-39a8-c88a-dfac39b51c82.png)

Part2は、これで設定作業は終わりです。

## Notebookの実行
あとは、上から順にNotebookを実行して下さい。
うまくいくと、次のような結果が得られるはずです。

#### 5.1の実行結果

![スクリーンショット 2021-01-06 16.06.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/4f02207e-5032-ab01-ac33-8c50c44c1664.png)

#### 5.2の実行結果

![スクリーンショット 2021-01-06 16.06.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/e6b27130-9ba1-61b0-668f-c3536311d55c.png)

(途中略)

一番下の結果例

![スクリーンショット 2021-01-06 16.06.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/aad68c29-db5e-fa18-b6c1-403ea62a0dcb.png)