Infrastructure Setup
At Sage, we generally provision an EC2 Linux instance for a Challenge that leverages SynapseWorkflowOrchestrator to run CWL workflows. These workflows will be responsible for evaluating and scoring submissions (see model-to-data-challenge-workflow GitHub for an example workflow). If Sage is responsible for the cloud compute services, please give a general estimate of the computing power (memory, volume) needed. We can also help with the estimates if you are unsure.
What Can Affect the Computing Power
By default, up to ten submissions can be evaluated concurrently, though this number can be increased or decreased accordingly within the orchestrator's .env file. Generally, the more submissions you want to run concurrently, the more power will be required of the instance.
Example
Let’s say a submission file that is very large and/or complex will require up to 10GB of memory for evaluation. If a max of four submissions should be run at the same time, then an instance of at least 40GB memory will be required (give or take some extra memory for system processes as well), whereas ten concurrent submissions would require at least 100GB.
The volume of the instance will be dependent on variables such as the size of the input files and the generated output files. If running a model-to-data challenge, Docker images should also be taken into account. On average, participants will create Docker images that are around 2-4 GB in size, though some have reached up to >10 GB. (When this happens, we do encourage participants to revisit their Dockerfile and source code to ensure they are following best practices, as >10 GB is a bit high).
Sensitive Data
If data is sensitive and cannot leave the external site or data provider, please provide a remote server with (ideally) the following:
Support for Docker and, if possible,
docker-compose
If Docker is not allowed, then support for Singularity and Java 8 is a must
SynapseWorkflowOrchestrator repository
If Sage is not allowed access to the server, then it is the external site’s responsibility to get the Orchestrator running in whatever environment chosen. If Docker is not supported by the system, please let us know as we do have solutions for workarounds (e.g. using Java to execute, etc.).
Typical Infrastructure Setup Steps
1. Create a workflow infrastructure GitHub repository for the Challenge. We have created two templates in Sage-Bionetworks-Challenges that you may use as a starting point. The READMEs outline what will need to be updated within the scripts, but we will return to this later in Step 10.
a. data-to-model-challenge-workflow (submission type: prediction files)
b. model-to-data-challenge-workflow (submission type: Docker images)
2. Create the Challenge site on Synapse. This can easily be done with challengeutils
:
challengeutils create-challenge "challenge_name"
This command will create two Synapse Projects: one staging site and one live site. You may think of them as development and production, in that all edits must be done in the staging site, NOT live. Changes to the live site will instead be synced over with challengeutils
' mirror-wiki
(more on this under Update the Challenge).
Note: at first, the live site will be just one page where a general overview about the Challenge is provided. There will also be a pre-register button that Synapse users can click on if they are interested in the upcoming Challenge:
For the initial deployment of the staging site to live, use synapseutils' copyWiki
command, NOT mirror-wiki
(more on this under Launch the Challenge).
create-challenge
will also create four Synapse Teams for the Challenge: * Preregistrants, * Participants, * Organizers, and * Admin, where * is the Challenge name. Add users to the Organizers and Admin teams as needed.
3. On the live site, go to the CHALLENGE tab and create as many Evaluation Queues as needed, e.g. one per sub-challenge, etc. by clicking on Challenge Tools > Create Evaluation Queue. By default, create-challenge
will create an Evaluation Queue for writeups, which you will already see listed here.
Important: the 7-digits in the parentheses following each Evaluation Queue name is its evaluation IDs, e.g.
You will need these IDs later for Step 9, so make note of them.
4. While still on the live site, go to the FILES tab and create a new Folder called "Logs" by clicking on Files Tools > Add New Folder.
Important: this will be where the participants' submission logs and prediction files are uploaded, so make note of its Synapse ID for later usage in Step 9.
5. On the staging site, go to the FILES tab and create a new File by clicking on Files Tools > Upload or Link to a File > Link to URL.
For "URL", enter the link address to the zipped download of the workflow infrastructure repository. You may get this address by going to the repository and clicking on Code > right-clicking Download Zip > Copy Link Address:
Name the File whatever you like (we generally use "workflow"), then hit Save.
Important: this File will be what links the Evaluation Queue to the orchestrator, so make note of its Synapse ID for later usage in Step 9.
6. Add an Annotation to the File called ROOT_TEMPLATE by clicking on Files Tools > Annotations > Edit. The "Value" will be the path to the workflow script, written as: {infrastructure workflow repo}-{branch}/path/to/workflow.cwl
For example, this is the path to workflow.cwl
of the model-to-data template repo: model-to-data-challenge-workflow-main/workflow.cwl
Important: the ROOT_TEMPLATE annotation is what the orchestrator uses to determine which file among the repo is the workflow script.
7. Create a cloud compute environment with the required memory and volume specifications. Once it spins up, log into the instance and clone the orchestrator:
git clone https://github.com/Sage-Bionetworks/SynapseWorkflowOrchestrator.git
Follow the "Setting up linux environment" instructions in the README to install and run Docker, as well as docker-compose
.
8. While still on the instance, change directories to SynapseWorkflowOrchestrator/
and create a copy of the .envTemplate
file as .env
(or simply rename it to .env
):
cd SynapseWorkflowOrchestrator/ cp .envTemplate .env
9. Open .env
and enter values for the following property variables:
Property | Description | Example |
| Synapse credentials under which the orchestrator will run. The provided user must have access to the Evaluation Queue(s) being serviced. |
|
| API key for This can be found under My Dashboard > Settings. |
|
| Synapse ID for "Logs" Folder. Use the Synapse ID from Step 4. |
|
| JSON map of evaluation IDs to the workflow repo archive, where the key is the evaluation ID and the value is the link address to the archive. Use the evaluation IDs from Step 3 as the key(s) and the Synapse ID from Step 5 as the value. |
|
Other properties may also be updated if desired, e.g. SUBMITTER_NOTIFICATION_MASK
, SHARE_RESULTS_IMMEDIATELY
, MAX_CONCURRENT_WORKFLOWS
, etc. Refer to the "Running the Orchestrator with Docker containers" notes in the README for more details.
10. Return to the workflow infrastructure repository and clone it onto your local machine. Open the repo in your editor of choice and make the following edits to the scripts:
data-to-model template:
Script | What to Edit | Required TODO? |
| Update |
|
Set |
| |
Add metrics and scores to |
| |
| Update the base image if the validation code is not Python |
|
Remove the sample validation code and replace with validation code for the Challenge |
| |
| Update the base image if the validation code is not Python |
|
Remove the sample scoring code and replace with scoring code for the Challenge |
|
model-to-data template:
Script | What to Edit | Required TODO? |
| Provide the admin user ID or admin team ID for (2 steps: |
|
Update |
| |
Set (2 steps: |
| |
Provide the absolute path to the data directory, denoted as |
| |
Set |
| |
Add metrics and scores to |
| |
| Update the base image if the validation code is not Python |
|
Remove the sample validation code and replace with validation code for the Challenge |
| |
| Update the base image if the validation code is not Python |
|
Remove the sample scoring code and replace with scoring code for the Challenge |
|
Push the changes up to GitHub when done.
11. On the instance, change directories to SynapseWorkflowOrchestrator/
and kick-start the orchestrator with:docker-compose up
To have it run in the background, add the -d
flag (for detached mode):
docker-compose up -d
Note: it may be helpful to not run the orchestrator in detached mode at first, so that you will be made aware of any errors with the orchestrator setup right away.
If successful, the orchestrator will continuously monitor the Evaluation Queues specified by EVALUATION_TEMPLATES
for submissions with the status, RECEIVED. When it encounters a RECEIVED submission, it will run the workflow as specified by ROOT_TEMPLATE and update the submission status from RECEIVED to EVALUATION_IN_PROGRESS. The orchestrator will also upload logs and prediction files to the Folder as specified by WORKFLOW_OUTPUT_ROOT_ENTITY_ID
. The Folder will be structured like this:
Logs
├── submitteridA
│ ├── submission01
│ │ └── submission01.zip
│ ├── submission02
│ │ └── submission02.zip
│ ...
│
├── submitteridA_LOCKED
│ ├── submission01
│ │ └── predictions.csv
│ ├── submission02
│ │ └── predictions.csv
│ ...
│
...
If an error is encountered during any of the workflow steps, the orchestrator will update the submission status to INVALID and the workflow will stop. If, instead, the workflow finishes to completion, the orchestrator will update the submission status to ACCEPTED. Depending on how the workflow is set up (configured by step 10), participants may periodically be notified by email of their submission's progress.
For a visual reference, a diagram of the orchestrator and its interactions with Synapse is provided below:
Display a Submissions Dashboard (optional)
12. (Optional) Go to the staging site and click on the TABLES tab. Create a new Submission View by clicking on Table Tools > Add Submission View. Under "Scope", add the Evaluation Queue(s) you are interested in monitoring (you may add more than one), then click Next. On the next screen, select which information to display, then hit Save. A Synapse table of the submissions and their metadata is now available for viewing and querying.
Changes to the information displayed can be edited by going to the Submission View, then clicking on Submission View Tools > Show Submission View Schema > Edit Schema.
Launch the Challenge (one-time only)
13. On the live site, go to the CHALLENGE tab and share the appropriate Evaluation Queues with the Participants team, giving them "Can submit" permissions.
14. Use the copyWiki
command provided by synapseutils to copy over all pages from the staging site to the live site. When using copyWiki
, it is important to also specify the destinationSubPageId
parameter. This ID can be found in the URL of the live site, where it is the integer following .../wiki/
, e.g.https://www.synapse.org/#!Synapse:syn123/wiki/123456
Example Script
import synapseclient import synapseutils syn = synapseclient.login() synapseutils.copyWiki( syn, "syn1234", # Synapse ID of staging site destinationId="syn2345", # Synapse ID of live site destinationSubPageId=999999 # ID following ../wiki/ of live site URL )
Important!! After the initial copying, all changes to the live site should now be synced over with mirror-wiki
; DO NOT use copyWiki
again. More on updating the Wikis under Update the Challenge.
Stop the Orchestrator
15. On the instance, enter: Ctrl + C
followed by:
docker-compose down
If you are running the orchestrator in the background, skip the first step and simply enter:
docker-compose down
Note: docker-compose
must be run in the SynapseWorkflowOrchestrator/
directory. If you are not already in that directory, change directories first.
Note that if the Challenge is currently active but you need to stop the orchestrator (e.g. to make updates to the .env
file, etc), it may be helpful to first check whether any submissions are currently being evaluated. If you are running the orchestrator in the background, you can monitor its activity by entering:
docker ps
If only one image is listed, e.g. sagebionetworks/synapse-workflow-orchestrator
, this will indicate that no submissions are currently running.
Otherwise, read the logs on the terminal screen to determine whether there is currently activity.
Wiki Setup
Use the following questions to help plan and set up the Challenge site and Evaluation Queues.
How many Challenge questions (“sub-challenges”) will there be?
Will the participants submit a single file/model to answer all sub-challenges or will they submit a different file/model per sub-challenge?
What is the general timeline for the Challenge?
Will there be rounds? If so, how many?
Using rounds may help increase participation levels throughout the Challenge, as submission activity is usually high near the end of rounds/phases.
It is best to have end dates during the mid-week if possible; this will ensure that there will be someone on-hand to help monitor and resolve issues should one arise.
Can users submit multiple submissions to a sub-challenge?
If so, should there be a limit in frequency? Examples: one submission per day, 3 submissions per week, 5 total, etc.
Setting a limit may help with potential overfitting as well as limit a user/team from monopolizing the compute resources.
What sort of submissions will the participants submit?
Common formats supported by Sage: prediction file (i.e. csv file), Docker imageWhen can the truth files (goldstandard) and training data (if any) be expected?
Will the data be released upon the challenge end? After the embargo? Never?Is the data sensitive?
If so, will a clickwrap be needed (an agreement between the participant and data provider that requires the former to click a button that they will agree to the policies put in place regarding data usage)? Should log files be returned? Will there be a need to generate synthetic data?Who will be responsible for providing/writing the validation and/or scoring scripts?
If Sage, please provide as many details regarding the format of a valid predictions file (e.g. number of columns, names of column headers, valid values, etc.) and all exceptional cases. For scoring, please provide the primary and secondary metrics, as well as any special circumstances for evaluations, i.e. CTD2 BeatAML primary metric is an average Spearman correlation, calculated from each drug’s Spearman correlation.If not Sage, please provide the scripts in either Python or R. If needed, we do provide sample scoring models that you may use as a template, available in both Python and R.
Are scores returned to the participants immediately or should they be withheld until the Challenge end?
A typical Challenge will immediately return the scores in an email upon evaluation completion, however, there have been past Challenges that did not return scores until after the end date.There is also an “hybrid” approach, in which scores are immediately returned during the Leaderboard/Testing Phase but withheld during the Final/Validation Phase (in which participants do not know their performance until after the Challenge end).
When should the evaluation results/leaderboard be accessible to the participants?
Some past Challenges had active leaderboards (i.e. participants could readily view their ranking throughout the evaluation round) whereas other Challenges did not release the leaderboards until the round/Challenge was over.Regarding writeups: when will these be accepted?
Should participants submit their writeups during submission evaluations or after the Challenge has closed?A writeup is something we require of all participants in order to be considered for final evaluation and ranking. Within a writeup should be all contributing persons, a thorough description of their methods and usage of data outside of the Challenge data, as well as all of their scripts, code, and predictions file(s)/Docker image(s). We require all of these so that, should they be a top-performer, we can ensure their code and final output is reproducible.
Update the Challenge
Challenge Site
Wikis
Any changes to the Challenge site and its Wiki/sub-Wiki contents must be done in the staging site, not live. Steps for updating the site is outlined below:
Make whatever changes needed to the staging Synapse Project.
Use
challengeutils'
mirror-wiki
to push the changes to the live Project.
Note: using the --dryrun
flag prior to officially mirroring can be helpful in ensuring that the pages to be updated are actually the ones intended. For example, an update is only made on the main Wiki page of this particular Challenge, therefore, it is expected that only the first page will be updated:
Evaluation Queue Quotas
Updating an Evaluation Queue’s quota can be done in one of two ways:
On Synapse via Edit Evaluation Queue.
In the terminal via
challengeutils
'set-evaluation-quota
:
Example
The deadline date for the first round of a Challenge has been shifted from 12 January 2020 to 9 February 2021. The queues are currently implementing a "1 submission per day" limit, therefore, the Number of Rounds will need to be updated, NOT Round Duration. This is because a "round" will need to stay as one day long (86400000 Epoch milliseconds), so that Synapse can enforce the Submission Limit of 1 per day.
Note: if there is no daily (or weekly) submission limit, then updating the Round Duration would be appropriate. For example, the final round of a Challenge has a total Submission Limit of 2, that is, participants are only allowed two submissions during the entire phase. A "round", this time, is considered to be the entire phase, so updating Round Duration (or end_date
when using set-evaluation-quota
) will be the appropriate step to take when updating the deadline for the queue(s).
To update the quota(s) on Synapse, go to the live site, then head to CHALLENGE tab. Edit the Evaluation Queues as needed; in this case, there are three queues and they will all need to be updated. There are 57 days between the start date (14 December 2020) and the new end date (9 February 2021), which can be translated as 57 "rounds". And so, Number of Rounds will be increased to 57 rounds:
Notice how Round Duration still remains the same at 1 day long.
Updating with challengeutils
' set-evaluation-quota
is more or less the same (except round_duration
must be given as Epoch milliseconds):
There is one important caveat to using the latter approach:
blank values will replace any existing quotas if they are not set during this command
That is, if the command above had not set round_start
as 2020-12-14T21:00:00
, then when the command completes, the Evaluation Queue will no longer have a starting date, e.g.
quota no longer has a firstRoundStart property
Workflow Steps
For any changes to the infrastructure workflow steps and/or scripts involved with the workflow (e.g. run_docker.py), simply make the edits to the scripts, then push the changes.
Note: dry-runs should always follow a change to the workflow; this will ensure things are still working as expected.