Skip to content

Commit 9384785

Browse files
authored
Updated implementation (#5)
1 parent 6cc2ce9 commit 9384785

File tree

19 files changed

+1904
-553
lines changed

19 files changed

+1904
-553
lines changed

.github/workflows/main.yaml

Lines changed: 31 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,9 @@
1-
name: CI-CD
2-
3-
on:
4-
push:
5-
branches:
6-
- development
7-
- main
8-
pull_request:
9-
branches:
10-
- development
11-
- main
1+
name: Build-Deploy
2+
3+
on: workflow_dispatch
124

135
env:
14-
PROJECT_NAME: wine-quality
6+
PROJECT_NAME: employee-attrition
157

168
jobs:
179
build:
@@ -31,45 +23,35 @@ jobs:
3123
with:
3224
creds: ${{ secrets.AZURE_CREDENTIALS }}
3325

34-
- name: Setup python environment
35-
uses: conda-incubator/setup-miniconda@v2
26+
- uses: actions/setup-python@v2
3627
with:
37-
activate-environment: ${{ env.PROJECT_NAME }}_env
38-
environment-file: service/environment.yaml
3928
python-version: 3.8
40-
auto-activate-base: false
29+
cache: pip
30+
- run: pip install -r service/requirements.txt
4131

4232
- name: Set databricks host environment variables
4333
run: |
4434
echo "MLFLOW_TRACKING_URI=databricks" >> $GITHUB_ENV
4535
echo "DATABRICKS_HOST=${{ secrets.DATABRICKS_HOST }}" >> $GITHUB_ENV
4636
echo "DATABRICKS_TOKEN=${{ secrets.DATABRICKS_TOKEN }}" >> $GITHUB_ENV
4737
48-
- name: Set artifact URI environment variables
38+
- name: Set artifact model environment variables
4939
run: |
50-
echo "PREDICTION_MODEL_ARTIFACT_URI=$(jq --raw-output .prediction_model_artifact_uri service/configuration.json)" >> $GITHUB_ENV
51-
echo "DRIFT_MODEL_ARTIFACT_URI=$(jq --raw-output .drift_model_artifact_uri service/configuration.json)" >> $GITHUB_ENV
52-
echo "OUTLIER_MODEL_ARTIFACT_URI=$(jq --raw-output .outlier_model_artifact_uri service/configuration.json)" >> $GITHUB_ENV
40+
echo "MODEL_NAME=$(jq --raw-output .model_name service/configuration.json)" >> $GITHUB_ENV
41+
echo "MODEL_VERSION=$(jq --raw-output .model_version service/configuration.json)" >> $GITHUB_ENV
5342
54-
- name: Package model service
43+
- name: Download model artifact
5544
run: |
56-
# Download model artifacts from databricks
57-
PREDICTION_MODEL_ARTIFACT_PATH=$(mlflow artifacts download -u $PREDICTION_MODEL_ARTIFACT_URI)
58-
DRIFT_MODEL_ARTIFACT_PATH=$(mlflow artifacts download -u $DRIFT_MODEL_ARTIFACT_URI)
59-
OUTLIER_MODEL_ARTIFACT_PATH=$(mlflow artifacts download -u $OUTLIER_MODEL_ARTIFACT_URI)
60-
61-
# Create directory for model package
62-
mkdir -p artifacts/model_package
45+
# Get model artifact uri
46+
MODEL_ARTIFACT_URI=$(curl -X GET -H "Authorization: Bearer ${DATABRICKS_TOKEN}" ${DATABRICKS_HOST}/api/2.0/preview/mlflow/model-versions/get-download-uri -d '{"name": "'"${MODEL_NAME}"'", "version": "'"${MODEL_VERSION}"'"}' | jq ".artifact_uri" --raw-output)
6347
64-
# Package model as webservice with bentoml
65-
python3 service/package_model_service.py \
66-
--mlflow-prediction-model-artifiact-path $PREDICTION_MODEL_ARTIFACT_URI \
67-
--mlflow-drift-model-artifiact-path $DRIFT_MODEL_ARTIFACT_URI \
68-
--mlflow-outlier-model-artifiact-path $OUTLIER_MODEL_ARTIFACT_URI \
69-
--package-path artifacts/model_package
48+
# Download model artifacts from databricks
49+
MODEL_ARTIFACT_PATH=$(mlflow artifacts download -u $MODEL_ARTIFACT_URI)
7050
7151
# Copy model configuration to artifacts directory
52+
mkdir artifacts
7253
cp service/configuration.json artifacts/model.json
54+
cp -R $MODEL_ARTIFACT_PATH service/employee_attrition_model
7355
7456
- name: ACR login
7557
uses: azure/docker-login@v1
@@ -80,7 +62,7 @@ jobs:
8062

8163
- name: Build and push image
8264
run: |
83-
docker build -t ${{ env.PROJECT_NAME }} artifacts/model_package
65+
docker build -t ${{ env.PROJECT_NAME }} service
8466
docker tag ${{ env.PROJECT_NAME }} ${{ secrets.CONTAINER_REGISTRY_NAME }}.azurecr.io/${{ env.PROJECT_NAME }}:${{ github.sha }}
8567
docker push ${{ secrets.CONTAINER_REGISTRY_NAME }}.azurecr.io/${{ env.PROJECT_NAME }}:${{ github.sha }}
8668
@@ -142,14 +124,14 @@ jobs:
142124
${{ secrets.CONTAINER_REGISTRY_IMAGE_PULL_SECRET }}
143125
namespace: default
144126

127+
- name: Set artifact model environment variables
128+
run: |
129+
echo "MODEL_NAME=$(jq --raw-output .model_name model.json)" >> $GITHUB_ENV
130+
echo "MODEL_VERSION=$(jq --raw-output .model_version model.json)" >> $GITHUB_ENV
131+
145132
- name: Transition models to staging
146133
run: |
147-
for i in {$PREDICTION_MODEL_ARTIFACT_URI,$DRIFT_MODEL_ARTIFACT_URI,$OUTLIER_MODEL_ARTIFACT_URI};
148-
do
149-
MODEL_NAME=$(echo $i | cut -c 9- | cut -d '/' -f1) ;
150-
MODEL_VERSION=$(echo $i | cut -c 9- | cut -d '/' -f2) ;
151-
curl -i -X POST -H "Authorization: Bearer ${DATABRICKS_TOKEN}" ${DATABRICKS_HOST}/api/2.0/preview/mlflow/model-versions/transition-stage -d '{"name": "'"${MODEL_NAME}"'", "version": "'"${MODEL_VERSION}"'", "stage": "Staging", "archive_existing_versions": true}' ;
152-
done
134+
curl -i -X POST -H "Authorization: Bearer ${{ secrets.DATABRICKS_TOKEN }}" ${{ secrets.DATABRICKS_HOST }}/api/2.0/preview/mlflow/model-versions/transition-stage -d '{"name": "'"${MODEL_NAME}"'", "version": "'"${MODEL_VERSION}"'", "stage": "Staging", "archive_existing_versions": true}' ;
153135
154136
production:
155137
name: Production
@@ -197,11 +179,11 @@ jobs:
197179
${{ secrets.CONTAINER_REGISTRY_IMAGE_PULL_SECRET }}
198180
namespace: default
199181

200-
- name: Transition models to production
182+
- name: Set artifact model environment variables
183+
run: |
184+
echo "MODEL_NAME=$(jq --raw-output .model_name model.json)" >> $GITHUB_ENV
185+
echo "MODEL_VERSION=$(jq --raw-output .model_version model.json)" >> $GITHUB_ENV
186+
187+
- name: Transition models to staging
201188
run: |
202-
for i in {$PREDICTION_MODEL_ARTIFACT_URI,$DRIFT_MODEL_ARTIFACT_URI,$OUTLIER_MODEL_ARTIFACT_URI};
203-
do
204-
MODEL_NAME=$(echo $i | cut -c 9- | cut -d '/' -f1) ;
205-
MODEL_VERSION=$(echo $i | cut -c 9- | cut -d '/' -f2) ;
206-
curl -i -X POST -H "Authorization: Bearer ${DATABRICKS_TOKEN}" ${DATABRICKS_HOST}/api/2.0/preview/mlflow/model-versions/transition-stage -d '{"name": "'"${MODEL_NAME}"'", "version": "'"${MODEL_VERSION}"'", "stage": "Production", "archive_existing_versions": true}' ;
207-
done
189+
curl -i -X POST -H "Authorization: Bearer ${{ secrets.DATABRICKS_TOKEN }}" ${{ secrets.DATABRICKS_HOST }}/api/2.0/preview/mlflow/model-versions/transition-stage -d '{"name": "'"${MODEL_NAME}"'", "version": "'"${MODEL_VERSION}"'", "stage": "Production", "archive_existing_versions": true}' ;

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,5 +129,5 @@ dmypy.json
129129
.pyre/
130130

131131
# Custom
132-
model_package
132+
employee_attrition_model
133133
.DS_Store

infrastructure/main.bicep

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//********************************************************
2+
// Modules
3+
//********************************************************
4+
5+
module m_databricks './modules/databricks.bicep' = {
6+
name: 'm_databricks'
7+
params: {
8+
resourceInstance: '01'
9+
}
10+
}
11+
12+
module m_microservices_01 './modules/microservices.bicep' = {
13+
name: 'm_microservices_01'
14+
params: {
15+
resourceInstance: '01'
16+
}
17+
}
18+
19+
module m_microservices_02 './modules/microservices.bicep' = {
20+
name: 'm_microservices_02'
21+
params: {
22+
resourceInstance: '02'
23+
useExistingContainerRegistry: true
24+
useExistingLogAnalyticsWorkspace: true
25+
containerRegistryName: m_microservices_01.outputs.containerRegistryName
26+
logAnalyticsWorkspaceName: m_microservices_01.outputs.logAnalyticsWorkspaceName
27+
}
28+
}

0 commit comments

Comments
 (0)