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

Swifter/Dask/Ray处理SMILES标准化任务仅单核心运行的原因排查

问题分析与解决方案:RDKit SMILES标准化并行处理多核利用率低

核心原因

1. RDKit的GIL限制

RDKit底层虽为C++实现,但Python调用其API时会持有全局解释器锁(GIL)——单个Python线程执行期间,GIL会阻止其他线程运行。Swifter、Dask默认采用多线程调度,这种模式下无法突破GIL限制,自然只能用到少数核心。

2. 框架默认配置未适配

  • Swifter:默认会自动选择执行引擎,但针对RDKit这类受GIL限制的函数,它可能默认启用多线程而非多进程,导致并行失效。
  • Dask/Ray:若未手动指定调度器为多进程模式,默认的多线程调度同样会被GIL卡住;部分场景下框架的任务粒度或序列化机制也会影响多核利用。

3. 负载不均衡(复杂SMILES场景)

真实复杂SMILES的处理时长差异极大(比如简单分子0.1ms,复杂药物分子100ms+),框架的静态任务分配可能导致部分核心长期闲置,看起来像是未充分利用多核。

针对性解决方案

1. 强制框架使用多进程调度

Swifter配置

手动指定Dask采用多进程调度,核心数根据CPU设置:

import swifter
# 设置多进程调度,n_workers为你的CPU核心数
swifter.set_dask_options(scheduler='processes', n_workers=4)
df['standardized_smiles'] = df['smiles'].swifter.apply(standardize_smiles)

Dask配置

将DataFrame分区数匹配核心数,并指定多进程调度:

import dask.dataframe as dd
# 分区数建议等于CPU核心数
ddf = dd.from_pandas(df, npartitions=4)
# 指定meta参数确保类型正确,用processes调度器
df['standardized_smiles'] = ddf['smiles'].apply(
    standardize_smiles,
    meta=('smiles', 'object')
).compute(scheduler='processes')

Ray配置

用Ray的多进程远程函数模式,绕过GIL限制:

import ray
# 初始化Ray,指定CPU核心数
ray.init(num_cpus=4)

@ray.remote
def ray_standardize(smi):
    # 每个进程独立导入RDKit模块,避免全局状态冲突
    from rdkit import Chem
    return standardize_smiles(smi)

# 批量提交任务并获取结果
results = ray.get([ray_standardize.remote(smi) for smi in df['smiles']])
df['standardized_smiles'] = results

# 关闭Ray资源
ray.shutdown()

2. 优化RDKit函数本身

确保standardize_smiles无全局状态依赖,每个调用完全独立:

def standardize_smiles(smi):
    # 函数内部导入RDKit模块(多进程下每个进程会独立初始化)
    from rdkit import Chem
    from rdkit.Chem import AllChem
    if not smi:
        return None
    mol = Chem.MolFromSmiles(smi)
    if not mol:
        return None
    # 执行标准化操作(示例:移除氢、生成规范SMILES)
    mol = AllChem.RemoveHs(mol)
    return Chem.MolToSmiles(mol, canonical=True)

3. 缓解负载不均衡

  • 对Dask:调整分区大小,将大拆分为更小的分区(比如按数据量平均拆分),让调度器能更灵活分配任务。
  • 对Ray:Ray的动态任务调度会自动适配负载差异,无需额外配置;若差异极大,可手动将数据分成小批次提交。

验证方法

运行时通过系统监控(如top、任务管理器)观察CPU使用率,若多个核心占用率持续处于高位,则说明并行生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:05:21