이 페이지는 Cloud Translation API를 통해 번역되었습니다.
Switch to English

연합 학습

개요

이 문서에서는 TensorFlow에서 구현 된 기존 기계 학습 모델을 사용한 연합 학습 또는 평가와 같은 연합 학습 작업을 용이하게하는 인터페이스를 소개합니다. 이러한 인터페이스를 설계 할 때 우리의 주요 목표는 내부에서 작동하는 방식에 대한 지식 없이도 통합 학습을 실험 할 수 있도록하고 다양한 기존 모델 및 데이터에 대해 구현 된 통합 학습 알고리즘을 평가하는 것이 었습니다. 플랫폼에 다시 기여할 것을 권장합니다. TFF는 확장 성과 구성 성을 염두에두고 설계되었으며 우리는 기여를 환영합니다. 우리는 당신이 무엇을 생각해 냈는지 보게되어 기쁩니다!

이 계층에서 제공하는 인터페이스는 다음 세 가지 주요 부분으로 구성됩니다.

  • 모델 . TFF와 함께 사용하기 위해 기존 모델을 래핑 할 수있는 클래스 및 도우미 함수입니다. 모델을 래핑하는 것은 단일 래핑 함수 (예 : tff.learning.from_keras_model )를 호출하거나 완전한 사용자 지정을 위해 tff.learning.Model 인터페이스의 하위 클래스를 정의하는 것처럼 간단 할 수 있습니다.

  • 연합 계산 빌더 . 기존 모델을 사용하여 훈련 또는 평가를위한 연합 계산을 구성하는 도우미 함수입니다.

  • 데이터 세트 . 통합 학습 시나리오 시뮬레이션에 사용하기 위해 Python에서 다운로드하고 액세스 할 수있는 미리 준비된 데이터 모음입니다. 연합 학습은 중앙 위치에서 간단히 다운로드 할 수없는 분산 데이터와 함께 사용하도록 설계되었지만 연구 및 개발 단계에서는 로컬에서 다운로드하고 조작 할 수있는 데이터를 사용하여 초기 실험을 수행하는 것이 편리합니다. 접근 방식에 새로운.

이러한 인터페이스는 주로에 정의되어 tff.learning 연구 데이터 세트에 그룹화 된 다른 시뮬레이션 관련 기능을 제외하고, 네임 스페이스 tff.simulation . 이 계층은 런타임 환경도 제공하는 Federated Core (FC) 에서 제공하는 하위 수준 인터페이스를 사용하여 구현됩니다.

계속하기 전에 구체적인 예를 사용하여 여기에 설명 된 대부분의 개념을 소개하는 이미지 분류텍스트 생성 에 대한 자습서를 먼저 검토하는 것이 좋습니다. TFF 작동 방식에 대해 더 자세히 알고 싶다면 연합 계산의 논리를 표현하는 데 사용하는 하위 수준 인터페이스에 대한 소개로 사용자 지정 알고리즘 자습서를 훑어보고 기존 구현을 연구 할 수 있습니다. tff.learning . tff.learning 인터페이스.

모델

아키텍처 가정

직렬화

TFF는 작성한 기계 학습 모델 코드가 다양한 기능을 가진 많은 이기종 클라이언트에서 실행될 수있는 다양한 분산 학습 시나리오를 지원하는 것을 목표로합니다. 스펙트럼의 한쪽 끝에서는 일부 애플리케이션에서 이러한 클라이언트가 강력한 데이터베이스 서버 일 수 있지만, 당사 플랫폼이 지원하려는 많은 중요한 용도에는 제한된 리소스가있는 모바일 및 임베디드 장치가 포함됩니다. 이러한 장치가 Python 런타임을 호스팅 할 수 있다고 가정 할 수 없습니다. 이 시점에서 우리가 가정 할 수있는 유일한 것은 로컬 TensorFlow 런타임을 호스팅 할 수 있다는 것입니다. 따라서 TFF에서 만드는 기본적인 아키텍처 가정은 모델 코드를 TensorFlow 그래프로 직렬화 할 수 있어야한다는 것입니다.

eager 모드 사용과 같은 최신 모범 사례에 따라 TF 코드를 계속 개발할 수 있습니다. 그러나 최종 코드는 직렬화 가능해야합니다 (예 : eager-mode 코드의 경우 tf.function 으로 래핑 될 수 있음). 이를 통해 실행 시간에 필요한 모든 Python 상태 또는 제어 흐름을 직렬화 할 수 있습니다 ( Autograph 의 도움으로 가능).

현재 TensorFlow는 eager-mode TensorFlow 직렬화 및 역 직렬화를 완전히 지원하지 않습니다. 따라서 TFF의 직렬화는 현재 TF 1.0 패턴을 따르며, 여기서 모든 코드는 TFF가 제어하는 tf.Graph 내부에 구성되어야합니다. 이는 현재 TFF가 이미 구성된 모델을 사용할 수 없음을 의미합니다. 대신, 모델 정의 로직은 tff.learning.Model 을 반환하는 tff.learning.Model 없는 함수로 tff.learning.Model 됩니다. 이 함수는 모델의 모든 구성 요소가 직렬화되었는지 확인하기 위해 TFF에 의해 호출됩니다. 또한 강력한 유형의 환경이므로 TFF에는 모델의 입력 유형 사양과 같은 약간의 추가 메타 데이터 가 필요합니다.

집합

대부분의 사용자는 Keras를 사용하여 모델을 구성 할 것을 강력히 권장합니다. 아래의 Keras 용 변환기 섹션을 참조하십시오. 이러한 래퍼는 모델 업데이트의 집계와 모델에 대해 정의 된 모든 메트릭을 자동으로 처리합니다. 그러나 일반 tff.learning.Model 대해 집계가 처리되는 방식을 이해하는 것이 여전히 유용 할 수 있습니다.

연합 학습에는 항상 로컬 온 디바이스 집계 및 교차 디바이스 (또는 연합) 집계라는 두 가지 이상의 집계 계층이 있습니다.

  • 로컬 집계 . 이 집계 수준은 개별 클라이언트가 소유 한 여러 배치의 예제에 대한 집계를 나타냅니다. 모델이 로컬에서 학습됨에 따라 순차적으로 진화하는 모델 매개 변수 (변수)와 모델이 로컬에서 다시 업데이트 할 통계 (예 : 평균 손실, 정확도 및 기타 메트릭) 모두에 적용됩니다. 각 개별 클라이언트의 로컬 데이터 스트림을 반복합니다.

    이 수준에서 집계를 수행하는 것은 모델 코드의 책임이며 표준 TensorFlow 구성을 사용하여 수행됩니다.

    일반적인 처리 구조는 다음과 같습니다.

    • 모델은 먼저 tf.Variable 구성하여 일괄 처리 수 또는 처리 된 예제 수, 일괄 처리 당 또는 예제 당 손실의 합계 등과 같은 집계를 보유합니다.

    • TFF는 클라이언트 데이터의 후속 배치에 대해 순차적으로 Model 에서 forward_pass 메소드를 여러 번 호출하여 부작용으로 다양한 집계를 보유하는 변수를 업데이트 할 수 있습니다.

    • 마지막으로 TFF는 모델에서 report_local_outputs 메서드를 호출하여 모델이 수집 한 모든 요약 통계를 클라이언트가 내보낼 수있는 간단한 메트릭 세트로 컴파일 할 수 있도록합니다. 예를 들어 모델 코드는 평균 손실 등을 내보내기 위해 처리 된 예제 수로 손실 합계를 나눌 수 있습니다.

  • 연합 집계 . 이 집계 수준은 시스템의 여러 클라이언트 (장치)에 대한 집계를 나타냅니다. 다시 말하지만, 이는 클라이언트 전체에서 평균화되는 모델 매개 변수 (변수)와 모델이 로컬 집계의 결과로 내 보낸 메트릭에 모두 적용됩니다.

    이 수준에서 집계를 수행하는 것은 TFF의 책임입니다. 그러나 모델 작성자는이 프로세스를 제어 할 수 있습니다 (자세한 내용은 아래 참조).

    일반적인 처리 구조는 다음과 같습니다.

    • 초기 모델 및 교육에 필요한 모든 매개 변수는 교육 또는 평가 라운드에 참여할 클라이언트의 하위 집합에 서버에 의해 배포됩니다.

    • 각 클라이언트에서 독립적으로 병렬로 모델 코드가 로컬 데이터 일괄 처리 스트림에서 반복적으로 호출되어 새로운 모델 매개 변수 세트 (학습시)와 위에서 설명한대로 새로운 로컬 메트릭 세트 (이것은 로컬 집합).

    • TFF는 분산 집계 프로토콜을 실행하여 시스템 전체에서 모델 매개 변수와 로컬로 내 보낸 메트릭을 누적하고 집계합니다. 이 로직은 모델의 federated_output_computation. 에서 TFF의 자체 연합 계산 언어 (TensorFlow가 아님)를 사용하여 선언적 방식으로 표현됩니다 federated_output_computation. 집계 API에 대한 자세한 내용은 사용자 지정 알고리즘 자습서를 참조하십시오.

추상 인터페이스

이 기본 생성자 + 메타 데이터 인터페이스는 다음과 같이 tff.learning.Model 인터페이스로 표시됩니다.

  • 생성자, forward_passreport_local_outputs 메소드는보고 할 모델 변수, 순방향 전달 및 통계를 report_local_outputs 구성해야합니다. 이러한 메서드로 구성된 TensorFlow는 위에서 설명한대로 직렬화 가능해야합니다.

  • input_spec 속성과 학습 가능, 학습 불가능 및 지역 변수의 하위 집합을 반환하는 3 개의 속성은 메타 데이터를 나타냅니다. TFF는이 정보를 사용하여 모델의 일부를 연합 최적화 알고리즘에 연결하는 방법을 결정하고 내부 유형 서명을 정의하여 구성된 시스템의 정확성을 확인하는 데 도움을줍니다 (따라서 모델이 무엇과 일치하지 않는 데이터에 대해 인스턴스화 될 수 없음). 모델은 소비하도록 설계되었습니다).

또한 추상 인터페이스 tff.learning.Model 은 앞에서 언급 한 report_local_outputs 속성과 함께 요약 통계 집계 프로세스를 제어 할 수있는 federated_output_computation 속성을 노출합니다.

당신은 당신의 자신의 사용자 정의 정의하는 방법의 예를 찾을 수 있습니다 tf.learning.Model 우리의 두 번째 부분에서 이미지 분류 뿐만 아니라 우리가 테스트에 사용할 예제 모델, 튜토리얼 model_examples.py .

Keras 용 변환기

거의 TFF에 필요한 것 모든 정보를 호출하여 얻을 수있다 tf.keras 당신이 Keras 모델이 그렇다면, 당신이 신뢰할 수있는, 인터페이스를 tff.learning.from_keras_model 구축 tff.learning.Model .

TFF는 여전히 다음과 같은 인수가없는 모델 함수 인 생성자를 제공하기를 원합니다.

def model_fn():
  keras_model = ...
  return tff.learning.from_keras_model(keras_model, sample_batch, loss=...)

모델 자체 외에도 TFF가 모델 입력의 유형과 모양을 결정하는 데 사용하는 샘플 배치 데이터를 제공합니다. 이렇게하면 TFF가 클라이언트 장치에 실제로 존재할 데이터에 대한 모델을 적절하게 인스턴스화 할 수 있습니다 (이 데이터는 직렬화 할 TensorFlow를 구성 할 때 일반적으로 사용할 수 없다고 가정하기 때문입니다).

Keras 래퍼의 사용은 이미지 분류텍스트 생성 자습서에 설명되어 있습니다.

통합 컴퓨팅 빌더

tff.learning 패키지는 학습 관련 작업을 수행하는 tff.Computation 대한 여러 빌더를 제공합니다. 우리는 그러한 계산의 집합이 미래에 확장 될 것으로 기대합니다.

아키텍처 가정

실행

연합 계산을 실행하는 데는 두 가지 별개의 단계가 있습니다.

  • 컴파일 : TFF는 먼저 연합 학습 알고리즘을 전체 분산 계산의 추상 직렬화 된 표현으로 컴파일합니다 . 이것은 TensorFlow 직렬화가 발생하지만 더 효율적인 실행을 지원하기 위해 다른 변환이 발생할 수 있습니다. 우리는 컴파일러에 의해 생성 된 직렬화 된 표현을 연합 계산이라고 합니다.

  • TFF는 이러한 계산을 수행 할 수있는 방법을 제공합니다 실행합니다. 현재 실행은 로컬 시뮬레이션을 통해서만 지원됩니다 (예 : 시뮬레이션 된 분산 데이터를 사용하는 노트북에서).

연합 모델 평균 또는 연합 평가를 사용하는 훈련 알고리즘과 같이 TFF의 연합 학습 API에 의해 생성 된 연합 계산에는 다음과 같은 여러 요소가 포함됩니다.

  • 모델 코드의 직렬화 된 형식과 모델의 학습 / 평가 루프를 구동하기 위해 Federated Learning 프레임 워크에서 생성 한 추가 TensorFlow 코드 (예 : 최적화 프로그램 구성, 모델 업데이트 적용, tf.data.Dataset s 반복 및 메트릭 계산) 서버에 집계 된 업데이트를 적용하는 것 등).

  • 클라이언트서버 간의 통신에 대한 선언적 사양 (일반적으로 클라이언트 장치를 통한 다양한 집계 형태 및 서버에서 모든 클라이언트로 브로드 캐스팅 ) 및이 분산 통신이 클라이언트 로컬 또는 서버 로컬 실행과 인터리브되는 방법 TensorFlow 코드의.

이 직렬화 된 형식으로 표현 된 통합 계산 은 Python과는 별개의 플랫폼 독립적 인 내부 언어로 표현되지만, 통합 학습 API를 사용하기 위해이 표현의 세부 사항에 대해 걱정할 필요가 없습니다. 계산은 Python 코드에서 tff.Computation 유형의 객체로 표현되며 대부분의 경우 불투명 한 Python callable 처리 할 수 ​​있습니다.

자습서에서는 이러한 통합 계산을 마치 일반 Python 함수 인 것처럼 호출하여 로컬에서 실행합니다. 그러나 TFF는 실행 환경의 대부분의 측면에 구애받지 않는 방식으로 연합 계산을 표현하도록 설계되어 잠재적으로 Android 실행하는 기기 그룹이나 데이터 센터의 클러스터에 배포 할 수 있습니다. 다시 말하지만 이것의 주요 결과는 직렬화 에 대한 강력한 가정입니다. 특히 아래에 설명 된 build_... 메소드 중 하나를 호출하면 계산이 완전히 직렬화됩니다.

모델링 상태

TFF는 함수형 프로그래밍 환경이지만 연합 학습에서 관심있는 많은 프로세스는 상태 저장입니다. 예를 들어, 연합 모델 평균화의 여러 라운드를 포함하는 훈련 루프는 상태 저장 프로세스 로 분류 할 수있는 예입니다. 이 프로세스에서 라운드에서 라운드로 진화하는 상태에는 훈련중인 모델 매개 변수 세트와 최적화 기와 관련된 추가 상태 (예 : 운동량 벡터)가 포함됩니다.

TFF가 작동하기 때문에 상태 저장 프로세스는 현재 상태를 입력으로 받아들이고 업데이트 된 상태를 출력으로 제공하는 계산으로 TFF에서 모델링됩니다. 상태 저장 프로세스를 완전히 정의하려면 초기 상태의 출처를 지정해야합니다 (그렇지 않으면 프로세스를 부트 스트랩 할 수 없습니다). 이것은 도우미 클래스 tff.templates.IterativeProcess 의 정의에서 캡처되며, 2 개의 속성 initializenext 각각 초기화 및 반복에 해당합니다.

사용 가능한 빌더

현재 TFF는 연합 교육 및 평가를위한 연합 계산을 생성하는 두 가지 빌더 함수를 제공합니다.

데이터 세트

아키텍처 가정

클라이언트 선택

전형적인 연합 학습 시나리오에서, 우리는 단지 작은 부분이 어떤 주어진 순간에 교육 활성화 및 사용할 수 있습니다있는 클라이언트 장치의 수백만의 잠재적으로 수백의 많은 인구를 가지고 (예를 들어, 이것은이다 클라이언트에 제한 될 수 있습니다 측정 네트워크가 아닌 전원에 연결되어 있거나 유휴 상태 임). 일반적으로 교육 또는 평가에 참여할 수있는 클라이언트 집합은 개발자가 제어 할 수 없습니다. 또한 수백만 명의 클라이언트를 조정하는 것은 비현실적이므로 일반적인 교육 또는 평가 라운드에는 사용 가능한 클라이언트의 일부만 포함되며 이는 무작위샘플링 될 수 있습니다.

이것의 핵심 결과는 연합 된 계산이 설계 상 정확한 참여자 집합을 알 수없는 방식으로 표현된다는 것입니다. 모든 처리는 익명 클라이언트 의 추상 그룹에 대한 집계 작업으로 표현되며 해당 그룹은 교육 라운드마다 다를 수 있습니다. 따라서 구체적인 참가자에 대한 계산의 실제 바인딩, 따라서 계산에 입력되는 구체적인 데이터에 대한 실제 바인딩은 계산 자체 외부에서 모델링됩니다.

통합 학습 코드의 현실적인 배포를 시뮬레이션하기 위해 일반적으로 다음과 같은 학습 루프를 작성합니다.

trainer = tff.learning.build_federated_averaging_process(...)
state = trainer.initialize()
federated_training_data = ...

def sample(federate_data):
  return ...

while True:
  data_for_this_round = sample(federated_training_data)
  state, metrics = trainer.next(state, data_for_this_round)

이를 용이하게하기 위해 시뮬레이션에서 TFF를 사용할 때 연합 데이터는 참여하는 클라이언트 장치 당 하나의 요소를 사용하여 해당 장치의 로컬 tf.data.Dataset 을 나타내는 Python list 허용됩니다.

추상 인터페이스

시뮬레이션 된 연합 데이터 세트 처리를 표준화하기 위해 TFF는 클라이언트 세트를 열거하고 특정 클라이언트의 데이터를 포함하는 tf.data.Dataset 을 구성 할 수있는 추상 인터페이스 tff.simulation.ClientData 제공합니다. 이러한 tf.data.Dataset 은 eager 모드에서 생성 된 연합 계산에 대한 입력으로 직접 제공 될 수 있습니다.

클라이언트 ID에 액세스 할 수있는 기능은 시뮬레이션에 사용하기 위해 데이터 세트에서만 제공되는 기능입니다. 여기서 클라이언트의 특정 하위 집합에서 데이터를 훈련하는 기능이 필요할 수 있습니다 (예 : 다른 사용자의 일주 가용성을 시뮬레이션하기 위해). 클라이언트 유형). 컴파일 된 계산 및 기본 런타임에는 클라이언트 ID 개념이 포함 되지 않습니다 . 특정 클라이언트 하위 집합의 데이터가 입력으로 선택되면 (예 : tff.templates.IterativeProcess.next 호출) 클라이언트 ID가 더 이상 여기에 표시되지 않습니다.

사용 가능한 데이터 세트

시뮬레이션에 사용하기 위해 tff.simulation.ClientData 인터페이스를 구현하는 데이터 세트를위한 네임 스페이스 tff.simulation.datasets 를 전용하고, 이미지 분류텍스트 생성 튜토리얼을 지원하기 위해 2 개의 데이터 세트로 시드했습니다. 우리는 귀하가 자신의 데이터 세트를 플랫폼에 기여하도록 권장하고 싶습니다.