NVIDIA FLARE Workspace

NVIDIA FLARE maintains a workspace for keeping the FL apps and execution results for different jobs under folders with the name of the job_id.

The following is the workspace folder structure when running NVIDIA FLARE for the server and clients.

Server

/some_path_on_fl_server/fl_server_workspace_root/
    admin_audit.log
    log.txt
    startup/
        authorization.json
        fed_server.json
        log.config
        readme.txt
        rootCA.pem
        server_context.tenseal
        server.crt
        server.key
        signature.pkl
        start.sh
        stop_fl.sh
        sub_start.sh
    transfer/
    aefdb0a3-6fbb-4c53-a677-b6951d6845a6/
        app_server/
            ...
            config_fed_server.json
        fl_app.txt
        log.txt
    baaf8789-e83f-4863-b085-3ca95303e6bc/
        app_server/
            ...
            config/
                config_fed_server.json
        fl_app.txt
        log.txt

In each job_id folder, there is the app_server folder that contains the NVIDIA FLARE Application that is running on the server for this job_id.

The log.txt inside each job_id folder are the loggings of this job.

While the log.txt under server folder is the log for the server control process.

The startup folder contains the config and the scripts to start the FL server program.

Accessing server-side workspace

When the job is running, each job will have a corresponding workspace under the server folder.

When the job is finished, the server side workspace will be removed. The workspace will be saved into the JobStorage.

You can issue the download_job [JOB_ID] in the admin client to download the server side workspace.

The downloaded workspace will be in [DOWNLOAD_DIR]/[JOB_ID]/workspace/.

Note

If you issue download_job before the job is finished, the workspace folder will be empty.

Client

/some_path_on_fl_client/fl_client_workspace_root/
    log.txt
    startup/
        client_context.tenseal
        client.crt
        client.key
        fed_client.json
        log.config
        readme.txt
        rootCA.pem
        signature.pkl
        start.sh
        stop_fl.sh
        sub_start.sh
    transfer/
    aefdb0a3-6fbb-4c53-a677-b6951d6845a6/
        app_clientA/
            ...
            config_fed_client.json
        fl_app.txt
        log.txt
    baaf8789-e83f-4863-b085-3ca95303e6bc/
        app_clientA/
            ...
            config/
                config_fed_client.json
        fl_app.txt
        log.txt

In each job_id folder, there is the app_clientname folder that contains the NVIDIA FLARE Application that is running on the client for this job_id.

The log.txt inside each job_id folder are the loggings of this job.

While the log.txt under client folder is the log for the client control process.

The startup folder contains the config and the scripts to start the FL 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)
                        other_folder (app defined)

        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, job_id: str) -> str:
        return os.path.join(self.root_dir, WorkspaceConstants.WORKSPACE_PREFIX + str(job_id))

    def get_app_dir(self, job_id: str) -> str:
        return os.path.join(self.get_run_dir(job_id), WorkspaceConstants.APP_PREFIX + self.name)

    def get_app_config_dir(self, job_id: str) -> str:
        return os.path.join(self.get_app_dir(job_id), self.config_folder)

    def get_app_custom_dir(self, job_id: str) -> str:
        return os.path.join(self.get_app_dir(job_id), "custom")