yanchang
yanchang
发布于 2025-10-10 / 11 阅读
0
0

工作流串行(ai生图和换脸)

#!/bin/bash
# run_manual_parallel_batch_with_progress.sh

# 切换到脚本所在目录
SHELL_FOLDER=$(cd "$(dirname "$0")";pwd)
cd $SHELL_FOLDER

# --- 配置参数 ---
MODEL_PATH="OmniGen2/OmniGen2"
OUTPUT_DIR="manual_batch_outputs"
PROMPTS_FILE="prompts.txt" # 提示词输入文件
TEMP_PROMPT_0="${OUTPUT_DIR}/temp_prompts_gpu0.txt"
TEMP_PROMPT_1="${OUTPUT_DIR}/temp_promPTS_gpu1.txt"
DTYPE="fp16"

# 新增:获取格式化时间戳 (年-月-日-时:分)
# %Y-%m-%d-%H:%M:%S  ->  2025-10-10-14:22:39
TIMESTAMP=$(date +%Y-%m-%d-%H-%M-%S)
# -----------------

# 确保输出目录存在
mkdir -p $OUTPUT_DIR

# 检查提示词文件是否存在
if [ ! -f "$PROMPTS_FILE" ]; then
    echo "错误: 提示词文件 ${PROMPTS_FILE} 不存在!"
    echo "请创建该文件,并确保每行包含一个提示词。"
    exit 1
fi

echo "--- Starting OmniGen2 Manual Parallel Batch Inference (With Progress) ---"
echo "Model: $MODEL_PATH"
echo "Output Directory: $OUTPUT_DIR"
echo "Prompts File: $PROMPTS_FILE"
echo "Timestamp Prefix: ${TIMESTAMP}" # 打印时间戳前缀
echo "--------------------------------------------------------"

# --- 1. 分割提示词文件 ---
# 获取总行数
TOTAL_LINES=$(grep -cve '^\s*$' "$PROMPTS_FILE") # 统计非空行
# 计算每份的行数(向上取整)
LINES_PER_GPU=$(( (TOTAL_LINES + 1) / 2 ))

echo "总提示词数量: $TOTAL_LINES"
echo "分配给每个 GPU 的数量: $LINES_PER_GPU"

# 使用 head 和 tail 分割文件,平均分配给两个 GPU
grep -ve '^\s*$' "$PROMPTS_FILE" | head -n $LINES_PER_GPU > "$TEMP_PROMPT_0"
grep -ve '^\s*$' "$PROMPTS_FILE" | tail -n +$((LINES_PER_GPU + 1)) > "$TEMP_PROMPT_1"

# 重新计算实际分配的行数
COUNT_GPU0=$(wc -l < "$TEMP_PROMPT_0")
COUNT_GPU1=$(wc -l < "$TEMP_PROMPT_1")

echo "实际分配 GPU 0: $COUNT_GPU0 个提示词"
echo "实际分配 GPU 1: $COUNT_GPU1 个提示词"
# -------------------------


# --- 2. 定义运行子脚本函数 (添加进度逻辑) ---
# 注意:函数现在需要接收和使用 TIMESTAMP 变量
run_inference() {
    local gpu_id=$1
    local prompt_file=$2
    local total_tasks=$3 # 该 GPU 需要完成的任务总数
    local timestamp_prefix=$4 # 时间戳前缀
    
    echo "------------------------------------------------"
    echo "Starting Process on GPU $gpu_id. Total tasks: $total_tasks"
    
    local index=0
    
    # 逐行读取提示词文件并运行推理
    while IFS= read -r instruction; do
        
        # 计算进度
        local current_task=$((index + 1))
        local percent=0
        if [ "$total_tasks" -gt 0 ]; then
            percent=$(echo "scale=0; ($current_task * 100) / $total_tasks" | bc)
        fi
        
        # --- 核心修改:生成包含时间戳的输出文件名 ---
        # 格式: TIMESTAMP-gpu[ID]_[INDEX].png
        local output_name="${timestamp_prefix}-gpu${gpu_id}_$(printf "%03d" $index).png"
        local output_path="${OUTPUT_DIR}/${output_name}"
        # ---------------------------------------------
        
        # 打印进度信息
        echo -e "[GPU $gpu_id] Progress: ${percent}% (${current_task}/${total_tasks}) - Saving to: $output_name"
        
        # 执行推理命令
        CUDA_VISIBLE_DEVICES=$gpu_id python inference.py \
            --model_path $MODEL_PATH \
            --num_inference_step 50 \
            --height 1024 \
            --width 1024 \
            --text_guidance_scale 4.0 \
            --instruction "$instruction" \
            --output_image_path "$output_path" \
            --num_images_per_prompt 1 \
            --enable_model_cpu_offload \
            --dtype $DTYPE
            
        index=$((index + 1))
        
    done < "$prompt_file"
    
    echo "Process on GPU $gpu_id finished. 100% complete."
}
# -----------------------------------------------


# --- 3. 运行并行进程 ---

# 进程 1: 使用 GPU ID 0
( run_inference 0 "$TEMP_PROMPT_0" "$COUNT_GPU0" "$TIMESTAMP" ) &
PID_GPU0=$!

# 进程 2: 使用 GPU ID 1
( run_inference 1 "$TEMP_PROMPT_1" "$COUNT_GPU1" "$TIMESTAMP" ) &
PID_GPU1=$!

# 等待所有后台进程完成
echo "Waiting for both parallel processes (PID $PID_GPU0 and PID $PID_GPU1) to complete..."
wait $PID_GPU0
wait $PID_GPU1

# --- 4. 清理临时文件 ---
rm -f "$TEMP_PROMPT_0" "$TEMP_PROMPT_1"
echo "临时提示词文件已清理。"
# -------------------------

echo "--------------------------------------------------------"
echo "Batch parallel inference finished. All results saved in ${OUTPUT_DIR}"
echo "--------------------------------------------------------"
# 切换目录到 startimage.py 所在位置(虽然 conda run 不强制要求,但为了清晰保留)
cd /home/yanchang/DATA/facefusion

echo "切换到 $(pwd) 目录。"
echo "正在使用 'face' Conda 环境运行 startimage.py..."

# 使用 conda run 在 'face' 环境中执行 python startimage.py
# 这样更可靠,因为它不依赖于脚本中临时的 conda activate
conda run -n face python startimage.py

echo "startimage.py 脚本已启动(或已完成)。"

这样的话只需要在omnigen2conda环境下运行batch.sh 脚本即可

nohup bash batch.sh > image.log 2>&1 &

实时监控日志

tail -f image.log


评论