要完成使用MLflow比较模型运行、选择模型并将其部署到REST API的教程,请按照以下有序步骤操作:
-
设置环境
- 导出MLflow跟踪URI:设置环境变量以指向您的MLflow跟踪服务。
export MLFLOW_TRACKING_URI=your-organization's-MLflow-server-url
-
加载数据和预处理
- 读取数据集:使用pandas读取包含数据集的CSV文件。
import pandas as pd data = pd.read_csv('https://raw.githubusercontent.com/mlflow/tutorials/main/quickstarts/lf/mm%2Ecsv', sep=';')
- 划分数据:将数据集分为训练集、验证集和测试集。
from sklearn.model_selection import train_test_split train_ratio = 0.7 val_ratio = 0.2 test_ratio = 0.1 train, temp = train_test_split(data, test_size=(val_ratio + test_ratio), random_state=42) train_x, train_y = train.drop(['quality'], axis=1).values, train['quality'].values.ravel() valid_x, valid_y = temp.drop(['quality'], axis=1).values, temp['quality'].values.ravel() X_train, y_train = train_x, train_y X_valid, y_valid = valid_x, valid_y # 注意:X_test, y_test在示例中未直接定义,应从temp中进一步划分得到
- 读取数据集:使用pandas读取包含数据集的CSV文件。
-
定义模型架构
- 神经网络模型:创建一个具有适当层的顺序模型并进行编译。
import keras from keras.layers import Dense, Normalization from tensorflow.keras.optimizers import SGD def create_model(hp): model = keras.Sequential([ keras.Input(shape=(len(X_train[0], ))), keras.layers.Normalization(axis=-1), keras.layers.Dense(units=hp.get('units'), activation='relu'), keras.layers.Dense(1) ]) model.compile(optimizer=SGD(learning_rate=hp.get('learning_rate'), momentum=hp.get('momentum')), loss='mse', metrics=[keras.metrics.RootMeanSquareError()]) return model
- 神经网络模型:创建一个具有适当层的顺序模型并进行编译。
-
超参数搜索的目标函数
- 函数定义:将模型训练包装在MLflow的
start_run()
上下文管理器内。def objective(params): with mlflow.start_run(nested=True): model = create_model(params) history = model.fit(X_train, y_train, epochs=params['epochs'], validation_data=(X_valid, y_valid)) score = model.evaluate(X_test, y_test, verbose=0) return {'loss': float(score[1]), 'params': params}
- 函数定义:将模型训练包装在MLflow的
-
执行超参数搜索
- 使用HyperOpt:利用hypertune模块执行搜索。
import hpbandster as hp import numpy as np space = { 'learning_rate': hp.uniform('lr', 0.001, 0.1), 'momentum': hp.uniform('mom', 0.0, 1.0), 'epoch': hp.randint('epoch', low=2, high=10, qstep=1) } study = hp.BayesStudy(space, objective) results = [] max_trials = 10 for i in range(max_trials): print(f'Trial {i+1}/{max_trials}') config = study.suggest() # 注意:study trial i+1 应该是 study.evaluate(objective, config) 或类似调用,示例中存在笔误 res = objective(config) results.append(res)
- 使用HyperOpt:利用hypertune模块执行搜索。
-
选择最佳模型运行
- 分析结果:根据记录的指标确定表现最佳的运行。
min_loss = min([res['loss'] for res in results]) best_index = [idx for idx, res in enumerate(results) if res['loss'] == min_loss][0] best_config = results[best_index]['params'] print(f'Best configuration: {best_config}')
- 分析结果:根据记录的指标确定表现最佳的运行。
-
记录和部署最佳模型
- 记录参数和指标:捕获最佳运行的关键见解。
with mlflow.start_run(): mlflow.set_params(best_config) mlflow.log_metrics({'rmse': min_loss})
- 保存和容器化:构建封装最终模型的Docker镜像。
mlflow models build-docker --model-uri=models:/wine_quality/1 --name=qsp
- 创建REST API端点:使用Docker容器将模型对外提供服务。
docker run -e MODEL_NAME=wine_quality --env Leasing:1000 qsp:latest -p 5002:8080 curl -d '{}' -H "Content-Type: application/json" -X POST localhost:5002/invocations
- 记录参数和指标:捕获最佳运行的关键见解。
-
最终步骤
- 评估性能:使用样本输入测试端点,确保预测结果与预期输出一致。
- 记录与分享:为利益相关者提供详细解释和更新。
通过系统地应用这些步骤,您可以有效地利用MLflow来简化实验、自动化模型开发,并促进可扩展的部署流程。