본문 바로가기
연합학습

Flower 연합학습 프레임워크 설치 및 실행

by Kkiiki 2023. 10. 18.

 연합학습 (Federated Learning)이란 분산학습의 일종으로 중앙 서버가 사용자의 데이터를 수집하고 학습하는 중앙 학습 방식에서 벗어나 개별 사용자들이 직접 모델을 학습하고 중앙서버는 이를 결합 (Aggregation)하는 방식으로 학습을 진행하는 기술입니다. 개별 사용자들은 자신의 데이터를 서버에게 직접 전달하지 않기 때문에 자신의 데이터의 제 3자에 대한 노출을 방지할 수 있어 데이터 프라이버시 목적을 달성하기 용이합니다.

 

 연합학습은 일반적인 분산학습보다 학습 상황에 대한 조금 더 까다로운(?) 조건을 가정하며 그로 인한 학습 방식 및 결과에 대해 차이가 있다고 할 수 있습니다. 일반적인 분산학습의 목적은 여러 학습 자원 (e.g., GPU)를 사용하기 위해 중앙서버 통제하에 여러개의 노드 (물리적 서버 컴퓨터)가 학습을 진행하는 데 있습니다.

 

 반면 연합학습은 중앙서버의 통제를 받고 있지 않은 다수의 일반 사용자가 존재하는 상황에서의 협력적 학습을 달성하는 데 목적이 있습니다. 따라서 연합학습은 일반적인 분산학습 보다 높은 사용자 규모, 닞은 컴퓨팅 자원 (주로 모바일 단말), 불안정한 네트워크 상황, 불균형한 데이터 분포 (Non-I.I.D.) 상황을 가정합니다. 이와 같은 연합학습에 대한 정확한 정의 및 학습 방식은 연합학습의 대표적인 논문인 Communication-efficient learning of deep networks from decentralized data (McMahan, Brendan, et al.)를 참고해보세요.

 

 Flower: A Friendly Federated Learning Framework (이하 Flower)는 다중 프로세스 기반의 오픈소스 연합학습 프레임워크입니다.TensorFlow Federated , OpenFL 등 많은 오픈소스 연합학습 프레임워크 등이 있지만, 다수 노드에 다중 프로세스로 연합학습을 구현하는 것이 Flower가 가장 용이하다 싶어 Flower를 선택하였습니다.

 

Flower 메인 페이지: https://flower.dev/

Flower 깃허브: https://github.com/adap/flower

 

 설치 및 실행은 텐서플로우 버전의 예시코드를 기준으로 실행할 것이며, 2가지 방식으로 진행할 예정입니다. 첫 번째는 단일 프로세스에서 모든 클라이언트를 모두 실행하는 방식, 두 번째는 각 클라이언트를 개별 프로세스로 실행하는 방식입니다. 특히, 두 번째 실행 방식에서는 단일 GPU를 여러 클라이언트가 나누어 사용할 수 있도록 설정할 겁니다. 두 가지가 완료되면 이후 포스트에서는 다수 노드에서 다수 클라이언트를 실행하는 예시를 진행하겠습니다.

 

 

1. 단일 프로세스 실행 방식

 Flower의 기본적인 설치 및 실행 예시는 Flower Quickstart Tutorials에 매우 잘 나와있습니다. 그렇다할지라 파이썬 가상환경 설정, 관련 라이브러리, Tensorflow GPU 설정 등 설치 과정이 헷갈릴 수 있기 때문에 제 포스트에서는 아무것도 없는 서버 환경에서 Flower를 가장 쉽게 설치 및 실행하는 방법을 설명하고자 합니다. 

 Flower는 poetry를 사용하여 파이썬 가상환경을 제공합니다. 따라서 매우 설치 및 실행이 쉽습니다. 그런데 github의 README (https://github.com/adap/flower/tree/main/examples/quickstart-tensorflow) 에서는 poetry를 사용한 설치가 반영되어 있는데 (, 메인 페이지의 Quick Start (https://flower.dev/docs/framework/tutorial-quickstart-tensorflow.html)에서는 이 내용이 반영되어 있지 않더군요. 그러므로 저희는 Github 내용을 보고 "그대로" 진행합니다.

 

(0) 환경

저는 Ubuntu 22.04.3 LTS 환경에서 진행합니다.

 

(1) 설치

디렉토리에 아무 것도 없는 상태에서 시작합니다.

hsjin@abc1:~$ pwd
/home/hsjin
hsjin@abc1:~$ ls

먼저 Flower 코드를 다운로드합니다.

$ git clone --depth=1 https://github.com/adap/flower.git && mv flower/examples/quickstart-tensorflow . && rm -rf flower && cd quickstart-tensorflow

아래와 같이 다운로드가 됩니다.

hsjin@abc1:~/quickstart-tensorflow$ ls
client.py  pyproject.toml  README.md  requirements.txt  run.sh  server.py

poetry 가 설치 되어 있지 않은 경우 설치합니다.

$ sudo apt install python3-poetry

 

quickstart-tensorflow를 위한 poetry 가상 환경을 설정합니다.

반드시 quickstart-tensorflow 폴더 안에서 실행해야 합니다.

hsjin@abc1:~/quickstart-tensorflow$ poetry install
hsjin@abc1:~/quickstart-tensorflow$ poetry shell
Spawning shell within /home/hsjin/.cache/pypoetry/virtualenvs/quickstart-tensorflow-aRydVqJm-py3.10
hsjin@abc1:~/quickstart-tensorflow$ . /home/hsjin/.cache/pypoetry/virtualenvs/quickstart-tensorflow-aRydVqJm-py3.10/bin/activate
(quickstart-tensorflow-aRydVqJm-py3.10) hsjin@abc1:~/quickstart-tensorflow$

Shell 이 "quickstart-tensorflow-aRydVqJm-py3.10" 이라는 이름의 가상환경으로 접속된 것을 알 수 있습니다.

 

아래 명령어를 통해flower가 정상적으로 설치되었는지 확인 합니다.

$ poetry run python3 -c "import flwr"

import에 "No module named"와 같은 에러가 안 뜨면 flower가 정상적으로 설치 된 것입니다.

 

그 다음 터미널 실행에 필요한 dependency 들을 설치해 줍니다.

$ pip install -r requirements.txt

 

이제 Flower로 연합학습을 시작해줍니다.

터미널을 3개를 띄워 아래 명령어를 각각 입력해줍니다.

1개는 연합학습 서버, 2개는 연합학습 클라이언트입니다.

$ poetry run python3 server.py
$ poetry run python3 client.py
$ poetry run python3 client.py

 

Cifar-10 에 대한 연합학습이 진행됨을 알 수 있습니다.

 

Done! 

 

 

<참고>

1. McMahan, Brendan, et al. "Communication-efficient learning of deep networks from decentralized data." Artificial intelligence and statistics. PMLR, 2017.

2. Top 7 Open-Source Frameworks for Federated Learning: https://www.apheris.com/resources/blog/top-7-open-source-frameworks-for-federated-learning

3. Flower: https://flower.dev/

댓글