차분 개인정보 보호 사용#

이 가이드에서는 Flower 프레임워크에서 차분 개인정보 보호 기능을 활용하는 방법을 설명합니다. 차분 개인정보 보호에 대해 아직 익숙하지 않은 경우 :doc:`explanation-differential-privacy`를 참조하세요.

경고

Flower의 차분 개인정보 보호는 현재 프리뷰 단계에 있습니다. 민감한 데이터가 있는 프로덕션 환경에서 이러한 기능을 사용할 계획이라면 언제든지 문의하여 요구 사항을 논의하고 이러한 기능을 가장 잘 사용하는 방법에 대한 안내를 받으세요.

중앙 차등 프라이버시#

This approach consists of two separate phases: clipping of the updates and adding noise to the aggregated model. For the clipping phase, Flower framework has made it possible to decide whether to perform clipping on the server side or the client side.

  • Server-side Clipping: 이 방식은 서버가 모든 클라이언트의 업데이트에 대해 균일한 클리핑을 적용하고 클리핑 값에 대한 통신 오버헤드를 줄일 수 있다는 장점이 있습니다. 하지만 모든 클라이언트에 대해 클리핑 작업을 수행해야 하기 때문에 서버의 계산 부하가 증가한다는 단점도 있습니다.

  • Client-side Clipping: 이 방식은 서버의 계산 오버헤드를 줄일 수 있다는 장점이 있습니다. 하지만 서버가 클리핑 프로세스에 대한 통제력이 떨어지기 때문에 centralized 제어가 부족하다는 단점도 있습니다.

서버 측 클리핑#

서버 측 클리핑이 있는 중앙 DP의 경우, 실제 Strategy 인스턴스를 감싸는 래퍼 역할을 하는 두 개의 Strategy 클래스가 있습니다(예: FedAvg). 두 개의 래퍼 클래스는 고정 및 적응형 클리핑을 위한 :code:`DifferentialPrivacyServerSideFixedClipping`과 :code:`DifferentialPrivacyServerSideAdaptiveClipping`입니다.

서버 측 클리핑

아래 코드 샘플은 FedAvg 전략이 DifferentialPrivacyServerSideFixedClipping 래퍼 클래스를 사용하여 서버 측 고정 클리핑을 사용할 수 있도록 합니다. 해당 입력 매개변수를 조정하여 :code:`DifferentialPrivacyServerSideAdaptiveClipping`과 동일한 접근 방식을 사용할 수 있습니다.

from flwr.server.strategy import DifferentialPrivacyClientSideFixedClipping

# Create the strategy
strategy = fl.server.strategy.FedAvg(...)

# Wrap the strategy with the DifferentialPrivacyServerSideFixedClipping wrapper
dp_strategy = DifferentialPrivacyServerSideFixedClipping(
    strategy,
    cfg.noise_multiplier,
    cfg.clipping_norm,
    cfg.num_sampled_clients,
)

클라이언트 측 클리핑#

클라이언트 측 클리핑이 있는 중앙 DP의 경우 서버는 각 라운드마다 선택한 클라이언트에 클리핑 값을 보냅니다. 클라이언트는 기존 Flower Mods`를 사용하여 클리핑을 수행할 있습니다. 고정 적응형 클라이언트 클리핑에는 가지 모드를 사용할 있습니다: :code:`fixedclipping_modadaptiveclipping_mod`와 해당 서버 래퍼 :code:`DifferentialPrivacyClientSideFixedClipping 및 :code:`DifferentialPrivacyClientSideAdaptiveClipping`이 있습니다.

클라이언트 측 클리핑

아래 코드 샘플은 FedAvg 전략이 클라이언트 측 고정 클리핑과 함께 차분 프라이버시를 사용할 수 있도록 DifferentialPrivacyClientSideFixedClipping 래퍼 클래스와 클라이언트에서 :code:`fixedclipping_mod`를 모두 사용하도록 합니다:

from flwr.server.strategy import DifferentialPrivacyClientSideFixedClipping

# Create the strategy
strategy = fl.server.strategy.FedAvg(...)

# Wrap the strategy with the DifferentialPrivacyClientSideFixedClipping wrapper
dp_strategy = DifferentialPrivacyClientSideFixedClipping(
    strategy,
    cfg.noise_multiplier,
    cfg.clipping_norm,
    cfg.num_sampled_clients,
)

서버 측 전략 래퍼 외에도 클라이언트 측 클리핑을 수행하려면 :code:`ClientApp`이 일치하는 :code:`fixedclipping_mod`를 구성해야 합니다:

from flwr.client.mod import fixedclipping_mod

# Add fixedclipping_mod to the client-side mods
app = fl.client.ClientApp(
    client_fn=client_fn,
    mods=[
        fixedclipping_mod,
    ]
)

로컬 차등 프라이버시#

로컬 차분 프라이버시(DP)를 활용하고 클라이언트 모델 파라미터를 서버로 전송하기 전에 노이즈를 추가하려면 `LocalDpMod`를 사용하면 됩니다. 클리핑 노멀 값, 감도, 엡실론, 델타 등의 하이퍼파라미터를 설정해야 합니다.

로컬 DP mod

다음은 :code:`LocalDpMod`를 사용하는 방법을 보여주는 코드 예시입니다:

from flwr.client.mod.localdp_mod import LocalDpMod

# Create an instance of the mod with the required params
local_dp_obj = LocalDpMod(
    cfg.clipping_norm, cfg.sensitivity, cfg.epsilon, cfg.delta
)
# Add local_dp_obj to the client-side mods

app = fl.client.ClientApp(
  client_fn=client_fn,
  mods=[local_dp_obj],
)

여러 개의 수정자를 사용할 때는 수정자, 특히 매개변수를 수정하는 수정자의 순서가 중요하다는 점에 유의하세요. 일반적으로 차분 프라이버시(DP) 수정자는 매개변수에서 가장 마지막에 작동해야 합니다.

Privacy Engines을 사용한 로컬 훈련#

클라이언트 측에서 로컬 모델을 훈련하는 동안 데이터 인스턴스 수준의 개인 정보 보호를 보장하려면 Opacus 및 TensorFlow Privacy와 같은 개인 정보 보호 엔진을 활용하는 것을 고려하세요. 이러한 엔진과 함께 Flower를 사용하는 예제는 Flower examples directory (Opacus, Tensorflow Privacy)를 참조하세요.