Pelajari cara menggabungkan pembelajaran mesin dengan rekayasa perangkat lunak untuk merancang, mengembangkan, menerapkan, dan melakukan iterasi pada aplikasi ML tingkat produksi.
Dalam kursus ini, kita akan beralih dari eksperimen (desain + pengembangan) ke produksi (penerapan + iterasi). Kami akan melakukan ini secara berulang dengan memotivasi komponen yang memungkinkan kami membangun sistem produksi yang andal .
Pastikan untuk menonton video di bawah ini untuk ikhtisar singkat tentang apa yang akan kami bangun.
Pembelajaran mesin bukanlah industri yang terpisah, melainkan merupakan cara berpikir yang ampuh tentang data yang tidak diperuntukkan bagi satu jenis orang saja.
Pastikan untuk mengikuti kursus untuk panduan lebih rinci tentang konten di repositori ini. Kami akan memiliki instruksi untuk laptop lokal dan cluster Anyscale pada bagian di bawah ini, jadi pastikan untuk mengaktifkan dropdown ► berdasarkan apa yang Anda gunakan (Instruksi Anyscale akan diaktifkan secara default). Jika Anda ingin menjalankan kursus ini dengan Anyscale, di mana kami akan menyediakan struktur , komputasi (GPU), dan komunitas untuk mempelajari semuanya dalam satu hari, bergabunglah dengan kelompok langsung kami berikutnya → daftar di sini!
Kami akan mulai dengan menyiapkan cluster kami dengan lingkungan dan konfigurasi komputasi.
Kita dapat membuat Ruang Kerja Skala Apa pun menggunakan UI halaman web.
- Workspace name: ` madewithml `
- Project: ` madewithml `
- Cluster environment name: ` madewithml-cluster-env `
# Toggle ` Select from saved configurations `
- Compute config: ` madewithml-cluster-compute-g5.4xlarge `
Alternatifnya, kita dapat menggunakan CLI untuk membuat ruang kerja melalui
anyscale workspace create ...
Jika Anda tidak ingin mengikuti kursus ini secara lokal atau melalui Anyscale, Anda memiliki opsi berikut:
Buat repositori dengan mengikuti petunjuk berikut: Buat repositori baru → beri nama Made-With-ML
→ Alihkan Add a README file
( sangat penting karena ini membuat cabang main
) → Klik Create repository
(gulir ke bawah)
Sekarang kita siap untuk mengkloning repositori yang memiliki semua kode kita:
git clone https://github.com/GokuMohandas/Made-With-ML.git .
touch .env
# Inside .env
GITHUB_USERNAME= " CHANGE_THIS_TO_YOUR_USERNAME " # ← CHANGE THIS
source .env
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 autoupdate
Sangat merekomendasikan menggunakan Python
3.10
dan menggunakan pyenv (mac) atau pyenv-win (windows).
Lingkungan kami dengan versi dan pustaka Python yang sesuai sudah siap untuk kami melalui lingkungan cluster yang kami gunakan saat menyiapkan Ruang Kerja Anyscale. Jadi kita hanya perlu menjalankan perintah ini:
export PYTHONPATH= $PYTHONPATH : $PWD
pre-commit install
pre-commit autoupdate
Mulailah dengan menjelajahi notebook jupyter untuk menelusuri beban kerja inti pembelajaran mesin secara interaktif.
# Start notebook
jupyter lab notebooks/madewithml.ipynb
Klik ikon Jupyter di sudut kanan atas halaman Ruang Kerja Anyscale dan ini akan membuka instance JupyterLab di tab baru. Kemudian navigasikan ke direktori notebooks
dan buka notebook madewithml.ipynb
.
Sekarang kita akan menjalankan beban kerja yang sama menggunakan skrip Python bersih dengan mengikuti praktik terbaik rekayasa perangkat lunak (pengujian, dokumentasi, logging, penyajian, pembuatan versi, dll.) Kode yang telah kita implementasikan di buku catatan kita akan difaktorkan ulang menjadi skrip berikut:
madewithml
├── config.py
├── data.py
├── evaluate.py
├── models.py
├── predict.py
├── serve.py
├── train.py
├── tune.py
└── utils.py
Catatan : Ubah nilai argumen masukan --num-workers
, --cpu-per-worker
, dan --gpu-per-worker
di bawah berdasarkan sumber daya sistem Anda. Misalnya, jika Anda menggunakan laptop lokal, konfigurasi yang masuk akal adalah --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.json
Kami akan menggunakan MLflow untuk melacak eksperimen kami dan menyimpan model kami serta UI Pelacakan MLflow untuk melihat eksperimen kami. Kami telah menyimpan eksperimen kami ke direktori lokal namun perhatikan bahwa dalam pengaturan produksi sebenarnya, kami akan memiliki lokasi pusat untuk menyimpan semua eksperimen kami. Sangat mudah/murah untuk membuat server MLflow Anda sendiri agar semua anggota tim Anda dapat melacak eksperimen mereka atau menggunakan solusi terkelola seperti Weights & Biases, Comet, dll.
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_REGISTRY
Jika Anda menjalankan notebook ini di laptop lokal Anda, buka http://localhost:8080/ untuk melihat dasbor MLflow Anda.
Jika Anda menggunakan Anyscale Workspaces, pertama-tama kita perlu mengekspos port server MLflow. Jalankan perintah berikut di terminal Anyscale Workspace Anda untuk menghasilkan URL publik ke server MLflow Anda.
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
},
...
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_ID
Setelah aplikasi berjalan, kita dapat menggunakannya melalui CURL, Python, dll.:
# 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
Di Ruang Kerja Anyscale, Ray sudah berjalan sehingga kita tidak perlu memulai/mematikan secara manual seperti yang harus kita lakukan secara lokal.
# 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_ID
Setelah aplikasi berjalan, kita dapat menggunakannya melalui CURL, Python, dll.:
# 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 tests/code --cov madewithml --cov-report html --disable-warnings # html report
python3 -m pytest tests/code --cov madewithml --cov-report term --disable-warnings # terminal report
Mulai saat ini dan seterusnya, untuk menerapkan aplikasi kita ke dalam produksi, kita harus berada di Anyscale atau di cloud VM/kluster lokal yang Anda kelola sendiri (dengan Ray). Jika tidak dalam skala apa pun, perintahnya akan sedikit berbeda tetapi konsepnya akan sama.
Jika Anda tidak ingin menyiapkan semua ini sendiri, kami sangat menyarankan untuk bergabung dengan kelompok langsung kami yang akan datang{:target="_blank"} di mana kami akan menyediakan lingkungan dengan semua infrastruktur yang sudah disiapkan untuk Anda sehingga Anda hanya fokus pada pembelajaran mesin.
Kredensial di bawah ini secara otomatis ditetapkan untuk kami jika kami menggunakan Ruang Kerja Anyscale. Kami tidak perlu menyetel kredensial ini secara eksplisit di Ruang Kerja, namun kami melakukannya jika kami menjalankannya secara lokal atau di klaster di luar tempat Pekerjaan dan Layanan Anyscale kami dikonfigurasikan untuk dijalankan.
export ANYSCALE_HOST=https://console.anyscale.com
export ANYSCALE_CLI_TOKEN= $YOUR_CLI_TOKEN # retrieved from Anyscale credentials page
Lingkungan klaster menentukan di mana beban kerja kita akan dieksekusi (OS, dependensi, dll.) Kita telah membuat lingkungan klaster ini untuk kita, namun dengan cara inilah kita dapat membuat/memperbaruinya sendiri.
export CLUSTER_ENV_NAME= " madewithml-cluster-env "
anyscale cluster-env build deploy/cluster_env.yaml --name $CLUSTER_ENV_NAME
Konfigurasi komputasi menentukan sumber daya apa yang akan digunakan untuk mengeksekusi beban kerja kita. Kami telah membuat konfigurasi komputasi ini untuk kami, tetapi inilah cara kami membuatnya sendiri.
export CLUSTER_COMPUTE_NAME= " madewithml-cluster-compute-g5.4xlarge "
anyscale cluster-compute create deploy/cluster_compute.yaml --name $CLUSTER_COMPUTE_NAME
Sekarang kami siap menjalankan beban kerja ML kami. Kita telah memutuskan untuk menggabungkan semuanya ke dalam satu pekerjaan namun kita juga dapat membuat pekerjaan terpisah untuk setiap beban kerja (melatih, mengevaluasi, dll.) Kita akan mulai dengan mengedit slot $GITHUB_USERNAME
di dalam file workloads.yaml
kita:
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)
runtime_env
di sini menetapkan bahwa kita harus mengunggah working_dir
kita saat ini ke bucket S3 sehingga semua pekerja ketika kita menjalankan Pekerjaan Anyscale memiliki akses ke kode yang akan digunakan. GITHUB_USERNAME
nantinya digunakan untuk menyimpan hasil dari beban kerja kita ke S3 sehingga kita dapat mengambilnya nanti (mis. untuk disajikan).
Sekarang kami siap mengirimkan tugas kami untuk menjalankan beban kerja ML kami:
anyscale job submit deploy/jobs/workloads.yaml
Dan setelah beban kerja ML kami dijalankan, kami siap meluncurkan model servis kami ke produksi. Mirip dengan konfigurasi Pekerjaan Anyscale kami, pastikan untuk mengubah $GITHUB_USERNAME
di 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)
Sekarang kami siap meluncurkan layanan kami:
# 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_NAME
Kami tidak akan menerapkan aplikasi kami secara manual setiap kali kami melakukan perubahan. Sebagai gantinya, kami akan mengotomatiskan proses ini menggunakan GitHub Actions!
git remote set-url origin https://github.com/ $GITHUB_USERNAME /Made-With-ML.git # <-- CHANGE THIS to your username
git checkout -b dev
/settings/secrets/actions
di repositori GitHub kami. export ANYSCALE_HOST=https://console.anyscale.com
export ANYSCALE_CLI_TOKEN= $YOUR_CLI_TOKEN # retrieved from https://console.anyscale.com/o/madewithml/credentials
main
) dan memasukkannya ke GitHub. Namun untuk memasukkan kode kita ke GitHub, kita harus mengautentikasi terlebih dahulu dengan kredensial kita sebelum memasukkan ke repositori kita: git config --global user.name $GITHUB_USERNAME # <-- CHANGE THIS to your username
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
Sekarang Anda akan diminta memasukkan nama pengguna dan kata sandi Anda (token akses pribadi). Ikuti langkah-langkah berikut untuk mendapatkan token akses pribadi: Token akses pribadi GitHub baru → Tambahkan nama → Alihkan repo
dan workflow
→ Klik Generate token
(gulir ke bawah) → Salin token dan tempel saat diminta kata sandi.
main
kita dan ini akan memicu alur kerja beban kerja. Jika alur kerja (Anyscale Jobs) berhasil maka akan menghasilkan komentar dengan hasil pelatihan dan evaluasi langsung pada PR.main
. Hal ini akan memicu alur kerja servis yang akan meluncurkan layanan baru kami ke produksi!Dengan alur kerja CI/CD yang siap untuk menerapkan aplikasi, kami kini dapat fokus untuk terus meningkatkan model kami. Menjadi sangat mudah untuk memperluas fondasi ini untuk terhubung ke proses terjadwal (cron), pipeline data, penyimpangan yang terdeteksi melalui pemantauan, evaluasi online, dll. Dan kita dapat dengan mudah menambahkan konteks tambahan seperti membandingkan eksperimen apa pun dengan eksperimen yang sedang diproduksi (secara langsung di PR bahkan), dll.
Masalah dengan mengonfigurasi notebook dengan jupyter? Secara default, jupyter akan menggunakan kernel dengan lingkungan virtual kita tetapi kita juga dapat menambahkannya secara manual ke jupyter:
python3 -m ipykernel install --user --name=venv
Sekarang kita dapat membuka buku catatan → Kernel (bilah menu atas) → Ubah Kernel → venv
. Untuk menghapus kernel ini, kita dapat melakukan hal berikut:
jupyter kernelspec list
jupyter kernelspec uninstall venv