You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure API运行函数中实现多进程优化LIME解释效率

问题描述

我需要通过多进程缩短API执行时间,实际场景是用LIME生成机器学习模型的可解释性结果。简化示例中,原逻辑是循环处理数据行,实际会执行24次explainer.explain_instance(df.loc[idx], model.predict_proba),现有12个CPU核心,希望实现多进程处理以提速。

解决方案

1. 拆分单条数据解释任务

先把循环中针对单条数据的LIME解释逻辑抽成独立函数,避免依赖全局变量,确保参数可在进程间传递:

def explain_single_row(row, explainer, predict_proba_fn):
    # 对单条数据执行LIME解释并返回结果
    return explainer.explain_instance(row, predict_proba_fn)

2. 用进程池并行执行任务

利用concurrent.futures.ProcessPoolExecutor创建进程池,设置max_workers=12(匹配CPU核心数),让所有核心同时处理任务:

import json
from concurrent.futures import ProcessPoolExecutor

def explain_single_row(row, explainer, predict_proba_fn):
    return explainer.explain_instance(row, predict_proba_fn)

def main(data):
    input_data = json.loads(data)["data"]
    customer_id = input_data[0]
    item_list = df1.loc[df1["cust_id"] == customer_id, "prod_id"].tolist()

    # 获取需要解释的目标数据行
    target_rows = df.loc[
        (df["cust_id"] == customer_id) & (df["prod_id"].isin(item_list))
    ].itertuples(index=False)  # 用itertuples传递数据,序列化效率更高

    # 初始化进程池,并行处理所有解释任务
    with ProcessPoolExecutor(max_workers=12) as executor:
        # 批量提交任务
        futures = [
            executor.submit(explain_single_row, row, explainer, model.predict_proba)
            for row in target_rows
        ]
        # 收集所有解释结果
        explanations = [future.result() for future in futures]
    
    # 后续可对explanations做整理、返回等操作
    return explanations

3. 关键注意事项

  • 序列化优化:如果explainer或model体积较大,直接传递会影响性能,可在子进程中初始化这些对象,避免跨进程传递大对象:
    # 子进程初始化用的全局变量
    global_model = None
    global_explainer = None
    
    def init_process(model, explainer):
        global global_model, global_explainer
        global_model = model
        global_explainer = explainer
    
    def explain_single_row(row):
        return global_explainer.explain_instance(row, global_model.predict_proba)
    
    # 在main函数中调整进程池初始化方式
    with ProcessPoolExecutor(
        max_workers=12,
        initializer=init_process,
        initargs=(model, explainer)
    ) as executor:
        futures = [executor.submit(explain_single_row, row) for row in target_rows]
        explanations = [future.result() for future in futures]
    
  • 避免全局数据修改:原示例中修改全局df的操作在多进程中无效(子进程有独立内存空间),但LIME解释仅读取数据,无需修改原数据集,因此无影响。
  • 任务分配效率:24次任务分给12个进程,每个进程处理2次,刚好匹配核心数量,不会出现进程闲置或过载。

内容的提问来源于stack exchange,提问作者Karthik S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:32:46