Erfahren Sie, wie Sie maschinelles Lernen mit Software-Engineering kombinieren können, um ML-Anwendungen für Produktionsqualitäten zu entwerfen, zu entwickeln, einzusetzen und zu iterieren.
In diesem Kurs werden wir von Experimentieren (Modelldesign + Entwicklung) zur Produktion (Modellbereitstellung + Iteration) wechseln. Wir werden dies iterativ tun, indem wir die Komponenten motivieren, die es uns ermöglichen, ein zuverlässiges Produktionssystem aufzubauen.
Sehen Sie sich das Video unten an, um einen kurzen Überblick darüber zu erhalten, was wir erstellen werden.
Maschinelles Lernen ist keine separate Branche, stattdessen ist es eine leistungsstarke Denkweise über Daten, die keiner Person für eine Person vorbehalten sind.
Gehen Sie unbedingt den Kurs für eine viel detailliertere Exemplar des Inhalts dieses Repositorys. Wir haben Anweisungen für lokale Laptop- und AnyScale -Cluster für die folgenden Abschnitte. Wechseln Sie daher unbedingt die ► Dropdown basierend auf dem, was Sie verwenden (AnyScale -Anweisungen werden standardmäßig eingeschaltet). Wenn Sie diesen Kurs mit AnyScale betreiben möchten, wo wir die Struktur , Berechnung (GPUs) und Community anbieten, um an einem Wochenende alles zu lernen, nehmen Sie an unserer nächsten kommenden Live -Kohorte → Anmelde hier!
Wir werden zunächst unseren Cluster mit der Umgebung einrichten und Konfigurationen berechnen.
Wir können einen AnyScale -Arbeitsbereich mit der Webseiten -Benutzeroberfläche erstellen.
- Workspace name: ` madewithml `
- Project: ` madewithml `
- Cluster environment name: ` madewithml-cluster-env `
# Toggle ` Select from saved configurations `
- Compute config: ` madewithml-cluster-compute `Alternativ können wir die CLI verwenden, um den Arbeitsbereich über
anyscale workspace create ...
Wenn Sie diesen Kurs nicht vor Ort oder über AnyalScale durchführen möchten, haben Sie die folgenden Optionen:
Erstellen Sie ein Repository, indem Sie folgende Anweisungen befolgen: Erstellen Sie ein neues Repository → Name Made-With-ML → Schalter Add a README file ( sehr wichtig , da dies eine main erstellt) → Klicken Sie auf Create repository (Scrollen Sie nach unten).
Jetzt sind wir bereit, das Repository zu klonen, das unseren gesamten Code hat:
git clone https://github.com/GokuMohandas/Made-With-ML.git .
git remote set-url origin https://github.com/GITHUB_USERNAME/Made-With-ML.git # <-- CHANGE THIS to your username
git checkout -b dev export PYTHONPATH= $PYTHONPATH : $PWD
python3 -m venv venv # recommend using Python 3.10
source venv/bin/activate # on Windows: venvScriptsactivate
python3 -m pip install --upgrade pip setuptools wheel
python3 -m pip install -r requirements.txt
pre-commit install
pre-commit autoupdateEmpfehlen Sie die Verwendung von Python
3.10und Pyenv (MAC) oder Pyenv-Win (Windows).
Unsere Umgebung mit der entsprechenden Python -Version und den Bibliotheken ist bereits für uns über die Cluster -Umgebung festgelegt, die wir bei der Einrichtung unseres AnyScale -Arbeitsbereichs verwendet haben. Wir müssen also nur diese Befehle ausführen:
export PYTHONPATH= $PYTHONPATH : $PWD
pre-commit install
pre-commit autoupdateErforschen Sie zunächst das Jupyter -Notizbuch, um die Workloads für maschinelles Lernen interaktiv zu entwickeln.
# Start notebook
jupyter lab notebooks/madewithml.ipynb Klicken Sie auf das Jupyter -Symbol in der oberen rechten Ecke unserer AnyScale -Arbeitsbereichsseite. Dadurch wird unsere JupyterLab -Instanz in einer neuen Registerkarte geöffnet. Navigieren Sie dann zum notebooks -Verzeichnis und öffnen Sie das Notebook madewithml.ipynb .
Jetzt führen wir die gleichen Workloads mit den Clean Python -Skripten aus, die nach den Best Practices (Tests, Dokumentation, Protokollierung, Servieren, Versionsung usw.) den Code, den wir in unserem Notebook implementiert haben, in die folgenden Skripte neu gestaltet werden:
madewithml
├── config.py
├── data.py
├── evaluate.py
├── models.py
├── predict.py
├── serve.py
├── train.py
├── tune.py
└── utils.py HINWEIS : Ändern Sie die unten auf den Ressourcen Ihres Systems nachstehenden Argumentwerte der --num-workers , --cpu-per-worker und --gpu-per-worker Eingabe-Argumentwerte. Wenn Sie beispielsweise auf einem lokalen Laptop befinden, wäre eine angemessene Konfiguration --num-workers 6 --cpu-per-worker 1 --gpu-per-worker 0 .
export EXPERIMENT_NAME= " llm "
export DATASET_LOC= " https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/dataset.csv "
export TRAIN_LOOP_CONFIG= ' {"dropout_p": 0.5, "lr": 1e-4, "lr_factor": 0.8, "lr_patience": 3} '
python madewithml/train.py
--experiment-name " $EXPERIMENT_NAME "
--dataset-loc " $DATASET_LOC "
--train-loop-config " $TRAIN_LOOP_CONFIG "
--num-workers 1
--cpu-per-worker 3
--gpu-per-worker 1
--num-epochs 10
--batch-size 256
--results-fp results/training_results.json export EXPERIMENT_NAME= " llm "
export DATASET_LOC= " https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/dataset.csv "
export TRAIN_LOOP_CONFIG= ' {"dropout_p": 0.5, "lr": 1e-4, "lr_factor": 0.8, "lr_patience": 3} '
export INITIAL_PARAMS= " [{ " train_loop_config " : $TRAIN_LOOP_CONFIG }] "
python madewithml/tune.py
--experiment-name " $EXPERIMENT_NAME "
--dataset-loc " $DATASET_LOC "
--initial-params " $INITIAL_PARAMS "
--num-runs 2
--num-workers 1
--cpu-per-worker 3
--gpu-per-worker 1
--num-epochs 10
--batch-size 256
--results-fp results/tuning_results.jsonWir werden MLFlow verwenden, um unsere Experimente zu verfolgen und unsere Modelle und die MLFlow -Tracking -UI zu speichern, um unsere Experimente anzuzeigen. Wir haben unsere Experimente in einem lokalen Verzeichnis gespeichert, beachten Sie jedoch, dass wir in einer tatsächlichen Produktionsumgebung einen zentralen Standort haben würden, um alle unsere Experimente zu speichern. Es ist einfach/kostengünstig, Ihren eigenen MLFlow -Server für alle Ihre Teammitglieder zu verfolgen, um ihre Experimente auf oder verwenden eine verwaltete Lösung wie Gewichte und Verzerrungen, Comet usw. zu verwenden.
export MODEL_REGISTRY= $( python -c " from madewithml import config; print(config.MODEL_REGISTRY) " )
mlflow server -h 0.0.0.0 -p 8080 --backend-store-uri $MODEL_REGISTRYWenn Sie dieses Notizbuch auf Ihrem lokalen Laptop ausführen, gehen Sie zu http: // localhost: 8080/, um Ihr MLFlow -Dashboard anzuzeigen.
Wenn Sie sich in AnyScale -Arbeitsbereichen befinden, müssen wir zunächst den Port des MLFlow -Servers enthüllen. Führen Sie den folgenden Befehl in Ihrem AnyScale Workspace -Terminal aus, um die öffentliche URL auf Ihren MLFlow -Server zu generieren.
APP_PORT=8080
echo https:// $APP_PORT -port- $ANYSCALE_SESSION_DOMAIN export EXPERIMENT_NAME= " llm "
export RUN_ID= $( python madewithml/predict.py get-best-run-id --experiment-name $EXPERIMENT_NAME --metric val_loss --mode ASC )
export HOLDOUT_LOC= " https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/holdout.csv "
python madewithml/evaluate.py
--run-id $RUN_ID
--dataset-loc $HOLDOUT_LOC
--results-fp results/evaluation_results.json{
"timestamp" : " June 09, 2023 09:26:18 AM " ,
"run_id" : " 6149e3fec8d24f1492d4a4cabd5c06f6 " ,
"overall" : {
"precision" : 0.9076136428670714 ,
"recall" : 0.9057591623036649 ,
"f1" : 0.9046792827719773 ,
"num_samples" : 191.0
},
... # Get run ID
export EXPERIMENT_NAME= " llm "
export RUN_ID= $( python madewithml/predict.py get-best-run-id --experiment-name $EXPERIMENT_NAME --metric val_loss --mode ASC )
python madewithml/predict.py predict
--run-id $RUN_ID
--title " Transfer learning with transformers "
--description " Using transformers for transfer learning on text classification tasks. " [{
"prediction" : [
" natural-language-processing "
],
"probabilities" : {
"computer-vision" : 0.0009767753 ,
"mlops" : 0.0008223939 ,
"natural-language-processing" : 0.99762577 ,
"other" : 0.000575123
}
}] # Start
ray start --head # Set up
export EXPERIMENT_NAME= " llm "
export RUN_ID= $( python madewithml/predict.py get-best-run-id --experiment-name $EXPERIMENT_NAME --metric val_loss --mode ASC )
python madewithml/serve.py --run_id $RUN_IDWährend der Anwendung können wir sie über Curl, Python usw. verwenden:
# via cURL
curl -X POST -H " Content-Type: application/json " -d ' {
"title": "Transfer learning with transformers",
"description": "Using transformers for transfer learning on text classification tasks."
} ' http://127.0.0.1:8000/predict # via Python
import json
import requests
title = "Transfer learning with transformers"
description = "Using transformers for transfer learning on text classification tasks."
json_data = json . dumps ({ "title" : title , "description" : description })
requests . post ( "http://127.0.0.1:8000/predict" , data = json_data ). json ()ray stop # shutdown export HOLDOUT_LOC= " https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/holdout.csv "
curl -X POST -H " Content-Type: application/json " -d ' {
"dataset_loc": "https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/holdout.csv"
} ' http://127.0.0.1:8000/evaluateIn AnyScale -Arbeitsbereichen läuft Ray bereits, sodass wir nicht manuell starten/schalten müssen, wie wir es lokal tun müssen.
# Set up
export EXPERIMENT_NAME= " llm "
export RUN_ID= $( python madewithml/predict.py get-best-run-id --experiment-name $EXPERIMENT_NAME --metric val_loss --mode ASC )
python madewithml/serve.py --run_id $RUN_IDWährend der Anwendung können wir sie über Curl, Python usw. verwenden:
# via cURL
curl -X POST -H " Content-Type: application/json " -d ' {
"title": "Transfer learning with transformers",
"description": "Using transformers for transfer learning on text classification tasks."
} ' http://127.0.0.1:8000/predict # via Python
import json
import requests
title = "Transfer learning with transformers"
description = "Using transformers for transfer learning on text classification tasks."
json_data = json . dumps ({ "title" : title , "description" : description })
requests . post ( "http://127.0.0.1:8000/predict" , data = json_data ). json () # Code
python3 -m pytest tests/code --verbose --disable-warnings
# Data
export DATASET_LOC= " https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/dataset.csv "
pytest --dataset-loc= $DATASET_LOC tests/data --verbose --disable-warnings
# Model
export EXPERIMENT_NAME= " llm "
export RUN_ID= $( python madewithml/predict.py get-best-run-id --experiment-name $EXPERIMENT_NAME --metric val_loss --mode ASC )
pytest --run-id= $RUN_ID tests/model --verbose --disable-warnings
# Coverage
python3 -m pytest --cov madewithml --cov-report htmlAb diesem Zeitpunkt müssen wir entweder in AnyScale oder in einem Cloud-VM / On-Prem-Cluster, um sich selbst zu verwalten (W / Ray), um unsere Anwendung in Produktion einzusetzen. Wenn nicht in AnyScale, sind die Befehle geringfügig unterschiedlich, aber die Konzepte sind gleich.
Wenn Sie all dies nicht selbst einrichten möchten, empfehlen wir dringend, an unserer kommenden Live -Kohorte {: target = "_ leer"} teilzunehmen, in der wir eine Umgebung mit all dieser Infrastruktur zur Verfügung stellen, die bereits für Sie eingerichtet ist, damit Sie sich gerade auf das maschinelle Lernen konzentriert haben.
Diese folgenden Anmeldeinformationen sind für uns automatisch festgelegt, wenn wir AnyScale -Arbeitsbereiche verwenden. Wir müssen diese Anmeldeinformationen nicht ausdrücklich auf Arbeitsbereiche festlegen, aber wir tun es, wenn wir diese lokal oder auf einem Cluster außerhalb dessen Ausführen unserer AnyScale -Jobs und -Dienste für die Ausführung ausführen.
export ANYSCALE_HOST=https://console.anyscale.com
export ANYSCALE_CLI_TOKEN= $YOUR_CLI_TOKEN # retrieved from Anyscale credentials pageDie Cluster -Umgebung bestimmt, wo unsere Workloads ausgeführt werden (Betriebssystem, Abhängigkeiten usw.). Wir haben diese Cluster -Umgebung bereits für uns erstellt, aber so können wir selbst eine erstellen/aktualisieren.
export CLUSTER_ENV_NAME= " madewithml-cluster-env "
anyscale cluster-env build deploy/cluster_env.yaml --name $CLUSTER_ENV_NAMEDie Rechenkonfiguration bestimmt, auf welchen Ressourcen unsere Workloads ausgeführt werden. Wir haben diese Rechenkonfiguration bereits für uns erstellt, aber so können wir sie selbst erstellen.
export CLUSTER_COMPUTE_NAME= " madewithml-cluster-compute "
anyscale cluster-compute create deploy/cluster_compute.yaml --name $CLUSTER_COMPUTE_NAME Jetzt sind wir bereit, unsere ML -Workloads auszuführen. Wir haben beschlossen, sie alle zu einem Job zu kombinieren $GITHUB_USERNAME aber wir hätten auch separate Jobs für jede workloads.yaml (trainieren, bewerten usw.) erstellen können.
runtime_env :
working_dir : .
upload_path : s3://madewithml/$GITHUB_USERNAME/jobs # <--- CHANGE USERNAME (case-sensitive)
env_vars :
GITHUB_USERNAME : $GITHUB_USERNAME # <--- CHANGE USERNAME (case-sensitive) Der hier runtime_env gibt an, dass wir unseren aktuellen working_dir in einen S3 -Bucket hochladen sollten, damit alle unsere Mitarbeiter, wenn wir einen AnyScale -Job ausführen, Zugriff auf den zu verwendenden Code haben. Der GITHUB_USERNAME wird später verwendet, um Ergebnisse von unseren Workloads auf S3 zu speichern, damit wir sie später abrufen können (z. B. zum Servieren).
Jetzt sind wir bereit, unseren Job einzureichen, um unsere ML -Workloads auszuführen:
anyscale job submit deploy/jobs/workloads.yaml Und nachdem unsere ML -Workloads ausgeführt wurden, sind wir bereit, unser Aufschlag unseres Modells für die Produktion zu starten. Ähnlich wie bei unseren AnyScale -Job -Konfigurationen ändern Sie den $GITHUB_USERNAME in serve_model.yaml .
ray_serve_config :
import_path : deploy.services.serve_model:entrypoint
runtime_env :
working_dir : .
upload_path : s3://madewithml/$GITHUB_USERNAME/services # <--- CHANGE USERNAME (case-sensitive)
env_vars :
GITHUB_USERNAME : $GITHUB_USERNAME # <--- CHANGE USERNAME (case-sensitive)Jetzt sind wir bereit, unseren Service zu starten:
# Rollout service
anyscale service rollout -f deploy/services/serve_model.yaml
# Query
curl -X POST -H " Content-Type: application/json " -H " Authorization: Bearer $SECRET_TOKEN " -d ' {
"title": "Transfer learning with transformers",
"description": "Using transformers for transfer learning on text classification tasks."
} ' $SERVICE_ENDPOINT /predict/
# Rollback (to previous version of the Service)
anyscale service rollback -f $SERVICE_CONFIG --name $SERVICE_NAME
# Terminate
anyscale service terminate --name $SERVICE_NAMEWir werden unsere Anwendung nicht jedes Mal manuell einsetzen, wenn wir eine Änderung vornehmen. Stattdessen automatisieren wir diesen Prozess mit GitHub -Aktionen!
/settings/secrets/actions unseres Github -Repositorys hinzufügen. export ANYSCALE_HOST=https://console.anyscale.com
export ANYSCALE_CLI_TOKEN= $YOUR_CLI_TOKEN # retrieved from https://console.anyscale.com/o/madewithml/credentialsmain ) und sie nach GitHub schieben. Um unseren Code jedoch nach GitHub zu bringen, müssen wir uns zunächst mit unseren Anmeldeinformationen authentifizieren, bevor wir uns auf unser Repository drängen: git config --global user.name " Your Name " # <-- CHANGE THIS to your name
git config --global user.email [email protected] # <-- CHANGE THIS to your email
git add .
git commit -m " " # <-- CHANGE THIS to your message
git push origin dev Jetzt werden Sie aufgefordert, Ihren Benutzernamen und Ihr Passwort (Personal Access Token) einzugeben. Befolgen Sie diese Schritte, um persönliche Zugriffstoken zu erhalten: Neues Github Personal Access Token → Name → repo und workflow → Klicken Sie Generate token (Scrollen) → Kopieren Sie das Token und fügen Sie es ein, wenn Sie für Ihr Passwort aufgefordert werden.
main starten, und dies wird den Workloads -Workflow auslösen. Wenn der Workflow (AnyScale Jobs) erfolgreich ist, wird dies mit den Schulungs- und Bewertungsergebnissen direkt auf der PR Kommentare erzeugt.main verschmelzen. Dadurch wird der Serve -Workflow ausgelöst, der unseren neuen Service für die Produktion einrollt!Mit unserem CI/CD -Workflow für die Bereitstellung unserer Anwendung können wir uns nun darauf konzentrieren, unser Modell kontinuierlich zu verbessern. Es ist sehr einfach, diese Fundament zu erweitern, um eine Verbindung zu geplanten Läufen (CRON), Datenpipelines und Drift durch Überwachung, Online -Bewertung usw. zu erkennen. Wir können problemlos zusätzlichen Kontext hinzufügen, z.
Probleme mit der Konfiguration der Notizbücher mit Jupyter? Standardmäßig wird Jupyter den Kernel mit unserer virtuellen Umgebung verwenden, aber wir können es auch manuell zu Jupyter hinzufügen:
python3 -m ipykernel install --user --name=venv Jetzt können wir ein Notizbuch → Kernel (obere Menüleiste) → Kernel ändern → venv . Um diesen Kernel jemals zu löschen, können wir Folgendes tun:
jupyter kernelspec list
jupyter kernelspec uninstall venv