기본 제공 모드 사용#

참고: 이 튜토리얼은 실험적인 기능을 다룹니다. 기능 및 인터페이스는 향후 버전에서 변경될 수 있습니다.

이 튜토리얼에서는 내장 모드를 활용하여 ``ClientApp``의 동작을 보강하는 방법을 배우겠습니다. Mods(Modifiers라고도 함)를 사용하면 ``ClientApp``에서 작업이 처리되기 전과 후에 작업을 수행할 수 있습니다.

Mods란 무엇인가요?#

Mod는 ``ClientApp``을 감싸는 콜러블입니다. 들어오는 ``Message``와 그 결과로 나가는 ``Message``를 조작하거나 검사할 수 있습니다. ``Mod``의 시그니처는 다음과 같습니다:

ClientApp = Callable[[Message, Context], Message]
Mod = Callable[[Message, Context, ClientApp], Message]

일반적인 mod 함수는 다음과 같은 모습일 수 있습니다:

def example_mod(msg: Message, ctx: Context, nxt: ClientApp) -> Message:
    # Do something with incoming Message (or Context)
    # before passing to the inner ``ClientApp``
    msg = nxt(msg, ctx)
    # Do something with outgoing Message (or Context)
    # before returning
    return msg

Mods 사용#

``ClientApp``에서 mods를 사용하려면 다음 단계를 따르세요:

1. 필요한 mods를 가져옵니다#

먼저 사용하려는 기본 제공 mod를 가져옵니다:

import flwr as fl
from flwr.client.mod import example_mod_1, example_mod_2

2. 클라이언트 기능 정의#

mod(s)로 래핑할 클라이언트 함수(’client_fn)를 정의합니다:

def client_fn(cid):
    # Your client code goes here.
    return # your client

3. mods로 ``ClientApp``을 생성합니다#

ClientApp``을 생성하고 mods를 ``mods argument에 목록으로 전달합니다. mods를 제공하는 순서가 중요합니다:

app = fl.client.ClientApp(
    client_fn=client_fn,
    mods=[
        example_mod_1,  # Mod 1
        example_mod_2,  # Mod 2
    ]
)

실행 순서#

``ClientApp``이 실행되면 목록에 제공된 순서대로 모드가 실행됩니다:

  1. ``example_mod_1``(가장 바깥쪽 mod)

  2. example_mod_2 (다음 mod)

  3. Message handler(들어오는 ``Message``를 처리하고 나가는 ``Message``를 반환하는 핵심 함수)

  4. ``example_mod_2``(돌아가는 방법)

  5. ``example_mod_1``(돌아가는 방법에 가장 바깥쪽 모드)

각 mod는 다음 mod로 전달하기 전에 들어오는 ``Message``를 검사하고 수정할 기회가 있으며, 스택 위로 반환하기 전에 나가는 ``Message``도 마찬가지로 검사하고 수정할 수 있습니다.

결론#

이 가이드를 따라 mods를 효과적으로 사용하여 ``ClientApp``의 기능을 향상시키는 방법을 배웠습니다. mods 순서는 매우 중요하며 입력과 출력이 처리되는 방식에 영향을 미친다는 점을 기억하세요.

Mods를 통해 더욱 강력하고 유연한 ``ClientApp``을 구축해 보세요!