数据科学

NVIDIA 在制造和运营领域的 AI 应用:借助 NVIDIA CUDA-X 数据科学加速 ML 模型

从晶圆制造和电路探测到封装芯片测试,NVIDIA 利用数据科学和机器学习来优化芯片制造和运营工作流程。这些阶段会产生 TB 级的数据,而要确保质量、吞吐量和成本效益,关键在于快速、大规模地将这些数据转化为切实可行的见解。多年来,我们开发了强大的 Machine Learning 流程,可解决缺陷检测和测试优化等问题。

这是一系列博客中的第一个,这些博客将分享我们使用 NVIDIA cuDF 和 NVIDIA cuML 等 CUDA-X 库部署此类工作流的关键经验。虽然这些经验教训来自半导体制造,但挑战和解决方案广泛适用于物流、质量工程和供应链优化。

我们先从现实世界的分类任务开始:预测芯片是否通过特定测试。在更高级的场景中,目标扩展到预测芯片的性能箱(从 L1 到 L5),并将问题表述为多类别分类问题。

在这两种情况下,模型会使用来自多个来源的丰富测量信号:

  • 稀疏特征:Wafer-level metrology
  • 密集信号:来自电路探针 (CP) 测试的芯片级数据,以及封装单元的高保真功能测试 (FT) 结果

这些数据集通常涵盖数十万行和数百个特征,很快就会使传统的 CPU 数据处理工作流程不堪重负。

处理不平衡的数据集

以运算为中心的机器学习 (Ops ML) 面临的一个关键挑战是极端的等级失衡。在某些芯片系列中,超过 99% 的单元通过了测试,只有一小部分单元失败。这种偏差使得训练稳健模型变得困难,因为标准学习者往往偏向于大多数类别。

为了解决这一问题,我们利用 CUDA-X 数据科学库(包括 cuDF 和 cuML)进行快速的数据转换和可扩展的模型实验。在处理此类高度不平衡的数据集时,我们采用定向采样方法(包括 Synthetic Minority Over-Sampling Technique (SMOTE) 和 undersampling)来平衡类,从而实现更稳定、更有效的模型训练。利用 CUDA-X 库,这些策略可以直接在 GPU 内存中完成,从而大幅缩短迭代时间并无缝扩展实验。

合成少数超采样技术 (SMOTE)

# Minority Oversampling (SMOTE) using cuML 
from imblearn.over_sampling import SMOTE
from cuml.neighbors import NearestNeighbors

# X,y are dataframes with features and target resp. 
nn = NearestNeighbors(n_neighbors=6)
X_resampled, y_resampled = SMOTE(n_neighbors=nn).fit_resample(X, y)

在我们的实验中,与原生 scikit-learn 相比,cuML 的 NearestNeighbors 与 SMOTE 的结合表明,CUDA-X 库的价值体现在 2x 到 8x 的速度提升上。

分层下采样

# Quick example of stratified sampling using cuDF
df['label'] = df['label'].astype('category')
sampled_df = df.groupby('label').sample(n=10000, replace=True)
X_resampled, y_resampled = sampled_df[x_features], sampled_df[target]

在实践中,快速迭代至关重要。得益于 cuDF 的 GPU 加速连接、过滤器和组比,我们通常在几小时而不是几天内就能从原始的 CP 和 FT 数据转换为模型就绪型功能。在训练随机森林或 XGBoost 等模型时,cuML 的速度比基于 CPU 的版本持续提高 5 到 30 倍,使我们能够更快地测试更多假设和调整模型。这种敏捷性使工程师能够在晶圆厂现场近乎实时地对解决方案进行原型设计。

对于评估至关重要的Metrics

高度不平衡的数据集不仅会使训练变得复杂,还会扭曲用于评估的标准指标。例如,当模型可以预测每个芯片的“pass”,并且准确性仍为 99% 时,准确性就变成了毫无意义的指标

为了更好地反映真实性能,我们依赖于加权精度precision-recall 曲线下的区域等指标。

加权精度

我们分别评估每个类别的准确性,并采用加权平均值,给予每个类别同等重要性,并消除不平衡。

及格率:p_ac = Predicted Pass/(Predicted Pass + True Pass)

失败准确率:f_ac = Predicted Fail/(Predicted Fail + True Fail)

加权形式为:

acc = w_f * f_acc + (1 – w_f) * p_acc

对于大多数设置而言,便捷的默认设置是 w_f = 0.5

acc = ( f_acc = p_acc) / 2

精度召回曲线

在严重不平衡的数据集中,传统的相对运算特征 (ROC) 曲线和 ROC 曲线指标下的区域可能会产生误导。例如,假设产量吞吐量为 98% (即 2% 的部件“不合格”) 的数据集严重不平衡。

我们来比较一下 ROC 曲线和 precision-recall 曲线。ROC 曲线上的标记突出显示了真阳性率为 0.61 且假阳性率为 0.13 的点。乍一看,这似乎是一个合理的操作点。但是,对于不平衡的数据集 (如下所示,其中大多数结果都“通过”) ,ROC 曲线可能会产生误导,因为它们不会强调假阳性的成本。

看看 precision-recall (PR) 曲线上的同一点。这里的 precision 只有 0.09,recall 是 0.61。这告诉我们,模型预测每 100 个单元“失败”,只有 9 个单元真正失败,这对于大多数现实世界的制造场景来说是不可接受的,因为在这些场景中,响应错误警报的成本很高。

For an imbalanced binary classification dataset ((98% pass), the two charts show a relative-operating-characteristics (ROC) curve and a precision-recall(PR) curve for a trained random classifier model. Observe that the AUC for PR is much lower than that of the ROC curve, demonstrating the poorer performance of the classifier at higher recalls.
图 1。评估指标:ROC 曲线的 AUC 与 Precision-Recall 曲线

下方的混淆矩阵(对应上述图形上的标记)强化了这一点。在选定的操作点,1,274 个单元被错误标记为“fail”,而只有 122 个单元被正确标记为“fail”。那是一个 false-alarm 率超过 90%。precision-recall 曲线使这种糟糕的性能更加明显。

A chart in blue and orange. The confusion matrix corresponds to a point on the ROC curve with (TPR, FPR) = (0.61, 0.13), suggesting acceptable performance. However, the same point corresponds to (Precision, Recall) = (0.09, 0.61) on the precision-recall curve, indicating a significantly poorer tradeoff in precision at this level of recall.
图 2。与图 1 中所示标记对应的 classifier 混淆矩阵。

以下是所讨论场景的代码。

import cuml
from sklearn.datasets import make_classification
from cuml.model_selection import train_test_split
from cuml.ensemble import RandomForestClassifier as cuRF
from cuml.metrics import roc_auc_score, precision_recall_curve
import cupy as cp
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt

# synthetic dataset dimensions
n_samples = 10000
n_features = 20
n_classes = 2

# random forest depth and size
n_estimators = 25
max_depth = 10

# generate synthetic data [ binary classification task ]
X, y = make_classification (n_classes = n_classes,
                        n_features = n_features,
                        n_samples = n_samples,
random_state=13,
                       weights =[0.98, 0.02]))
X_train, X_test, y_train, y_test = train_test_split(
X, y, random_state = 0, test_size=0.3)
# Train the RandomForest Classifier
model = cuRF( max_depth = max_depth,
          n_estimators = n_estimators,
          random_state  = 0)

trained_RF = model.fit ( X_train, y_train)
ypred = model.predict_proba ( X_test) [:, 1]

# Calculate the ROC curve
fpr, tpr, _ = roc_curve(y_test, ypred)
roc_auc = roc_auc_score(y_test, ypred)
plt.plot(fpr, tpr, color='darkorange', label='ROC Curve')

# Calculate the Precision-Recall curve
precision, recall, _ = precision_recall_curve(y_test, ypred)
pr_auc = auc(cp.asnumpy(recall), cp.asnumpy(precision))
plt.plot(recall, precision, color='darkorange', label='Precision-Recall Curve')

可解释性

模型性能只是其中一部分。在操作环境中,可解释性可操作性同样重要。只有当领域专家能够理解和信任模型的推理时,预测测试结果才有真正的价值。

这就是为什么我们依赖于 cuML 对集成模型中特征重要性的原生支持。此功能可帮助我们呈现高影响力特征以进行工程审查。在某些情况下,这些见解有助于识别并消除冗余或低价值的测试步骤,从而直接节省成本并简化流程

领域专家通过模型输出进行推理的另一种方法是使用 cuML 的 GPU 加速 SHAP (SHapley Additive exPlanations) 实现,例如 Kernel SHAP 和 Permutation SHAP 解释器。这些工具使我们能够了解每个特征对模型预测的贡献,同时提供全局和局部可解释性。在实践中,这些基于 SHAP 的见解帮助我们确定了冗余或预测性较低的测试步骤,从而通过消除测试来节省成本。

总结

对于有兴趣进一步探索的用户,cuDF 文档提供了有关 GPU 加速数据操作的全面指南,而 cuML 文档详细介绍了针对 GPU 优化的机器学习算法套件。对于希望在工作流程中充分发挥 CUDA-X 数据科学库潜力的从业者来说,这些资源非常宝贵。

如果您已使用 pandas、Polars 或 scikit-learn 等库构建工作流,CUDA-X 还可以通过 cuDF 的 pandas 加速器cuML 的 scikit-learn 估计器提供插入式、零代码更改加速。这使得扩展现有 Python 工作流变得比以往更容易,而无需从头开始重写它们。要更深入地了解加速数据科学,您可以通过我们的 DLI 学习路径注册实战课程。

在我们即将发布的博客中,我们将探索特征工程技术(例如合并测试信号和计算空间 Z-Yield)、使用业务感知指标(例如 Cost of Quality (CoQ) 曲线)进行模型评估,以及使用 ML 增强和赋能运营工程的最佳实践。这些课程基于 CUDA-X 基础的流程和 NVIDIA 的制造领域,但这些模式在任何数据丰富的决策驱动型操作环境中都是可重复的。

在构建和部署面向运营的机器学习 (ML) 的下一阶段中,请持续关注我们 – 加速数据处理工作流程仅仅是个开始。真正的价值在于让它变得可行。

 

标签