เรียนรู้วิธีผสมผสานการเรียนรู้ของเครื่องเข้ากับวิศวกรรมซอฟต์แวร์เพื่อออกแบบ พัฒนา ปรับใช้ และทำซ้ำในแอปพลิเคชัน ML ระดับการผลิต
ในหลักสูตรนี้ เราจะเริ่มจากการทดลอง (การออกแบบ + การพัฒนา) ไปจนถึงการผลิต (การปรับใช้ + การวนซ้ำ) เราจะทำเช่นนี้ซ้ำๆ โดยการกระตุ้นส่วนประกอบต่างๆ ที่จะช่วยให้เราสามารถสร้างระบบการผลิต ที่เชื่อถือได้
อย่าลืมชมวิดีโอด้านล่างเพื่อดูภาพรวมโดยย่อของสิ่งที่เราจะสร้าง
การเรียนรู้ของเครื่องไม่ใช่อุตสาหกรรมที่แยกจากกัน แต่เป็นวิธีคิดที่มีประสิทธิภาพเกี่ยวกับข้อมูลที่ไม่ได้สงวนไว้สำหรับบุคคลประเภทใดประเภทหนึ่ง
อย่าลืมผ่านหลักสูตรนี้เพื่อดูรายละเอียดเพิ่มเติมเกี่ยวกับเนื้อหาในพื้นที่เก็บข้อมูลนี้ เราจะมีคำแนะนำสำหรับทั้งแล็ปท็อปในเครื่องและคลัสเตอร์ Anyscale สำหรับส่วนด้านล่าง ดังนั้นอย่าลืมสลับเมนูแบบเลื่อนลง ► ตามสิ่งที่คุณกำลังใช้ (คำแนะนำทุกขนาดจะถูกเปิดใช้งานตามค่าเริ่มต้น) หากคุณต้องการดำเนินหลักสูตรนี้กับ Anyscale ซึ่งเราจะจัดเตรียม โครงสร้าง การประมวลผล (GPU) และ ชุมชน เพื่อเรียนรู้ทุกสิ่งในหนึ่งวัน เข้าร่วมกลุ่มประชากรตามรุ่นสดครั้งต่อไปที่กำลังจะมีขึ้น → ลงทะเบียนที่นี่!
เราจะเริ่มต้นด้วยการตั้งค่าคลัสเตอร์ของเราด้วยสภาพแวดล้อมและการกำหนดค่าการประมวลผล
เราสามารถสร้าง Anyscale Workspace ได้โดยใช้ UI ของหน้าเว็บ
- Workspace name: ` madewithml `
- Project: ` madewithml `
- Cluster environment name: ` madewithml-cluster-env `
# Toggle ` Select from saved configurations `
- Compute config: ` madewithml-cluster-compute-g5.4xlarge `
อีกทางหนึ่ง เราสามารถใช้ CLI เพื่อสร้างพื้นที่ทำงานผ่าน
anyscale workspace create ...
หากคุณไม่ต้องการทำหลักสูตรนี้ในพื้นที่หรือผ่าน Anyscale คุณมีตัวเลือกดังต่อไปนี้:
สร้างพื้นที่เก็บข้อมูลโดยทำตามคำแนะนำเหล่านี้: สร้างพื้นที่เก็บข้อมูลใหม่ → ตั้งชื่อเป็น Made-With-ML
→ สลับ Add a README file
( สำคัญมาก เนื่องจากเป็นการสร้างสาขา main
) → คลิก Create repository
(เลื่อนลง)
ตอนนี้เราพร้อมที่จะโคลนพื้นที่เก็บข้อมูลที่มีโค้ดทั้งหมดของเราแล้ว:
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
ขอแนะนำเป็นอย่างยิ่งให้ใช้ Python
3.10
และใช้ pyenv (mac) หรือ pyenv-win (windows)
สภาพแวดล้อมของเราที่มีเวอร์ชัน Python และไลบรารีที่เหมาะสมนั้นได้รับการตั้งค่าไว้แล้วสำหรับเราผ่านสภาพแวดล้อมคลัสเตอร์ที่เราใช้เมื่อตั้งค่า Anyscale Workspace ของเรา ดังนั้นเราจึงต้องรันคำสั่งเหล่านี้:
export PYTHONPATH= $PYTHONPATH : $PWD
pre-commit install
pre-commit autoupdate
เริ่มต้นด้วยการสำรวจสมุดบันทึก Jupyter เพื่อแนะนำปริมาณงานหลักของ Machine Learning แบบโต้ตอบ
# Start notebook
jupyter lab notebooks/madewithml.ipynb
คลิกที่ไอคอน Jupyter ที่มุมขวาบนของหน้า Anyscale Workspace ของเรา และจะเป็นการเปิดอินสแตนซ์ JupyterLab ของเราในแท็บใหม่ จากนั้นไปที่ไดเรกทอรี notebooks
และเปิดสมุดบันทึก madewithml.ipynb
ตอนนี้ เราจะดำเนินการปริมาณงานเดียวกันโดยใช้สคริปต์ Python ที่ปลอดภัยตามแนวทางปฏิบัติที่ดีที่สุดด้านวิศวกรรมซอฟต์แวร์ (การทดสอบ เอกสาร การบันทึก การให้บริการ การกำหนดเวอร์ชัน ฯลฯ) โค้ดที่เรานำมาใช้ในสมุดบันทึกของเราจะถูกปรับโครงสร้างใหม่เป็นสคริปต์ต่อไปนี้:
madewithml
├── config.py
├── data.py
├── evaluate.py
├── models.py
├── predict.py
├── serve.py
├── train.py
├── tune.py
└── utils.py
หมายเหตุ : เปลี่ยนค่าอาร์กิวเมนต์อินพุต --num-workers
, --cpu-per-worker
และ --gpu-per-worker
ด้านล่างตามทรัพยากรของระบบของคุณ ตัวอย่างเช่น หากคุณใช้แล็ปท็อปในพื้นที่ การกำหนดค่าที่เหมาะสมจะเป็น --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
เราจะใช้ MLflow เพื่อติดตามการทดลองของเราและจัดเก็บแบบจำลองของเราและ UI การติดตาม MLflow เพื่อดูการทดลองของเรา เราได้บันทึกการทดลองของเราไว้ในไดเร็กทอรีท้องถิ่น แต่โปรดทราบว่าในสภาพแวดล้อมที่ใช้งานจริง เราจะมีศูนย์กลางสำหรับจัดเก็บการทดลองทั้งหมดของเรา เป็นเรื่องง่าย/ไม่แพงในการหมุนเซิร์ฟเวอร์ MLflow ของคุณเองเพื่อให้สมาชิกในทีมทุกคนติดตามการทดลองหรือใช้โซลูชันที่ได้รับการจัดการ เช่น Weights & Biases, Comet เป็นต้น
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
หากคุณใช้งานโน้ตบุ๊กนี้บนแล็ปท็อปในพื้นที่ของคุณ ให้ไปที่ http://localhost:8080/ เพื่อดูแดชบอร์ด MLflow ของคุณ
หากคุณอยู่ใน Anyscale Workspaces เราจำเป็นต้องเปิดเผยพอร์ตของเซิร์ฟเวอร์ MLflow ก่อน เรียกใช้คำสั่งต่อไปนี้บนเทอร์มินัล Anyscale Workspace ของคุณเพื่อสร้าง URL สาธารณะไปยังเซิร์ฟเวอร์ MLflow ของคุณ
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
เมื่อแอปพลิเคชันทำงาน เราสามารถใช้งานได้ผ่าน cURL, Python ฯลฯ:
# 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
ในพื้นที่ทำงาน Anyscale นั้น Ray กำลังทำงานอยู่แล้ว ดังนั้นเราจึงไม่จำเป็นต้องเริ่ม/ปิดเครื่องด้วยตนเองเหมือนกับที่เราต้องทำในเครื่อง
# 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
เมื่อแอปพลิเคชันทำงาน เราสามารถใช้งานได้ผ่าน cURL, Python ฯลฯ:
# 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
จากจุดนี้เป็นต้นไป เพื่อปรับใช้แอปพลิเคชันของเราในการผลิต เราจะต้องอยู่บน Anyscale หรือบนคลาวด์ VM / คลัสเตอร์ในองค์กรที่คุณจัดการด้วยตัวเอง (พร้อม Ray) หากไม่ใช่บน Anyscale คำสั่งจะแตกต่างออกไปเล็กน้อย แต่แนวคิดจะเหมือนกัน
หากคุณไม่ต้องการตั้งค่าทั้งหมดนี้ด้วยตนเอง เราขอแนะนำเป็นอย่างยิ่งให้เข้าร่วมกลุ่มประชากรตามรุ่นที่กำลังถ่ายทอดสดที่กำลังจะมีขึ้น{:target="_blank"} ซึ่งเราจะจัดเตรียมสภาพแวดล้อมที่มีโครงสร้างพื้นฐานทั้งหมดนี้เตรียมไว้ให้คุณแล้ว เพื่อให้คุณ เพียงแค่มุ่งเน้นไปที่การเรียนรู้ของเครื่อง
ข้อมูลรับรองด้านล่างนี้ได้รับการตั้งค่า โดยอัตโนมัติ หากเราใช้ Anyscale Workspaces เรา ไม่ จำเป็นต้องตั้งค่าข้อมูลประจำตัวเหล่านี้อย่างชัดเจนบนพื้นที่ทำงาน แต่เราจะทำหากเราใช้งานสิ่งนี้ภายในเครื่องหรือบนคลัสเตอร์ภายนอกที่งานและบริการ Anyscale ของเราได้รับการกำหนดค่าให้ทำงาน
export ANYSCALE_HOST=https://console.anyscale.com
export ANYSCALE_CLI_TOKEN= $YOUR_CLI_TOKEN # retrieved from Anyscale credentials page
สภาพแวดล้อมคลัสเตอร์จะกำหนด ตำแหน่งที่ ปริมาณงานของเราจะถูกดำเนินการ (ระบบปฏิบัติการ การขึ้นต่อกัน ฯลฯ) เราได้สร้างสภาพแวดล้อมคลัสเตอร์นี้ให้เราแล้ว แต่นี่คือวิธีที่เราสามารถสร้าง/อัปเดตด้วยตนเอง
export CLUSTER_ENV_NAME= " madewithml-cluster-env "
anyscale cluster-env build deploy/cluster_env.yaml --name $CLUSTER_ENV_NAME
การกำหนดค่าการประมวลผลจะกำหนดว่าทรัพยากร ใดที่ ปริมาณงานของเราจะถูกดำเนินการ เราได้สร้างการกำหนดค่าการประมวลผลนี้ให้เราแล้ว แต่นี่คือวิธีที่เราสร้างขึ้นเองได้
export CLUSTER_COMPUTE_NAME= " madewithml-cluster-compute-g5.4xlarge "
anyscale cluster-compute create deploy/cluster_compute.yaml --name $CLUSTER_COMPUTE_NAME
ตอนนี้เราพร้อมที่จะดำเนินการปริมาณงาน ML ของเราแล้ว เราได้ตัดสินใจที่จะรวมงานทั้งหมดเข้าด้วยกันเป็นงานเดียว แต่เราสามารถสร้างงานแยกกันสำหรับแต่ละปริมาณงานได้ (ฝึก ประเมินผล ฯลฯ) เราจะเริ่มต้นด้วยการแก้ไขช่อง $GITHUB_USERNAME
ภายในไฟล์ workloads.yaml
ของเรา:
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
ที่นี่ระบุว่าเราควรอัปโหลด working_dir
ปัจจุบันของเราไปยังบัคเก็ต S3 เพื่อให้ผู้ปฏิบัติงานทั้งหมดของเราเมื่อเราดำเนินการงาน Anyscale สามารถเข้าถึงโค้ดที่จะใช้ได้ GITHUB_USERNAME
ใช้ในภายหลังเพื่อบันทึกผลลัพธ์จากปริมาณงานของเราไปยัง S3 เพื่อให้เราสามารถดึงข้อมูลได้ในภายหลัง (เช่น สำหรับการให้บริการ)
ตอนนี้เราพร้อมที่จะส่งงานเพื่อดำเนินการปริมาณงาน ML ของเราแล้ว:
anyscale job submit deploy/jobs/workloads.yaml
และหลังจากดำเนินการปริมาณงาน ML ของเราแล้ว เราก็พร้อมที่จะเปิดตัวโมเดลของเราสู่การใช้งานจริง เช่นเดียวกับการกำหนดค่า Anyscale Jobs ของเรา อย่าลืมเปลี่ยน $GITHUB_USERNAME
ใน 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)
ตอนนี้เราพร้อมที่จะเปิดตัวบริการของเราแล้ว:
# 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
เราจะไม่ปรับใช้แอปพลิเคชันของเราด้วยตนเองทุกครั้งที่ทำการเปลี่ยนแปลง แต่เราจะทำให้กระบวนการนี้เป็นแบบอัตโนมัติโดยใช้ 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
ของที่เก็บ GitHub ของเรา export ANYSCALE_HOST=https://console.anyscale.com
export ANYSCALE_CLI_TOKEN= $YOUR_CLI_TOKEN # retrieved from https://console.anyscale.com/o/madewithml/credentials
main
) และพุชไปที่ GitHub แต่เพื่อที่จะพุชโค้ดของเราไปที่ GitHub เราจะต้องตรวจสอบสิทธิ์ด้วยข้อมูลรับรองของเราก่อนจึงจะพุชไปยังที่เก็บของเรา: 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
ตอนนี้คุณจะได้รับแจ้งให้ป้อนชื่อผู้ใช้และรหัสผ่านของคุณ (โทเค็นการเข้าถึงส่วนบุคคล) ทำตามขั้นตอนเหล่านี้เพื่อรับโทเค็นการเข้าถึงส่วนบุคคล: โทเค็นการเข้าถึงส่วนบุคคล GitHub ใหม่ → เพิ่มชื่อ → สลับ repo
และ workflow
→ คลิก Generate token
(เลื่อนลง) → คัดลอกโทเค็นและวางเมื่อได้รับแจ้งให้ใส่รหัสผ่าน
main
ของเราได้ และสิ่งนี้จะทริกเกอร์เวิร์กโฟลว์ปริมาณงาน หากเวิร์กโฟลว์ (Anyscale Jobs) ประสบความสำเร็จ จะแสดงความคิดเห็นพร้อมกับผลการฝึกอบรมและการประเมินผลโดยตรงที่ PRmain
ได้ สิ่งนี้จะทริกเกอร์เวิร์กโฟลว์การให้บริการซึ่งจะเปิดตัวบริการใหม่ของเราสู่การใช้งานจริง!ด้วยเวิร์กโฟลว์ CI/CD ของเราในการปรับใช้แอปพลิเคชันของเรา ตอนนี้เราสามารถมุ่งเน้นไปที่การปรับปรุงโมเดลของเราอย่างต่อเนื่อง เป็นเรื่องง่ายมากที่จะขยายบนรากฐานนี้เพื่อเชื่อมต่อกับการรันตามกำหนดการ (cron), ไปป์ไลน์ข้อมูล, การดริฟท์ที่ตรวจพบผ่านการตรวจสอบ, การประเมินออนไลน์ ฯลฯ และเราสามารถเพิ่มบริบทเพิ่มเติมได้อย่างง่ายดาย เช่น การเปรียบเทียบการทดลองใดๆ กับสิ่งที่กำลังใช้งานอยู่ในปัจจุบัน (โดยตรง ในการประชาสัมพันธ์ด้วยซ้ำ) ฯลฯ
ปัญหาในการกำหนดค่าโน้ตบุ๊กด้วย jupyter ตามค่าเริ่มต้น jupyter จะใช้เคอร์เนลกับสภาพแวดล้อมเสมือนของเรา แต่เรายังสามารถเพิ่มเคอร์เนลลงใน jupyter ได้ด้วยตนเอง:
python3 -m ipykernel install --user --name=venv
ตอนนี้เราสามารถเปิดสมุดบันทึก → เคอร์เนล (แถบเมนูด้านบน) → เปลี่ยนเคอร์เนล → venv
หากต้องการลบเคอร์เนลนี้ เราสามารถดำเนินการดังต่อไปนี้:
jupyter kernelspec list
jupyter kernelspec uninstall venv