เรียนรู้วิธีการรวมการเรียนรู้ของเครื่องเข้ากับวิศวกรรมซอฟต์แวร์เพื่อออกแบบพัฒนาปรับใช้และวนซ้ำกับแอพพลิเคชั่น ML เกรดการผลิต
ในหลักสูตรนี้เราจะไปจากการทดลอง (การออกแบบโมเดล + การพัฒนา) ไปจนถึงการผลิต (การปรับใช้แบบจำลอง + การวนซ้ำ) เราจะทำสิ่งนี้ซ้ำ ๆ โดยการกระตุ้นส่วนประกอบที่จะช่วยให้เราสามารถสร้างระบบการผลิต ที่เชื่อถือได้
อย่าลืมดูวิดีโอด้านล่างเพื่อดูภาพรวมอย่างรวดเร็วของสิ่งที่เราจะสร้าง
การเรียนรู้ของเครื่องไม่ใช่อุตสาหกรรมที่แยกต่างหาก แต่เป็นวิธีคิดที่ทรงพลังเกี่ยวกับข้อมูลที่ไม่ได้สงวนไว้สำหรับบุคคลประเภทใดประเภทหนึ่ง
ให้แน่ใจว่าได้ผ่านหลักสูตรเพื่อขอคำแนะนำรายละเอียดเพิ่มเติมของเนื้อหาในที่เก็บนี้ เราจะมีคำแนะนำสำหรับทั้งแล็ปท็อปในท้องถิ่นและกลุ่ม anyscale สำหรับส่วนด้านล่างดังนั้นอย่าลืมสลับ►แบบเลื่อนลงตามสิ่งที่คุณใช้ (คำแนะนำใด ๆ จะถูกสลับตามค่าเริ่มต้น) หากคุณต้องการดำเนินการหลักสูตรนี้ด้วย OneScale ซึ่งเราจะจัดเตรียม โครงสร้าง การคำนวณ (GPU) และ ชุมชน เพื่อเรียนรู้ทุกอย่างในวันหยุดสุดสัปดาห์หนึ่งเข้าร่วมการศึกษาสดครั้งต่อไปของเรา→ลงทะเบียนที่นี่!
เราจะเริ่มต้นด้วยการตั้งค่าคลัสเตอร์ของเราด้วยสภาพแวดล้อมและคำนวณการกำหนดค่า
เราสามารถสร้างพื้นที่ทำงานใด ๆ โดยใช้เว็บเพจ UI
- Workspace name: ` madewithml `
- Project: ` madewithml `
- Cluster environment name: ` madewithml-cluster-env `
# Toggle ` Select from saved configurations `
- Compute config: ` madewithml-cluster-compute `อีกทางเลือกหนึ่งเราสามารถใช้ CLI เพื่อสร้างพื้นที่ทำงานผ่าน
anyscale workspace create ...
หากคุณไม่ต้องการทำหลักสูตรนี้ในพื้นที่หรือผ่านทางใด ๆ คุณมีตัวเลือกต่อไปนี้:
สร้างที่เก็บโดยทำตามคำแนะนำเหล่านี้: สร้างที่เก็บใหม่→ชื่อมัน Made-With-ML →สลับ Add a README file ( สำคัญมาก เมื่อสร้างสาขา main ) →คลิก Create repository (เลื่อนลง)
ตอนนี้เราพร้อมที่จะโคลนพื้นที่เก็บข้อมูลที่มีรหัสทั้งหมดของเรา:
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 autoupdateขอแนะนำอย่างยิ่งให้ใช้ Python
3.10และใช้ Pyenv (Mac) หรือ Pyenv-Win (Windows)
สภาพแวดล้อมของเราที่มีเวอร์ชัน Python และไลบรารีที่เหมาะสมได้รับการตั้งค่าไว้แล้วสำหรับเราผ่านสภาพแวดล้อมคลัสเตอร์ที่เราใช้เมื่อตั้งค่าพื้นที่ทำงาน AnyScale ของเรา ดังนั้นเราแค่ต้องเรียกใช้คำสั่งเหล่านี้:
export PYTHONPATH= $PYTHONPATH : $PWD
pre-commit install
pre-commit autoupdateเริ่มต้นด้วยการสำรวจสมุดบันทึก Jupyter เพื่อแนะนำเวิร์กโหลดการเรียนรู้ของเครื่องหลัก
# Start notebook
jupyter lab notebooks/madewithml.ipynb คลิกที่ไอคอน Jupyter ที่มุมบนขวาของหน้า OneScale Workspace ของเราและสิ่งนี้จะเปิดอินสแตนซ์ JupyterLab ของเราในแท็บใหม่ จากนั้นนำทางไปยังไดเรกทอรี notebooks และเปิดสมุดบันทึก madewithml.ipynb
ตอนนี้เราจะดำเนินการเวิร์กโหลดเดียวกันโดยใช้สคริปต์ Clean 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 ของคุณเองสำหรับสมาชิกในทีมของคุณทุกคนเพื่อติดตามการทดลองหรือใช้โซลูชันที่มีการจัดการเช่นน้ำหนักและอคติดาวหาง ฯลฯ
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 ของคุณ
หากคุณอยู่ในพื้นที่ทำงานใด ๆ เราต้องเปิดเผยพอร์ตของเซิร์ฟเวอร์ MLFlow ก่อน เรียกใช้คำสั่งต่อไปนี้บนเทอร์มินัลเวิร์กสเปซของคุณเพื่อสร้าง 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
},
... # 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_IDในขณะที่แอปพลิเคชันกำลังทำงานอยู่เราสามารถใช้ผ่าน Curl, Python และอื่น ๆ :
# 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/evaluateในพื้นที่ทำงานของ OneScale เรย์กำลังทำงานอยู่แล้วดังนั้นเราจึงไม่ต้องเริ่ม/ปิดตัวเองเหมือนเราต้องทำในพื้นที่
# 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 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 htmlจากจุดนี้เป็นต้นไปเพื่อปรับใช้แอปพลิเคชันของเราในการผลิตเราจะต้องอยู่ในระดับใด ๆ หรือบนคลัสเตอร์ Cloud VM / on-prem ที่คุณจัดการด้วยตัวเอง (w / ray) หากไม่ได้อยู่ใน anyscale คำสั่งจะแตกต่างกันเล็กน้อย แต่แนวคิดจะเหมือนกัน
หากคุณไม่ต้องการตั้งค่าทั้งหมดนี้ด้วยตัวคุณเองเราขอแนะนำให้เข้าร่วมกลุ่มสดที่กำลังจะมาถึง {: target = "_ blank"} ซึ่งเราจะให้สภาพแวดล้อมกับโครงสร้างพื้นฐานทั้งหมดนี้ตั้งค่าไว้สำหรับคุณเพื่อที่คุณจะได้มุ่งเน้นไปที่การเรียนรู้ของเครื่อง
ข้อมูลประจำตัวเหล่านี้ด้านล่างจะถูกตั้งค่าไว้สำหรับเรา โดยอัตโนมัติ หากเราใช้พื้นที่ทำงานใด ๆ เรา ไม่ จำเป็นต้องตั้งค่าข้อมูลรับรองเหล่านี้อย่างชัดเจนเกี่ยวกับพื้นที่ทำงาน แต่เราทำถ้าเราใช้งานนี้ในพื้นที่หรือบนคลัสเตอร์นอกสถานที่ที่งานและบริการใด ๆ ของเราได้รับการกำหนดค่าให้ทำงาน
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 "
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 เพื่อให้คนงานทั้งหมดของเราเมื่อเราดำเนินงานใด ๆ ที่สามารถเข้าถึงรหัสที่จะใช้ GITHUB_USERNAME ถูกใช้ในภายหลังเพื่อบันทึกผลลัพธ์จากเวิร์กโหลดของเราไปยัง S3 เพื่อให้เราสามารถเรียกคืนได้ในภายหลัง (เช่นสำหรับการให้บริการ)
ตอนนี้เราพร้อมที่จะส่งงานของเราเพื่อดำเนินการ ML WORKLOFES ของเรา:
anyscale job submit deploy/jobs/workloads.yaml และหลังจากที่ปริมาณงาน ML ของเราถูกดำเนินการแล้วเราก็พร้อมที่จะเปิดตัวรุ่นของเราเพื่อการผลิต คล้ายกับการกำหนดค่างาน AnyScale ของเราอย่าลืมเปลี่ยน $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!
/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/credentialsmain ) และผลักพวกเขาไปที่ GitHub แต่เพื่อที่จะผลักดันรหัสของเราไปยัง GitHub เราจะต้องตรวจสอบความถูกต้องด้วยข้อมูลประจำตัวของเราก่อนที่จะส่งไปยังที่เก็บของเรา: 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 ตอนนี้คุณจะได้รับแจ้งให้ป้อนชื่อผู้ใช้และรหัสผ่านของคุณ (โทเค็นการเข้าถึงส่วนบุคคล) ทำตามขั้นตอนเหล่านี้เพื่อรับโทเค็นการเข้าถึงส่วนบุคคล: โทเค็นการเข้าถึงส่วนบุคคล GitHub ใหม่→เพิ่มชื่อ→สลับ repo และ workflow →คลิก Generate token (เลื่อนลง) →คัดลอกโทเค็นและวางเมื่อได้รับแจ้งสำหรับรหัสผ่านของคุณ
main ของเราและสิ่งนี้จะกระตุ้นเวิร์กโฟลว์เวิร์กโหลด หากเวิร์กโฟลว์ (งานใด ๆ ) ประสบความสำเร็จสิ่งนี้จะสร้างความคิดเห็นกับผลการฝึกอบรมและการประเมินผลโดยตรงเกี่ยวกับ PRmain สิ่งนี้จะกระตุ้นเวิร์กโฟลว์เสิร์ฟซึ่งจะเปิดตัวบริการใหม่ของเราในการผลิต!ด้วยเวิร์กโฟลว์ CI/CD ของเราในการปรับใช้แอปพลิเคชันของเราตอนนี้เราสามารถมุ่งเน้นไปที่การปรับปรุงโมเดลของเราอย่างต่อเนื่อง มันกลายเป็นเรื่องง่ายที่จะขยายรากฐานนี้เพื่อเชื่อมต่อกับการรันตามกำหนดเวลา (cron), ท่อข้อมูล, ดริฟท์ที่ตรวจพบผ่านการตรวจสอบการประเมินผลออนไลน์ ฯลฯ และเราสามารถเพิ่มบริบทเพิ่มเติมได้อย่างง่ายดายเช่นการเปรียบเทียบการทดลองใด ๆ กับสิ่งที่อยู่ในการผลิต (โดยตรงในการประชาสัมพันธ์) ฯลฯ
ปัญหาเกี่ยวกับการกำหนดค่าโน้ตบุ๊กด้วย Jupyter? โดยค่าเริ่มต้น Jupyter จะใช้เคอร์เนลกับสภาพแวดล้อมเสมือนจริงของเรา แต่เรายังสามารถเพิ่มมันลงใน Jupyter ด้วยตนเอง:
python3 -m ipykernel install --user --name=venv ตอนนี้เราสามารถเปิดสมุดบันทึก→เคอร์เนล (แถบเมนูด้านบน) →เปลี่ยนเคอร์เนล→ venv หากต้องการลบเคอร์เนลนี้เราสามารถทำสิ่งต่อไปนี้:
jupyter kernelspec list
jupyter kernelspec uninstall venv