NVIDIA FLARE Workspace¶
NVIDIA FLARE maintains a workspace for keeping the FL apps and execution results of different run_number
experiments. The following is the workspace folder structure when running NVIDIA FLARE for the server and clients.
Server¶
server/
run_1/
app_server/
...
config_fed_server.json
fl_app.txt
run_2/
app_server/
...
config/
config_fed_server.json
fl_app.txt
startup/
fed_server.json
log.config
start.sh
sub_start.sh
Client¶
clientA/
run_1/
app_clientA/
...
config_fed_client.json
fl_app.txt
run_2/
app_clientA/
...
config/
config_fed_client.json
fl_app.txt
startup/
fed_client.json
log.config
start.sh
sub_start.sh
The FL application and run data from different run_number are kept in the separate run_N folders for each run
number N. Under the run_N folder, the app_server folder holds the FL application content of the server. The
app_clientName folder holds the FL application content of the client. The config_fed_server.json and
config_fed_client.json may be in the root folder of the FL App, or in a sub-folder (for example: config) of the FL App.
The fl_app.txt indicates which FL App current run_number is using. The deploy_app command will deploy the
corresponding FL app into the current run_number. If the app_server or app_clientName folder
already exists, all the contents within that folder will be wiped out and deployed a new FL application. If you would
like to keep some execution results within the same run_number, you can keep them in the root directory of the
run_N folder.
The startup folder contains the config and the scripts to start the FL server and client program.
The Workspace object is available through the FLContext. From the Workspace,
you can access each folder location accordingly:
workspace = fl_ctx.get_prop(FLContextKey.WORKSPACE_OBJECT)
Args:
root_dir: root directory of the workspace
name: name of the workspace
config_folder: where to find required config inside an app
"""
self.root_dir = root_dir
self.name = name
self.config_folder = config_folder
def get_startup_kit_dir(self) -> str:
return os.path.join(self.root_dir, "startup")
def get_root_dir(self) -> str:
return self.root_dir
def get_run_dir(self, run_num: int) -> str:
return os.path.join(self.root_dir, "run_" + str(run_num))
def get_app_dir(self, run_num: int) -> str:
return os.path.join(self.get_run_dir(run_num), "app_" + self.name)
def get_app_config_dir(self, run_num) -> str:
return os.path.join(self.get_app_dir(run_num), self.config_folder)
def get_app_custom_dir(self, run_num) -> str:
return os.path.join(self.get_app_dir(run_num), "custom")