Skip to content

Commit 4a9da58

Browse files
committed
docker: add the GPU image build and remove per-model Dockerfiles
1 parent 874c1fa commit 4a9da58

21 files changed

Lines changed: 207 additions & 559 deletions

File tree

.github/workflows/api-docs.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616
runs-on: ubuntu-latest
1717
strategy:
1818
matrix:
19-
python-version: [ '3.10' ]
19+
python-version: [ '3.11' ]
2020
max-parallel: 1
2121

2222
steps:

.github/workflows/docker.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
- uses: actions/checkout@v4
2020

2121
- name: Lint
22-
run: hadolint --ignore DL3008 --ignore DL3013 --ignore DL3003 --ignore DL4006 docker/Dockerfile* docker/**/Dockerfile*
22+
run: hadolint --ignore DL3008 --ignore DL3013 --ignore DL3003 --ignore DL4006 --ignore DL3006 --ignore SC2086 --ignore SC2046 docker/Dockerfile* docker/**/Dockerfile*
2323

2424
build-and-push:
2525
needs: lint
@@ -74,6 +74,9 @@ jobs:
7474
platforms: linux/amd64,linux/arm64
7575
context: .
7676
file: docker/Dockerfile
77+
build-args: |
78+
IMAGE_TYPE=gpu
79+
PIP_EXTRAS=llm
7780
push: true
7881
tags: ${{ steps.cms_meta.outputs.tags }}
7982
labels: ${{ steps.cms_meta.outputs.labels }}

.github/workflows/release-gpu.yaml

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
name: release
2+
3+
on:
4+
release:
5+
types: [published]
6+
7+
env:
8+
REGISTRY: docker.io
9+
CMS_GPU_IMAGE_NAME: cogstacksystems/cogstack-modelserve-gpu
10+
11+
jobs:
12+
ensure-branch:
13+
runs-on: ubuntu-latest
14+
outputs:
15+
is-valid: ${{ steps.ensure-branch.outputs.is-valid }}
16+
steps:
17+
- name: Ensures release is from the production branch only
18+
id: ensure-branch
19+
run: |
20+
TARGET_BRANCH="${{ github.event.release.target_commitish }}"
21+
if [ "$TARGET_BRANCH" != "production" ]; then
22+
echo "Only releases from the 'production' branch are allowed but found: $TARGET_BRANCH"
23+
echo "is-valid=false" >> "$GITHUB_OUTPUT"
24+
exit 1
25+
else
26+
echo "Target release branch is: $TARGET_BRANCH"
27+
echo "is-valid=true" >> "$GITHUB_OUTPUT"
28+
fi
29+
30+
qc:
31+
runs-on: ubuntu-latest
32+
needs: ensure-branch
33+
if: needs.ensure-branch.outputs.is-valid == 'true'
34+
steps:
35+
- uses: actions/checkout@v4
36+
- name: Install uv
37+
uses: astral-sh/setup-uv@v5
38+
with:
39+
version: "0.8.10"
40+
python-version: "3.11"
41+
- name: Install dependencies
42+
run: |
43+
uv sync --extra dev --extra docs --extra llm
44+
uv run python -m ensurepip
45+
- name: Run unit tests
46+
run: |
47+
uv run pytest -v tests/app --cov --cov-report=html:coverage_reports #--random-order
48+
- name: Run integration tests
49+
run: |
50+
uv run pytest -s -v tests/integration
51+
52+
release-gpu:
53+
runs-on: ubuntu-latest
54+
needs: [ensure-branch, qc]
55+
if: needs.ensure-branch.outputs.is-valid == 'true'
56+
permissions:
57+
contents: read
58+
packages: write
59+
id-token: write
60+
attestations: write
61+
steps:
62+
- uses: actions/checkout@v4
63+
64+
- name: Set up QEMU
65+
uses: docker/setup-qemu-action@v3
66+
67+
- name: Set up Docker Buildx
68+
uses: docker/setup-buildx-action@v3
69+
70+
- name: Extract the tag
71+
run: |
72+
echo "RELEASE_VERSION=${GITHUB_REF/refs\/tags\/v/}" >> $GITHUB_ENV
73+
74+
- name: Login to Docker Hub
75+
uses: docker/login-action@v3
76+
with:
77+
registry: ${{ env.REGISTRY }}
78+
username: ${{ secrets.DOCKERHUB_USERNAME }}
79+
password: ${{ secrets.DOCKERHUB_TOKEN }}
80+
81+
- name: Extract CMS meta
82+
id: cms_meta
83+
uses: docker/metadata-action@v5
84+
with:
85+
images: ${{ env.REGISTRY }}/${{ env.CMS_GPU_IMAGE_NAME }}
86+
87+
- name: Build and push CMS image
88+
uses: docker/build-push-action@v6
89+
id: build_and_push_cms
90+
with:
91+
platforms: linux/amd64,linux/arm64
92+
context: .
93+
file: docker/Dockerfile
94+
build-args: |
95+
IMAGE_TYPE=gpu
96+
PIP_EXTRAS=llm
97+
push: true
98+
github-token: ${{ github.token }}
99+
tags: |
100+
${{ env.REGISTRY }}/${{ env.CMS_GPU_IMAGE_NAME }}:${{ env.RELEASE_VERSION }}
101+
labels: ${{ steps.cms_meta.outputs.labels }}
102+
103+
- name: Attest CMS image artifacts
104+
uses: actions/attest-build-provenance@v2
105+
with:
106+
subject-name: ${{ env.REGISTRY }}/${{ env.CMS_GPU_IMAGE_NAME }}
107+
subject-digest: ${{ steps.build_and_push_cms.outputs.digest }}
108+
push-to-registry: true
109+
110+
- name: Inspect the released image
111+
run: |
112+
docker pull ${{ env.REGISTRY }}/${{ env.CMS_GPU_IMAGE_NAME }}:${{ env.RELEASE_VERSION }}
113+
docker image inspect ${{ env.REGISTRY }}/${{ env.CMS_GPU_IMAGE_NAME }}:${{ env.RELEASE_VERSION }}

.github/workflows/release.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ jobs:
3838
uses: astral-sh/setup-uv@v5
3939
with:
4040
version: "0.8.10"
41-
python-version: "3.10"
41+
python-version: "3.11"
4242
- name: Install dependencies
4343
run: |
4444
uv sync --extra dev --extra docs --extra llm

docker-compose-dev.yml

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
# This is for spinning up core services as single hosts in the DEV environment
2-
version: "3.6"
3-
42
name: dev-cms
53

64
services:
@@ -13,7 +11,7 @@ services:
1311
- org.cogstack.model-serve.dev=true
1412
build:
1513
context: ./
16-
dockerfile: ./docker/medcat-snomed/Dockerfile
14+
dockerfile: ./docker/Dockerfile
1715
args:
1816
- CMS_MODEL_NAME=SNOMED MedCAT model
1917
- CMS_UID=${CMS_UID:-1000}
@@ -23,7 +21,7 @@ services:
2321
- NO_PROXY=$NO_PROXY
2422
image: local-cms-medcat-snomed:do-not-push
2523
environment:
26-
- BASE_MODEL_FULL_PATH=$MODEL_PACKAGE_FULL_PATH
24+
- BASE_MODEL_FULL_PATH=${MODEL_PACKAGE_FULL_PATH:-/dev/null}
2725
- AWS_ACCESS_KEY_ID=
2826
- AWS_SECRET_ACCESS_KEY=
2927
- MLFLOW_S3_ENDPOINT_URL=
@@ -51,7 +49,7 @@ services:
5149
- org.cogstack.model-serve.dev=true
5250
build:
5351
context: ./
54-
dockerfile: ./docker/medcat-icd10/Dockerfile
52+
dockerfile: ./docker/Dockerfile
5553
args:
5654
- CMS_MODEL_NAME=ICD-10 MedCAT model
5755
- CMS_UID=${CMS_UID:-1000}
@@ -61,7 +59,7 @@ services:
6159
- NO_PROXY=$NO_PROXY
6260
image: local-cms-medcat-icd10:do-not-push
6361
environment:
64-
- BASE_MODEL_FULL_PATH=$MODEL_PACKAGE_FULL_PATH
62+
- BASE_MODEL_FULL_PATH=${MODEL_PACKAGE_FULL_PATH:-/dev/null}
6563
- AWS_ACCESS_KEY_ID=
6664
- AWS_SECRET_ACCESS_KEY=
6765
- MLFLOW_S3_ENDPOINT_URL=
@@ -89,7 +87,7 @@ services:
8987
- org.cogstack.model-serve.dev=true
9088
build:
9189
context: ./
92-
dockerfile: ./docker/medcat-opcs4/Dockerfile
90+
dockerfile: ./docker/Dockerfile
9391
args:
9492
- CMS_MODEL_NAME=OPCS-4 MedCAT model
9593
- CMS_UID=${CMS_UID:-1000}
@@ -127,7 +125,7 @@ services:
127125
- org.cogstack.model-serve.dev=true
128126
build:
129127
context: ./
130-
dockerfile: ./docker/medcat-deid/Dockerfile
128+
dockerfile: ./docker/Dockerfile
131129
args:
132130
- CMS_MODEL_NAME=De-Identification MedCAT model
133131
- CMS_UID=${CMS_UID:-1000}
@@ -137,7 +135,7 @@ services:
137135
- NO_PROXY=$NO_PROXY
138136
image: local-cms-medcat-deid:do-not-push
139137
environment:
140-
- BASE_MODEL_FULL_PATH=$MODEL_PACKAGE_FULL_PATH
138+
- BASE_MODEL_FULL_PATH=${MODEL_PACKAGE_FULL_PATH:-/dev/null}
141139
- AWS_ACCESS_KEY_ID=
142140
- AWS_SECRET_ACCESS_KEY=
143141
- MLFLOW_S3_ENDPOINT_URL=
@@ -165,7 +163,7 @@ services:
165163
- org.cogstack.model-serve.dev=true
166164
build:
167165
context: ./
168-
dockerfile: ./docker/medcat-umls/Dockerfile
166+
dockerfile: ./docker/Dockerfile
169167
args:
170168
- CMS_MODEL_NAME=UMLS MedCAT model
171169
- CMS_UID=${CMS_UID:-1000}
@@ -175,7 +173,7 @@ services:
175173
- NO_PROXY=$NO_PROXY
176174
image: local-cms-medcat-umls:do-not-push
177175
environment:
178-
- BASE_MODEL_FULL_PATH=$MODEL_PACKAGE_FULL_PATH
176+
- BASE_MODEL_FULL_PATH=${MODEL_PACKAGE_FULL_PATH:-/dev/null}
179177
- AWS_ACCESS_KEY_ID=
180178
- AWS_SECRET_ACCESS_KEY=
181179
- MLFLOW_S3_ENDPOINT_URL=
@@ -203,7 +201,7 @@ services:
203201
- org.cogstack.model-serve.dev=true
204202
build:
205203
context: ./
206-
dockerfile: ./docker/huggingface-ner/Dockerfile
204+
dockerfile: ./docker/Dockerfile
207205
args:
208206
- CMS_MODEL_NAME=HuggingFace NER model
209207
- CMS_UID=${CMS_UID:-1000}
@@ -216,7 +214,7 @@ services:
216214
networks:
217215
- cms
218216
environment:
219-
- BASE_MODEL_FULL_PATH=$MODEL_PACKAGE_FULL_PATH
217+
- BASE_MODEL_FULL_PATH=${MODEL_PACKAGE_FULL_PATH:-/dev/null}
220218
- AWS_ACCESS_KEY_ID=
221219
- AWS_SECRET_ACCESS_KEY=
222220
- MLFLOW_S3_ENDPOINT_URL=
@@ -244,20 +242,22 @@ services:
244242
- org.cogstack.model-serve.dev=true
245243
build:
246244
context: ./
247-
dockerfile: ./docker/huggingface-llm/Dockerfile
245+
dockerfile: ./docker/Dockerfile
248246
args:
249247
- CMS_MODEL_NAME=HuggingFace LLM model
250248
- CMS_UID=${CMS_UID:-1000}
251249
- CMS_GID=${CMS_GID:-1000}
252250
- HTTP_PROXY=$HTTP_PROXY
253251
- HTTPS_PROXY=$HTTPS_PROXY
254252
- NO_PROXY=$NO_PROXY
253+
- IMAGE_TYPE=gpu
254+
- PIP_EXTRAS=mcp,llm
255255
image: local-cms-huggingface-llm:do-not-push
256256
restart: always
257257
networks:
258258
- cms
259259
environment:
260-
- BASE_MODEL_FULL_PATH=$MODEL_PACKAGE_FULL_PATH
260+
- BASE_MODEL_FULL_PATH=${MODEL_PACKAGE_FULL_PATH:-/dev/null}
261261
- AWS_ACCESS_KEY_ID=
262262
- AWS_SECRET_ACCESS_KEY=
263263
- MLFLOW_S3_ENDPOINT_URL=
@@ -276,6 +276,7 @@ services:
276276
- http_proxy=$HTTP_PROXY
277277
- https_proxy=$HTTPS_PROXY
278278
- no_proxy=localhost
279+
- CMS_SERVE_EXTRA_OPTIONS=--load-in-4bit --device cuda
279280

280281
volumes:
281282
retrained-models:

0 commit comments

Comments
 (0)