数据科学

大规模特征工程:利用 NVIDIA CUDA-X 数据科学优化半导体制造的机器学习模型

在上一篇博文中,我们介绍了芯片制造和运营中的预测建模设置,重点介绍了数据集不平衡等常见挑战,以及对更细致的评估指标的需求。我们还探讨了 NVIDIA CUDA-X 数据科学库 (如 cuDFcuML) 如何帮助克服这些挑战并加速机器学习工作流程。在本博客中,我们将重点转移到下一个关键步骤:特征工程。我们观察到,精心设计的功能 (通过 GPU 加速高效构建) 可以显著提高模型的性能和部署就绪性。例如,由于我们的模型通常需要在紧张的 15 分钟工厂窗口内执行和转发预测,因此使用 CUDA-X 数据科学库和下文讨论的特征工程技术使我们能够减少 ETL pro这种效率直接影响到高吞吐量制造环境中的运营可行性。我们重点介绍三种关键技术:

  • 利用位置特征
  • 合并测试结果
  • 根据历史背景加入先前的概率

所有这些转换均设计为使用 cuDF 在 NVIDIA GPU 上大规模运行,从而使用 cudf.pandas 接口为 pandas 工作流实现零代码更改加速。

利用位置特征:空间环境非常重要

在半导体制造中,芯片在晶圆上的物理位置会显著影响其性能。缺陷或异常通常表现出空间模式,因此位置数据对于预测建模至关重要。通过整合晶圆上裸片的 X 和 Y 坐标以及 Z 位置 (以批量表示晶圆序列) 等特征,我们可以捕获这些空间依赖项。

为了利用此空间环境丰富模型,我们计算了相邻单元的平均产量等指标。这涉及识别相邻裸片,并计算统计数据,例如定义邻域内的平均产量或缺陷率。通过使用 cuDF 的 GPU 加速运算,我们可以高效执行这些计算,即使对大型数据集也是如此。

import cudf.pandas as pd
# Assume 'df' is a cuDF DataFrame with columns: 'wafer_id', 'x', 'y', 'yield'
df = pd.DataFrame({
    'wafer_id': [...],
    'x': [...],
    'y': [...],
    'yield': [...]
})
 
# Create shifted neighbors and join them
for dx, dy in [(-1,0), (1,0), (0,-1), (0,1)]:
    neighbor = df.copy()
    neighbor['x'] += dx
    neighbor['y'] += dy
    df = df.merge(neighbor[['wafer_id', 'x', 'y', 'yield']],
                  on=['wafer_id', 'x', 'y'],
                  how='left',
                  suffixes=('', f'_n{dx}{dy}'))
 
# Average neighbor yields
neighbor_cols = [col for col in df.columns if 'yield_n' in col]
df['neighbor_yield'] = df[neighbor_cols].mean(axis=1)

这些工作流部署在每天测试数千个芯片的环境中。GPU 加速可确保这些基于邻域的转换即使在严格的生产服务水平协议 (有时需要在 10 分钟的工厂窗口内进行模型推理和 ETL) 下也能高效运行。

合并测试结果:合成多项测量结果

芯片在制造过程中会经历各种测试,通常会导致在不同条件 (如电压或温度) 下对同一参数进行多次测量。为了从这些不同的读数中创建统一的特征,我们采用了一种称为合并的技术。此过程涉及对相关测试结果进行分组,并计算具有代表性的统计数据,例如均值或最大值。

使用 cudf.pandas,我们可以高效执行以下操作:

# Assume 'df' has columns: 'chip_id', 'test_name', 'voltage', 'time', 'measurement'
 
# Filter tests for a specific voltage
df_filtered = df[df['voltage'] == 1.0]
 
# Sort by time to get the latest measurement
df_sorted = df_filtered.sort_values(['chip_id', 'test_name', 'time'], ascending=[True, True, False])
 
# Drop duplicates to keep the latest measurement per chip
df_latest = df_sorted.drop_duplicates(subset=['chip_id', 'test_name'])
 
# Compute the mean measurement per chip
df_coalesced = df_latest.groupby(['chip_id'])['measurement'].mean().reset_index(name='coalesced_measurement')

这种方法可确保每个芯片都由单个综合测量值表示,从而提高模型输入特征的质量。事实上,应用此合并步骤提高了我们一些项目的模型准确性,并将不必要的测试减少了 20%,这直接影响了生产成本和周期时间。

整合先前的概率:从历史语境中学习

历史数据可以对某些结果的可能性提供有价值的见解。通过基于测试器 ID、晶圆在批量中的位置、晶圆上的裸片坐标或其他上下文信息等因素来计算先验概率,我们可以让模型了解制造过程中的固有偏差或趋势。

例如,如果某些测试人员以往产生的故障率较高,则整合这些信息可以提高预测准确性。另一个常见的例子是,靠近晶圆边缘的芯片的通过率高于或低于平均值。

以下是使用 cuDF 计算先验概率的方法:

# Assume 'df' has columns: 'ECID', 'tester_id', 'XY_coord', pass_fail' (1 for pass, 0 for fail). ECID refers to Exclusive Chip ID.
 
# Prior pass rates per tester and (x,y) coordinates of chip
tester_pass_prob = df.groupby('tester_id')['pass_fail'].mean().reset_index(name='prior_pass_rate_tester')
chipxy_pass_prob = df.groupby('XY_coord')['pass_fail'].mean().reset_index(name='prior_pass_rate_XY')
 
# Merge back to the original DataFrame
df = df.merge(tester_pass_prob, on='tester_id', how='left')
df = df.merge(chipxy_pass_prob, on='XY_coord'', how='left')

通过将这些先验概率添加为特征,我们可以让模型细致入微地了解制造环境的历史性能。由于每天都要对大量测试数据执行这种计算,因此在 GPU 上执行这些“groupby”和“join”操作的能力有助于我们保持在经常面临的狭窄 ETL 窗口范围内,尤其是在后期测试中,必须快速对结果采取行动。

总结

运营中的特征工程旨在提高准确性,并确保见解能够足够快地到达,从而在运营期限内推动决策。借助 CUDA-X GPU 加速库,我们构建了特征工程流程,可在不到 10 分钟的时间内进行推理,并每天在数千个单元中增长。过去,在类似工作负载下,基于 CPU 的 ETL 工作流需要 20 – 25 分钟才能完成此过程。这种加速使我们能够在不牺牲特征复杂性的情况下满足严格的测试操作服务水平协议。无论是空间平滑、信号合并还是历史先验,这些技术在提高产量洞察和减少生产中的测试冗余方面都发挥了重要作用。

有关 CUDA-X 数据科学库的更多信息

如要试用 cuML,请在启用免费 GPU 运行时的 Colab 中试用此“入门”Notebook;如要了解 cuML 零代码更改简介,请阅读此博客,了解我们近期发布的内容。如需详细了解如何利用无需更改 API 代码的 CUDA-X 库,请查看我们的 DLI 学习路径中的加速数据科学课程。

 

标签