secrets and mlflow should now work

This commit is contained in:
Alexis Bruneteau 2025-10-01 17:35:13 +02:00
parent f107164b51
commit af9b700a5b
4 changed files with 98 additions and 45 deletions

View File

@ -11,22 +11,27 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.12'
- name: Install dependencies
run: |
pip install poetry
poetry install
- name: Setup DVC
run: |
poetry run dvc remote list
poetry run dvc pull || echo "DVC pull failed, continuing..."
- name: Start API server
run: |
poetry run uvicorn src.api.main:app --host 0.0.0.0 --port 8000 &
sleep 10
- name: Run unit tests
run: poetry run pytest tests/ --cov=src --cov-report=xml
@ -36,41 +41,49 @@ jobs:
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v3
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.12'
- name: Install dependencies
run: |
pip install poetry
poetry install
- name: Setup DVC
run: poetry run dvc pull
- name: Train model
run: poetry run python src/models/train.py
run: |
poetry run dvc remote list
poetry run dvc pull || echo "DVC pull failed, continuing..."
- name: Run DVC pipeline
run: poetry run dvc repro
env:
MLFLOW_TRACKING_URI: ${{ secrets.MLFLOW_URI }}
MLFLOW_TRACKING_USERNAME: ${{ secrets.CSGO }}
MLFLOW_TRACKING_PASSWORD: ${{ secrets.MLOPSEPITALYON }}
MLFLOW_TRACKING_URI: ${{ secrets.MLFLOW_TRACKING_URI }}
MLFLOW_TRACKING_USERNAME: ${{ secrets.MLFLOW_TRACKING_USERNAME }}
MLFLOW_TRACKING_PASSWORD: ${{ secrets.MLFLOW_TRACKING_PASSWORD }}
- name: Push DVC changes
run: |
poetry run dvc push || echo "DVC push failed, continuing..."
deploy:
needs: train
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v3
- name: Build Docker image
run: |
docker build -t csgo-mlops:${{ github.sha }} .
docker tag csgo-mlops:${{ github.sha }} csgo-mlops:latest
- name: Push to registry
run: |
docker push csgo-mlops:${{ github.sha }}
docker push csgo-mlops:latest
- name: Deploy to Kubernetes
run: kubectl apply -f kubernetes/deployment.yml
run: kubectl apply -f kubernetes/deployment.yml

7
models/metrics.json Normal file
View File

@ -0,0 +1,7 @@
{
"accuracy": 1.0,
"precision": 1.0,
"recall": 1.0,
"f1_score": 1.0,
"roc_auc": 1.0
}

View File

@ -21,7 +21,8 @@ dependencies = [
"pytest (>=7.0.0,<8.0.0)",
"pytest-cov (>=4.0.0,<5.0.0)",
"uvicorn (>=0.24.0,<1.0.0)",
"pandas (>=2.0.0,<3.0.0)"
"pandas (>=2.0.0,<3.0.0)",
"pyyaml (>=6.0.0,<7.0.0)"
]

View File

@ -7,14 +7,23 @@ import mlflow.sklearn
import yaml
import json
import pickle
import os
from pathlib import Path
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score
import pandas as pd
# Configure MLflow
mlflow.set_tracking_uri("https://mlflow.sortifal.dev")
mlflow.set_experiment("csgo-match-prediction")
mlflow.set_tracking_uri(os.getenv("MLFLOW_TRACKING_URI", "https://mlflow.sortifal.dev"))
# Try to set experiment, but handle auth errors gracefully
USE_MLFLOW = True
try:
mlflow.set_experiment("csgo-match-prediction")
except Exception as e:
print(f"Warning: Could not connect to MLflow: {e}")
print("Training will continue without MLflow tracking.")
USE_MLFLOW = False
def load_params():
"""Load training parameters from params.yaml"""
@ -92,38 +101,64 @@ def main():
print(f" Test samples: {len(X_test)}")
print(f" Features: {X_train.shape[1]}")
# Start MLflow run
with mlflow.start_run(run_name="random-forest-csgo"):
# Log parameters
mlflow.log_params(params)
mlflow.log_param("n_features", X_train.shape[1])
mlflow.log_param("n_train_samples", len(X_train))
mlflow.log_param("n_test_samples", len(X_test))
if USE_MLFLOW:
# Start MLflow run
with mlflow.start_run(run_name="random-forest-csgo"):
# Log parameters
mlflow.log_params(params)
mlflow.log_param("n_features", X_train.shape[1])
mlflow.log_param("n_train_samples", len(X_train))
mlflow.log_param("n_test_samples", len(X_test))
# Train model
# Train model
model = train_model(X_train, y_train, params)
# Evaluate model
metrics = evaluate_model(model, X_test, y_test)
# Log metrics to MLflow
mlflow.log_metrics(metrics)
# Log feature importance
feature_importance = dict(zip(X_train.columns, model.feature_importances_))
top_features = sorted(feature_importance.items(), key=lambda x: x[1], reverse=True)[:5]
print("\nTop 5 most important features:")
for feat, importance in top_features:
print(f" {feat}: {importance:.4f}")
mlflow.log_metric(f"importance_{feat}", importance)
# Try to log model to MLflow (if permissions allow)
try:
mlflow.sklearn.log_model(model, "model")
print("\nModel logged to MLflow successfully!")
except Exception as e:
print(f"\nWarning: Could not log model to MLflow: {e}")
print("Model will only be saved locally.")
# Save model and metrics locally
save_model(model, metrics)
# Print results
print("\n" + "=" * 60)
print("Training Results:")
print("=" * 60)
for metric, value in metrics.items():
print(f" {metric}: {value:.4f}")
print("=" * 60)
print(f"\nMLflow run ID: {mlflow.active_run().info.run_id}")
print(f"View run at: {mlflow.get_tracking_uri()}")
else:
# Train without MLflow
model = train_model(X_train, y_train, params)
# Evaluate model
metrics = evaluate_model(model, X_test, y_test)
# Log metrics to MLflow
mlflow.log_metrics(metrics)
# Log feature importance
feature_importance = dict(zip(X_train.columns, model.feature_importances_))
top_features = sorted(feature_importance.items(), key=lambda x: x[1], reverse=True)[:5]
print("\nTop 5 most important features:")
for feat, importance in top_features:
print(f" {feat}: {importance:.4f}")
mlflow.log_metric(f"importance_{feat}", importance)
# Try to log model to MLflow (if permissions allow)
try:
mlflow.sklearn.log_model(model, "model")
print("\nModel logged to MLflow successfully!")
except Exception as e:
print(f"\nWarning: Could not log model to MLflow: {e}")
print("Model will only be saved locally.")
# Save model and metrics locally
save_model(model, metrics)
@ -136,9 +171,6 @@ def main():
print(f" {metric}: {value:.4f}")
print("=" * 60)
print(f"\nMLflow run ID: {mlflow.active_run().info.run_id}")
print(f"View run at: {mlflow.get_tracking_uri()}")
print("\nTraining pipeline completed successfully!")
if __name__ == "__main__":