> For the complete documentation index, see [llms.txt](https://docs.rhinofcp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.rhinofcp.com/rhino-sdk/running-nvflare-code-using-the-rhino-sdk.md).

# Running NVFlare Code using the Rhino SDK

This article explains how to run NVFlare Code using the Rhino SDK.

{% hint style="info" %}
If you want to know how to run NVFlare Code using the FCP UI, see [Creating and Running NVFlare Code and Running Inference](/creating-and-running-code-objects/creating-and-running-nvflare-code-and-running-inference.md).
{% endhint %}

#### Prerequisites

Before starting this process, you should have already:

1. Created a Project using the Rhino SDK or UI
2. Created 1 or more Datasets using the Rhino SDK or UI
3. Created a Code Object using the Rhino SDK or UI

{% hint style="info" %}
Remember to change all lines with `CHANGE_ME` comments above them in all the blocks below!
{% endhint %}

#### Import your Python Dependencies

```python
import rhino_health as rh
from rhino_health.lib.endpoints.code.code_object_dataclass import (
    CodeObject,
    ModelTrainInput
)
from rhino_health.lib.endpoints.code_run.code_run_dataclass import (
    CodeRunStatus
)
import getpass
```

#### Log into the Rhino SDK using your FCP Credentials

Your username will be the email address you log into the Rhino FCP platform with.

```python
print("Logging In")

# CHANGE_ME: MY_USERNAME
my_username = "MY_USERNAME"

session = rh.login(username=my_username, password=getpass.getpass())
print("Logged In")
```

#### Get Supporting FCP Information Needed to Run Your Code

At this point, you will need the name of your Project, any Dataset's name you would like to use as input and your previously created Code Object's name. You can also retrieve each object's UUID by following the instructions here: [Frequently Asked Questions (FAQs)](/frequently-asked-questions/frequently-asked-questions-faqs.md)

```python

# CHANGE_ME: YOUR_FCP_PROJECT_NAME
project = session.project.get_project_by_name('YOUR_FCP_PROJECT_NAME')

# CHANGE_ME: DATASET_NAME_1 & DATASET_NAME_2 & Possibly Version Number too
input_dataset1 = session.dataset.get_dataset_by_name("DATASET_NAME_1", project_uid=project.uid, version=1)
input_dataset2 = session.dataset.get_dataset_by_name("DATASET_NAME_2", project_uid=project.uid, version=1)

# Repeat the above for as many Datasets you would like to run as input to your Code

# CHANGE_ME: DATASET_NAME_3 & DATASET_NAME_4 & Possibly Version Number too
validation_dataset1 = session.dataset.get_dataset_by_name("DATASET_NAME_3", project_uid=project.uid, version=1)
validation_dataset2 = session.dataset.get_dataset_by_name("DATASET_NAME_4", project_uid=project.uid, version=1)

# Repeat the above for as many Datasets you would like to run as input to your Code

# CHANGE_ME: CODE_OBJECT_NAME & Possibly Version Number too
code_object = session.code.get_code_object_by_name("CODE_OBJECT_NAME:, project_uid=project.uid, version=1)
```

#### Training & Validating Your Model

To run your model you will need to supply the Code Object with the input Datasets you would like to train the model with, validation Datasets you would like to validate the newly trained model with, configurations for both the federated server and clients whether you are simulating federated learning, a timeout and a validation Dataset names suffix. The suffix will be appended to each validation Dataset name so you can view the results of the model validation once the output has been re-imported into the system as a Dataset.

```python
code_object_params = ModelTrainInput(
  code_object_uid = code_object.uid,

  # CHANGE_ME: Add/Delete Dataset variables based on how many you want as input
  input_dataset_uids = [dataset1.uid, dataset2.uid],

  # CHANGE_ME: Add/Delete Dataset variables based on how many you want as input
  validation_dataset_uids = [dataset3.uid, dataset4.uid],

  # CHANGE_ME: OUTPUT_SUFFIX
  validation_dataset_inference_suffix = "OUTPUT_SUFFIX",

  # CHANGE_ME: Set to Trie to run simulated federated learning on the same Rhino Client by treating each Dataset as a site
  simulate_federated_learning: False,

  # CHANGE_ME: CONFIG_FED_SERVER - a string of valid JSON
  config_fed_server: "CONFIG_FED_SERVER",

  # CHANGE_ME: CONFIG_FED_CLIENT - a string of valid JSON
  config_fed_client: "CONFIG_FED_CLIENT",

  # CHANGE_ME: 900 - Set to whatever number of seconds you would like your code to timeout after
  timeout_seconds: 900,

  secrets_fed_server: "", # Optional - The secrets for the federated server
  secrets_fed_client: "" # Optional - The secrets for the federated client
)
model_run = session.code.train_model(code_object_params)
run_result = model_run.wait_for_completion()

print("Finished running Training & Validation")
print(f"Result status is '{run_result.status.value}', errors={run_result.result_info.get('errors') if run_result.result_info else None}")
if run_result.status.value == CodeRunStatus.COMPLETED:
print("Saving Model Parameters")
  run_result.save_model_params("/rhino_data/model_parameters.pt
```

**Getting Help**

If you have received an error or run into any issues throughout the process, please reach out to <support@rhinohealth.com> for more assistance.
