Files
SIME/scripts/merge_results.sh
hotwa a8fea027ac feat: 实现大规模并行预测功能 (v2.0.0)
新增功能:
- 新增统一批量预测工具 utils/batch_predictor.py
  * 支持单进程/多进程并行模式
  * 灵活的 GPU 配置和显存自动计算
  * 自动临时文件管理和断点续传
  * 完整的 CLI 参数支持(Click 框架)

- 新增 Shell 脚本集合 scripts/
  * run_parallel_predict.sh - 并行预测脚本
  * run_single_predict.sh - 单进程预测脚本
  * merge_results.sh - 结果合并脚本

性能优化:
- 解决 CUDA + multiprocessing fork 死锁问题
  * 使用 spawn 模式替代 fork
  * 文件描述符级别的输出重定向

- 优化预测性能
  * XGBoost OpenMP 多线程(利用所有 CPU 核心)
  * 预加载模型减少重复加载
  * 大批量处理降低函数调用开销
  * 实际加速比:2-3x(12进程 vs 单进程)

- 优化输出显示
  * 抑制模型加载时的权重信息
  * 只显示进度条和关键统计
  * 临时文件自动保存到专门目录

文档更新:
- README.md 新增"大规模并行预测"章节
- README.md 新增"性能优化说明"章节
- 添加详细的使用示例和参数说明
- 更新项目结构和版本信息

技术细节:
- 每个模型实例约占用 2.5GB GPU 显存
- 显存计算公式:建议进程数 = GPU显存(GB) / 2.5
- GPU 瓶颈占比:MolE 表示生成 94%
- 非 GIL 问题:计算密集任务在 C/CUDA 层

Breaking Changes:
- 废弃旧的独立预测脚本,统一使用新工具

相关 Issue: 解决 #并行预测卡死问题
测试平台: Linux, 256 CPU cores, NVIDIA RTX 5090 32GB
2025-10-18 20:53:39 +08:00

76 lines
2.0 KiB
Bash
Executable File

#!/bin/bash
# 合并并行预测的结果
# 用法: bash merge_results.sh
set -e
TEMP_DIR="Data/fragment/Frags-Enamine-18M_temp"
OUTPUT_FILE="Data/fragment/Frags-Enamine-18M_predicted.csv"
echo "============================================================"
echo "📦 合并预测结果"
echo "============================================================"
# 检查临时目录是否存在
if [ ! -d "$TEMP_DIR" ]; then
echo "❌ 临时目录不存在: $TEMP_DIR"
exit 1
fi
# 检查所有部分文件是否存在
MISSING=0
for i in 0 1 2 3; do
if [ ! -f "${TEMP_DIR}/part_${i}.csv" ]; then
echo "❌ 缺少文件: part_${i}.csv"
MISSING=1
else
LINES=$(wc -l < "${TEMP_DIR}/part_${i}.csv")
echo "✓ part_${i}.csv: $LINES"
fi
done
if [ $MISSING -eq 1 ]; then
echo "❌ 有文件缺失,请等待所有进程完成"
exit 1
fi
echo ""
echo "合并文件..."
# 合并 CSV 文件(保留第一个文件的表头,跳过其他文件的表头)
cat "${TEMP_DIR}/part_0.csv" > "$OUTPUT_FILE"
for i in 1 2 3; do
tail -n +2 "${TEMP_DIR}/part_${i}.csv" >> "$OUTPUT_FILE"
done
# 统计结果
TOTAL_LINES=$(wc -l < "$OUTPUT_FILE")
TOTAL_MOLECULES=$((TOTAL_LINES - 1))
echo ""
echo "============================================================"
echo "✓ 合并完成"
echo "============================================================"
echo "输出文件: $OUTPUT_FILE"
echo "总分子数: $TOTAL_MOLECULES"
echo ""
# 统计广谱抗菌分子
if command -v python3 &> /dev/null; then
python3 << EOF
import pandas as pd
df = pd.read_csv("$OUTPUT_FILE")
n_broad = df['broad_spectrum'].sum()
print(f"广谱抗菌: {n_broad:,} 个 ({n_broad/len(df)*100:.2f}%)")
print(f"非广谱: {len(df)-n_broad:,} 个 ({(len(df)-n_broad)/len(df)*100:.2f}%)")
print("")
print("抑制菌株数分布:")
for threshold in [0, 5, 10, 15, 20, 30]:
n = (df['ginhib_total'] >= threshold).sum()
print(f" ≥{threshold:2d} 个菌株: {n:,} ({n/len(df)*100:.2f}%)")
EOF
fi
echo "============================================================"