新增功能: - 新增统一批量预测工具 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
76 lines
2.0 KiB
Bash
Executable File
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 "============================================================"
|
|
|