HPE Swarm Learning 使い方

Posted on
Updated on
この記事は、最終更新日から 1 年以上経過しています。 情報が古い可能性があります。

2023/10/25 更新:

Swarm Learning は 現在 v2.1 がリリースされており、

しており、以下の手順のとおりにいかない可能性があるので、公式のドキュメントを参照いただくか、 HPE Japanのメンバーへのコンタクトを希望する旨、ご連絡いただければと思います。


前回 に引き続き、Swarm Learning の使い方をご紹介します。

この記事に登場する略語(SN や APLS など)の説明は前々回の記事をご参照ください。

チュートリアル Keras MNIST

このチュートリアルでは、MNIST をSwarm Learningで実行します。Deep LearningのライブラリとしてKerasを使用します。 実行するコードは、こちら から引用し、Swarm Learning上で動作するように修正したものです。 以下のような環境となっています。

Tutrial Keras MNIST

この記事のチュートリアルでは、特に断りがない限り、前回 Swarm Learning をインストールしたディレクトリ /opt/hpe/swarm-learning にて作業を行っています。

実運用においては、Swarm Learning がインストールされたディレクトリ /opt/hpe/swarm-learning ではなく、 一般ユーザーにて、操作できるディレクトリにて、作業を行うことが望ましいと思われます。

事前準備

  1. 学習に使用するデータセットをダウンロードします。
curl https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz \
-o examples/mnist/app-data/mnist.npz
  1. 一時的なワークスペース・ディレクトリを作成し、サンプルコードをコピーします。
mkdir workspace
cp -r examples/mnist workspace/
cp -r examples/utils/gen-cert workspace/mnist/
  1. Swarm Learningの各コンポーネントが相互に通信する際に使用するTLS証明書を作成します

ここでは、Swarm Learningに同梱されているツールでTLS証明書を生成しますが、 本番環境導入にあたっては、正規の情報に基づくTLS証明書を作成するのが良いと思われます。

./workspace/mnist/gen-cert -e mnist -i 1
./workspace/mnist/gen-cert -e mnist -i 2
  1. 作成したCA証明書を相互に交換します。
scp <host-2>:<PATH>workspace/mnist/cert/ca/capath/ca-2-cert.pem \
workspace/mnist/cert/ca/capath
scp <host-1>:<PATH>workspace/mnist/cert/ca/capath/ca-1-cert.pem \
workspace/mnist/cert/ca/capath
  1. Swarm Learning のコンポーネントが使用するDockerネットワークを作成します。
docker network create host-1-net
docker network create host-2-net
  1. Docker ボリュームを作成し、Swarm Learning のライブラリを格納します。

MLのDockerコンテナイメージをビルドする際に、このボリュームをマウントし、Swarm LearningライブラリをMLにインストールします。

docker volume create sl-cli-lib
docker container create --name helper -v sl-cli-lib:/data \
hub.myenterpriselicense.hpe.com/hpe_eval/swarm-learning/sn:1.0.0
docker cp -L lib/swarmlearning-client-py3-none-manylinux_2_24_x86_64.whl helper:/data
docker rm helper

SWOP Profile 設定

SWOPのProfileを確認・設定します。SWOPはProfileの内容に沿って、タスクの実行やSLの起動などを行います。 このチュートリアルでは、host-1swop1_profile.yaml を、host-2 は、 swop2_profile.yaml を使用します。

SWOP Profile

SWOPのProfileにて、以下の点を更新します。

主要な設定項目は以下となります。

      usrenvvars:
        - NODE_WEIGHTAGE: 80
      usrcontaineropts:
        - gpus: "all"
      usrcontaineropts:
        - gpus: "device=6,7"

その他、SWOP Profileで設定できる項目 (Schema) は、 docs/SWOP-profile-schema.yaml に記載されています。

SWOP Task 設定

SWOPが実行するTaskを確認・設定します。これらのファイルでSWOPが行うTaskの詳細を設定します。 これらのファイルは、SWCIから呼び出されるため、ファイルが格納されているディレクトリは swci のディレクトリとなります。

SWOP Task

SWOP Taskで設定できる項目 (Schema) は、 docs/SWOP-task-schema.yaml に記載されています。

Docker コンテナイメージビルド Task

SWOP Task MAKE_USER_CONTAINER

Dockerコンテナのビルドを行うタスクの設定です。

学習実行 Task

SWOP Task RUN_SWARM

学習を行うタスクです。

Docker イメージプル Task

SWOP Task PULL_IMAGE

Docker イメージをプルするTaskです。

ファイルダウンロード Task

SWOP Task MAKE_SWARM_USER_CONTENT

特定のURLからデータをダウンロード(解凍)する Task です。ダウンロード(解凍)したファイルはDocker のVolume に保存されます。 Dockerイメージのビルドや、学習に使用することを想定しています。

SWCI 実行処理設定

SWCI 起動時に実行する処理を設定します。

SWCI Init

SWCI コンテキスト

SWCI コンテキストは、文字列の識別子です。SWCI コマンドの実行先環境を識別します。 SWCIは、複数のコンテキストを作成できますが、操作が可能なアクティブなコンテキストは常に1つとなります。

SWCI コントラクト

SWCIコントラクトは、Swarm Learningの学習プロセスを制御するために使用されます。 これはブロックチェーンEthereumスマートコントラクトのインスタンスです。 CREATE CONTRACTコマンドなどを使用してブロックチェーンにデプロイされ、Swarm Learning Networkに登録されます。 SWCI コントラクトは、一度永続化されると、更新・削除することはできません。 コンテキストが作成されると、デフォルトのコントラクト defaultbb.cqdb.sml.hpe が合わせて作成されます。

SWCI タスクランナー

タスクランナーは、SWOPによるタスクの実行を調整するために使用されるEthereumスマートコントラクトのインスタンスです。 コンテキストが作成されると、デフォルトのタスクランナー defaulttaskbb.taskdb.sml.hpe が合わせて作成されます。

SWCI 設定概要

SN 起動

ブロックチェーンを構成するSNを起動します。

初めに、host-1 の SN (Sentinel Node) を起動します。

./scripts/bin/run-sn -d --rm --name=sn1 --network=host-1-net --host-ip=172.1.1.1 \
--sentinel --sn-p2p-port=30303 --sn-api-port=30304 \
--key=workspace/mnist/cert/sn-1-key.pem \
--cert=workspace/mnist/cert/sn-1-cert.pem \
--capath=workspace/mnist/cert/ca/capath \
--apls-ip=172.1.1.1

SN起動後、ログに以下の内容が出力されれば初期化完了となり、次のステップに進めます。数分程度を要します。

Starting SWARM-API-SERVER on port: 30304

Start SN

つづけて、残りの他のノードでSNを起動します。

./scripts/bin/run-sn -d --rm --name=sn2 --network=host-2-net --host-ip=172.2.2.2 \
--sentinel-ip=172.1.1.1 --sn-p2p-port=30303 --sn-api-port=30304 \
--key=workspace/mnist/cert/sn-2-key.pem \
--cert=workspace/mnist/cert/sn-2-cert.pem \
--capath=workspace/mnist/cert/ca/capath \
--apls-ip=172.1.1.1

SN起動後、ログに以下の内容が出力されれば初期化完了となり、次のステップに進めます。数分程度を要します。

Starting SWARM-API-SERVER on port: 30304

SWOP 起動

タスクの実行を管理するSWOPを起動します。起動時に、各システムそれぞれの状況に応じたSWOP Profileを指定します。

./scripts/bin/run-swop -d --rm --name=swop1 --network=host-1-net \
--usr-dir=workspace/mnist/swop --profile-file-name=swop1_profile.yaml \
--key=workspace/mnist/cert/swop-1-key.pem \
--cert=workspace/mnist/cert/swop-1-cert.pem \
--capath=workspace/mnist/cert/ca/capath \
-e http_proxy= -e https_proxy= --apls-ip=172.1.1.1
./scripts/bin/run-swop -d --rm --name=swop2 --network=host-2-net \
--usr-dir=workspace/mnist/swop --profile-file-name=swop2_profile.yaml \
--key=workspace/mnist/cert/swop-2-key.pem \
--cert=workspace/mnist/cert/swop-2-cert.pem \
--capath=workspace/mnist/cert/ca/capath \
-e http_proxy= -e https_proxy= --apls-ip=172.1.1.1

SWOPは起動に、ほとんど時間を必要としません。ログには、指定したProfileの内容と合わせて、以下のような内容が出力されます。

<前略> Start SWOP

SWCI 起動

タスクの実行を指示するSWCIを起動します。これにより、指定されたタスクが順次実行されます。

./scripts/bin/run-swci -ti --rm --name=swci1 --network=host-1-net \
--usr-dir=workspace/mnist/swci --init-script-name=swci-init \
--key=workspace/mnist/cert/swci-1-key.pem \
--cert=workspace/mnist/cert/swci-1-cert.pem \
--capath=workspace/mnist/cert/ca/capath \
-e http_proxy= -e https_proxy= --apls-ip=172.1.1.1

SWCIを実行すると、SWCIのプロンプトに対して、 swci-init ファイルの内容が順次実行されていく様子が確認できます。

Swarm Learning 停止

swarm-learning/bin/stop-swarm スクリプトを使用して、ホストシステム上で動作している すべての Swarm Network および Swarm Learning コンポーネントを停止します。 このスクリプトは、自システム内のコンポーネントのみが操作対象となります。各システムごとに停止処理を行う必要があります。

./scripts/bin/stop-swarm

Swarm Learning ライブラリ

ここでは、Tensorflow や PyTorch のコード内でどのようにSwarm Learning のライブラリを利用するかご紹介します。

Swarm Learning ライブラリには、SwarmCallback というカスタムコールバッククラスが実装されています。 SwarmCallbackは、同期間隔ごとに各SLとモデルパラメータを共有する操作を実行します。

Tensorflow (Keras)

TensorFlowベースのKerasプラットフォームでは、SwarmCallbackは Kerasのtf.keras.callbacks.Callbackクラスをベースにしています。

学習コード冒頭で、ライブラリをインポートします。

from swarmlearning.tf import SwarmCallback #for TensorFlow

SwarmCallback のインスタンスを作成します。

swarmCallback = SwarmCallback(
    syncFrequency=128,
    minPeers=MIN_PEERS,
    useAdaptiveSync=False,
    adsValData=(x_test, y_test),
    adsValBatchSize=8,
    checkinModelOnTrainEnd=snapshot,
    nodeWeightage=50,
)

Keras学習コード内のコールバックのリストにSwarmCallbackのインスタンスを渡します。クラスメソッドは自動的に呼び出されます。

model.fit(..., callbacks = [swarmCallback])

PyTorch

Kerasとは異なり、PyTorchには組み込みのCallbackクラスがありません。 そのため、PyTorchベースの学習コードでは、ユーザーがこのクラスのメソッドを呼び出す必要があります。

学習コード冒頭で、ライブラリをインポートします。

from swarmlearning.pyt import SwarmCallback #for PyTorch

SwarmCallback のインスタンスを作成します。

swarmCallback = SwarmCallback(
    syncFrequency=128,
    minPeers=MIN_PEERS,
    useAdaptiveSync=False,
    adsValData=testDs,
    adsValBatchSize=8,
    checkinModelOnTrainEnd=snapshot,
    nodeWeightage=50,
    model=model,
)

パラメータは、Tensorflow のときと基本的に同じです。一点、PyTorchでは、モデルのインスタンスを引数に指定する必要があります。

PyTorchの場合、クラスメソッドを学習の中で適宜、呼び出す必要があります。

swarmCallback.on_train_begin()
swarmCallback.on_batch_end()
swarmCallback.on_epoch_end(epoch)
swarmCallback.on_train_end()

まとめ

以上で Swarm Learning 使ってみた、の記事完結です。

その他の、Swarm Learning についての情報は、また別途、記事にしていけたらと思います。

その他の Swarm Learning の記事はこちら(に追加されていく予定)です。

参照