Skip to content

Commit 135141a

Browse files
Add OpenFold3 SageMaker DLC (build + tests, incl. precomputed-MSA under network isolation) (#6285)
* Add OpenFold3 SageMaker DLC (build + basic tests) OpenFold3 protein-structure prediction image for SageMaker async inference, private release to JumpStart. - docker/openfold3/Dockerfile: 2-stage build on devel-cu130-amzn2023, conda-lock env, OpenFold3 pinned to tag 0.4.1, baked checkpoint of3-p2-155k.pt - scripts/docker/openfold3/: Flask+gunicorn serve, SageMaker handler (GPU pool, per-GPU warmup), entrypoint - .github/config/image/openfold3/sagemaker.yml: release:false, public_registry: false (private-only); tag 0.4-cu130-amzn2023 - .github/workflows/openfold3.{pipeline,pr-amzn2023,autorelease-sagemaker-amzn2023}.yml: minimal pipeline (build + sanity + security + release) - release-schedule.yml: register autorelease cron Model tests and SageMaker endpoint tests intentionally omitted (added later once test artifacts are uploaded to S3). * Apply dockerfmt formatting to openfold3 Dockerfile * Enable pull_request trigger for openfold3 PR workflow * Fix and allowlist openfold3 ECR scan CVEs ECR enhanced scan flagged 43 CRITICAL/HIGH CVEs. Remediation: Fixed (14, in Dockerfile): upgrade pure-Python utility libs not in the model dependency graph — GitPython>=3.1.50, urllib3>=2.7.0, pillow>=12.2.0, dulwich>=1.2.5, msgpack>=1.2.1. Allowlisted (29, test/security/data/ecr_scan_allowlist/openfold3/): - openssl (21) + curl (3): conda-vendored native libs pinned by OpenFold3 0.4.1 upstream lock; upgrading risks breaking the locked env. - torch 2.5.1 (3): official upstream pin (cuda12.4); CVE-2025-32434 torch.load RCE not reachable (baked checkpoint, no untrusted load). - quinn-proto (1): inside the uv build-tool binary, not runtime. - jaraco.context (1): vendored in setuptools. All allowlist entries carry review_by 2026-09-30. * Fully remediate openfold3 Python CVEs in both envs + purge conda cache The first remediation pass left 14 CVEs because: - conda's extracted package cache (/opt/conda/pkgs/<pkg>-<oldver>) kept old METADATA the scanner reads, even after the active env was upgraded - awscli (installed for the checkpoint download) pinned urllib3<2.7, downgrading the patched urllib3 - msgpack was only upgraded in the openfold3 env, not the base env Fix: upgrade the libs in BOTH base and openfold3 envs, run remediation last (after awscli is removed), and purge the conda pkg cache + conda clean. * Fetch checkpoint via curl instead of awscli awscli pulled in botocore, which pins urllib3<2.7 and conflicted with the CVE remediation (capping urllib3 at 2.6.3). The checkpoint is a public, anonymously readable S3 object, so fetch it over HTTPS with curl like the other DLCs do — removing the awscli/botocore dependency entirely (no install/uninstall dance). * Add OpenFold3 SageMaker async-inference tests Deploys one 4-GPU ml.g6.12xlarge async endpoint (reused across cases) and exercises it via S3 in/out. Three cases: - small protein, 1 request (smoke) - large protein, 1 request (baseline timing) - large protein, 4 concurrent: asserts the GPU pool keeps wall-time under 2x the single-request time (vs ~4x if serialized) Validation is smoke-level (valid non-empty CIF). Wires a sagemaker-tests job into the pipeline (gated on customer_type==sagemaker) + PR change detection. * Inline SageMaker test fixtures, drop conftest.py Match the repo convention: vllm/sglang/ray/vllm-omni all keep their SageMaker endpoint fixtures in the test file rather than a per-suite conftest.py. Shared fixtures (image_uri, region, aws_session) still come from the root test/conftest.py. * Align openfold3 SageMaker test with pytorch pattern (env vars, no conftest) Follow test/pytorch/integration/sagemaker convention (per kwanggg/reenable-pytorch-pr): - config via env vars TEST_IMAGE_URI / SM_ROLE_ARN / AWS_REGION instead of the --image-uri pytest arg + aws_session fixture - workflow builds SM_ROLE_ARN from CI_AWS_ACCOUNT_ID + SageMakerRole, single sagemaker-test job with check-image-exists graceful skip - requirements pin sagemaker>=3.0.0 (SDK v3) like pytorch The endpoint deploy/teardown stays a module-scoped fixture in the test file (persistent endpoint needs cleanup, unlike pytorch's fire-and-forget training jobs) — but no separate conftest.py. * Harden OpenFold3 SageMaker async test (fix CI hang + orphan leak) Root cause of the 2-hour CI hang: the SageMaker execution role (AmazonSageMakerFullAccess) can read but NOT write s3://dlc-cicd-models — that managed policy only grants S3 write to buckets named *sagemaker*. The endpoint ran the prediction but could not write the async OUTPUT object, so the test's 3600s poll waited a full hour with no result and no failure object, then the 2h merge-conditions cap canceled the job (skipping fixture teardown -> orphaned ml.g6.12xlarge endpoints). Fixes: - async input + output now use the account default sagemaker-<region>-<account> bucket (writable by the role); queries are staged there from dlc-cicd-models (read-only is permitted). QUERY_SRC_BUCKET/PREFIX are env-overridable. - read FailureLocation + POLL_TIMEOUT=900s + 5s interval: a dropped/failed request now fails fast and legibly instead of a 1h hang. - first-request retry + 30s settle after InService: SageMaker async can silently drop the first request submitted immediately after InService (the discrepancy vs the POC, where a human waits after warmup). - cleanup-first _sweep_stale() in the fixture so a canceled run never strands or blocks the next one. Validated end-to-end on the real DLC image (ml.g6.12xlarge, account 897880167187): all 3 tests pass. Timings: small 80s, large 206s, 4-concurrent 268s vs 206s single (ratio 1.30 < 2.0 -> GPU pool parallelizes). Endpoint auto-deleted, no orphan. * Simplify SageMaker async test: single bucket, preflight, no retry - Query inputs + async output both use the account default sagemaker bucket (queries submitted directly, no cross-bucket staging from dlc-cicd-models). - Add _preflight_s3() to fail fast (before the ~10-min deploy) if queries are missing or the output bucket is not writable. - Drop the first-request retry; keep the 30s post-InService settle. - Validated end-to-end on the DLC image (account 897880167187): all 3 pass. * Expand SageMaker test module header to document env vars, GPU model, and S3 bucket rationale * Restructure sagemaker-test workflow into preflight + endpoint-test (vllm/sglang pattern), drop skip notice * TEMP(gamma-validation): release openfold3 to gamma (028) from PR pipeline One-off gamma pre-prod validation push. force_release bypasses the active us-west-2 change-control window (2026-06-23..27). Release-gate temporarily relaxed to allow the .pr caller / non-main ref. REVERT all three files after the gamma run completes. - sagemaker.yml: release/force_release=true, environment=gamma - openfold3.pipeline.yml: drop main-ref + autorelease/dispatch gate conditions - openfold3.pr-amzn2023.yml: release=true * Revert "TEMP(gamma-validation): release openfold3 to gamma (028) from PR pipeline" This reverts commit df8a7d2. * Enable network isolation in SageMaker async test Validates the production no-outbound-network posture: weights are baked into the image and inputs arrive via S3, so the default single-sequence inference path needs no internet. MSA is off by default. * Support customer precomputed MSA + add isolated MSA test Handler: a chain may carry an optional precomputed_msa list of {name, content} a3m/sto alignments. Names are validated against OF3 0.4.1's recognized keys (unrecognized names are silently ignored by OF3 → single-sequence), then staged to a per-request temp dir with main_msa_file_paths set. No network needed, so it works under network isolation. Subprocess engine only; optional and backward compatible. Test: test_large_precomputed_msa reads the uploaded a3m fixture, derives the query sequence from its first record, and submits both inline to the isolated endpoint — validating the bring-your-own-MSA path end-to-end. * Submit prebuilt large_msa.json instead of assembling MSA request at runtime Mirrors small.json/large.json: the MSA request (622-res protein + inline colabfold_main.a3m) is a committed fixture uploaded to the sagemaker bucket, submitted directly. Drops the runtime read/parse/stage helpers. * Reject use_msa_server under network isolation with an actionable error The endpoint runs network-isolated, so the MSA server has no outbound internet and a use_msa_server=true request hangs until the predict timeout (~55min, holds a GPU) — confirmed by a manual repro. Reject it up front (before leasing a GPU) with a clear error that points to the precomputed_msa format + supported names. Env-overridable via OPENFOLD3_ALLOW_MSA_SERVER=1 for a non-isolated deploy. Adds test_msa_server_rejected_under_isolation asserting fast rejection. * Use committed small_msa_server.json fixture for the MSA-server rejection test Replaces the inline _submit_inline helper: the negative test now submits a committed query (small protein, use_msa_server=true) via the standard _invoke path, matching small/large/large_msa. Uploaded by upload_openfold3_test_queries.sh. * Enable openfold3 release now that CDK ECR repo + ReleaseLogic tag are deployed Both companion CRs are deployed: the openfold3 ECR repo exists in the release account and the openfold3 framework/tag entry is live in the release-logic S3 dist. Flip release:true so the scheduled autorelease (and dispatch) publishes to the private registry. PR runs still never release (release-gate requires main-ref + an autorelease/dispatch caller). * Address review: guard release job on !failure/!cancelled; move all Dockerfile ARGs to config (1) release job had a custom if: that overrides the default 'skip on failed needs', so a failed/cancelled build or release-gate could still let release run. Add !failure() && !cancelled() (matches PR #6307 fix). (2) Add base_image + miniforge_version to the build: block so every Dockerfile ARG is declared in the config (config = source of truth, Dockerfile ARG = fallback default). All 6 ARGs (BASE_IMAGE, MINIFORGE_VERSION, OPENFOLD3_REF, CHECKPOINT, DLC_MAJOR/MINOR_VERSION) are now config-driven. * nit: order release if: as !failure && !cancelled && should-release for consistency
1 parent 12a9acd commit 135141a

13 files changed

Lines changed: 1689 additions & 0 deletions

File tree

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
image:
2+
name: "openfold3-sagemaker"
3+
description: "OpenFold3 protein structure prediction for SageMaker async inference"
4+
5+
metadata:
6+
framework: "openfold3"
7+
framework_version: "0.4.1"
8+
os_version: "amzn2023"
9+
customer_type: "sagemaker"
10+
arch_type: "x86"
11+
device_type: "gpu"
12+
job_type: "inference"
13+
prod_image: "openfold3:0.4-cu130-amzn2023"
14+
15+
build:
16+
dockerfile: "docker/openfold3/Dockerfile"
17+
target: "openfold3-sagemaker"
18+
base_image: "public.ecr.aws/deep-learning-containers/base:devel-cu130-amzn2023"
19+
python_version: "3.12"
20+
cuda_version: "13.0.2"
21+
miniforge_version: "25.11.0-1"
22+
openfold3_ref: "0.4.1"
23+
checkpoint: "of3-p2-155k.pt"
24+
dlc_major_version: "1"
25+
dlc_minor_version: "0"
26+
27+
release:
28+
release: true
29+
force_release: false
30+
public_registry: false
31+
private_registry: true
32+
enable_soci: true
33+
environment: "production"

.github/release-schedule.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,7 @@ schedules:
7373
- cron: "00 22 * * 2,4"
7474
workflow: vllm-omni.autorelease-sagemaker.yml
7575
gpu: medium
76+
77+
- cron: "30 22 * * 2"
78+
workflow: openfold3.autorelease-sagemaker-amzn2023.yml
79+
gpu: heavy
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
name: "Auto Release - OpenFold3 SageMaker AL2023"
2+
3+
on:
4+
schedule:
5+
- cron: '30 22 * * 2'
6+
workflow_dispatch:
7+
8+
concurrency:
9+
group: ${{ github.workflow }}
10+
cancel-in-progress: false
11+
12+
permissions:
13+
contents: read
14+
15+
jobs:
16+
discover:
17+
runs-on: ubuntu-latest
18+
outputs:
19+
configs: ${{ steps.discover.outputs.configs }}
20+
steps:
21+
- uses: actions/checkout@v6
22+
- id: discover
23+
uses: ./.github/actions/discover-configs
24+
with:
25+
pattern: ".github/config/image/openfold3/sagemaker.yml"
26+
27+
pipeline:
28+
needs: [discover]
29+
strategy:
30+
fail-fast: false
31+
matrix:
32+
include: ${{ fromJson(needs.discover.outputs.configs) }}
33+
uses: ./.github/workflows/openfold3.pipeline.yml
34+
with:
35+
config-file: ${{ matrix.config_file }}
36+
tag-suffix: ${{ github.run_id }}
37+
release: true
38+
secrets: inherit
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
name: "Pipeline - OpenFold3"
2+
3+
on:
4+
workflow_call:
5+
inputs:
6+
config-file:
7+
description: "Path to image config YAML"
8+
required: true
9+
type: string
10+
tag-suffix:
11+
description: "CI tag suffix (run_id or pr-NUMBER)"
12+
required: true
13+
type: string
14+
build:
15+
description: "Whether to build the image (false = skip build, test against prod)"
16+
required: false
17+
type: boolean
18+
default: true
19+
run-sanity-test:
20+
description: "Run sanity tests"
21+
required: false
22+
type: boolean
23+
default: true
24+
run-security-test:
25+
description: "Run security tests"
26+
required: false
27+
type: boolean
28+
default: false
29+
run-sagemaker-test:
30+
description: "Run SageMaker endpoint tests"
31+
required: false
32+
type: boolean
33+
default: true
34+
release:
35+
description: "Run release job after tests pass"
36+
required: false
37+
type: boolean
38+
default: false
39+
outputs:
40+
image-uri:
41+
description: "Built image URI (empty if build was skipped)"
42+
value: ${{ jobs.build.outputs.image-uri }}
43+
44+
jobs:
45+
ci-config:
46+
runs-on: ubuntu-latest
47+
outputs:
48+
customer-type: ${{ steps.parse.outputs.customer-type }}
49+
steps:
50+
- uses: actions/checkout@v6
51+
- id: parse
52+
run: |
53+
echo "customer-type=$(yq '.metadata.customer_type' '${{ inputs.config-file }}')" >> $GITHUB_OUTPUT
54+
55+
build:
56+
if: ${{ inputs.build }}
57+
concurrency:
58+
group: ${{ github.workflow }}-build-${{ inputs.config-file }}-${{ github.ref }}
59+
cancel-in-progress: true
60+
runs-on:
61+
- codebuild-runner-${{ github.run_id }}-${{ github.run_attempt }}
62+
fleet:x86-build-runner
63+
buildspec-override:true
64+
timeout-minutes: 720
65+
outputs:
66+
image-uri: ${{ steps.build.outputs.image-uri }}
67+
steps:
68+
- uses: actions/checkout@v6
69+
- id: build
70+
uses: ./.github/actions/build-image
71+
with:
72+
config-file: ${{ inputs.config-file }}
73+
aws-account-id: ${{ vars.CI_AWS_ACCOUNT_ID }}
74+
aws-region: ${{ vars.AWS_REGION }}
75+
tag-suffix: ${{ inputs.tag-suffix }}
76+
77+
sanity-test:
78+
if: ${{ always() && !failure() && !cancelled() && inputs.run-sanity-test }}
79+
needs: [build]
80+
concurrency:
81+
group: ${{ github.workflow }}-sanity-test-${{ inputs.config-file }}-${{ github.ref }}
82+
cancel-in-progress: true
83+
uses: ./.github/workflows/_reusable.sanity-tests.yml
84+
with:
85+
config-file: ${{ inputs.config-file }}
86+
image-uri: ${{ needs.build.outputs.image-uri || '' }}
87+
88+
security-test:
89+
if: ${{ always() && !failure() && !cancelled() && inputs.run-security-test }}
90+
needs: [build]
91+
concurrency:
92+
group: ${{ github.workflow }}-security-test-${{ inputs.config-file }}-${{ github.ref }}
93+
cancel-in-progress: true
94+
uses: ./.github/workflows/_reusable.security-tests.yml
95+
with:
96+
config-file: ${{ inputs.config-file }}
97+
image-uri: ${{ needs.build.outputs.image-uri || '' }}
98+
99+
sagemaker-tests:
100+
if: ${{ always() && !failure() && !cancelled() && inputs.run-sagemaker-test && needs.ci-config.outputs.customer-type == 'sagemaker' }}
101+
needs: [build, ci-config]
102+
concurrency:
103+
group: ${{ github.workflow }}-sagemaker-tests-${{ inputs.config-file }}-${{ github.ref }}
104+
cancel-in-progress: false
105+
uses: ./.github/workflows/openfold3.tests-sagemaker.yml
106+
with:
107+
config-file: ${{ inputs.config-file }}
108+
image-uri: ${{ needs.build.outputs.image-uri || '' }}
109+
110+
release-gate:
111+
if: >-
112+
github.ref == 'refs/heads/main' &&
113+
(contains(github.workflow_ref, '.autorelease') || contains(github.workflow_ref, '.dispatch-release')) &&
114+
!contains(github.workflow_ref, '.pr') &&
115+
inputs.release &&
116+
!failure() && !cancelled() &&
117+
needs.build.result == 'success'
118+
needs: [build, sanity-test, security-test, sagemaker-tests]
119+
runs-on: ubuntu-latest
120+
outputs:
121+
should-release: ${{ steps.check.outputs.should-release }}
122+
release-spec: ${{ steps.spec.outputs.release-spec }}
123+
environment: ${{ steps.check.outputs.environment }}
124+
steps:
125+
- uses: actions/checkout@v6
126+
- id: check
127+
run: |
128+
SHOULD_RELEASE=$(yq '.release.release' "${{ inputs.config-file }}")
129+
ENVIRONMENT=$(yq '.release.environment' "${{ inputs.config-file }}")
130+
echo "should-release=${SHOULD_RELEASE}" >> $GITHUB_OUTPUT
131+
echo "environment=${ENVIRONMENT}" >> $GITHUB_OUTPUT
132+
- id: spec
133+
if: steps.check.outputs.should-release == 'true'
134+
uses: ./.github/actions/generate-release-spec
135+
with:
136+
config-file: ${{ inputs.config-file }}
137+
138+
release:
139+
if: ${{ !failure() && !cancelled() && needs.release-gate.outputs.should-release == 'true' }}
140+
needs: [build, release-gate]
141+
uses: ./.github/workflows/_reusable.release-image.yml
142+
with:
143+
source-image-uri: ${{ needs.build.outputs.image-uri }}
144+
release-spec: ${{ needs.release-gate.outputs.release-spec }}
145+
environment: ${{ needs.release-gate.outputs.environment }}
146+
aws-region: ${{ vars.AWS_REGION }}
147+
secrets: inherit
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
name: "PR - OpenFold3 AL2023"
2+
3+
on:
4+
workflow_dispatch:
5+
pull_request:
6+
branches: [main]
7+
types: [opened, reopened, synchronize]
8+
paths:
9+
- ".github/config/image/openfold3/*.yml"
10+
- ".github/workflows/openfold3.pipeline.yml"
11+
- ".github/workflows/openfold3.pr-amzn2023.yml"
12+
- ".github/workflows/openfold3.tests-sagemaker.yml"
13+
- "docker/openfold3/Dockerfile"
14+
- "scripts/docker/common/**"
15+
- "scripts/docker/openfold3/**"
16+
- "test/sanity/**"
17+
- "test/openfold3/sagemaker/**"
18+
- "!docs/**"
19+
20+
permissions:
21+
contents: read
22+
pull-requests: read
23+
24+
jobs:
25+
gatekeeper:
26+
runs-on: ubuntu-latest
27+
steps:
28+
- uses: actions/checkout@v6
29+
with:
30+
ref: ${{ github.event.pull_request.base.sha }}
31+
fetch-depth: 1
32+
- uses: ./.github/actions/pr-permission-gate
33+
34+
check-changes:
35+
needs: [gatekeeper]
36+
runs-on: ubuntu-latest
37+
outputs:
38+
build-change: ${{ steps.changes.outputs.build-change }}
39+
sanity-test-change: ${{ steps.changes.outputs.sanity-test-change }}
40+
sagemaker-test-change: ${{ steps.changes.outputs.sagemaker-test-change }}
41+
steps:
42+
- uses: actions/checkout@v6
43+
- uses: dorny/paths-filter@v4
44+
id: changes
45+
with:
46+
filters: |
47+
build-change:
48+
- ".github/config/image/openfold3/*.yml"
49+
- "docker/openfold3/Dockerfile"
50+
- "scripts/docker/common/**"
51+
- "scripts/docker/openfold3/**"
52+
sanity-test-change:
53+
- "test/sanity/**"
54+
sagemaker-test-change:
55+
- "test/openfold3/sagemaker/**"
56+
57+
discover:
58+
needs: [gatekeeper]
59+
runs-on: ubuntu-latest
60+
outputs:
61+
configs: ${{ steps.discover.outputs.configs }}
62+
steps:
63+
- uses: actions/checkout@v6
64+
- id: discover
65+
uses: ./.github/actions/discover-configs
66+
with:
67+
pattern: ".github/config/image/openfold3/*.yml"
68+
69+
pipeline:
70+
needs: [check-changes, discover]
71+
strategy:
72+
fail-fast: false
73+
matrix:
74+
include: ${{ fromJson(needs.discover.outputs.configs) }}
75+
uses: ./.github/workflows/openfold3.pipeline.yml
76+
with:
77+
config-file: ${{ matrix.config_file }}
78+
tag-suffix: pr-${{ github.event.pull_request.number }}
79+
build: ${{ needs.check-changes.outputs.build-change == 'true' }}
80+
run-sanity-test: ${{ needs.check-changes.outputs.build-change == 'true' || needs.check-changes.outputs.sanity-test-change == 'true' }}
81+
run-security-test: ${{ needs.check-changes.outputs.build-change == 'true' }}
82+
run-sagemaker-test: ${{ needs.check-changes.outputs.build-change == 'true' || needs.check-changes.outputs.sagemaker-test-change == 'true' }}
83+
release: false
84+
secrets: inherit
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
name: Reusable OpenFold3 SageMaker Tests
2+
3+
on:
4+
workflow_call:
5+
inputs:
6+
config-file:
7+
description: "Path to image config YAML"
8+
required: true
9+
type: string
10+
image-uri:
11+
description: "Image URI to test. If empty, derives prod URI from config."
12+
required: false
13+
type: string
14+
default: ""
15+
16+
permissions:
17+
contents: read
18+
19+
jobs:
20+
preflight:
21+
runs-on:
22+
- codebuild-runner-${{ github.run_id }}-${{ github.run_attempt }}
23+
fleet:default-runner
24+
buildspec-override:true
25+
outputs:
26+
image-uri: ${{ steps.image.outputs.image-uri }}
27+
aws-account-id: ${{ steps.image.outputs.aws-account-id }}
28+
image-exists: ${{ steps.check.outputs.exists }}
29+
steps:
30+
- uses: actions/checkout@v6
31+
32+
- name: Resolve image URI
33+
id: image
34+
uses: ./.github/actions/resolve-image-uri
35+
with:
36+
image-uri: ${{ inputs.image-uri }}
37+
ci-aws-account-id: ${{ vars.CI_AWS_ACCOUNT_ID }}
38+
prod-aws-account-id: ${{ vars.PROD_AWS_ACCOUNT_ID }}
39+
aws-region: ${{ vars.AWS_REGION }}
40+
config-file: ${{ inputs.config-file }}
41+
42+
- name: Check image exists
43+
id: check
44+
uses: ./.github/actions/check-image-exists
45+
with:
46+
image-uri: ${{ steps.image.outputs.image-uri }}
47+
48+
endpoint-test:
49+
if: ${{ needs.preflight.outputs.image-exists == 'true' }}
50+
needs: [preflight]
51+
runs-on:
52+
- codebuild-runner-${{ github.run_id }}-${{ github.run_attempt }}
53+
fleet:default-runner
54+
buildspec-override:true
55+
timeout-minutes: 120
56+
steps:
57+
- uses: actions/checkout@v6
58+
59+
- name: ECR login
60+
uses: ./.github/actions/ecr-authenticate
61+
with:
62+
aws-account-id: ${{ needs.preflight.outputs.aws-account-id }}
63+
aws-region: ${{ vars.AWS_REGION }}
64+
image-uri: ${{ needs.preflight.outputs.image-uri }}
65+
66+
- name: Run SageMaker async endpoint tests
67+
env:
68+
TEST_IMAGE_URI: ${{ needs.preflight.outputs.image-uri }}
69+
SM_ROLE_ARN: arn:aws:iam::${{ vars.CI_AWS_ACCOUNT_ID }}:role/SageMakerRole
70+
AWS_REGION: ${{ vars.AWS_REGION }}
71+
run: |
72+
uv venv --python 3.12
73+
source .venv/bin/activate
74+
uv pip install -r test/requirements.txt
75+
uv pip install -r test/openfold3/sagemaker/requirements.txt
76+
cd test/
77+
PYTHONPATH=$(pwd):$PYTHONPATH python3 -m pytest -v --tb=short -rA --log-cli-level=INFO \
78+
openfold3/sagemaker/test_async_endpoint.py

0 commit comments

Comments
 (0)