MLflowมีข้อดีหลายประการในการพัฒนาและจัดการโมเดลการจัดหมวดหมู่ข้อความ:

  1. การติดตามการทดสอบ: MLflow ช่วยให้คุณสามารถบันทึกและติดตามการรันการฝึกโมเดล ไฮเปอร์พารามิเตอร์ และเมตริกประสิทธิภาพ วิธีนี้ช่วยให้คุณเก็บบันทึกการทดสอบของคุณได้อย่างครอบคลุม ทำให้ง่ายต่อการทำซ้ำและเปรียบเทียบผลลัพธ์
  2. การกำหนดเวอร์ชันของโมเดล: ด้วย MLflow คุณสามารถควบคุมเวอร์ชันของโมเดลได้ ทำให้คุณสามารถจัดการการวนซ้ำโมเดลหลายรอบ และเลือกโมเดลที่มีประสิทธิภาพดีที่สุดสำหรับการปรับใช้
  3. การทำงานร่วมกัน: MLflow ส่งเสริมการทำงานร่วมกันอย่างราบรื่นระหว่างสมาชิกในทีม ด้วยการแชร์การทดลอง MLflow ทุกคนสามารถเข้าถึง วิเคราะห์ และสร้างต่อจากงานที่ผู้อื่นทำเสร็จแล้ว
  4. ความสามารถในการทำซ้ำ: ด้วยการรักษาบันทึกโดยละเอียดเกี่ยวกับสภาพแวดล้อม ข้อมูล และโค้ดที่ใช้ระหว่างการฝึกโมเดล MLflow จึงอำนวยความสะดวกในการสร้างผลลัพธ์ขึ้นมาใหม่ แม้แต่ในระบบที่แตกต่างกัน
  5. ความยืดหยุ่นในการปรับใช้: MLflow รองรับตัวเลือกการใช้งานที่หลากหลาย ทำให้ง่ายต่อการให้บริการโมเดลที่ผ่านการฝึกอบรมของคุณบนแพลตฟอร์มที่แตกต่างกัน ไม่ว่าจะเป็นในองค์กรหรือในระบบคลาวด์

การตั้งค่า MLflow

ก่อนที่จะเจาะลึกถึงการจัดหมวดหมู่ข้อความ เรามาตั้งค่า MLflow ในสภาพแวดล้อมของเรากันก่อน ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง Python แล้วใช้คำสั่งต่อไปนี้:

pip install mlflow
mlflow ui

การสร้างแบบจำลองการจัดประเภทข้อความ

เพื่อจุดประสงค์ของบทช่วยสอนนี้ เราจะสร้างแบบจำลองการจัดหมวดหมู่ข้อความโดยใช้ชุดข้อมูลข่าวที่สร้างโดย ScrapeHero ซึ่งเป็นหนึ่งในบริษัทขูดเว็บชั้นนำของโลก ScrapeHero มีความสามารถในการปรับขนาดและรวบรวมข้อมูลอินเทอร์เน็ตเพื่อหาข้อมูลที่เกี่ยวข้องเพื่อช่วยฝึกโมเดล AI ของคุณ ชุดข้อมูลข่าวนี้สร้างขึ้นจาก Marketplace API ของ ScrapeHero Cloud ชุดข้อมูลภายใต้การดูแลนี้แบ่งออกเป็นเทนนิส การเมือง อาชญากรรม บันเทิง และธุรกิจ

เราจะใช้ ktrainและ scikit-learn สำหรับงานจำแนกประเภทนี้ ด้านล่างนี้คือโครงร่างของขั้นตอนที่เราจะปฏิบัติตาม:

  • โหลดและประมวลผลชุดข้อมูลล่วงหน้า (เราจะโหลดชุดข้อมูลที่ประมวลผลล่วงหน้า)
import pandas as pd
try:
 df = pd.read_csv("data/sample.csv")
 classes = list(set(df.label.tolist()))
except Exception as e:
 logger.exception(
 "Unable to load training & test CSV, check the file path. Error: %s", e
 )
  • แบ่งข้อมูลออกเป็นชุดการฝึกอบรม การทดสอบ และการตรวจสอบความถูกต้อง
from sklearn import model_selection

train_x, valid_x, train_y, valid_y = model_selection.train_test_split(df['content'].tolist(), df['label'].tolist())

trn, val, preproc = text.texts_from_array(x_train=train_x, y_train=train_y,
                                                x_test=valid_x, y_test=valid_y,
                                                class_names=classes,
                                                preprocess_mode='distilbert',
                                                maxlen=256, 
                                                max_features=10000)
  • ฝึกฝนโมเดลการจัดหมวดหมู่ข้อความโดยใช้ distilbert
model = text.text_classifier('distilbert', train_data=trn, preproc=preproc)
learner = ktrain.get_learner(model, train_data=trn, val_data=val, batch_size=6, use_multiprocessing=True)
  • ค้นหาอัตราการเรียนรู้ที่เหมาะสมที่สุดสำหรับชุดข้อมูลของเราโดยใช้ฟังก์ชันในตัวของ ktrain
learner.lr_find(max_epochs=2) # finding the learning rate

# The optimal learning rate is `2e-5`.

  • บันทึกโมเดลและพารามิเตอร์ที่เกี่ยวข้อง เช่น ความแม่นยำ คะแนน f1 อัตราการเรียนรู้ และยุคโดยใช้ MLflow

ติดตามด้วย MLflow

เมื่อคุณมีโมเดลพร้อมแล้ว คุณสามารถบันทึกการทดลองได้โดยใช้ MLflow ซึ่งรวมถึงพารามิเตอร์โมเดลการบันทึก เมตริก และอาร์ติแฟกต์ (เช่น โมเดลที่บันทึกไว้ พล็อต) ต่อไปนี้เป็นข้อมูลโค้ดเพื่อแสดงกระบวนการ:

import mlflow
import mlflow.sklearn

from sklearn.metrics import accuracy_score, f1_score

lrate = float(sys.argv[1]) if len(sys.argv) > 1 else 2e-5
epochs = int(sys.argv[2]) if len(sys.argv) > 2 else 1
print("training ktrain distilbert model (lrate={:f}, epochs={:f}):".format(lrate, epochs))
mlflow.set_experiment("text_classification_ktrain")
experiment = mlflow.get_experiment_by_name("text_classification_ktrain")
with mlflow.start_run(experiment_id=experiment.experiment_id, nested=True):
    learner.fit_onecycle(lrate, epochs)
    predictor = ktrain.get_predictor(learner.model, preproc)
    y_pred = predictor.predict(valid_x)
    accuracy = accuracy_score(valid_y, y_pred)
    f1 = f1_score(valid_y, y_pred, average="weighted")
    # logging the metrics and parameters to the mlflow
    mlflow.log_metric("accuracy", round(accuracy, 4))
    mlflow.log_metric("f1-score", round(f1, 4))
    mlflow.log_param("lrate", lrate)
    mlflow.log_param("epochs", epochs)
    # save the model
    mlflow.sklearn.log_model(learner, "text_classification1")

คุณสามารถรับโค้ดการทำงานที่สมบูรณ์ได้จาก repo github นี้

เรียกใช้ไฟล์หลัก distilbertTraining.py โดยใช้คำสั่ง:

python distilbertTraining.py 2e-6 1

เมื่อเรารันคำสั่งข้างต้นได้สำเร็จ โฟลเดอร์ mlruns โฟลเดอร์ experiment Id โฟลเดอร์ run Id พร้อมด้วยส่วนต่างๆ เมตริก และพารามิเตอร์จะถูกสร้างขึ้นโดยอัตโนมัติ ดังต่อไปนี้

การเปรียบเทียบการทดลองและการปรับใช้

หลังจากบันทึกการรันหลายครั้งด้วยโมเดลหรือไฮเปอร์พารามิเตอร์ที่แตกต่างกัน คุณสามารถเปรียบเทียบประสิทธิภาพได้โดยใช้ MLflow UI การแสดงภาพนี้ช่วยให้คุณมีข้อมูลประกอบการตัดสินใจว่าจะเลือกโมเดลใดสำหรับการปรับใช้

เราได้ฝึกอบรมโมเดลสองโมเดลที่มีอัตราการเรียนรู้ที่แตกต่างกัน 2e-5 และ 2e-6 อัตราการเรียนรู้ 2e-5 นั้นเหมาะสมที่สุดและสร้างอัตราความแม่นยำ 93.5% ในขณะที่อัตราการเรียนรู้ 2e-6 สร้างได้เพียง 63.17%

ค้นหาโมเดลที่ดีที่สุดโดยใช้การติดตาม MLflow ผ่านโค้ด

from mlflow.tracking import MlflowClient
import mlflow 
import numpy as np

# If you called your experiment something else, replace here
current_experiment=dict(mlflow.get_experiment_by_name("text_classification_ktrain"))
experiment_id=current_experiment['experiment_id']

# To access MLFlow stuff we need to work with MlflowClient
client = MlflowClient()

# Searches runs for a specific attribute
runs = client.search_runs([experiment_id])
print("total runs", len(runs), "experiment id", experiment_id)

# Select the best run according to test_accuracy metric
best_run = np.argmax([f.data.metrics['accuracy'] for f in runs])
best_auc = np.round(runs[best_run].data.metrics['accuracy'], 4)
best_runname = runs[best_run].info.run_name
best_runid = runs[best_run].info.run_id
print(f"Experiment had {len(runs)} rounds")
print(f"Best run name - {best_runname} with run id - {best_runid} has the accuracy of {best_auc}")

เราสามารถตรวจสอบข้ามได้ที่นี่

นอกเหนือจากการค้นหาโมเดลที่ดีที่สุดแล้ว เราสามารถลงทะเบียนโมเดลและเลื่อนระดับเป็นการใช้งานจริงผ่านโค้ด Python

เมื่อพูดถึงการปรับใช้ MLflow มีตัวเลือกมากมาย รวมถึงการให้บริการโมเดลผ่าน REST API หรือการผสานรวมเข้ากับเว็บแอปพลิเคชัน

เอกสารประกอบ MLflow มีตัวอย่างมากมายและสามารถดูได้ที่นี่»

คุณสามารถรับโค้ดที่สมบูรณ์ของโมเดลการจัดหมวดหมู่ข้อความที่คล่องตัวด้วย MLflow ที่กล่าวถึงข้างต้นได้จาก GitHub repo นี้

บทสรุป

MLflow มอบชุดเครื่องมืออันทรงพลังสำหรับการสร้างและจัดการโมเดล ML ด้วยการใช้ประโยชน์จากการติดตามการทดลอง การกำหนดเวอร์ชันโมเดล และฟีเจอร์การทำงานร่วมกันของ MLflow นักวิทยาศาสตร์ข้อมูลและผู้ปฏิบัติงาน NLP จึงสามารถปรับปรุงขั้นตอนการทำงานของตนได้ ซึ่งนำไปสู่โมเดล ML ที่มีประสิทธิภาพและเชื่อถือได้มากขึ้น

โปรดจำไว้ว่า บล็อกนี้เป็นเพียงเนื้อหาคร่าวๆ ของสิ่งที่ MLflow สามารถทำได้เท่านั้น เมื่อคุณเจาะลึกเข้าไปในโลกของ NLP และการจัดหมวดหมู่ข้อความ MLflow จะกลายเป็นส่วนสำคัญของชุดเครื่องมือ Machine Learning ของคุณอย่างไม่ต้องสงสัย มีความสุขในการปรับปรุงและจัดหมวดหมู่!