数据科学

加速数据分析:使用 GPU 的机器学习 – 加速 pandas 和 Scikit 学习

 

本文是加速数据分析系列文章的一部分。

如果您想将您的机器学习( ML )项目的速度和可扩展性提升到新的水平,GPU 加速的数据分析可以帮助您以突破性的性能快速提供见解。从更快的计算到高效的模型训练,GPU 为日常 ML 任务带来了许多好处。

本帖子提供了以下方面的技术最佳实践:

  • 加速基本的 ML 技术,如分类、聚类和回归
  • 使用预处理时间序列数据,有效地训练 ML 模型,并使用RAPIDS,一套开源库,完全在 GPU 上执行数据科学和分析管道。
  • 了解算法性能以及用于每个 ML 任务的评估指标

使用 GPU 加速数据科学管道

GPU – 加速的数据分析可以通过 RAPIDS cuDF ,一个 GPU DataFrame 库和 RAPIDS cuML ,一种 GPU – 加速的 ML 库来实现。

cuDF 是一个 Python GPU 数据框库,基于 Apache Arrow 柱状内存格式构建,用于加载、连接、聚合、过滤和操作数据。它的 API 与 pandas 类似,一个建立在 Python 之上的开源软件库,专门用于数据操作和分析。这使得它成为数据分析工作流的有用工具,包括为 ML 准备数据框的数据预处理和探索任务。要了解有关如何使用 cuDF 加速数据分析管道的更多信息,请参阅 加速数据分析系列

一旦您的数据经过预处理,cuDF 与 cuML 就可以无缝集成,cuML 利用 GPU 加速提供了一套大型 ML 算法,可以帮助大规模执行复杂的 ML 任务,比基于 CPU 的框架scikit-learn快得多。

cuML 提供了一个简单的 API ,它与 scikit-learn API 非常相似,因此很容易集成到现有的 ML 项目中。通过 cuDF 和 cuML ,从事 ML 项目的数据科学家和数据分析师可以通过数据管道上的 GPU 加速功能,轻松地与最流行的开源数据科学工具进行交互。这最大限度地减少了推进 ML 工作流的采用时间。

注:此资源与 cuML 和 cuDF 一起介绍 ML ,演示用于学习目的的常见算法。它并不是功能工程或模型构建的最终指南。每个 ML 场景都是唯一的,可能需要自定义技术。在构建 ML 模型时,请始终考虑您的问题细节。

了解 Meteonet 数据集

在深入分析之前,了解Meteonet 数据集,非常适合用于时间序列分析。这个数据集是一个全面的天气数据集,对气象学研究人员和数据科学家都有很大的帮助。

Meteonet 数据集的概述以及每一列的含义如下:

  1. number_sta:每个气象站的唯一标识符。
  2. latlon:气象站的纬度和经度,代表其地理位置。
  3. height_sta:气象站海拔高度,单位为米。
  4. date:数据记录的日期和时间,对时间序列分析至关重要。
  5. dd:风向,以度为单位,表示风向。
  6. ff:风速,单位为米/秒。
  7. precip:降水量,单位为毫米。
  8. hu:湿度,以百分比表示,表示空气中水蒸气的浓度。
  9. td:露点温度,单位为摄氏度,表示空气何时被湿气饱和。
  10. t:空气温度,单位为摄氏度。
  11. psl:海平面的大气压力,单位为百帕(百帕斯卡)。

使用 RAPIDS 进行机器学习

本教程介绍了 cuDF 和 cuML 的三种基本 ML 算法的加速:回归、分类和聚类。

安装

在分析 Meteonet 数据集之前,请安装并设置 RAPIDS cuDF 和 cuML。请参考 RAPIDS 安装指南,获取根据您的系统要求的说明。

分类

Classification(分类)是一种 ML 算法,用于基于一组特征预测分类值。在这种情况下,目标是利用温度、湿度和其他因素预测天气条件(如晴天、多云或下雨)和风向。

使用随机森林这种强大且通用的 ML 方法,我们可以执行回归和分类任务。本节使用 cuML 随机森林分类器对特定时间和地点的天气条件和风向进行分类,并用准确性来评估模型的性能。

在本教程中,将 3 年的西北站数据合并为一个名为 NW_data.csv 的数据帧。要查看完整的合并数据步骤,请访问 cuML 中的机器学习介绍 笔记本,位于 GitHub 上。

import cudf, cuml
from cuml.ensemble import RandomForestClassifier as cuRF

# Load data
df = cudf.read_csv('./NW_data.csv').dropna()

要准备数据进行分类,请执行预处理任务,例如将日期列转换为日期时间格式和提取小时。

# Convert date column to datetime and extract hour
df['date'] = cudf.to_datetime(df['date'])
df['hour'] = df['date'].dt.hour

# Drop the original 'date' column
df = df.drop(['date'], axis=1)

创建两个新的分类列:wind_directionweather_condition

对于wind_direction,离散化dd列(假设风向以度为单位)分为四类:北( 0-90 度)、东( 90-180 度)、南( 180-270 度)和西( 270-360 度)。

# Discretize wind direction
df['wind_direction'] = cudf.cut(df['dd'], bins=[-0.1, 90, 180, 270, 360], labels=['N', 'E', 'S', 'W'])

对于weather_condition,将沉淀柱(即降水量)离散为三类:sunny(无雨),cloudy(小雨),以及rainy(更多降雨)。

# Discretize weather condition based on precipitation amount
df['weather_condition'] = cudf.cut(df['precip'], bins=[-0.1, 0.1, 1, float('inf')], labels=['sunny', 'cloudy', 'rainy'])

然后将这些分类列转换为数字标签RandomForestClassifier可以使用.cat.codes.

# Convert 'wind_direction' and 'weather_condition' columns to category
df['wind_direction'] = df['wind_direction'].astype('category').cat.codes
df['weather_condition'] = df['weather_condition'].astype('category').cat.codes

模特培训

现在预处理已经完成,下一步是定义一个函数来预测风向和天气条件:

def train_and_evaluate(target):
    # Split into features and target
    X = df.drop(target, axis=1)
    y = df[target]

    # Split the dataset into training set and test set
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

    # Define the model
    model = cuRF()

    # Train the model
    model.fit(X_train, y_train)

    # Make predictions
    predictions = model.predict(X_test)

    # Evaluate the model
    accuracy = accuracy_score(y_test, predictions)
    print(f"Accuracy for predicting {target} is {accuracy}")

    return model

现在函数已经准备好了,下一步是使用以下调用来训练模型,并提及目标变量:

# Train and evaluate models
weather_condition_model = train_and_evaluate('weather_condition')
wind_direction_model = train_and_evaluate('wind_direction')

本教程使用 cuML 随机森林分类器对西北数据集中的天气条件和风向进行分类。预处理步骤包括转换日期列、离散风向和天气条件,以及将分类列转换为数字标签。使用准确性作为评估指标对模型进行训练和评估。

回归

回归是一种机器学习算法,用于基于一组特征来预测连续值。例如,您可以使用回归来根据房子的特征,如卧室的数量、面积和位置,来预测房子的价格。

线性回归是一种流行的算法,用于预测定量响应。在本教程中,我们将使用 cuML 的线性回归实现来预测不同时间和地点的温度、湿度和降水量。R ^ 2 分数可用于评估回归模型的性能,更多信息请参阅线性回归

首先导入此节所需的库:

from cuml import make_regression, train_test_split
from cuml.linear_model import LinearRegression as cuLinearRegression
from cuml.metrics.regression import r2_score
from cuml.preprocessing.LabelEncoder import LabelEncoder

接下来,通过将 NW _ data . csv 文件读取到数据帧中并删除任何缺少值的行来加载 NW 数据集:

# Load data
df = cudf.read_csv('/NW_data.csv').dropna()

想要了解如何下载 NW _ data . csv 的详细步骤,请访问 GitHub 上的 Introduction to Machine Learning Using cuML 笔记本

对于许多 ML 算法,分类输入数据必须转换为数字形式。对于这个例子,number_sta,表示“车站编号”,使用 LabelEncoder 进行转换, LabelEncode 为每个类别分配唯一的数值。

接下来,必须对数字特征进行规范化,以防止模型因可变尺度而产生偏差。

然后将“日期”列转换为“小时”功能,因为天气模式通常与一天中的时间相关。最后,删除“日期”列,因为使用的模型无法直接处理此列。

# Convert categorical variables to numeric variables
le = LabelEncoder()
df['number_sta'] = le.fit_transform(df['number_sta'])

# Normalize numeric features
numeric_columns = ['lat', 'lon', 'height_sta', 'dd', 'ff', 'hu', 'td', 't', 'psl']
for col in numeric_columns:
    if df[col].dtype != 'object':
        df[col] = (df[col] - df[col].mean()) / df[col].std()
    else:
        print(f"Skipping normalization for non-numeric column: {col}")


# Convert date column to datetime and extract hour
df['date'] = cudf.to_datetime(df['date'])
df['hour'] = df['date'].dt.hour

# Drop the original 'date' column
df = df.drop(['date'], axis=1)

模特培训和表现

预处理完成后,下一步是定义一个函数,该函数训练两个模型来预测温度和湿度‌气象站。

要评估回归模型的性能,请使用决定系数 R ^ 2 。较高的 R ^ 2 表示模型能够更好地预测数据。

def train_and_evaluate(target):
    # Split into features and target
    X = df.drop(target, axis=1)
    y = df[target]

    # Split the dataset into training set and test set
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

    # Define the model
    model = cuLinearRegression()

    # Train the model
    model.fit(X_train, y_train)

    # Make predictions
    predictions = model.predict(X_test)

    # Evaluate the model
    r2 = r2_score(y_test, predictions)
    print(f"R^2 score for predicting {target} is {r2}")

    return model

现在已经编写了函数,下一步是使用以下调用来训练模型,指定目标变量:

# Train and evaluate models
temperature_model = train_and_evaluate('t')
humidity_model = train_and_evaluate('hu')

本示例演示了如何使用 cuML 线性回归来使用西北数据集预测温度、湿度和降水量。为了评估回归模型的性能,我们使用了 R ^ 2 分数。值得注意的是,通过探索特征选择、正则化和高级模型等技术,可以进一步提高模型性能。

聚类

聚类是一种无监督的机器学习( ML )技术,用于根据相似实例的特征对其进行分组。它有助于识别数据中的模式和结构。本节探讨了使用 K-Means (一种流行的基于质心的聚类算法)基于温度和降水对天气条件进行聚类。

首先,对数据集进行预处理。关注两个具体特征:温度 (t) 和降水 (pp) 。为了简单起见,将删除任何缺少值的行。

import cudf
from cuml import KMeans

# Load data
df = cudf.read_csv("/NW_data.csv").dropna()

# Select the features for clustering
features = ['t', 'pp']
df_kmeans = df[features]

接下来,将 K-Means 聚类应用于数据。目标是将数据划分为指定数量的集群,每个集群由其中数据点的平均值表示。

# Initialize the KMeans model
kmeans = KMeans(n_clusters=5, random_state=42)

# Fit the model
kmeans.fit(df_kmeans)

拟合模型后,检索聚类标签,指示每个数据点所属的聚类。

# Get the cluster labels
kmeans_labels = kmeans.labels_

# Add the cluster labels as new columns to the dataframe
df['KMeans_Labels_Temperature'] = cudf.Series(kmeans_labels)
df['KMeans_Labels_Precipitation'] = cudf.Series(kmeans_labels)

模特培训和表现

为了评估聚类模型的质量,请检查惯性,惯性表示每个数据点与其最近质心之间距离的平方和。惯性值越低,表示簇越紧密、越明显。

# Print the inertia values
print("Temperature Inertia:")
print(kmeans.inertia_)

print("Precipitation Inertia:")
print(kmeans.inertia_)

确定 K-Means 中聚类的最佳数量是至关重要的。Elbow 方法可以通过绘制不同簇编号的惯性值,帮助找到理想的编号。“弯头”点表示最小化惯性和避免过多集群之间的最佳平衡。要进一步探索 Elbow 方法,请访问 GitHub 上的 Introduction to Machine Learning Using cuML 笔记本

UMAP 在 cuML 中提供,是一种强大的降维算法,用于可视化高维数据和揭示潜在模式。虽然 UMAP 本身不是一种专用的聚类算法,但其将数据投影到低维空间的能力往往揭示了聚类结构。它被广泛用于聚类探索和分析,为数据提供了有价值的见解。它在 cuML 中的高效实现实现了用于集群任务的高级数据分析和模式识别。

部署 cuML 模

一旦您训练了 cuML 模型,就可以将其部署到 NVIDIA Triton,这是一款开源、可扩展、可生产的推理服务器,可用于将 cuML 模型部署到云、本地和边缘设备等各种平台。

在生产环境中有效地部署经过培训的 cuML 模型对于充分挖掘其潜力至关重要。对于使用 cuML 训练的模型,有两种主要方法:

  1. Triton 的 FIL 后端
  2. Triton Python 后端

NVIDIA 的 FIL 后端 Triton

Triton 的 FIL 后端使 Triton ‘用户能够利用 cuML 的森林推理库( FIL )来加速树模型的推理,包括决策林和梯度增强林。这个 Triton 后端提供了一种高度优化的方法来部署林模型,而不管使用什么框架来训练它们。

它提供了对 XGBoost 和 LightGBM 模型的原生支持,以及对使用 Treelite 序列化格式的 cuML 和 Scikit Learn 树模型的支持。虽然 FIL GPU 模式提供了最先进的 GPU – 加速性能,但它也为原型部署或部署提供了优化的 CPU 模式,在这些部署中,极小的批处理延迟比整体吞吐量更重要。

要开始,请参考使用 XGBoost 和 Triton-FIL 的欺诈检测入门教程。要深入了解如何在 Triton 上部署树模型,请参阅FIL Backend 常见问题笔记本

Triton Python 后端

部署模型的另一种灵活方法使用 Triton Python 后端。这个后端使您能够直接调用 RAPIDS Python 库。它非常灵活,因此您可以编写自定义的 Python 脚本来处理预处理和后处理。

要使用 Python Python 后端部署 cuML 模型,您需要:

  1. 写一个Python 脚本,Triton 服务器可以调用它来进行推理。该脚本应处理任何必要的预处理和后处理。
  2. 配置 Triton 推理服务器以使用此 Python 脚本为您的模型提供服务。

在所有情况下, Triton 推理服务器都为所有模型提供了统一的接口, Triton 推理服务器为所有模型(无论其框架如何)提供了统一接口,使其更容易集成到现有的服务和基础设施中。它还实现了传入请求的动态批处理,减少了计算资源,从而降低了部署成本。

基准 RAPIDS

这篇文章摘自 使用 cuML 进行机器学习介绍 的 GitHub 笔记本。该工作流程使数据加载、预处理和 ML 训练的组合工作流程的速度提高了 44 倍。这些结果是在 NVIDIA RTX 8000 GPU 上使用 RAPIDS 23.04 和英特尔酷睿 i7-7800X CPU 进行测试得出的。

Screenshot of a benchmark results table showing the performance metrics for training regression, classification, and clustering models.
图 1 。以 RAPIDS 为基线,在 RAPIDS CPU 上训练回归、分类和聚类模型的基准结果

结论

GPU – 使用 cuDF 和 cuML 加速机器学习可以大大加快您的数据科学管道。通过使用 cuDF 和 cuML 科学学习兼容 API 进行更快的数据预处理,很容易开始利用 GPU 的强大功能进行机器学习。

要深入了解本文中讨论的概念,请访问 GitHub 上的 Introduction to Machine Learning Using cuML 笔记本。了解更多关于 GPU 加速的数据科学工作流程 的信息。

 

Tags