기본 제공 모드 사용¶
참고: 이 튜토리얼은 실험적인 기능을 다룹니다. 기능 및 인터페이스는 향후 버전에서 변경될 수 있습니다.
이 튜토리얼에서는 내장 모드를 활용하여 ``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``이 실행되면 목록에 제공된 순서대로 모드가 실행됩니다:
``example_mod_1``(가장 바깥쪽 mod)
example_mod_2
(다음 mod)Message handler(들어오는 ``Message``를 처리하고 나가는 ``Message``를 반환하는 핵심 함수)
``example_mod_2``(돌아가는 방법)
``example_mod_1``(돌아가는 방법에 가장 바깥쪽 모드)
각 mod는 다음 mod로 전달하기 전에 들어오는 ``Message``를 검사하고 수정할 기회가 있으며, 스택 위로 반환하기 전에 나가는 ``Message``도 마찬가지로 검사하고 수정할 수 있습니다.
결론¶
이 가이드를 따라 mods를 효과적으로 사용하여 ``ClientApp``의 기능을 향상시키는 방법을 배웠습니다. mods 순서는 매우 중요하며 입력과 출력이 처리되는 방식에 영향을 미친다는 점을 기억하세요.
Mods를 통해 더욱 강력하고 유연한 ``ClientApp``을 구축해 보세요!