generated from ersilia-os/eos-template
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit fb44de3
Showing
35 changed files
with
2,112 additions
and
0 deletions.
There are no files selected for viewing
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
mock.txt filter=lfs diff=lfs merge=lfs -text |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
import sys | ||
import os | ||
import requests | ||
|
||
from ersilia_pack.parsers import DockerfileInstallParser, YAMLInstallParser | ||
|
||
REPO_PATH = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../..")) | ||
PY_VERSION_MAP = { | ||
'3.8': 'py38', | ||
'3.9': 'py39', | ||
'3.10': 'py310', | ||
'3.11': 'py311', | ||
'3.12': 'py312' | ||
} | ||
model_id = sys.argv[1] | ||
def resolve_parser(): | ||
if os.path.exists(os.path.abspath(os.path.join(REPO_PATH, "Dockerfile"))): | ||
return DockerfileInstallParser(file_dir=REPO_PATH) | ||
elif os.path.exists(os.path.join(REPO_PATH, "install.yml")): | ||
return YAMLInstallParser(file_dir=REPO_PATH) | ||
else: | ||
raise ValueError("No install file found") | ||
|
||
def resolve_python_version(parser): | ||
return parser._get_python_version() | ||
|
||
def read_dockerfile(parser): | ||
commands = parser._get_commands() | ||
has_conda = parser._has_conda(commands) | ||
if has_conda: | ||
file_url = "https://raw.githubusercontent.com/ersilia-os/ersilia/master/dockerfiles/dockerize-ersiliapack/model/Dockerfile.conda" | ||
else: | ||
file_url = "https://raw.githubusercontent.com/ersilia-os/ersilia/master/dockerfiles/dockerize-ersiliapack/model/Dockerfile.pip" | ||
response = requests.get(file_url) | ||
return response.text | ||
|
||
def write_version_and_model_id(file_content, python_version): | ||
python_version = PY_VERSION_MAP[python_version] | ||
file_content = file_content.replace("eos_identifier", model_id) | ||
lines = file_content.split("\n") | ||
lines[0] = lines[0].replace("VERSION", python_version) | ||
with open(os.path.join(REPO_PATH, "../", "Dockerfile"), "w") as f: | ||
f.write("\n".join(lines)) | ||
|
||
if __name__ == "__main__": | ||
parser = resolve_parser() | ||
python_version = resolve_python_version(parser) | ||
dockerfile = read_dockerfile(parser) | ||
write_version_and_model_id(dockerfile, python_version) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
import csv | ||
|
||
def check_non_null_outcomes_in_output_csv(csv_file_path): | ||
with open(csv_file_path, 'r') as csv_file: | ||
csv_reader = csv.reader(csv_file) | ||
header = next(csv_reader) | ||
row = next(csv_reader) | ||
for val in row[2:]: # Skip the first two columns (Inchikey and input) | ||
if val not in ['', None]: | ||
return False | ||
return True | ||
|
||
if __name__ == '__main__': | ||
# Read file path from command line | ||
import sys | ||
if len(sys.argv) < 2: | ||
print('Usage: python verify_model_output.py <output_csv_file>') | ||
exit(1) | ||
|
||
output_csv_file = sys.argv[1] | ||
|
||
if check_non_null_outcomes_in_output_csv(output_csv_file): | ||
# If there are null outcomes, exit with status code 1 | ||
print('All outcomes are null') | ||
else: | ||
print('Some outcomes are not null') | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
name: json syntax check | ||
|
||
on: | ||
push: | ||
paths: | ||
- "**.json" | ||
pull_request: | ||
|
||
jobs: | ||
json-test: | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: checkout | ||
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # pin@v3.5.2 | ||
|
||
- name: json syntax check | ||
id: json-yaml-validate | ||
uses: GrantBirki/json-yaml-validate@87b2d309a02f4942c5e602183eeea11008a640f9 # pin@v1.4.0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,179 @@ | ||
name: Post Model Upload actions | ||
|
||
on: | ||
workflow_run: | ||
workflows: ["Upload model to DockerHub"] | ||
types: | ||
- completed | ||
|
||
jobs: | ||
post-model-upload: | ||
if: ${{ github.repository != 'ersilia-os/eos-template' }} | ||
runs-on: ubuntu-latest | ||
steps: | ||
|
||
- name: Checkout repository | ||
uses: actions/checkout@v4 | ||
|
||
- name: Download arch.txt | ||
uses: actions/download-artifact@v4 | ||
with: | ||
name: arch | ||
path: . | ||
run-id: ${{ github.event.workflow_run.id }} | ||
github-token: ${{ secrets.GITHUB_TOKEN }} | ||
|
||
- name: Check metadata file | ||
id: checkMetadata | ||
continue-on-error: true | ||
run: | | ||
if [[ ! -f metadata.yml ]]; then | ||
echo "metadata.yml file not found" | ||
exit 1 | ||
fi | ||
- name: Update Metadata YAML file with DockerHub info | ||
id: updateMetadataYAML | ||
if: steps.checkMetadata.outcome == 'success' | ||
run: | | ||
python3 -c " | ||
import yaml | ||
with open('metadata.yml', 'r') as f: | ||
data = yaml.safe_load(f) | ||
print(data) | ||
with open('arch.txt', 'r') as f: | ||
arch = f.read().rstrip() | ||
arch = arch.split(',') | ||
data['DockerHub'] = 'https://hub.docker.com/r/ersiliaos/{0}'.format(data['Identifier']) | ||
data['Docker Architecture'] = arch | ||
with open('metadata.yml', 'w') as f: | ||
yaml.dump(data, f, default_flow_style=False, sort_keys=False) | ||
" | ||
rm arch.txt | ||
- name: Update Metadata JSON file with DockerHub info | ||
id: updateMetadataJSON | ||
if: steps.checkMetadata.outcome == 'failure' | ||
run: | | ||
python3 -c " | ||
import json | ||
with open('metadata.json', 'r') as f: | ||
data = json.load(f) | ||
print(data) | ||
with open('arch.txt', 'r') as f: | ||
arch = f.read().rstrip() | ||
arch = arch.split(',') | ||
data['DockerHub'] = 'https://hub.docker.com/r/ersiliaos/{0}'.format(data['Identifier']) | ||
data['Docker Architecture'] = arch | ||
with open('metadata.json', 'w') as f: | ||
json.dump(data, f, indent=4) | ||
" | ||
rm arch.txt | ||
|
||
- name: Commit and push changes done to the Metadata file | ||
uses: actions-js/push@156f2b10c3aa000c44dbe75ea7018f32ae999772 # pin@v1.4 | ||
with: | ||
author_name: "ersilia-bot" | ||
author_email: "ersilia-bot@users.noreply.github.com" | ||
message: "updating metadata [skip ci]" | ||
repository: "ersilia-os/${{ github.event.repository.name }}" | ||
github_token: ${{ secrets.GITHUB_TOKEN }} | ||
amend: true | ||
force: true | ||
|
||
# Setup conda | ||
- name: Setup conda | ||
id: setupConda | ||
uses: conda-incubator/setup-miniconda@v3 | ||
with: | ||
auto-update-conda: true | ||
python-version: "3.10.10" | ||
|
||
# Install ersilia | ||
- name: Install dependencies in Conda environment | ||
id: installDependenciesInConda | ||
run: | | ||
conda install gh -c conda-forge | ||
python -m pip install git+https://github.com/ersilia-os/ersilia.git | ||
- name: Update metadata to AirTable | ||
id: update-metadata-to-airtable | ||
env: | ||
USER_NAME: ${{ github.repository_owner }} | ||
BRANCH: "main" | ||
REPO_NAME: ${{ github.event.repository.name }} | ||
AIRTABLE_API_KEY: ${{ secrets.AIRTABLE_API_KEY }} | ||
run: | | ||
echo "Updating metadata to AirTable looking at owner: $USER_NAME" | ||
wget https://raw.githubusercontent.com/ersilia-os/ersilia/master/.github/scripts/update_metadata_to_airtable.py | ||
python3 update_metadata_to_airtable.py $USER_NAME $REPO_NAME $BRANCH $AIRTABLE_API_KEY | ||
rm update_metadata_to_airtable.py | ||
- name: Update README file | ||
id: update-readme-file | ||
env: | ||
MODEL_ID: ${{ github.event.repository.name }} | ||
run: | | ||
echo "Updating README file with AirTable metadata for model: $MODEL_ID" | ||
wget https://raw.githubusercontent.com/ersilia-os/ersilia/master/.github/scripts/update_readme_from_airtable.py | ||
python3 update_readme_from_airtable.py $MODEL_ID . | ||
rm update_readme_from_airtable.py | ||
less README.md | ||
- name: Commit and push changes done to the README file | ||
uses: actions-js/push@156f2b10c3aa000c44dbe75ea7018f32ae999772 # pin@v1.4 | ||
with: | ||
author_name: "ersilia-bot" | ||
author_email: "ersilia-bot@users.noreply.github.com" | ||
message: "updating readme [skip ci]" | ||
repository: "ersilia-os/${{ github.event.repository.name }}" | ||
github_token: ${{ secrets.GITHUB_TOKEN }} | ||
amend: true | ||
force: true | ||
|
||
- name: Docker Hub Description | ||
uses: peter-evans/dockerhub-description@v3 | ||
with: | ||
username: ${{ secrets.DOCKERHUB_USERNAME }} | ||
password: ${{ secrets.DOCKERHUB_PASSWORD }} | ||
repository: ersiliaos/${{ github.event.repository.name }} | ||
short-description: "Ersilia Model Hub Identifier: ${{ github.event.repository.name }}" | ||
|
||
# Create an issue within the repository to track that this model is ready for testing | ||
|
||
- name: Shuffle assignees | ||
id: shuffle | ||
run: | | ||
export assignees=$(echo "${{ vars.assignees }}" | awk 'BEGIN {FS=","}; {srand();split($0,a,FS); print a[int(rand()*NF+1)]}') | ||
echo "$assignees" >> $GITHUB_STEP_SUMMARY | ||
echo "shuffled_assignee=$assignees" >> $GITHUB_OUTPUT | ||
echo "shuffled_assignee=$assignees" >> $GITHUB_ENV | ||
- name: Check for existing issue | ||
id: check_existing_test_issue | ||
run: | | ||
gh auth login --with-token <<< ${{ secrets.GITHUB_TOKEN }} | ||
issue_number=$(gh issue list --limit 100 --search "${{ vars.test_issue_title }}" --json number --jq '.[0].number') | ||
echo "::set-output name=issue_number::$issue_number" | ||
- name: Create a Test issue | ||
uses: actions-ecosystem/action-create-issue@b63bc2bbacb6a838dfe4a9f70da6665ae0962a49 | ||
id: create_test_issue | ||
with: | ||
github_token: ${{ secrets.GITHUB_TOKEN }} | ||
title: ${{ vars.TEST_ISSUE_TITLE }} | ||
assignees: | | ||
${{ steps.shuffle.outputs.shuffled_assignee }} | ||
body: | | ||
This model is a new incorporation to the Ersilia Model Hub or it has been modified. If you are assigned to this issue, please try it out and ensure everything works! | ||
To test a model, first clone it in your local system (ideally, from dockerhub) using the CLI commands: | ||
``` | ||
ersilia -v fetch eosxxxx --from_dockerhub | ||
ersilia serve eosxxxx | ||
ersilia test | ||
``` | ||
The test command will automatically check that the model can handle null outputs and whether it produces consistent results. Please copy here the result of the test command. If it passes, simply close the issue as completed. If it fails, please detail at which step and whether you have taken any steps to solve it. Please tag the original model contributor and one of Ersilia's maintainers for support. | ||
labels: | | ||
test | ||
if: steps.check_existing_test_issue.outputs.issue_number == '' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
name: Send Slack message | ||
on: | ||
issues: | ||
types: [opened] | ||
|
||
jobs: | ||
slack: | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: post slack | ||
uses: slackapi/slack-github-action@v1.23.0 | ||
env: | ||
SLACK_BOT_TOKEN: ${{ secrets.SLACK_TOKEN }} | ||
with: | ||
slack-message: | | ||
"new issue: https://github.com/${{ github.repository }}/issues/${{ github.event.issue.number }} created." | ||
channel-id: ${{ secrets.SLACK_CHANNEL_TESTER }} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
name: Model Test on PR | ||
|
||
on: | ||
pull_request: | ||
|
||
jobs: | ||
test: | ||
if: github.repository != 'ersilia-os/eos-template' | ||
runs-on: ubuntu-latest | ||
steps: | ||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # pin@v3.5.2 | ||
with: | ||
lfs: true | ||
|
||
# This might stop working in the future, so we need to keep an eye on it | ||
- name: Free Disk Space (Ubuntu) | ||
uses: jlumbroso/free-disk-space@main | ||
with: | ||
# this might remove tools that are actually needed, | ||
# if set to "true" but frees about 6 GB | ||
tool-cache: true | ||
|
||
# all of these default to true, but feel free to set to | ||
# "false" if necessary for your workflow | ||
android: true | ||
dotnet: true | ||
haskell: true | ||
large-packages: true | ||
swap-storage: true | ||
|
||
- name: Add conda to system path | ||
run: echo $CONDA/bin >> $GITHUB_PATH | ||
|
||
- name: Source conda | ||
run: source $CONDA/etc/profile.d/conda.sh | ||
|
||
- name: Set Python to 3.10.10 | ||
run: | ||
conda install -y python=3.10.10 | ||
|
||
- name: Install dependencies | ||
run: | | ||
source activate | ||
conda init | ||
conda install git-lfs -c conda-forge | ||
git-lfs install | ||
conda install gh -c conda-forge | ||
- name: Install ersilia | ||
run: | | ||
source activate | ||
python --version | ||
echo "After conda init" | ||
conda init | ||
python -m pip install git+https://github.com/ersilia-os/ersilia.git | ||
- name: Check metadata before updating to AirTable | ||
id: check-metadata | ||
env: | ||
USER_NAME: ${{ github.event.pull_request.head.repo.owner.login }} | ||
BRANCH: "main" | ||
REPO_NAME: ${{ github.event.repository.name }} | ||
uses: nick-fields/retry@v3 | ||
with: | ||
timeout_minutes: 10 | ||
max_attempts: 3 | ||
command: | | ||
source activate | ||
wget https://raw.githubusercontent.com/ersilia-os/ersilia/master/.github/scripts/update_metadata_to_airtable.py | ||
python3 update_metadata_to_airtable.py $USER_NAME $REPO_NAME $BRANCH | ||
- name: Predict output | ||
env: | ||
MODEL_ID: ${{ github.event.repository.name }} | ||
uses: nick-fields/retry@v3 | ||
with: | ||
timeout_minutes: 10 | ||
max_attempts: 3 | ||
command: | | ||
source activate | ||
echo "Sample model id selected: $MODEL_ID" | ||
ersilia -v fetch $MODEL_ID --repo_path . | ||
ersilia -v serve $MODEL_ID | ||
ersilia sample -n 5 -f input.csv | ||
ersilia -v api -i input.csv | ||
ersilia close | ||
- name: Upload log output | ||
if: always() | ||
uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb #pin v3.1.1 | ||
with: | ||
name: debug-logs | ||
retention-days: 14 | ||
path: /home/runner/eos/*.log |
Oops, something went wrong.