Pelajari cara menggabungkan pembelajaran mesin dengan rekayasa perangkat lunak untuk merancang, mengembangkan, menggunakan, dan mengulangi aplikasi ML tingkat produksi.
Dalam kursus ini, kita akan beralih dari eksperimen (model desain + pengembangan) ke produksi (model penyebaran + iterasi). Kami akan melakukan ini secara iteratif dengan memotivasi komponen yang akan memungkinkan kami untuk membangun sistem produksi yang andal .
Pastikan untuk menonton video di bawah ini untuk ikhtisar cepat tentang apa yang akan kami bangun.
Pembelajaran mesin bukanlah industri yang terpisah, sebaliknya, ini adalah cara berpikir yang kuat tentang data yang tidak disediakan untuk satu tipe orang.
Pastikan untuk mengikuti kursus untuk penelusuran konten yang jauh lebih rinci di repositori ini. Kami akan memiliki instruksi untuk laptop lokal dan kluster apa pun untuk bagian di bawah ini, jadi pastikan untuk beralih ► dropdown berdasarkan apa yang Anda gunakan (instruksi apa pun akan diaktifkan secara default). Jika Anda ingin menjalankan kursus ini dengan AnyScale, di mana kami akan menyediakan struktur , Hitung (GPU) dan komunitas untuk mempelajari semuanya dalam satu akhir pekan, bergabunglah dengan kohort langsung berikutnya yang akan datang → Daftar di sini!
Kami akan mulai dengan menyiapkan cluster kami dengan lingkungan dan menghitung konfigurasi.
Kami dapat membuat ruang kerja AnyScale 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 `Atau, kita dapat menggunakan CLI untuk membuat ruang kerja melalui
anyscale workspace create ...
Jika Anda tidak ingin melakukan kursus ini secara lokal atau melalui AnyScale, Anda memiliki opsi berikut:
Buat repositori dengan mengikuti instruksi ini: Buat repositori baru → nama itu Made-With-ML → sakelar Add a README file ( sangat penting karena ini membuat cabang main ) → Klik Create repository (gulir ke bawah)
Sekarang kami siap untuk mengkloning repositori yang memiliki semua kode kami:
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 autoupdateSangat merekomendasikan menggunakan Python
3.10dan menggunakan PyenV (Mac) atau PyenV-Win (Windows).
Lingkungan kami dengan versi python yang sesuai dan perpustakaan sudah siap untuk kami melalui lingkungan cluster yang kami gunakan saat menyiapkan ruang kerja anyScale kami. Jadi kita hanya perlu menjalankan perintah ini:
export PYTHONPATH= $PYTHONPATH : $PWD
pre-commit install
pre-commit autoupdateMulailah dengan menjelajahi Jupyter Notebook untuk secara interaktif memalsukan beban kerja pembelajaran mesin inti.
# Start notebook
jupyter lab notebooks/madewithml.ipynb Klik ikon Jupyter di sudut kanan atas halaman AnyScale Workspace kami dan ini akan membuka instance Jupyterlab kami di tab baru. Kemudian arahkan ke direktori notebooks dan buka notebook madewithml.ipynb .
Sekarang kami akan menjalankan beban kerja yang sama menggunakan skrip Python bersih mengikuti praktik terbaik rekayasa perangkat lunak (pengujian, dokumentasi, logging, melayani, versi, dll.) Kode yang telah kami terapkan dalam buku catatan kami akan direkomendasikan ke dalam skrip berikut:
madewithml
├── config.py
├── data.py
├── evaluate.py
├── models.py
├── predict.py
├── serve.py
├── train.py
├── tune.py
└── utils.py Catatan : Ubah --num-workers , --cpu-per-worker , dan --gpu-per-worker nilai argumen input di bawah ini 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.jsonKami akan menggunakan MLFLOW untuk melacak eksperimen kami dan menyimpan model kami dan UI pelacakan MLFLOW untuk melihat eksperimen kami. Kami telah menyimpan eksperimen kami ke direktori lokal tetapi mencatat bahwa dalam pengaturan produksi yang sebenarnya, kami akan memiliki lokasi pusat untuk menyimpan semua percobaan kami. Mudah/murah untuk memutar server MLFLOW Anda sendiri untuk semua anggota tim Anda untuk melacak eksperimen mereka pada atau menggunakan solusi yang dikelola seperti bobot & bias, komet, 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_REGISTRYJika Anda menjalankan buku catatan ini di laptop lokal Anda, pergilah ke http: // localhost: 8080/untuk melihat dasbor mlflow Anda.
Jika Anda berada di ruang kerja apa pun, maka kami harus terlebih dahulu mengekspos port server MLFLOW. Jalankan perintah berikut di Terminal Ruang Kerja AnyScale 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
},
... # 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_IDSaat aplikasi sedang berjalan, kita dapat menggunakannya melalui Curl, Python, dll.:
# 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/evaluateDi ruang kerja AnyScale, Ray sudah berjalan sehingga kami tidak harus memulai/mematikan secara manual seperti yang harus kami 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_IDSaat aplikasi sedang berjalan, kita dapat menggunakannya melalui Curl, Python, dll.:
# 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 htmlDari titik ini dan seterusnya, untuk menggunakan aplikasi kami ke dalam produksi, kami harus berada di AnyScale atau di cloud VM / on-prem cluster yang Anda kelola sendiri (w / ray). Jika tidak pada apa pun, perintah akan sedikit berbeda tetapi konsepnya akan sama.
Jika Anda tidak ingin mengatur semua ini sendiri, kami sangat merekomendasikan bergabung dengan kohort langsung kami yang akan datang {: target = "_ blank"} di mana kami akan menyediakan lingkungan dengan semua infrastruktur ini yang sudah diatur 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 mengatur kredensial ini secara eksplisit di ruang kerja tetapi kami melakukannya jika kami menjalankan ini secara lokal atau pada sekelompok di luar tempat pekerjaan dan layanan apa pun kami dikonfigurasi untuk dijalankan.
export ANYSCALE_HOST=https://console.anyscale.com
export ANYSCALE_CLI_TOKEN= $YOUR_CLI_TOKEN # retrieved from Anyscale credentials pageLingkungan cluster menentukan di mana beban kerja kami akan dieksekusi (OS, dependensi, dll.) Kami telah membuat lingkungan cluster ini untuk kami tetapi ini adalah bagaimana kami dapat membuat/memperbarui sendiri.
export CLUSTER_ENV_NAME= " madewithml-cluster-env "
anyscale cluster-env build deploy/cluster_env.yaml --name $CLUSTER_ENV_NAMEKonfigurasi Hitung menentukan sumber daya apa yang akan dijalankan oleh beban kerja kami. Kami telah membuat konfigurasi komputasi ini untuk kami tetapi ini adalah bagaimana kami dapat membuatnya sendiri.
export CLUSTER_COMPUTE_NAME= " madewithml-cluster-compute "
anyscale cluster-compute create deploy/cluster_compute.yaml --name $CLUSTER_COMPUTE_NAME Sekarang kami siap untuk menjalankan beban kerja ML kami. Kami telah memutuskan untuk menggabungkan semuanya menjadi satu pekerjaan tetapi kami juga bisa menciptakan pekerjaan terpisah untuk setiap beban kerja (kereta, evaluasi, dll.) Kami akan mulai dengan mengedit slot $GITHUB_USERNAME di dalam workloads.yaml kami. File YL:
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 menentukan bahwa kami harus mengunggah working_dir kami saat ini ke ember S3 sehingga semua pekerja kami ketika kami menjalankan pekerjaan apa pun memiliki akses ke kode untuk digunakan. GITHUB_USERNAME kemudian digunakan untuk menyimpan hasil dari beban kerja kami ke S3 sehingga kami dapat mengambilnya nanti (mis. Untuk melayani).
Sekarang kami siap mengirimkan pekerjaan kami untuk menjalankan beban kerja ML kami:
anyscale job submit deploy/jobs/workloads.yaml Dan setelah beban kerja ML kami dieksekusi, kami siap meluncurkan Model kami untuk produksi kami. 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_NAMEKami tidak akan menggunakan aplikasi kami secara manual setiap kali kami melakukan perubahan. Sebagai gantinya, kami akan mengotomatiskan proses ini menggunakan tindakan github!
/settings/secrets/actions 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/credentialsmain ) dan mendorongnya ke GitHub. Tetapi untuk mendorong kode kami ke GitHub, kami harus mengotentikasi terlebih dahulu dengan kredensial kami sebelum mendorong ke repositori kami: 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 Sekarang Anda akan diminta untuk memasukkan nama pengguna dan kata sandi Anda (Token Akses Pribadi). Ikuti langkah -langkah ini untuk mendapatkan Token Akses Pribadi: Token Akses Pribadi GitHub Baru → Tambahkan Nama → Toggle repo dan workflow → Klik Generate token (gulir ke bawah) → Salin token dan tempel saat diminta untuk kata sandi Anda.
main kita dan ini akan memicu alur kerja beban kerja. Jika alur kerja (pekerjaan apa pun) berhasil, ini akan menghasilkan komentar dengan hasil pelatihan dan evaluasi secara langsung pada PR.main . Ini akan memicu alur kerja serve yang akan meluncurkan layanan baru kami untuk produksi!Dengan alur kerja CI/CD kami di tempat untuk menggunakan aplikasi kami, kami sekarang dapat fokus untuk terus meningkatkan model kami. Menjadi sangat mudah untuk memperluas fondasi ini untuk terhubung ke Jadwal Berjalan (CRON), jalur pipa data, drift yang terdeteksi melalui pemantauan, evaluasi online, dll. Dan kami dapat dengan mudah menambahkan konteks tambahan seperti membandingkan eksperimen apa pun dengan apa yang saat ini dalam produksi (langsung dalam PR), dll.
Masalah dengan mengkonfigurasi notebook dengan Jupyter? Secara default, Jupyter akan menggunakan kernel dengan lingkungan virtual kami tetapi kami 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 pernah menghapus kernel ini, kita dapat melakukan hal berikut:
jupyter kernelspec list
jupyter kernelspec uninstall venv